K8S部署好幫手:掌握StatefulSet

更新於 發佈於 閱讀時間約 17 分鐘

本篇將說明關於StatefulSet的基本概念,因為怕太長,所以關於部分測試再分成另一篇文章來說明。

本文將說明:

  1. What is StatefulSet? 有那些特性?
  2. Headless service
  3. StatefulSet 管理方式
  4. StatefulSet 更新策略



1. What is StatefulSet? 有那些特性?

針對”有狀態”的服務使用,例如如果是使用了db cluster時,ReplicaSet會因為ID不固定(random)而無法使服務正常運行,並且由於要接回原本的volume,也必須要透過這種方式實現。

每個服務都有各自的需求

每個服務都有各自的需求

特性如下:

  • 穩定、唯一的網路ID
  • 穩定、持久化的儲存
  • 有順序的部署與縮放
  • 有順序的刪除與終止
  • 有順序、自動的滾動更新針對”有狀態”的服務使用,例如如果是使用了db cluster時,ReplicaSet會因為ID不固定(random)而無法使服務正常運行,並且由於要接回原本的volume,也必須要透過這種方式實現。

2. Headless service

一般來說,K8S的Service可以再細分成以下二種:

  • 普通的Service:訪問mysvc.mynamespace.svc.cluster.local就是透過DNS服務解析到的mysvc的cluster IP
  • Headless Service:訪問mysvc.mynamespace.sve.cluster.local時,直接解析到mysvc代理的某一個實體Pod IP,中間少了cluster IP轉發。
Headless Service不需要分配一個VIP,kube-proxy不會處理它們,
平台也不會為它們進行load balancer和路由,而是直接以DNS record的方式解析到後面Pod IP
apiVersion: v1
kind: Service
metadata:
name: nginx
namespace: example
labels:
app: nginx
spec:
ports:
- name: http
port: 80
clusterIP: None <-- headless主要差別為None
selector:
app: nginx

=> 服務建立後,不會分配cluster ip, 要改用DNS recored的方式暴露所代理的Pod
服務發現

服務發現

Headless Service在資料庫集群等應用中非常有用,因為它允許應用程式直接連接到資料庫的各個實例,而無需通過代理或負載均衡器。

Headless Service也可用於服務發現,因為它提供了一個可靠的方式來查找和連接到後端Pod。這對於微服務架構中的動態服務發現非常有用。



3. StatefulSet 管理方式

預設的管理策略為OrderedReady(照上下文的順序)。可以改成Parallel(讓controller 平行終止所有Pod),這種方式可以在啟動或終止另一個Pod之前,不用等其他Pod的狀態。

apiVersion: v1
kind: Service
metadata:
name: nginx-ordered
namespace: nginx-sts
labels:
app: nginx
spec:
ports:
- name: http
port: 80
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web-sts
namespace: nginx-sts
spec:
podManagementPolicy: OrderedReady
serviceName: "nginx-ordered"
replicas: 6
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
raw-image
### 確認Pod建立順序
# kubectl get pod -l app=nginx -w -n nginx-sts
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 99s
web-1 1/1 Running 0 98s
web-2 1/1 Running 0 95s

### 確認Pod刪除順序
# kubectl delete -f nginx-sts-ordered.yaml -n nginx-sts
# kubectl get po -l app=nginx -w -n nginx-sts

接下來,進行StatefulSet controller部署有狀態服務套用Policy控制的測試(Policy: Parallel):

apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web-sts
namespace: nginx-sts
spec:
podManagementPolicy: Parallel
serviceName: "nginx-parallel"
replicas: 6
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
### 確認Pod建立順序
# kubectl create -f nginx-sts-parallel.yaml -n nginx-sts ; kubectl get pod -l app=nginx -w -n nginx-sts
raw-image
### 確認Pod刪除順序
# kubectl delete -f nginx-sts-parallel.yaml -n nginx-sts ; kubectl get pod -l app=nginx -w -n nginx-sts
raw-image

4. StatefulSet 更新策略

StatefulSet也支援2種升級策略:onDeleteRollingUpdate

  • onDelete: StatefulSet template更新後,只有手動刪除舊的Pod才會創建新的Pod
  • RollingUpdate: StatefulSet template更新後會自動刪除舊的Pod並建立新的Pod,有錯誤出現則全部停止。(PS. Pod部署時是依序從0~n,更新時則以n~0先一次刪除後再創建)
依序產生、依序更新

依序產生、依序更新

