上一節咱們討論了 Kubernetes 架構 Master 上運行的服務,本節討論 Node 節點。node
Node 是 Pod 運行的地方,Kubernetes 支持 Docker、rkt 等容器 Runtime。 Node上運行的 Kubernetes 組件有 kubelet、kube-proxy 和 Pod 網絡(例如 flannel)。後端
kubelet 是 Node 的 agent,當 Scheduler 肯定在某個 Node 上運行 Pod 後,會將 Pod 的具體配置信息(image、volume 等)發送給該節點的 kubelet,kubelet 根據這些信息建立和運行容器,並向 Master 報告運行狀態。api
service 在邏輯上表明瞭後端的多個 Pod,外界經過 service 訪問 Pod。service 接收到的請求是如何轉發到 Pod 的呢?這就是 kube-proxy 要完成的工做。網絡
每一個 Node 都會運行 kube-proxy 服務,它負責將訪問 service 的 TCP/UPD 數據流轉發到後端的容器。若是有多個副本,kube-proxy 會實現負載均衡。架構
Pod 要可以相互通訊,Kubernetes Cluster 必須部署 Pod 網絡,flannel 是其中一個可選方案。負載均衡
你可能會問:爲何 k8s-master 上也有 kubelet 和 kube-proxy 呢?ide
這是由於 Master 上也能夠運行應用,即 Master 同時也是一個 Node。幾乎全部的 Kubernetes 組件自己也運行在 Pod 裏,執行以下命令:spa
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 的系統組件都被放到 kube-system namespace中。這裏有一個
kube-dns 組件,它爲 Cluster 提供 DNS 服務,咱們後面會討論。
kube-dns是在執行
kubeadm init 時(第 ⑤ 步)做爲附加組件安裝的。code
kubelet 是惟一沒有以容器形式運行的 Kubernetes 組件,它在 Ubuntu 中經過 Systemd 運行。server
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://kubernetes.io/docs/home/ Main PID: 78026 (kubelet) Tasks: 16 (limit: 4632) CGroup: /system.slice/kubelet.service
爲了幫助你們更好地理解 Kubernetes 架構,下節咱們將部署一個應用來展現各個組件是如何協做的。