Concept
What is Kubernetes
用來管理 App 的備援(Replica 的管理)。
- 平衡負載。
- Storage Orchestration。
- 自動降版。
- Automatic bin packing:可以定義每個 container 可以存取的 CPU 及 RAM。
- 自動修復:如果 App 掛了,會自動重啟 container 並取代之。
- 敏感資料管理。
Control Plane Component
由數個小型服務組成,這些小型服務不需要建置在同台機器上。
- kube-apiserver:Kubernetes API server,可以不只一顆。
- etcd:用來儲存所有 cluster 的 data(應該是設定檔)。
- 簡單的鍵值對。
- kube-scheduler:用來管理新建的 pods 要放到哪個 node 去。
- kube-controller-manager:
- Node Controller
- Replication Controller
- Endpoints Controller
- Service Account & Token Controllers
- cloud-controller-manager
Node Component
跑在 Node 上,管理運行中的 Pod、提供 K8S 需要的 Runtime 環境。
- kubelet:負責管理 Pod 及其中的 Container。
- 依照 PodSpec 管理 Pod。
- kube-proxy:管理 Node 上的網路,讓網路能夠跟 Pod 通訊。
- Container runtime
Addon
好像沒什麼好說的... 就是可以裝 addon 的意思...
Cluster
由一個 Master, 即至少 1 個 Node 組成。
Master
管理整個 Cluster 及 Nodes。
Node
用來執行 Cluster 的業務/工作。
- 運行容器化的 App。
- 可以是個 VM、實體電腦。
- kubelet:用來管理 Node 並與 Master 溝通。
- 使用 Kubernetes API 與 Master 溝通
- 包含管理 Container 的工具,例如:Containerd、Docker。
Kubernetes Deployment
用來告訴 Kubernetes 如何建立/更新 App(應用程式)的 Instances。
- 創建 Instance 後,Kubernetes Deployment Controller 會持續監控 Instance。如果該 Instance 壞掉,Controller 會用其他 Node 上的 Instance 替代。
- Deployment 會創建 Pod(s) 來管理 App Instancec。
kubectl create deployment [DEPLOYMENT_NAME] --image=[DOCKER IMAGE]
建立 Deployment 並部署 App(應用程式)。
- Step 1. 搜尋合適的 Node 。
- Step 2. 安排(schedule)運行 App 在該 Node 上。
- Step 3. 控制 Cluster 以在需要的時候重新安排(reschedule)App Instance。
kubectl delete deployment [DEPLOYMENT_NAME]
刪除 Deployment。
Viewing Pods and Nodes
Pod
- 內含至少 1 個 Containerized App。
- 內含用以管理內部 Apps 的資訊。例如:Image Version、Ports 的使用狀況。
- Pod 內的 Apps 共用儲存空間(ex. Volumn)。
- Pod 內的 Apps 共用 Cluster 派發的 IP 及 Port。
- 有生命週期,跟著 Node。
範例:
一 Pod 內包含
- Container 執行 Node.js app server
- Container 執行 Node.js data server
app server 自 data server 獲取需要的資訊
kubelet get pods
取得所有 pods 的列表
kubelet describe pods
取得所有 pods 的資訊
kubelet logs [POD_NAME]
印出 pod 中的 log
kubelet exec [POD_NAME] -- [CMD]
在 pod 中執行 commandline 指令
Node
- 用來運行 Pod。
- 一個 Node 上可以運行多個 Pod。
- 可為 VM、實體電腦。
- 至少包含:
- Kubelet:與 Master 溝通;並管理旗下的 Pods、Container Runtime。
- Container Runtime:用以運行 App。
Service
A Kubernetes Service is an abstraction layer which defines a logical set of Pods and enables external traffic exposure, load balancing and service discovery for those Pods.
- 可以透過
.ymal檔定義。 - 解開 Pods 間的耦合。
- 可以用 LabelSelector 來控制 Service 要用哪一組 Pods。
Export Pod IP
可以透過定義 ServiceSpec 的 type,來進行 export。type 有以下幾種類型:
-
ClusterIP:預設值;只能在 Cluster 中存取 Service。
-
NodePort:
[NODE_IP]:[NODE_PORT],ClusterIP 的父集合。 -
LoadBalancer:固定 IP,NodePort 的父集合。
-
ExternalName:有點類似自定義的 DNS 的 Domain Name。
從 Deployment 到 Service
- Step 1:創建 Deployment
- Step 2:
kubectl expose deployments/[DEPLOYMENT_NAME] --type=[SERVICE_TYPE] --port=[EXPORTED_PORT][SERVICE_TYPE]:ClusterIP、NodePort、LoadBalancer、ExternalName[EXPORTED_PORT]:Pod 中要被外部存取的 port
kubectl describe services/[DEPLOYMENT_NAME] 中的 NodePort 即可透過 localhost:XXXX 存取。
透過上述方式創建的 Service 會由 K8S 指派 Label app=[DEPLOYMENT_NAME] 一樣。
可以透過 kubectl delete service [SERVICE_NAME] 刪除 service
增加 App 的分身 (Replica)
增加 App 的分身(Replicas);也就是增加 Pod。
kubectl scale deployments/[DEPLOYMENT_NAME] --replicas=[NUMBER]
更新 App
Kubernetes 更新 app 時為漸進式的,能夠在服務不中斷的情況下進行升級。
- Kubernetes 會逐一的替換掉 Deployments 中的 Pod:創建一新版 App 的 Pod 後,關掉一舊版 App 的 Pod。
- 更新過程中新舊版的 App 都有可能連到,端看 Kubernetes 的調度。
kubectl set deployments/[DEPLOYMENT_NAME] [IMAGE_NAME]=[NEW_IMAGE_WITH_VERSON_CODE]