### RollingUpdate: 建立statefulset
# kubectl create -f nginx-sts-parallel.yaml -n nginx-sts; kubectl get pod -l app=nginx -w -n nginx-sts
statefulset.apps/web created
NAME READY STATUS RESTARTS AGE
web-0 0/1 ContainerCreating 0 0s
web-1 0/1 ContainerCreating 0 0s
web-2 0/1 ContainerCreating 0 0s
web-3 0/1 ContainerCreating 0 0s
web-4 0/1 ContainerCreating 0 0s
web-5 0/1 ContainerCreating 0 0s
web-3 0/1 ContainerCreating 0 1s
web-0 0/1 ContainerCreating 0 1s
web-2 0/1 ContainerCreating 0 1s
web-1 0/1 ContainerCreating 0 1s
web-4 0/1 ContainerCreating 0 2s
web-2 1/1 Running 0 2s
web-3 1/1 Running 0 2s
web-5 0/1 ContainerCreating 0 3s
web-0 1/1 Running 0 3s
web-1 1/1 Running 0 3s
web-4 1/1 Running 0 4s
web-5 1/1 Running 0 4s
### 使用edit, 修改容器image (or edit YAML)
# kubectl patch statefulset web -n nginx-sts --type='json' -p='[{"op": "replace", "path":"/spec/template/spec/containers/0/image", "value":"nginx:latest"}]'
### RollingUpdate: 確認變化
# kubectl get pod -l app=nginx -w -n nginx-sts### RollingUpdate:
raw-image
### RollingUpdate: 查看滾動更新狀態
# kubectl rollout status sts web -n nginx-sts
partitioned roll out complete: 6 new pods have been updated...

以下說明利用上述更新方式實現應用服務的Partitions(分段更新):Pod序號大於或等於Partition的pod會在Statefulset template更新後進行rollingUpdate, 其他的則不變。

例如:web0~web-9, partition設為3,只會更新web3~web-9,web0~web2不會更新,實現灰度發佈

apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
namespace: nginx-sts
spec:
podManagementPolicy: OrderedReady
serviceName: "nginx-partition"
replicas: 6
updateStrategy:
type: RollingUpdate
rollingUpdate:
partition: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteMany" ]
resources:
requests:
storage: 1Gi
### RollingUpdate: 確認目前狀態
# kubectl get pod -l app=nginx -w -n nginx-sts

NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 110s
web-1 1/1 Running 0 109s
web-2 1/1 Running 0 108s
web-3 1/1 Running 0 107s
web-4 1/1 Running 0 105s
web-5 1/1 Running 0 104s
### RollingUpdate: 觸發更新image 版本,啟動rollingupdate
# kubectl get pod -l app=nginx -w -n nginx-sts
# kubectl patch statefulset web -n nginx-sts --type='json' -p='[{"op": "replace", "path":"/spec/template/spec/containers/0/image", "value":"nginx:latest"}]'
raw-image
### RollingUpdate: 確認pod內的image版本, 因partition=2, 故應為web2~5會有變化
# kubectl get pod web-1 -o yaml -n nginx-sts |grep image
# kubectl get pod web-2 -o yaml -n nginx-sts |grep image
raw-image

參考資料:https://zhuanlan.zhihu.com/p/593507921

