Open mangreen opened 5 years ago
藍色部分是高層次的 K8s 抽象,綠色部分描述的是 Node 以及其中的 Node 子進程。
Deployment 運行的無狀態應用 創建和管理 ReplicaSet
ReplicaSet 會確保你的 APP 具有指定數量的 Pod。 ReplicaSet 根據 Deployment 中設定的指標來創建和擴展 Pod。
Pod 是 K8s 中的基本構建單元。 一個 Pod 中可以包含多個 Container,但通常是包含一個。 Pod 負責處理容器的數據卷、密鑰、配置。 Pod 的生命週期是不確定的,可能非常短暫,但 Pod 具有很強的再生能力,在死後可以自動重新啟動。 當 ReplicaSet 對 APP 進行水平擴展的時候,就會複製 Pod,每個 Pod 運行相同的容器代碼。 Pod 生存在 Worker Node 上
K8s 羣集由 Master Node(主節點) 和 Worker Node(工作節點) 組成。
下圖是集羣結構描述圖,一個 Worker Node 中可以運行多個 Pod,Master 負責管理這些 Worker Node。
Master 和 Worker Node 中都有子進程組件。
如果要與K8s一起運行,則應用程序必須放在某種容器中。 Docker是最常見的容器平台。我們假設您正在使用它。 Docker =/= Container 在創建 Deployment 時,你會指定 Pod 應該使用哪個 Docker 鏡像。 K8s 不會直接創建容器,而是創建包含容器的 Pod。 Pod 中的容器共享一切已經配置好的資源,例如數據卷存儲。
https://godleon.github.io/blog/Kubernetes/k8s-StatefulSets-Overview/
什麼時候需要使用 StatefulSet?
而到底如何研判某某 application 是否需要使用 StatefulSet 來佈署呢? 如果有符合以下條件,就需要使用 StatefulSet 來進行佈署:
- 需要穩定 & 唯一的網路識別 (pod reschedule 後的 pod name & hostname 都不會變動)
- 需要穩定的 persistent storage (pod reschedule 後還是能存取到相同的資料,基本上用 PVC 就可以解決)
- 佈署 & scale out 的時後,每個 pod 的產生都是有其順序且逐一慢慢完成的
- 進行更新操作時,也是與上面的需求相同
根據 Kubernetes Pod Lifecycle [1],當 Pod 要被刪除時會由 kubelet 觸發 Container runtime 發出 SIGTERM signal 給每一個 Pod 內 container 的 process 1,倘若超出了 terminationGracePeriodSeconds 所設定時間(預設 30 秒),則會發出 SIGKILL signal 強制終止 process 而造成不預期的錯誤。若其中 Container 中定義使用了 preStop hook,kubelet 會執行完 preStop hook [2] 後才會發出 SIGTERM signal。
Kubernetes 的 HPA 原理详解
GKE
1. Login