k8s的集羣由master和node組成,節點上運行着若干k8s服務。前端
master節點之上運行着的後臺服務有kube-apiserver 、kube-scheduler、kube-controller-manager、etcd和pod網絡。以下圖所示node
API Server是k8s的前端接口,各類客戶端工具以及k8s其餘組件能夠經過它管理集羣的各類資源。bootstrap
scheduer負責決定將pod放在哪一個node上運行。另外scheduler在調度時會充分考慮集羣的架構,當前各個節點的負載,以及應用對高可用、性能、數據親和性的需求。後端
負責管理集羣的各類資源,保證資源處於預期的狀態。api
負責保存k8s集羣的配置信息和各類資源的狀態信息,當數據發生變化時,etcd會快速的通知k8s相關組件。網絡
pod要可以相互通訊,k8s集羣必須掌握pod網絡,fannel是其中一個可選的方案。架構
node是pod運行的地方。node上運行的k8s組件有kublet、kube-proxy和pod網絡(例如flannel),以下圖所示:負載均衡
是node的agent,當scheduler去肯定在某個node上運行pod後,會將pod的具體配置信息發送給該節點的kubelet,kubelet會根據遮羞信息建立和運行容器,並向master報告運行狀態。ide
每一個node都會運行kube-proxy服務,外界經過service訪問pod,kube-proxy負責將降訪問service的TCP/UDP數據流轉發到後端的容器。若是有多個副本,kube-proxy會實現負載均衡。工具
pod能可以互相通訊,k8s集羣必須部署pod網絡,flannel是其中一個能夠選擇的方案
爲何 k8s-master 上也有 kubelet 和 kube-proxy 呢?
這是由於 Master 上也能夠運行應用,即 Master 同時也是一個 Node。
幾乎全部的 Kubernetes 組件自己也運行在 Pod 裏,執行以下命令:
[root@ken ~]# kubectl get pod --all-namespaces -o wide NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES kube-system coredns-78d4cf999f-dbxpc 1/1 Running 0 4h40m 10.244.0.2 ken <none> <none> kube-system coredns-78d4cf999f-q9vq2 1/1 Running 0 4h40m 10.244.0.3 ken <none> <none> kube-system etcd-ken 1/1 Running 0 4h39m 172.20.10.2 ken <none> <none> kube-system kube-apiserver-ken 1/1 Running 0 4h39m 172.20.10.2 ken <none> <none> kube-system kube-controller-manager-ken 0/1 CrashLoopBackOff 23 4h39m 172.20.10.2 ken <none> <none> kube-system kube-flannel-ds-amd64-bq6jx 1/1 Running 0 4h4m 172.20.10.9 host2 <none> <none> kube-system kube-flannel-ds-amd64-fd8mv 1/1 Running 0 4h24m 172.20.10.2 ken <none> <none> kube-system kube-flannel-ds-amd64-ssqcl 1/1 Running 0 4h5m 172.20.10.7 host1 <none> <none> kube-system kube-proxy-7cnsr 1/1 Running 0 4h5m 172.20.10.7 host1 <none> <none> kube-system kube-proxy-gwmr2 1/1 Running 0 4h40m 172.20.10.2 ken <none> <none> kube-system kube-proxy-n6zxl 1/1 Running 0 4h4m 172.20.10.9 host2 <none> <none> kube-system kube-scheduler-ken 0/1 CrashLoopBackOff 21 4h39m 172.20.10.2 ken <none> <none>
Kubernetes 的系統組件都被放到kube-system namespace 中。這裏有一個kube-dns 組件,它爲 Cluster 提供 DNS 服務,咱們後面會討論。kube-dns是在執行kubeadm init 時做爲附加組件安裝的。
kubelet 是惟一沒有以容器形式運行的 Kubernetes 組件,它在系統中經過 Systemd 運行。
[root@ken ~]# systemctl status kubelet
● kubelet.service - kubelet: The Kubernetes Node Agent Loaded: loaded (/etc/systemd/system/kubelet.service; enabled; vendor preset: disabled) Drop-In: /etc/systemd/system/kubelet.service.d └─10-kubeadm.conf Active: active (running) since Tue 2019-01-29 10:39:16 CST; 4h 44min ago Docs: https://kubernetes.io/docs/ Main PID: 6350 (kubelet) Tasks: 35 Memory: 87.7M CGroup: /system.slice/kubelet.service └─6350 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kub... ...
部署httpd應用
[root@ken ~]# kubectl run httpd-ken --generator=run-pod/v1 --image=httpd --replicas=2 pod/httpd-ken1 created
等待一段時間,應用部署完成。
[root@ken ~]# kubectl get deployment NAME READY UP-TO-DATE AVAILABLE AGE httpd-ken 2/2 2 2 20m
k8s 部署了k8s httpd-ken,有兩個副本 Pod,分別運行在k8s-node1和k8s-node2。
[root@ken ~]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES httpd-ken-5c949b96f-9cd52 1/1 Running 0 3m50s 10.244.1.3 host1 <none> <none> httpd-ken-5c949b96f-twdsd 1/1 Running 0 3m50s 10.244.2.3 host2 <none> <none>
整個部署過程:
① kubectl 發送部署請求到 API Server。
② API Server 通知 Controller Manager 建立一個 deployment 資源。
③ Scheduler 執行調度任務,將兩個副本 Pod 分發到 k8s-node1 和 k8s-node2。
④ k8s-node1 和 k8s-node2 上的 kubectl 在各自的節點上建立並運行 Pod。
補充兩點:
應用的配置和當前狀態信息保存在 etcd 中,執行kubectl get pod 時 API Server 會從 etcd 中讀取這些數據。
flannel 會爲每一個 Pod 都分配 IP。由於沒有建立 service,目前 kube-proxy 還沒參與進來。