留言
avatar-img
留言分享你的想法!
avatar-img
超健忘閒人的沙龍
15會員
40內容數
記錄IT社畜的自我學習筆記,如同專題名稱,主要是怕自已忘記自已做過什麼、學到什麼。索性就分享我自已在學習Kubernetes這條路上的各種測試、學習心得。
2024/05/08
本文將介紹如何在Gitlab上部署和註冊runner,以進行CI/CD測試。透過Docker-compose方式進行部署,同時注意安裝時的一些注意事項。建議學習者至少掌握一種以上的Pipeline工具,以滿足實務上的需求。
Thumbnail
2024/05/08
本文將介紹如何在Gitlab上部署和註冊runner,以進行CI/CD測試。透過Docker-compose方式進行部署,同時注意安裝時的一些注意事項。建議學習者至少掌握一種以上的Pipeline工具,以滿足實務上的需求。
Thumbnail
2024/04/19
上一篇說明了如何在Kubernetes上建立基本的MySQL standalone,並加入phpmyadmin(PMA)來進行圖形化的管理,本篇就再進階一步,實作MySQL replication架構(master-salve),並進行驗證是否成功。
Thumbnail
2024/04/19
上一篇說明了如何在Kubernetes上建立基本的MySQL standalone,並加入phpmyadmin(PMA)來進行圖形化的管理,本篇就再進階一步,實作MySQL replication架構(master-salve),並進行驗證是否成功。
Thumbnail
2024/04/09
本文記錄如何在Kubernetes環境下,部署Standalone架構的MySQL Database,並透過phpmyadmin進行管理。這篇文章將分成MySQL部署在K8S內的優勢、部署MySQL DB standalone、部署PhpMyAdmin (PMA)、結論四個部分進行說明與實作的流程。
Thumbnail
2024/04/09
本文記錄如何在Kubernetes環境下,部署Standalone架構的MySQL Database,並透過phpmyadmin進行管理。這篇文章將分成MySQL部署在K8S內的優勢、部署MySQL DB standalone、部署PhpMyAdmin (PMA)、結論四個部分進行說明與實作的流程。
Thumbnail
看更多
你可能也想看
Thumbnail
沙龍一直是創作與交流的重要空間,這次 vocus 全面改版了沙龍介面,就是為了讓好內容被好好看見! 你可以自由編排你的沙龍首頁版位,新版手機介面也讓每位訪客都能更快找到感興趣的內容、成為你的支持者。 改版完成後可以在社群媒體分享新版面,並標記 @vocus.official⁠ ♥️ ⁠
Thumbnail
沙龍一直是創作與交流的重要空間,這次 vocus 全面改版了沙龍介面,就是為了讓好內容被好好看見! 你可以自由編排你的沙龍首頁版位,新版手機介面也讓每位訪客都能更快找到感興趣的內容、成為你的支持者。 改版完成後可以在社群媒體分享新版面,並標記 @vocus.official⁠ ♥️ ⁠
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
本文將探討Kubernetes內部DNS解析的相關流程,並介紹如何利用DNS來找到服務。透過瞭解DNS的工作原理,可以讓應用服務的問題處理更有效率,並提供基本測試與結論。
Thumbnail
本文將探討Kubernetes內部DNS解析的相關流程,並介紹如何利用DNS來找到服務。透過瞭解DNS的工作原理,可以讓應用服務的問題處理更有效率,並提供基本測試與結論。
Thumbnail
本篇說明如何利用Kubernetes特色,將PostgreSQL DB以HA的架構來提供服務,並說明相關的實作流程與說明。
Thumbnail
本篇說明如何利用Kubernetes特色,將PostgreSQL DB以HA的架構來提供服務,並說明相關的實作流程與說明。
Thumbnail
從官網可以知道,我們在建立一組高可用的Kubernetes Cluster時,針對ETCD有二種做法,一種是與Master節點共用,另一種則是將ETCD再獨立出來三個節點成為一組Cluster來進行運作。 本文將說明如何建置出外部的ETCD Cluster,並以Static Pod的方式運行與管理
Thumbnail
從官網可以知道,我們在建立一組高可用的Kubernetes Cluster時,針對ETCD有二種做法,一種是與Master節點共用,另一種則是將ETCD再獨立出來三個節點成為一組Cluster來進行運作。 本文將說明如何建置出外部的ETCD Cluster,並以Static Pod的方式運行與管理
Thumbnail
本篇將補完上一篇所提到關於StatefulSet的實作部份。
Thumbnail
本篇將補完上一篇所提到關於StatefulSet的實作部份。
Thumbnail
本篇將說明關於StatefulSet的基本概念
Thumbnail
本篇將說明關於StatefulSet的基本概念
Thumbnail
因為想要使用FQDN的方式連接到Kubernetes cluster內部的應用服務,加上早已使用Linux Bind為測試環境的主要DNS
Thumbnail
因為想要使用FQDN的方式連接到Kubernetes cluster內部的應用服務,加上早已使用Linux Bind為測試環境的主要DNS
Thumbnail
什麼是 Kubernetes Deployment? 一樣先來個官網解說 A Deployment provides declarative updates for Pods and ReplicaSets. You describe a desired state in a Deployment,
Thumbnail
什麼是 Kubernetes Deployment? 一樣先來個官網解說 A Deployment provides declarative updates for Pods and ReplicaSets. You describe a desired state in a Deployment,
Thumbnail
什麼是Kubernetes Service? 先來個官網的解說 A Kubernetes Service is an abstraction which defines a logical set of Pods and a policy by which to access them. 白話文就是
Thumbnail
什麼是Kubernetes Service? 先來個官網的解說 A Kubernetes Service is an abstraction which defines a logical set of Pods and a policy by which to access them. 白話文就是
Thumbnail
Kubernetes是什麼? 1. Kubernetes是Google嚴格保密十幾年的秘密武器——Borg的一個開放原始碼版本。 2. Kubernetes是一個開放的開發平台。 3. Kubernetes是一個完備的分散式系統支撐平台。
Thumbnail
Kubernetes是什麼? 1. Kubernetes是Google嚴格保密十幾年的秘密武器——Borg的一個開放原始碼版本。 2. Kubernetes是一個開放的開發平台。 3. Kubernetes是一個完備的分散式系統支撐平台。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News