這個其實可以想成,在 Docker 裡面有一個很方便的佈署方式,就是利用 docker-compose。也就是說在 K8s 會需要寫類似這種性質的設定檔,而且這設定檔可以一次寫多台機器上不同的容器,因此當根據這設定檔佈署,就能完成多個容器到多個機器上的效果。
當需要佈署容器越多的話,所需要寫 K8s 設定檔就會用複雜。有經驗工程師就會設法在寫一個好用的工具去寫設定檔,最知名的就是Helm。
從第一個字首 K 到字尾 S 之間總共有 8 個英文字母,所以為了不想寫那麼多字母,就寫成 K8s。所以文章後面也用 K8s 來簡短的書寫 XD
其實,起源是因為 Google 公司內部的工程師們發明了一個Borg系統,只是並沒有開源,只能用在 Google 公司內部。最後 Google 公司裡面的工程師將其 Borg 系統經過改良造就了現在的 K8s 系統,並宣布開源,將 K8s 所有權交由 Linux 基金會來使用。
也就是一個 Cluster 裡面的指揮中心,它負責管理 Cluster 裡面的其他節點。在 Master 裡面有包含四大元件:
Controll plane的目的:
The control plane's components make global decisions about the cluster (for example, scheduling), as well as detecting and responding to cluster events (for example, starting up a new pod when a deployment's replicas field is unsatisfied).
kube-apiserver
在 K8s 中,如果我們要對集群進行指令的操作,會用 kubectl 工具的 Command Line 指令,而這些指令就會直接送到 API Server,所以 API Server 會有 Kubernetes 的許多 API 接口,因此透過這個接口才能將容器佈署到其他節點上。API Server 也負責其他 Node 的橋樑,也就是要靠 API Server 作為中介的角色。還有一些身分認證及授權的責任。
kube-controller-manager
這個元件會去監視其他節點的健康狀態,而遇到不健康狀態就像是供應節點的主機掛掉了,又持續無法重啟,那個 Controller 就會刪除該節點,而節點上的 Pod 元件 (裡面裝的是容器) 也會一一的被終止,最後刪除。也有一種狀況是現在服務需求量大,節點的供應已經無法滿足,Controller 也會根據我們給的設定檔,選擇要不要加開節點來供應。Controller 會與 API Server 互相溝通,以便完成任務
cloud-controller-manager
和上面的元件功能完一樣,但對象是公有雲上的node。讓你的環境能整合公有雲的服務,如aws、gce、azure等。
kube-scheduler
會負責監聽每個節點裡面的 Pod 元件,會知道說每個 Pod 的內部資源利用率怎麼樣,確保工作負載不會超過可用資源,也就是提供負載均衡 (Load balancing) 的技術。所以當你現在要佈署新的容器到節點上,Scheduler 會決定要把該容器放到哪個 Pod 裡面去運行。
etcd
etcd是一個資料庫,詳情可參考其官網。是一個分散式的KV資料庫。
用來存放 Kubernetes Cluster 的資料,並將資料持久化,不會因為沒存到而遺漏資料,而當 Master 因為某些原因而故障時,可以透過 etcd 幫我們還原 Kubernetes 的狀態.
更完整的架構
也就是非 Master 節點,都是 Worker 節點,負責產生容器並且工作。每個 Worker 節點會有以下元件:
POD
Pod 是節點裡面的最小單位,簡單來說就是 Pod 就是放置容器服務的地方。通常一個 Pod 對應到一個容器,也可以一個 Pod 裡面放置多個容器。
在實際學習操作 K8s 都是先從如何撰寫 Pod 的設定檔,每個 Pod 會對應到一個設定檔,其實就是 yaml 檔,在設定檔裡面主要就是寫我們要佈署在這個 Pod 的 Docker Container 的資訊。
在 Pod 裡面還有一個很重要的概念要知道就是:
Pod 裡面的所有 Containers 都是共享所有儲存空間及網路,因此 Pod 裡面的 Container 要通訊,只要透過 localhost 的 port 就可以溝通了。
要知道,這是一個很強的功能,因為以往用 Docker 佈署的時候:docker 運行每個容器,都是分離的,沒辦法透過 localhost 的方式進行溝通,除非放到將應用程式放到同一個容器裡面, 不然只能用另一個容器的名字做為 mapping 去連到。
kubelet
負責自己的 Worker Node 的運行狀態,會確保 Pod 裡面的容器是否有正常運行。而當 Pod 如果出問題,會與 Master 節點進行連絡,Master 節點的 Controller Manager 就可能會下達命令將 pod 改成其他 Worker 節點運行,以維持整個 Cluster 的運作。
kube-proxy
主要負責網絡代理,負載均衡的實現,同時會根據傳入請求的 IP 和 Port,將流量轉發到指定的合適的 Pod 裡面的容器中。
cAdvisor
cAdvisor 主要是監視和收集每個節點上 Pod 裡面的容器的 CPU,記憶體,文件和網路使用情況等資源使用情況和性能指標的元件。
根據K8s Cluster 裡面的架構,就是工程師會透過下指令到 API Server 進行佈署等操作。而 User 使用我們佈署在 K8s 上的應用程式服務的時候,每個 Worker Node 的 kube-proxy 會根據 URL 去 Mapping 到要轉發到哪個 Pod 裡面的容器去服務。
重點就是Pod 設定檔撰寫開始操作,就是yaml
格式的檔案。