天天看點

Kubernetes全棧架構師(基本概念)--學習筆記

為什麼要用Kubernetes?

K8s控制節點-Master概念

K8s計算節點-Node概念

什麼是Pod?

為什麼要引入Pod?

建立一個Pod

零當機釋出應用必備知識:Pod三種探針

零當機必備知識:StartupProbe

零當機必備知識:Liveness和Readiness

零當機必備知識:Pod退出流程

零當機必備知識:PreStop的使用

容器管理

自動恢複

健康檢查

彈性擴容

内部通訊

高可用

Kubernetes是谷歌以Borg為前身,基于谷歌15年生産環境經驗的基礎上開源的一個項目,Kubernetes緻力于提供跨主機叢集的自動部署、擴充、高可用以及運作應用程式容器的平台。

k8s節點一般分為master節點和node節點,master節點一般三個足以,三個master節點承載成百上千node節點完全沒有問題,node節點可以橫向擴容

node節點用于部署應用程式,master節點不允許部署應用程式,它隻負責控制,排程工作

叢集的控制中樞,各個子產品之間資訊互動都需要經過Kube-APIServer,同時它也是叢集管理、資源配置、整個叢集安全機制的入口。

叢集的狀态管理器,保證Pod或其他資源達到期望值,也是需要和APIServer進行通信,在需要的時候建立、更新或删除它所管理的資源。

叢集的排程中心,它會根據指定的一系列條件,選擇一個或一批最佳的節點,然後部署我們的Pod。

鍵值資料庫,報錯一些叢集的資訊,一般生産環境中建議部署三個以上節點(奇數個)。

master節點在安裝完成之後,可能在很長一段時間都不會有任何的變化,是以在進行架設計的時候,要給足master節點資源,因為每次修改master節點是一件特别複雜的事情

我們在master節點綁定證書,每個證書綁定在master節點的ip位址或者主機名,如果我們在之前生成證書的時候沒有預留的話,那我們可能就需要重新生成一份證書,再把之前的證書都替換掉,而且還要替換node節點上面的證書,過程非常麻煩,是以一開始要給足資源,比如一次性給三台16核64G

Etcd也特别重要,一次性給足資源,未來五到十年,node節點的個數在500到1000之間的話,我們的master節點是完全不需要做任何變化的

node節點和master節點的差別:node節點比較具有動态性,添加、删除

Kubelet:負責監聽節點上Pod的狀态,同時負責上報節點和節點上面Pod的狀态,負責與Master節點通信,并管理節點上面的Pod。

Kube-proxy:負責Pod之間的通信和負載均衡,将指定的流量分發到後端正确的機器上。

監聽Master節點增加和删除service以及endpoint的消息,調用Netlink接口建立相應的IPVS規則。通過IPVS規則,将流量轉發至相應的Pod上。

Ipvs映射規則

主機通路node節點30372端口,通過ipvs規則,反向代理到kubernetes-dashboard上面的ip位址172.25.244.214的8443端口,是以就能通路到dashboard

監聽Master節點增加和删除service以及endpoint的消息,對于每一個Service,他都會建立一個iptables規則,将service的clusterIP代理到後端對應的Pod。

不推薦使用Iptables的原因是:當我們的規則特别多的時候,它的性能就會急劇下降

Calico:符合CNI标準的網絡插件,給每個Pod生成一個唯一的IP位址,并且把每個節點當做一個路由器。Cilium,eBPF

CoreDNS:用于Kubernetes叢集内部Service的解析,可以讓Pod把Service名稱解析成IP位址,然後通過Service的IP位址進行連接配接到對應的應用上。

Docker:容器引擎,負責對容器的管理。

Pod是Kubernetes中最小的單元,它由一組、一個或多個容器組成,每個Pod還包含了一個Pause容器,Pause容器是Pod的父容器,主要負責僵屍程序的回收管理,通過Pause容器可以使同一個Pod裡面的多個容器共享存儲、網絡、PID、IPC等。

檢視系統pod

Pause容器

