Kubernetes有狀態服務
簡介(未完成)
- 集大成者——StatefulSet
集大成者——StatefulSet
StatefulSet 的設計其實非常容易理解。它把真實世界的應用狀態,抽象為了兩種情況:
- 拓撲狀態,比如應用的主節點 A 要先於從節點 B 啟動
- 儲存狀態,應用的多個例項分別綁定了不同的儲存資料
StatefulSet 的核心功能,就是通過某種方式記錄這些狀態,然後在 Pod 被重新建立時,能夠為新 Pod 恢復這些狀態。程式 = 資料結構 + 演算法。新增了一個功能,一定在資料表示上有體現(對應資料結構),一定在原來的工作流程中有體現或者改了工作流程(對應演算法)
StatefulSet 這個控制器的主要作用之一,就是使用Pod 模板建立 Pod 的時候,對它們進行編號,並且按照編號順序逐一完成建立工作。而當 StatefulSet 的“控制迴圈”發現 Pod 的“實際狀態”與“期望狀態”不一致,需要新建或者刪除 Pod 進行“調諧”的時候,它會嚴格按照這些Pod 編號的順序,逐一完成這些操作。所以,StatefulSet 其實可以認為是對 Deployment 的改良。
StatefulSet 裡的不同 Pod 例項,不再像 ReplicaSet 中那樣都是完全一樣的,而是有了細微區別的。比如,每個 Pod 的 hostname、名字等都是不同的、攜帶了編號的。Kubernetes 通過 Headless Service,為這些有編號的 Pod,在 DNS 伺服器中生成帶有同樣編號的 DNS 記錄。StatefulSet 還為每一個 Pod 分配並建立一個同樣編號的 PVC。
DNS for Services and Pods
“Normal” (not headless) Services are assigned a DNS A record for a name of the formmy-svc.my-namespace.svc.cluster.local
. Headless Service 所代理的所有 Pod 的 IP 地址,都會被繫結一個這樣格式的 DNS 記錄<pod-name>.<svc-name>.<namespace>.svc.cluster.local
通過 Headless Service 的方式,StatefulSet 為每個 Pod 建立了一個固定並且穩定的 DNS記錄,來作為它的訪問入口。在部署“有狀態應用”的時候,應用的每個例項擁有唯一併且穩定的“網路標識”,是一個非常重要的假設。
Persistent Volume Claim 和 PV 的關係。運維人員建立PV,告知有多少volume。開發人員建立Persistent Volume Claim 告知需要多少大小的volume。建立一個 PVC,Kubernetes 就會自動為它繫結一個符合條件的Volume。即使 Pod 被刪除,它所對應的 PVC 和 PV 依然會保留下來。所以當這個 Pod 被重新創建出來之後,Kubernetes 會為它找到同樣編號的 PVC,掛載這個 PVC 對應的 Volume,從而獲取到以前儲存在 Volume 裡的資料。