--- lang: zh-tw title: Kubernetes Architecture tags: K8s --- # Kubernetes Architecture ![Components of Kubernetes](https://i.imgur.com/XdAAg2U.jpg) 1. Cluster至少包含一個Master跟一個Node 2. Master(Control Plane):調度整個Cluster,負責控制所有Node執行必要的容器、調度哪些Pods要排安到哪個Nodes運作、儲存Cluster運作過程的所有狀態 ## Kubernetes Control Plane(Master) ||| | -------- | -------- | |kube-apiserver|管理K8s API接口,也負責Node之間溝通 | |etcd |Key-Value資料庫,存放Cluster所有資料 | |kube-scheduler|負責Pod調度,安排Pod到適合的Node運行| |kube-controller-manager|管理並運行Controller| 1. Master 指的是Cluster控制節點,負責整個Cluster的管理和控制 2. Kubernetes所有控制指令都發給Master,它來負責實際的執行過程 3. kube-apiserver:管理Kubernetes API接口,kubectl的指令就會把指令送到這裡;負責Node之間溝通,每個Node不能直接溝通,必須透過apiserver 4. etcd:Key-Value資料庫,存放Cluster的資料作為備份,當Master因為某些原因而故障時,可以透過etcd還原Kubernetes的狀態 5. kube-scheduler:Kubernetes的Pods調度員,會監視新建立但尚未被指定要在哪個Node上執行的Pod,並選擇最適合放置的Node,讓該Pod在上面運行 6. kube-controller-manager:負責管理並運行controller 6-1. Node Controller:Node故障時進行通知和回應 6-2. Replication Controller:維護正確數量的Pod 6-3. Endpoints Controller:加入Service與Pod 6-4. Service Account & Token Controllers:為新的Namespace建立預設帳戶和API Token ## Kubernetes Node(Minions) ||| | -------- | -------- | |kubelet|管理Pod狀態並與Master溝通| |kube-proxy|實現Service的通訊與負載平衡機制的元件| |Container Runtime|負責本機容器建立與管理,ex: Docker, containerd, cri-o, rktlet| 1. 早期版本也被稱為 Minion 2. 可以是實體機也可以是虛擬機 3. Node才是Kubernetes Cluster中的工作節點 4. 每個Node都會被Master分配一些Pod 5. 當某個Node當機,上面的Pod會被Master自動傳輸到其它Node ## Kubernetes Cluster ![](https://i.imgur.com/gSuNK4m.jpg =70%x) ## Node ![](https://i.imgur.com/6MwDnCm.jpg =70%x) Node是K8s中負責容器運行的機器,多個Pod可以在一個Node上運行 ## Pod ![](https://i.imgur.com/R8yYNqU.jpg =70%x) 一組(一個或多個)容器,容器共用Storage, Network,以及如何運行的Sepc ## Architecture Summary + Cluster至少包含一個Master(Control-Plane)跟一個Worker(Node, Minions) + Master包含:api-server, etcd, scheduler, controller-manager + Master會調度Pods要到哪個Node運作,儲存叢集運作過程的狀態 + Node提供K8s運行的環境、管理所有容器運行,並監控運行的Pod狀態 + 每個Node都包含:kubelet, kube-proxy, Container Runtime + Pod是一組(一個或多個)容器,容器共用Storage與Network,以及容器如何運行的Spec ## 實作 Create a Cluster 使用 WSL2 + KinD 建立學習環境叢集 Note: Google Cloud SDK [官網](https://cloud.google.com/sdk/docs/quickstarts?hl=zh-tw) 安裝kubectl工具 sudo apt-get install kubectl # or gcloud components install kubectl 查看kubectl 工具版本 kubectl version --short 更新Client版本 curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.17.0/bin/linux/amd64/kubectl chmod +x ./kubectl sudo mv ./kubectl /usr/local/bin/kubectl KinD [官網](https://kind.sigs.k8s.io/docs/user/quick-start/) 建立Single Node叢集 kind create cluster --name k8s-cluster 確認安裝kubectl kubectl version 查看Cluster資訊 kubectl cluster-info 查看Node資訊 kubectl get nodes 提供worker label kubectl label node kind-worker node-role.kubernetes.io/worker=worker 查看Node描述,列出所有可用host kubectl describe nodes $NODE_NAME