Kubernetes 是一種容器編排工具,用於管理、部署、擴充套件容器化應用。在k8s中管理操作的最小單位是pod,而不是直接操作容器(比如docker)。下面就是管理pod 的集中方式:
ReplicaSetDeploymentsStatefulSetsDeamonSetWhy
既然我們有了ReplicaSet, Deployments 和 DeamonSet。為什麼還需要StatefulSets呢?顧名思義看的出來這是針對有狀態的應用,前面三種都是針對無狀態的。有狀態應用常見包括MySQL、kafka等。本文我們就主要關注下K8S 中StatefulSets如何管理有狀態的應用的。
StatefulSets
StatefulSets 用於管理K8S中的有狀態應用。StatefulSets 中的pods用唯一標識和穩定的主機名命名。它將狀態資訊和其他彈性資料儲存在持久卷中。該永久卷已附加到基於雲的儲存。它將負責維護您的應用程式狀態。
在StatefulSet上下文中的持久卷宣告,因此在建立StatefulSet並建立每個副本時,Kubernetes會繼續為StatefulSet中的每個副本建立一個不同的磁碟。
現在,當Kubernetes啟動時,可以執行復制的唯一方法是使用ReplicaSet。使用副本集,每個副本都完全相同。他們的應用程式名稱末尾有隨機雜湊。並且如果發生縮放事件(例如,按比例縮小),則會隨機選擇一個容器並將其刪除。這些特性使ReplicaSet很難對映到有狀態的應用程式。許多有狀態應用程式期望其主機名是恆定的。因此,使用ReplicaSet和有狀態應用程式的那些複雜性導致了StatefulSets的最終開發。Kubernetes中的StatefulSets與ReplicaSet類似,但是它增加了一些保證,使在Kubernetes內部管理狀態應用程式變得更加容易。
apiVersion: apps/v1kind: StatefulSetmetadata: name: mysqlspec: selector: matchLabels: app: mysql serviceName: mysql replicas: 3 template: metadata: labels: app: mysql spec: initContainers: - name: init-mysql image: mysql:5.7 command: - bash - "-c" - | set -ex # Generate mysql server-id from pod ordinal index. [[ `hostname` =~ -([0-9]+)$ ]] || exit 1 ordinal=${BASH_REMATCH[1]} echo [mysqld] > /mnt/conf.d/server-id.cnf # Add an offset to avoid reserved server-id=0 value. echo server-id=$((100 + $ordinal)) >> /mnt/conf.d/server-id.cnf # Copy appropriate conf.d files from config-map to emptyDir. if [[ $ordinal -eq 0 ]]; then cp /mnt/config-map/master.cnf /mnt/conf.d/ else cp /mnt/config-map/slave.cnf /mnt/conf.d/ fi volumeMounts: - name: conf mountPath: /mnt/conf.d - name: config-map mountPath: /mnt/config-map volumeClaimTemplates: - metadata: name: data spec: accessModes: ["ReadWriteOnce"] resources: requests: storage: 10Gi
.StatefulSet的工作與Deployment相似,但是在StatefulSet中,容器的部署按順序進行。與其一口氣地部署所有容器,不如一步一步地部署它。一旦第一個Pod部署並準備就緒,則只有第二個Pod可以啟動。為了獲得正確的參考,這些吊艙的名稱帶有唯一的ID,可在其中展示唯一的身份。因此,例如,如果有3個MySQL Pod,名稱將為mysql-0,mysql-1和mysql-2。並且,如果這些Pod中的任何Pod失敗,則StatefulSets將部署具有相同名稱的新Pod。StatefulSets需要無頭服務來管理唯一身份。下圖顯示了StatefulSets的體系結構:
在StatefulSet中縮放
當Kubernetes決定擴大或縮小StatefulSet時,它會以一種易於理解的方式做到這一點。例如,當您最初建立StatefulSet時,將建立第一個副本,Kubernetes將在建立第二個副本之前等待其變得正常且可用。這意味著在建立第二個副本時,您可以依賴於零索引(第一個副本)可供您連線的事實。它可以指向StatefulSet的原始成員。這使得在建立有狀態應用程式時,集合點宣告初始領導者和其他許多其他必要的事情變得容易得多。
結論因此,希望可以舉例說明如何在Kubernetes中部署有狀態應用程式,以及如何將StatefulSets用於此類應用程式。此部落格之後的下一步將是繼續並建立一個StatefulSet。