因為一個應用不可能單個容器就能支撐的,需要很多微服務支撐,可能出現一種情況就是兩個服務,A服務和B服務之間需要網絡互通,延遲非常小,而且兩個服務有資料的依賴性,服務B需要用到服務A産生的檔案,如果直接用k8s裸機的話,服務A和服務B不一定會在同一台主控端上,當副本數非常大的時候,很難保證兩個檔案可以共享一個目錄

每個pod有一個唯一的ip位址,便于管理

從k8s的角度看,它作為一個非常流行的編排工具,需要相容很多的容器技術,是以通過pod管理不同的符合該标準的容器,而沒有直接操作容器

其他容器技術:https://kubernetes.io/docs/setup/production-environment/container-runtimes/

建立pod

檢視pod

檢視labels

label與yaml檔案中的配置一緻

删除pod

删除之後就找不到pod了,是以生産環境中一般不會直接使用,很難保證業務正常運作,一般使用進階資源deployment,daemonset,StatefulSets

Pod探針

Pod探針的檢測方式

StartupProbe

LivenessProbe

ReadinessProbe

StartupProbe:k8s1.16版本後新加的探測方式,用于判斷容器内應用程式是否已經啟動。如果配置了startupProbe,就會先禁止其他的探測,直到它成功為止,成功後将不在進行探測。

LivenessProbe:用于探測容器是否運作,如果探測失敗,kubelet會根據配置的重新開機政策進行相應的處理。若沒有配置該探針,預設就是success。

ReadinessProbe:一般用于探測容器内的程式是否健康,它的傳回值如果為success,那麼久代表這個容器已經完成啟動,并且程式已經是可以接受流量的狀态。

ExecAction

TCPSocketAction

HTTPGetAction

ExecAction:在容器内執行一個指令,如果傳回值為0,則認為容器健康。

TCPSocketAction:通過TCP連接配接檢查容器内的端口是否是通的,如果是通的就認為容器健康。

HTTPGetAction:通過應用程式暴露的API位址來檢查程式是否是正常的,如果狀态碼為200~400之間,則認為容器健康。

生産環境推薦使用HTTPGetAction

檢視coredns的deployment檔案

查找livenessProbe

它請求了8080端口的/health,如果檢測成功,則容器不會被重新開機

查找readinessProbe

它請求了8181端口的/ready,如果檢測成功,則可以加上endpoint,開始接受流量,開始工作

探針檢查參數配置

為什麼要引入StartupProbe?

如果容器啟動特别慢,單獨配置一個StartupProbe,它會先禁用另外兩個探針,直到程式啟動完成,再檢測它的狀态

編輯pod.yaml,取消注釋

啟動容器

修改pod.yaml

建構容器

擷取IP

通路nginx

編輯pod.yaml

可以看到如果exec的指令不存在會報錯Liveness probe failed

修改exec指令為ls

重新建立

可以看到健康檢查通過

Liveness和Readiness推薦使用接口級健康檢查,參考 coredns

可以看到 coredns 的 livenessProbe 請求了一個 /health 的接口,readinessProbe 請求了一個 /ready 的接口

使用者執行删除操作:kubectl delete po nginx

執行PreStop的指令

Endpoint删除該Pod的IP位址

Pod變成Terminating

Pod變成Terminating之後有一個寬限期,讓我們做一些清理的動作,或者後置的動作

Prestop:先去請求eureka接口,把自己的IP位址和端口号,進行下線,eureka從系統資料庫中删除該應用的IP位址。然後容器進行sleep 90;kill <code>pgrep java</code>

如果sleep時間過長,需要修改terminationGracePeriodSeconds

檢視pod退出時間

可以看到隻執行了40s,并沒有sleep 90s,是以我們需要配置terminationGracePeriodSeconds

設定 terminationGracePeriodSeconds

可以看到退出時間延長了,但是也沒有真正的執行sleep 90s,是以配置的時候需要注意一下,因為k8s并不知道你執行了什麼操作,無法判斷PreStop的執行時間,是以會強制性的删除

http://www.kubeasy.com/

Kubernetes全棧架構師(基本概念)--學習筆記

本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協定進行許可。

歡迎轉載、使用、重新釋出,但務必保留文章署名 鄭子銘 (包含連結: http://www.cnblogs.com/MingsonZheng/ ),不得用于商業目的,基于本文修改後的作品務必以相同的許可釋出。