八、Kubernetes 架構(gòu)(下)
? 上一節(jié)我們討論了 Kubernetes 架構(gòu) Master 上運(yùn)行的服務(wù),本節(jié)討論 Node 節(jié)點(diǎn)。
(一)node
? Node 是 Pod 運(yùn)行的地方,Kubernetes 支持 Docker、rkt 等容器 Runtime。 Node上運(yùn)行的 Kubernetes 組件有 kubelet、kube-proxy 和 Pod 網(wǎng)絡(luò)(例如 flannel)。
(1)kubelet
? kubelet 是 Node 的 agent,當(dāng) Scheduler 確定在某個 Node 上運(yùn)行 Pod 后,會將 Pod 的具體配置信息(image、volume 等)發(fā)送給該節(jié)點(diǎn)的 kubelet,kubelet 根據(jù)這些信息創(chuàng)建和運(yùn)行容器,并向 Master 報(bào)告運(yùn)行狀態(tài)。
(2)kube-proxy
? service 在邏輯上代表了后端的多個 Pod,外界通過 service 訪問 Pod。service 接收到的請求是如何轉(zhuǎn)發(fā)到 Pod 的呢?這就是 kube-proxy 要完成的工作。
? 每個 Node 都會運(yùn)行 kube-proxy 服務(wù),它負(fù)責(zé)將訪問 service 的 TCP/UPD 數(shù)據(jù)流轉(zhuǎn)發(fā)到后端的容器。如果有多個副本,kube-proxy 會實(shí)現(xiàn)負(fù)載均衡。
(3) Pod 網(wǎng)絡(luò)
Pod 要能夠相互通信,Kubernetes Cluster 必須部署 Pod 網(wǎng)絡(luò),flannel 是其中一個可選方案。
(二)架構(gòu)圖
? 你可能會問:為什么 k8s-master 上也有 kubelet 和 kube-proxy 呢?
? 這是因?yàn)?Master 上也可以運(yùn)行應(yīng)用,即 Master 同時也是一個 Node。幾乎所有的 Kubernetes 組件本身也運(yùn)行在 Pod 里,執(zhí)行如下命令:
root@k8s-master:~# kubectl get pod --all-namespaces -o wide
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-system coredns-6d56c8448f-9grxk 1/1 Running 0 104m 10.244.0.3 k8s-master <none> <none>
kube-system coredns-6d56c8448f-mrx55 1/1 Running 0 104m 10.244.0.2 k8s-master <none> <none>
kube-system etcd-k8s-master 1/1 Running 0 105m 10.0.0.41 k8s-master <none> <none>
kube-system kube-apiserver-k8s-master 1/1 Running 0 105m 10.0.0.41 k8s-master <none> <none>
kube-system kube-controller-manager-k8s-master 1/1 Running 0 105m 10.0.0.41 k8s-master <none> <none>
kube-system kube-flannel-ds-cqwqv 1/1 Running 0 99m 10.0.0.41 k8s-master <none> <none>
kube-system kube-flannel-ds-nh2qg 1/1 Running 0 89m 10.0.0.43 k8s-node-02 <none> <none>
kube-system kube-flannel-ds-wbrs6 1/1 Running 0 88m 10.0.0.42 k8s-node-01 <none> <none>
kube-system kube-proxy-45prh 1/1 Running 0 104m 10.0.0.41 k8s-master <none> <none>
kube-system kube-proxy-g2c4x 1/1 Running 0 89m 10.0.0.43 k8s-node-02 <none> <none>
kube-system kube-proxy-jwvg5 1/1 Running 0 88m 10.0.0.42 k8s-node-01 <none> <none>
kube-system kube-scheduler-k8s-master 1/1 Running 0 105m 10.0.0.41 k8s-master <none> <none>
root@k8s-master:~#
? Kubernetes 的系統(tǒng)組件都被放到 kube-system namespace中。這里有一個 kube-dns 組件,它為 Cluster 提供 DNS 服務(wù),我們后面會討論。 kube-dns是在執(zhí)行 kubeadm init 時(第 ⑤ 步)作為附加組件安裝的。
? kubelet 是唯一沒有以容器形式運(yùn)行的 Kubernetes 組件,它在 Ubuntu 中通過 Systemd 運(yùn)行。
root@k8s-master:~# systemctl status kubelet.service
● kubelet.service - kubelet: The Kubernetes Node Agent
Loaded: loaded (/lib/systemd/system/kubelet.service; enabled; vendor preset: enabled)
Drop-In: /etc/systemd/system/kubelet.service.d
└─10-kubeadm.conf
Active: active (running) since Sun 2020-11-01 11:22:37 UTC; 1h 52min ago
Docs: https:///docs/home/
Main PID: 78026 (kubelet)
Tasks: 16 (limit: 4632)
CGroup: /system.slice/kubelet.service
? 為了幫助大家更好地理解 Kubernetes 架構(gòu),下節(jié)我們將部署一個應(yīng)用來展示各個組件是如何協(xié)作的。
|