k8s整體架構的知識整理

1、master節點

Master是Kubernetes Cluster的大腦,執行著的Daemon服務有以下幾個:

kube-apiserver

kube-scheduler

kube-controller-manager

etcd

Pod 網路(例如 flannel)

如圖所示:

k8s整體架構的知識整理

接下來就一個一個介紹如上組建的功能。

1)API Server(kube-apiserver)

API Server 提供 HTTP/HTTPS RESTful API,即 Kubernetes API。API Server 是 Kubernetes Cluster 的前端介面,各種客戶端工具(CLI 或 UI)以及 Kubernetes 其他元件可以透過它管理 Cluster 的各種資源。

2)Scheduler(kube-scheduler)

Scheduler 負責決定將 Pod 放在哪個 Node 上執行。Scheduler 在排程時會充分考慮 Cluster 的拓撲結構,當前各個節點的負載,以及應用對高可用、效能、資料親和性的需求

3)Controller Manager(kube-controller-manager)

Controller Manager 負責管理 Cluster 各種資源,保證資源處於預期的狀態。Controller Manager 由多種 controller 組成,包括 replication controller、endpoints controller、namespace controller、serviceaccounts controller 等。

不同的 controller 管理不同的資源。例如 replication controller 管理 Deployment、StatefulSet、DaemonSet 的生命週期,namespace controller 管理 Namespace 資源。

4)etcd

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

5)Pod 網路

Pod 要能夠相互通訊,Kubernetes Cluster 必須部署 Pod 網路,flannel 是其中一個可選方案,也是kubernetes官方預設的一種方案。

2、Node節點

Node 是 Pod 執行的地方,Kubernetes 支援 Docker、rkt 等容器 Runtime。 Node上執行的 Kubernetes 元件有:

kubelet

kube-proxy

如圖所示:

k8s整體架構的知識整理

1)kubelet

kubelet 是 Node agent,當 Scheduler 確定在某個 Node 上執行 Pod 後,會將 Pod 的具體配置資訊(image、volume 等)傳送給該節點的 kubelet,kubelet 根據這些資訊建立和執行容器,並向 Master 報告執行狀態

2)kube-proxy

service 在邏輯上代表了後端的多個 Pod,外界透過 service 訪問 Pod。service 接收到的請求是如何轉發到 Pod 的呢?這就是 kube-proxy 要完成的工作。

每個 Node 都會執行 kube-proxy 服務,它負責將訪問 service 的 TCP/UPD 資料流轉發到後端的容器。如果有多個副本,kube-proxy 會實現負載均衡。

3)Pod 網路

Pod 要能夠相互通訊,Kubernetes Cluster 必須部署 Pod 網路,flannel 是其中一個可選方案。

3、叢集架構

將如上講解的架構彙總起來,組成一個叢集,就是k8s叢集了,我們先看一張叢集完整架構圖:

k8s整體架構的知識整理

這裡在k8s-master 上也加有 kubelet 和 kube-proxy ,是因為在k8s叢集中,master既可以作為管理節點,也能夠擔任work節點。

有時部署的時候也可能將Scheduler等控制組件部署在node節點,這是為了高可用著想,如此一來,叢集每個節點都是master,同時也都是node,任意一個節點出了問題,都能夠被一些高可用的方案,所避免服務的宕機。

4、透過例項理解架構工作流程

現在來透過構建一個例項,來理解整個叢集工作的流程。

執行如下命令:

kubectl run nginx-ds ——image=nginx ——replicas=2

等待一段時間,可以檢視一下部署成功:

$

kubectl

get

pod

-

o

wide

NAME

READY

STATUS

RESTARTS

AGE

IP

NODE

nginx

-

ds

-

fbx76

1

/

1

Running

0

2

d

172。30

84。2

kube

-

node1

nginx

-

ds

-

jbjzg

1

/

1

Running

0

2

d

172。30

8。2

kube

-

node2

Kubernetes 部署了 deployment nginx-ds,有兩個副本 Pod,分別執行在 kube-node1 和 kube-node2。

詳細部署流程如圖所示:

k8s整體架構的知識整理

1,kubectl 傳送部署請求到 API Server。

2,API Server 通知 Controller Manager 建立一個 deployment 資源。

3,Scheduler 執行排程任務,將兩個副本 Pod 分發到 k8s-node1 和 k8s-node2。

4,k8s-node1 和 k8s-node2 上的 kubelet 在各自的節點上建立並執行 Pod。

另外:

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

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