1. 程式人生 > 實用技巧 >k8s —— 架構 (轉發)

k8s —— 架構 (轉發)

master節點

k8s的叢集由master和node組成,節點上執行著若干k8s服務。

master節點之上執行著的後臺服務有kube-apiserver 、kube-scheduler、kube-controller-manager、etcd和pod網路。如下圖所示

1. API Server(kube-apiserver)

API Server是k8s的前端介面,各種客戶端工具以及k8s其他元件可以通過它管理叢集的各種資源。

2.Scheduler(kube-scheduler)

scheduer負責決定將pod放在哪個node上執行。另外scheduler在排程時會充分考慮叢集的架構,當前各個節點的負載,以及應用對高可用、效能、資料親和性的需求。

3.Controller Manager(kube-controller-manager)

負責管理叢集的各種資源,保證資源處於預期的狀態

4.etcd

負責儲存k8s叢集的配置資訊和各種資源的狀態資訊,當資料發生變化時,etcd會快速的通知k8s相關元件。

5.pod網路

pod要能夠相互通訊,k8s叢集必須掌握pod網路,fannel是其中一個可選的方案

node節點

node是pod執行的地方。node上執行的k8s元件有kublet、kube-proxy和pod網路(例如flannel),如下圖所示:

1.kubelet

是node的agent,當scheduler去確定在某個node上執行pod後,會將pod的具體配置資訊傳送給該節點的kubelet,kubelet會根據遮羞資訊建立和執行容器,並向master報告執行狀態。

2.kube-proxy

每個node都會執行kube-proxy服務,外界通過service訪問pod,kube-proxy負責將降訪問service的TCP/UDP資料流轉發到後端的容器。如果有多個副本,kube-proxy會實現負載均衡。

3.pod網路

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-systemnamespace 中。這裡有一個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...

...

k8s叢集架構工作演示

部署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。

補充兩點:

  1. 應用的配置和當前狀態資訊儲存在 etcd 中,執行kubectl get pod時 API Server 會從 etcd 中讀取這些資料。

  2. flannel 會為每個 Pod 都分配 IP。因為沒有建立 service,目前 kube-proxy 還沒參與進來。