k8s架構說明 === ![](https://i.imgur.com/MeU3Vsd.png) ## Kubernetes介紹 ### 什麼是Kubernetes * K8s 可以幫助我們自動化的操作與管理容器 * 在這邊容器其實就可以想成是 Docker 的 Container * 雖然 Docker佈署已經很方便,但仍需要手動佈署多個容器到機器上 * 如果只有單一機器就還好 * 真正大型的服務一定會有需求是多個容器都在不同的機器上 * 那麼手動去每個機器佈署將會是很累人的一件事情 * 而且如果要監聽並管理這些容器的狀態也是很麻煩 ### Kubernetes的優點 * 容器如果掛掉了,可以自動重啟 * 當服務的用量增加,K8s 可以能自動讓容器做auto scaling(自動擴展) * 同時佈署多個容器到多個機器上 ### K8s的功能 * **Service discovery and load balancing** Kubernetes can expose a container using the DNS name or using their own IP address. If traffic to a container is high, Kubernetes is able to load balance and distribute the network traffic so that the deployment is stable. * **Storage orchestration** Kubernetes allows you to automatically mount a storage system of your choice, such as local storages, public cloud providers, and more. * **Automated rollouts and rollbacks** You can describe the desired state for your deployed containers using Kubernetes, and it can change the actual state to the desired state at a controlled rate. For example, you can automate Kubernetes to create new containers for your deployment, remove existing containers and adopt all their resources to the new container. * **Automatic bin packing** You provide Kubernetes with a cluster of nodes that it can use to run containerized tasks. You tell Kubernetes how much CPU and memory (RAM) each container needs. Kubernetes can fit containers onto your nodes to make the best use of your resources. * **Self-healing** Kubernetes restarts containers that fail, replaces containers, kills containers that don't respond to your user-defined health check, and doesn't advertise them to clients until they are ready to serve. * **Secret and configuration management** Kubernetes lets you store and manage sensitive information, such as passwords, OAuth tokens, and SSH keys. You can deploy and update secrets and application configuration without rebuilding your container images, and without exposing secrets in your stack configuration. 這個其實可以想成,在 Docker 裡面有一個很方便的佈署方式,就是利用 docker-compose。也就是說在 K8s 會需要寫類似這種性質的設定檔,而且這設定檔可以一次寫多台機器上不同的容器,因此當根據這設定檔佈署,就能完成多個容器到多個機器上的效果。 當需要佈署容器越多的話,所需要寫 K8s 設定檔就會用複雜。有經驗工程師就會設法在寫一個好用的工具去寫設定檔,最知名的就是Helm。 ### 為什麼又叫 K8s 從第一個字首 K 到字尾 S 之間總共有 8 個英文字母,所以為了不想寫那麼多字母,就寫成 K8s。所以文章後面也用 K8s 來簡短的書寫 XD ### K8s的起源 其實,起源是因為 Google 公司內部的工程師們發明了一個Borg系統,只是並沒有開源,只能用在 Google 公司內部。最後 Google 公司裡面的工程師將其 Borg 系統經過改良造就了現在的 K8s 系統,並宣布開源,將 K8s 所有權交由 Linux 基金會來使用。 ### K8S的架構 * 一群電腦組成的叢集(Cluster) * 叢集中的每一台電腦稱為一個節點(node) * 大部分的節點用來執行佈署的應用程式(至少一台) * 少部分的節點用來控制整個叢集(至少一台) * 用來真正執行應用程式的節點稱之為Worker * 用來控制整個叢集的節點稱之為Master * 一群由Master組成的控制節點稱之為Controll Plane * 要有一個客戶端來,客戶端可以安裝在任何連接至Master的電腦 * ![](https://i.imgur.com/7Zdx8Rn.png) ## k8s的元件 ### Master主機部分 也就是一個 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是一個資料庫,詳情可參考[其官網](https://etcd.io/)。是一個分散式的KV資料庫。 用來存放 Kubernetes Cluster 的資料,並將資料持久化,不會因為沒存到而遺漏資料,而當 Master 因為某些原因而故障時,可以透過 etcd 幫我們還原 Kubernetes 的狀態. 更完整的架構 ![](https://i.imgur.com/dU70Qpf.png) ### Worker 也就是非 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的工作流程 根據K8s Cluster 裡面的架構,就是工程師會透過下指令到 API Server 進行佈署等操作。而 User 使用我們佈署在 K8s 上的應用程式服務的時候,每個 Worker Node 的 kube-proxy 會根據 URL 去 Mapping 到要轉發到哪個 Pod 裡面的容器去服務。 重點就是Pod 設定檔撰寫開始操作,就是`yaml`格式的檔案。