首頁>技術>

Kubernetes 是一種容器編排工具,用於管理、部署、擴充套件容器化應用。在k8s中管理操作的最小單位是pod,而不是直接操作容器(比如docker)。下面就是管理pod 的集中方式:

ReplicaSetDeploymentsStatefulSetsDeamonSet
Why

既然我們有了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。

最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • WEB報表開發工具哪個好?主流.NET報表控制元件對比測評