上一節我們討論了 Kubernetes 架構 Master 上運行的服務,本節討論 Node 節點。
Node 是 Pod 運行的地方,Kubernetes 支持 Docker、rkt 等容器 Runtime。 Node上運行的 Kubernetes 組件有 kubelet、kube-proxy 和 Pod 網絡(例如 flannel)。
kubelet
kubelet 是 Node 的 agent,當 Scheduler 確定在某個 Node 上運行 Pod 后,會將 Pod 的具體配置信息(image、volume 等)發送給該節點的 kubelet,kubelet 根據這些信息創建和運行容器,並向 Master 報告運行狀態。
kube-proxy
service 在邏輯上代表了后端的多個 Pod,外界通過 service 訪問 Pod。service 接收到的請求是如何轉發到 Pod 的呢?這就是 kube-proxy 要完成的工作。
每個 Node 都會運行 kube-proxy 服務,它負責將訪問 service 的 TCP/UPD 數據流轉發到后端的容器。如果有多個副本,kube-proxy 會實現負載均衡。
Pod 網絡
Pod 要能夠相互通信,Kubernetes Cluster 必須部署 Pod 網絡,flannel 是其中一個可選方案。
完整的架構圖
結合實驗環境,我們得到了如下的架構圖:
你可能會問:為什么 k8s-master 上也有 kubelet 和 kube-proxy 呢?
這是因為 Master 上也可以運行應用,即 Master 同時也是一個 Node。
幾乎所有的 Kubernetes 組件本身也運行在 Pod 里,執行如下命令:
kubectl get pod --all-namespaces -o wide
Kubernetes 的系統組件都被放到 kube-system
namespace 中。這里有一個 kube-dns
組件,它為 Cluster 提供 DNS 服務,我們后面會討論。kube-dns
是在執行 kubeadm init
時(第 ⑤ 步)作為附加組件安裝的。
kubelet 是唯一沒有以容器形式運行的 Kubernetes 組件,它在 Ubuntu 中通過 Systemd 運行。
為了幫助大家更好地理解 Kubernetes 架構,下節我們將部署一個應用來展示各個組件是如何協作的。
書籍:
1.《每天5分鍾玩轉Docker容器技術》
https://item.jd.com/16936307278.html
2.《每天5分鍾玩轉OpenStack》
https://item.jd.com/12086376.html