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
15會員
40內容數
記錄IT社畜的自我學習筆記,如同專題名稱,主要是怕自已忘記自已做過什麼、學到什麼。索性就分享我自已在學習Kubernetes這條路上的各種測試、學習心得。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
超健忘閒人的沙龍 的其他內容
所謂daemonset,簡單來說就是在每個節點上部署一個Pod副本。當今天有新的主機節點加入時,就自動再上面部署一個Pod副本。移除節點時,也會自動將Pod副本移除。
本文將說明關於Local volume 與hostPath二種類型的差異與一些注意事項。
因為想要使用FQDN的方式連接到Kubernetes cluster內部的應用服務,加上早已使用Linux Bind為測試環境的主要DNS
今天分別針對3個基本中的基本資源物件類型來說明
在建置完Kubernetes cluster之後,通常我會做的前幾件事之一就是建立一個StorageClass給應用服務使用,而NFS我認為是相對容易實現的做法。
本文針對Kubernetes內最基本的資源(cpu, ram, disk)的計算單位與一些實務操作,分享給自已與大家做參考。
所謂daemonset,簡單來說就是在每個節點上部署一個Pod副本。當今天有新的主機節點加入時,就自動再上面部署一個Pod副本。移除節點時,也會自動將Pod副本移除。
本文將說明關於Local volume 與hostPath二種類型的差異與一些注意事項。
因為想要使用FQDN的方式連接到Kubernetes cluster內部的應用服務,加上早已使用Linux Bind為測試環境的主要DNS
今天分別針對3個基本中的基本資源物件類型來說明
在建置完Kubernetes cluster之後,通常我會做的前幾件事之一就是建立一個StorageClass給應用服務使用,而NFS我認為是相對容易實現的做法。
本文針對Kubernetes內最基本的資源(cpu, ram, disk)的計算單位與一些實務操作,分享給自已與大家做參考。
你可能也想看
Google News 追蹤
Thumbnail
現代社會跟以前不同了,人人都有一支手機,只要打開就可以獲得各種資訊。過去想要辦卡或是開戶就要跑一趟銀行,然而如今科技快速發展之下,金融App無聲無息地進到你生活中。但同樣的,每一家銀行都有自己的App時,我們又該如何選擇呢?(本文係由國泰世華銀行邀約) 今天我會用不同角度帶大家看這款國泰世華CUB
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
這篇文章將提供一個完整的Kubernetes安裝指南,包括控制平面節點和工作節點的安裝過程。文章中還會提及一些參考資料和解決常見錯誤的方法。
Thumbnail
KSQL引擎, 串流形式的SQL? 聽了應該霧煞煞吧! 想像一下傳統的SQL, 是不是一個指令一個動作, 每發送一個指令之後就必須等到查詢/寫入…動作皆完成之後才回應, 然而在Streaming的應用上這顯然不太可行, 每分每秒都有資料流入的情境下, 資料的狀態都在變化, 假設我們一個指令一個動作,
Thumbnail
※ 靜態資源回傳 ※ 什麼是靜態資源: 定義:是指事先準備好的資源,這些資源在伺服器上是靜態的、不會隨著每個請求而改變。 資源通常包括: 靜態 HTML 文件。 CSS。 圖像(Image)。 Video。 字體文件:google fonts。 favicon:網頁名稱旁邊的ico
Thumbnail
在實際生產中,容器化技術開始走向「容器編排技術」,如:Kubernetes。因為Docker無法獨立支撐大規模容器化部署。 Kubernetes起源於Borg系統,所以在大規模的叢集管理,優於其他容器編排技術。它提供拉取映像檔、拉取執行容器、路由閘道、水平擴充、監控和備份等,除外還可以自動化處理容
微服務是一種分散式的專案架構,換個說法,就是將一個專案做“應用切割”,切出數個可以獨立執行的應用,如此可以降低耦合性,並提升敏捷性。 特點 低耦合 獨立部署 高可維護性 高可測試性
Thumbnail
IaaS 以虛擬化原理運作,企業可從雲端服務商那裡獲得運算、儲存和資料庫等服務,不再需要自己購買設備、管理設備,或託管設備的空間。
Thumbnail
IaaS是一種雲端服務模型,所使用的運算資源託管在公有雲 、私有雲或混合雲中,能將傳統IT硬體設備統整為虛擬的運算資源,而得以針對運算需求彈性地調配資源。
Thumbnail
Service Worker 是用於客戶端的攔截器,可以使用 Cache Storage 和 IndexDB,並有自己的生命週期。Web Worker 用於處理可能會使用到大量運算且不希望影響到使用者體驗的任務。Shared Worker 可以在相同 Domain 的不同頁面上共享訊息。
Thumbnail
引言 在當今的技術世界中,Kubernetes 已成為容器化應用的領導平台。作為一個高效的容器編排系統,它不僅管理著容器的部署和擴展,還提供了必要的自動化支持,以保證應用的高可用性和性能。在這個框架中,自動擴展功能起著至關重要的作用,特別是在面對不斷變化的負載和需求時。
Thumbnail
Redis被稱為「資料結構伺服器」,因為其中的值(Value)可以是字串(String)、雜湊(Hash)、清單(List)、集合(Set)和有序集合(Sorted Set)等類型。 安裝 下載 wget https://download.redis.io/release/redis-6.
Thumbnail
現代社會跟以前不同了,人人都有一支手機,只要打開就可以獲得各種資訊。過去想要辦卡或是開戶就要跑一趟銀行,然而如今科技快速發展之下,金融App無聲無息地進到你生活中。但同樣的,每一家銀行都有自己的App時,我們又該如何選擇呢?(本文係由國泰世華銀行邀約) 今天我會用不同角度帶大家看這款國泰世華CUB
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
這篇文章將提供一個完整的Kubernetes安裝指南,包括控制平面節點和工作節點的安裝過程。文章中還會提及一些參考資料和解決常見錯誤的方法。
Thumbnail
KSQL引擎, 串流形式的SQL? 聽了應該霧煞煞吧! 想像一下傳統的SQL, 是不是一個指令一個動作, 每發送一個指令之後就必須等到查詢/寫入…動作皆完成之後才回應, 然而在Streaming的應用上這顯然不太可行, 每分每秒都有資料流入的情境下, 資料的狀態都在變化, 假設我們一個指令一個動作,
Thumbnail
※ 靜態資源回傳 ※ 什麼是靜態資源: 定義:是指事先準備好的資源,這些資源在伺服器上是靜態的、不會隨著每個請求而改變。 資源通常包括: 靜態 HTML 文件。 CSS。 圖像(Image)。 Video。 字體文件:google fonts。 favicon:網頁名稱旁邊的ico
Thumbnail
在實際生產中,容器化技術開始走向「容器編排技術」,如:Kubernetes。因為Docker無法獨立支撐大規模容器化部署。 Kubernetes起源於Borg系統,所以在大規模的叢集管理,優於其他容器編排技術。它提供拉取映像檔、拉取執行容器、路由閘道、水平擴充、監控和備份等,除外還可以自動化處理容
微服務是一種分散式的專案架構,換個說法,就是將一個專案做“應用切割”,切出數個可以獨立執行的應用,如此可以降低耦合性,並提升敏捷性。 特點 低耦合 獨立部署 高可維護性 高可測試性
Thumbnail
IaaS 以虛擬化原理運作,企業可從雲端服務商那裡獲得運算、儲存和資料庫等服務,不再需要自己購買設備、管理設備,或託管設備的空間。
Thumbnail
IaaS是一種雲端服務模型,所使用的運算資源託管在公有雲 、私有雲或混合雲中,能將傳統IT硬體設備統整為虛擬的運算資源,而得以針對運算需求彈性地調配資源。
Thumbnail
Service Worker 是用於客戶端的攔截器,可以使用 Cache Storage 和 IndexDB,並有自己的生命週期。Web Worker 用於處理可能會使用到大量運算且不希望影響到使用者體驗的任務。Shared Worker 可以在相同 Domain 的不同頁面上共享訊息。
Thumbnail
引言 在當今的技術世界中,Kubernetes 已成為容器化應用的領導平台。作為一個高效的容器編排系統,它不僅管理著容器的部署和擴展,還提供了必要的自動化支持,以保證應用的高可用性和性能。在這個框架中,自動擴展功能起著至關重要的作用,特別是在面對不斷變化的負載和需求時。
Thumbnail
Redis被稱為「資料結構伺服器」,因為其中的值(Value)可以是字串(String)、雜湊(Hash)、清單(List)、集合(Set)和有序集合(Sorted Set)等類型。 安裝 下載 wget https://download.redis.io/release/redis-6.