Kubernetes組件簡介
Kubernetes組件簡介
Kubernetes(簡稱k8s)致力于提供跨主機(jī)集群的自動(dòng)部署、擴(kuò)展、高可用以及運(yùn)行應(yīng)用程序容器的平臺(tái)。
k8s是什么
- 一個(gè)基于容器技術(shù)的分布式架構(gòu)
- 一個(gè)一站式的完備的分布式系統(tǒng)開發(fā)和支撐平臺(tái)
- 提供自動(dòng)化機(jī)制,降低運(yùn)維難度與成本的架構(gòu)
在k8s中,Service是分布式集群架構(gòu)的核心,一個(gè)Service對象擁有以下特征:
- 擁有唯一指定的名稱
- 擁有一個(gè)虛擬IP(Cluster IP、Service IP 或 VIP)和端口號(hào)
- 能夠提供某種遠(yuǎn)程服務(wù)能力
- 被映射到提供這種服務(wù)能力的一組容器應(yīng)用上
k8s集群的組成
k8s由控制平面組件(master節(jié)點(diǎn))、存儲(chǔ)端和工作節(jié)點(diǎn)組成。
工作節(jié)點(diǎn)會(huì)托管 Pod ,而 Pod 就是作為應(yīng)用負(fù)載的組件。
控制平面管理集群中的工作節(jié)點(diǎn)和 Pod。
在生產(chǎn)環(huán)境中,控制平面通常跨多臺(tái)計(jì)算機(jī)運(yùn)行, 一個(gè)集群通常運(yùn)行多個(gè)節(jié)點(diǎn),提供容錯(cuò)性和高可用性。
k8s集群由master(控制節(jié)點(diǎn))和node(工作節(jié)點(diǎn))組成。
master節(jié)點(diǎn):整個(gè)集群的控制中樞,負(fù)責(zé)整個(gè)集群的管理和控制;
node節(jié)點(diǎn):工作節(jié)點(diǎn),應(yīng)用服務(wù)部署至工作節(jié)點(diǎn)中;
load balance:一般用軟件keepalive、HAproxy或者硬件F5虛擬VIP地址,使其對master節(jié)點(diǎn)的高可用,通過load balance能訪問master節(jié)點(diǎn)的apiserver;云端使用SLB或者ELB提供該功能。
生產(chǎn)環(huán)境中通常采用3個(gè)master節(jié)點(diǎn)形成集群管理架構(gòu),node節(jié)點(diǎn)主要部署服務(wù)。
master節(jié)點(diǎn)各組件介紹:
master節(jié)點(diǎn)主要由APIServer、Scheduler、Controller-manager組件組成,及Etcd和pod網(wǎng)絡(luò)( flannel、calico等 )
APIServer:
- 集群的控制中樞,各個(gè)模塊之間信息交互都需要通過APIServer;
- API Server是k8s的前端接口,各種客戶端工具以及k8s其他組件可以通過它管理集群的各種資源。(接受管理命令,對外接受命令結(jié)構(gòu))
- APIServer將集群狀態(tài)和信息存儲(chǔ)導(dǎo)分布式鍵-值(key-value)存儲(chǔ)系統(tǒng)Etcd集群中;(包含刪除pod、增加資源等;注意只有APIServer與Etcd通信,其他組件不與Etcd通信)
- 同時(shí)APIServer是集群管理、資源配置、整個(gè)集群安全機(jī)制的入口,為集群各類資源對象提供增刪改查以及watch的REST API接口。(如namespace分配資源、RBAC)
Etcd:
- 負(fù)責(zé)保存k8s集群的配置信息和各種資源的狀態(tài)信息,K8S中所有的服務(wù)節(jié)點(diǎn)的信息數(shù)據(jù)、配置數(shù)據(jù)都是存儲(chǔ)在ETCD中,當(dāng)數(shù)據(jù)發(fā)生變化時(shí),etcd會(huì)快速的通知k8s相關(guān)組件。保證數(shù)據(jù)高可用、一致性,會(huì)把數(shù)據(jù)備份部署多份,即使一個(gè)服務(wù)也不影響使用。只有APIServer 與Etcd 通信,其他組件不與其通信。
- etcd屬于鍵值數(shù)據(jù)庫,保存集群的信息,一般生產(chǎn)環(huán)境中針對集群比較大的情況,建議部署三個(gè)以上節(jié)點(diǎn)(奇數(shù)個(gè)),并且與master節(jié)點(diǎn)區(qū)分開,不要部署在同一臺(tái)主機(jī)上。對磁盤性能要求高,最好采用SSD硬盤;
Scheduler(kube-scheduler):
Scheduler 資源調(diào)度,負(fù)責(zé)決定將pod放在哪個(gè)node上運(yùn)行。另外scheduler在調(diào)度時(shí)會(huì)充分考慮集群的架構(gòu),當(dāng)前各個(gè)節(jié)點(diǎn)的負(fù)載,以及應(yīng)用對高可用、性能、數(shù)據(jù)親和性的需求。
- 集群pod調(diào)度中心,它會(huì)根據(jù)指定的一系列條件,選擇一個(gè)或一批最佳的節(jié)點(diǎn),然后部署我們的Pod。
- 它通過APIServer監(jiān)聽所有Pod狀態(tài),一旦發(fā)現(xiàn)新的未被調(diào)度到任何Node節(jié)點(diǎn)的pod(PodSpec.NodeName為空),就會(huì)根據(jù)一系列策略選擇最佳節(jié)點(diǎn)進(jìn)行調(diào)度。
Controller Manager:
Controller Manager 負(fù)責(zé)維護(hù)集群的狀態(tài),比如故障檢測、自動(dòng)擴(kuò)展、滾動(dòng)更新等。Controller Manager 由多種 controller 組成,包括 replication controller、endpoints controller、namespace controller、serviceaccounts controller 等。不同的 controller 管理不同的資源。例如 replication controller 管理 Deployment、StatefulSet、DaemonSet 的生命周期,namespace controller 管理 Namespace 資源。
- 集群的狀態(tài)管理器,保證Pod或其他資源達(dá)到期望值,
- 也是需要和APIServer進(jìn)行通信,在需要的時(shí)候創(chuàng)建、更新或刪除它所管理的資源。
關(guān)于k8s控制組件中有狀態(tài)服務(wù)與無狀態(tài)服務(wù)的說明:
APIServer是無狀態(tài)服務(wù): 它會(huì)把集群狀態(tài)和資源情況存儲(chǔ)在Etcd中,當(dāng)LB發(fā)出連接請求時(shí),只會(huì)到1個(gè)apiserver中;
Scheduler和Controller-manager組件是有狀態(tài)服務(wù):
- Schedule和Controller-manager有"選主"機(jī)制,它們會(huì)選舉出主節(jié)點(diǎn)和從節(jié)點(diǎn),當(dāng)監(jiān)控到pod或其他資源出現(xiàn)異常狀態(tài)需要重新修復(fù)或調(diào)度時(shí),通過主節(jié)點(diǎn)進(jìn)行控制調(diào)度。
- Scheduler和Controller-manager通過APIServer去監(jiān)聽pod狀態(tài),或者pod或其他資源副本數(shù),
- 1.20版本下通過 “l(fā)eases” 資源保存主節(jié)點(diǎn)信息在 “HOLDER” 中;
- 1.20以上、1.24版本通過 “ep” 中 “annotations” 保留主節(jié)點(diǎn)信息;
node節(jié)點(diǎn)各組件介紹:
由kubelet、kube-proxy、DNS、Calico網(wǎng)絡(luò)、Runtime組件組成。
Kubelet:
負(fù)責(zé)監(jiān)聽節(jié)點(diǎn)上Pod的狀態(tài),同時(shí)負(fù)責(zé)上報(bào)節(jié)點(diǎn)和節(jié)點(diǎn)上面Pod的狀態(tài),負(fù)責(zé)與Master節(jié)點(diǎn)通信,并管理節(jié)點(diǎn)上面的Pod。
kubelet可以看作是node的agent,當(dāng)scheduler確定在某個(gè)node上運(yùn)行pod后,會(huì)將pod的具體配置信息發(fā)送給該節(jié)點(diǎn)的kubelet,kubelet會(huì)根據(jù)這些信息創(chuàng)建和運(yùn)行容器,并向master報(bào)告運(yùn)行狀態(tài)。
Kube-proxy:
負(fù)責(zé)Pod之間的通信和負(fù)載均衡,將指定的流量分發(fā)到后端正確的機(jī)器上。一般為10249端口。
proxy是配合service實(shí)現(xiàn)從pod到service,以及從外部的node port 到 service的訪問。每個(gè) Node 都會(huì)運(yùn)行 kube-proxy 服務(wù),它負(fù)責(zé)將訪問 service 的 TCP/UPD 數(shù)據(jù)流轉(zhuǎn)發(fā)到后端的容器。如果有多個(gè)副本,kube-proxy 會(huì)實(shí)現(xiàn)負(fù)載均衡。
查看proxy模式命令為:
curl 127.0.0.1:10249/proxyMode
Ipvs:監(jiān)聽Master節(jié)點(diǎn)增加和刪除service以及endpoint的消息,調(diào)用Netlink接口創(chuàng)建相應(yīng)的IPVS規(guī)則。通過IPVS規(guī)則,將流量轉(zhuǎn)發(fā)至相應(yīng)的Pod上。Ipvs屬于內(nèi)核級(jí)轉(zhuǎn)發(fā)。速度比Iptables快*
Iptables:監(jiān)聽Master節(jié)點(diǎn)增加和刪除service以及endpoint的消息,對于每一個(gè)Service,他都會(huì)場景一個(gè)iptables規(guī)則,將service的clusterIP代理到后端對應(yīng)的Pod。
eBPF網(wǎng)絡(luò)插件
Calico:
符合CNI標(biāo)準(zhǔn)的網(wǎng)絡(luò)插件,Calico給每個(gè)Pod生成一個(gè)唯一的IP地址,并且把每個(gè)節(jié)點(diǎn)當(dāng)做一個(gè)路由器。Cilium原生只是eBPF
CoreDNS:
用于Kubernetes集群內(nèi)部Service的解析,可以讓Pod把Service名稱解析成IP地址,然后通過Service的IP地址進(jìn)行連接到對應(yīng)的應(yīng)用上。 通常CoreDNS的IP為k8s網(wǎng)段的第10個(gè)地址。
Runtime:
負(fù)責(zé)容器的管理。

浙公網(wǎng)安備 33010602011771號(hào)