K8S: 探索StatefulSet實務操作

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

本篇將補完上一篇所提到關於StatefulSet的實作部份。

話不多說,直接先把重點說明如下:

  1. Statefulset與deployment最大的不同:Deployment內的Pod replicas 使用同一個storage,而statefulset每個replica都會各自接一個storage volume
  2. 容器化最困難的點:設計有狀態分佈元件的部署結構
raw-image
  1. Statefulset建立Pod副本會升序處理(1->2->3), 更新與刪除會降序處理(3->2->1),可透過修改podManagementPolicy的方式實現
  2. 使用headless不會隨機輪詢背後的pod,而是固定在某個pod,所以不能取代一般的Service
  3. 一般很少會直接使用StatefulSet來部署有狀態服務,新的做法建議使用Operator較好。

1. StatefulSet測試

#-----------------------------------------------
# 1-1. 準備2PV: nfs-pv
#-----------------------------------------------
# vim nfs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv001
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
nfs:
path: /var/nfsshare
server: 10.107.88.9
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv002
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
nfs:
path: /var/nfsshare
server: 10.107.88.9
#-----------------------------------------------
# 1-2. 準備2PV: nfs-sc
#-----------------------------------------------
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-storage
provisioner: kubernetes.io/no-provisioner
parameters:
type: nfs
server: 10.107.88.9
path: /var/nfsshare
# kubectl create -f nfs-sc.yaml -n example
# kubectl create -f nfs-pv.yaml -n example
# kubectl get pv -n example
raw-image

接下來要建立好service,Statefulset才能套用,Pod會按照以下格式取得DNS/hostname:pod-specific-string.serviceName.default.svc.cluster.local
其中pod-specific-string由StatefulSet controller管理

#-----------------------------------------------
# 1-3. Claim一個StatefulSet資源清單
#-----------------------------------------------
apiVersion: v1
kind: Service
metadata:
name: nginx-headless
namespace: example
labels:
app: nginx
spec:
ports:
- name: http
port: 80
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
namespace: example
spec:
serviceName: "nginx-headless" #指定一個headless service
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx # 要與上面selector一致
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80 #這個Port不會有任何訪問的功能
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates: # pvc template, 會自動建立一個pvc
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: nfs-storage
resources:
requests:
storage: 1Gi
# kubectl create -f nginx-sts.yaml -n example
# kubectl get pod -o wide -n example
raw-image

上述做法,以圖來看如下:

raw-image
#-----------------------------------------------
# 1-4. Statefulset建立Pod副本會升序處理(1->2->3), 更新與刪除會降序處理(3->2->1)
#-----------------------------------------------
S1. 依序建立web-0 -> web-1 POD
S2. 確認hostname
# kubectl exec web-0 -n example -- hostname
# kubectl exec web-1 -n example -- hostname
#-----------------------------------------------
# 1-5. 確認由誰控制(statefulset)
#-----------------------------------------------
# kubectl describe pod web-0 -n example
raw-image
#-----------------------------------------------
# 1-6. 訪問Pod內容
#-----------------------------------------------
# kubectl get pod -o wide -n example
web-0 1/1 Running 0 3h39m 10.244.84.209 worker01.dc1.k8s.poc <none> <none>
web-1 1/1 Running 0 3h39m 10.244.84.210 worker01.dc1.k8s.poc <none> <none>

# curl 10.244.84.209
-> 出現403 error

※ 排除403問題
Cause: volumeClaimTemplates是以掛載點(mountpoint)的方式,不是volume
=> 實際上是將PV的volume掛進容器中,所以會蓋掉容器內的資料。
=> 此處直接到PV內部建立index.html確保容器的正常訪問(或進到容器裡面建立)
# for i in 0 1; do kubectl exec web-$i -n example -- sh -c 'echo hello $(hostname) > /usr/share/nginx/html/index.html'; done
# kubectl get po -o wide

2. Headless測試

目的:在容器中用DNS方式訪問headless service

#-----------------------------------------------
# 2-1.建立busybox容器
#-----------------------------------------------
# kubectl run -it --image busybox:1.28.3 test -n example \
--restart=Never --rm /bin/sh
/ #

#-----------------------------------------------
# 2-2. 使用nslookup解析headless service
#-----------------------------------------------
/ # nslookup nginx-headless
/ # ping nginx-headless

※ 使用headless不會隨機輪詢背後的pod,而是固定在某個pod,所以不能取代一般的Service

raw-image
raw-image
#-----------------------------------------------
# 2-3. 測試刪除Pod之後,看Pod生成狀態
#-----------------------------------------------
# kubectl get pod -o wide -n example --show-labels
# kubectl delete pod -l app=nginx
# kubectl run -it --image busybox:1.28.3 test -n example --restart=Never --rm /bin/sh
/ # nslookup web-0.nginx
/ # nslookup web-1.nginx

※ 確認由StatefulSet controller建立2個pod,ID沒變,IP變化但URL沒變, 一樣Bound之前的PVC,資料一樣存在
raw-image
raw-image


avatar-img
15會員
40內容數
記錄IT社畜的自我學習筆記,如同專題名稱,主要是怕自已忘記自已做過什麼、學到什麼。索性就分享我自已在學習Kubernetes這條路上的各種測試、學習心得。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
超健忘閒人的沙龍 的其他內容
本篇將說明關於StatefulSet的基本概念
所謂daemonset,簡單來說就是在每個節點上部署一個Pod副本。當今天有新的主機節點加入時,就自動再上面部署一個Pod副本。移除節點時,也會自動將Pod副本移除。
本文將說明關於Local volume 與hostPath二種類型的差異與一些注意事項。
因為想要使用FQDN的方式連接到Kubernetes cluster內部的應用服務,加上早已使用Linux Bind為測試環境的主要DNS
今天分別針對3個基本中的基本資源物件類型來說明
在建置完Kubernetes cluster之後,通常我會做的前幾件事之一就是建立一個StorageClass給應用服務使用,而NFS我認為是相對容易實現的做法。
本篇將說明關於StatefulSet的基本概念
所謂daemonset,簡單來說就是在每個節點上部署一個Pod副本。當今天有新的主機節點加入時,就自動再上面部署一個Pod副本。移除節點時,也會自動將Pod副本移除。
本文將說明關於Local volume 與hostPath二種類型的差異與一些注意事項。
因為想要使用FQDN的方式連接到Kubernetes cluster內部的應用服務,加上早已使用Linux Bind為測試環境的主要DNS
今天分別針對3個基本中的基本資源物件類型來說明
在建置完Kubernetes cluster之後,通常我會做的前幾件事之一就是建立一個StorageClass給應用服務使用,而NFS我認為是相對容易實現的做法。
你可能也想看
Google News 追蹤
Thumbnail
現代社會跟以前不同了,人人都有一支手機,只要打開就可以獲得各種資訊。過去想要辦卡或是開戶就要跑一趟銀行,然而如今科技快速發展之下,金融App無聲無息地進到你生活中。但同樣的,每一家銀行都有自己的App時,我們又該如何選擇呢?(本文係由國泰世華銀行邀約) 今天我會用不同角度帶大家看這款國泰世華CUB
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
這篇文章將提供一個完整的Kubernetes安裝指南,包括控制平面節點和工作節點的安裝過程。文章中還會提及一些參考資料和解決常見錯誤的方法。
Thumbnail
玩完PVE到搭個NAS,今次用OpenMediaVault。 又係Debian base,太懶,係咁禁Next,一大隻Partition過,結果中晒伏。 Storage/File Systems 搵唔到 / 個file system,Google左輪,搵唔到。試下搞下fstab,除左會開
儲存庫 (Repository) 是檔案(File)的儲存區域。 在版本控制中,儲存庫是包含所有檔案的資料夾[1]。 每次改動檔案,你都可以選擇要不要儲存。 而那些有被處存的改動,就被稱為「提交 Commit」[2]。 而當一個儲存庫有多個開發者(Developer)在貢獻,
Thumbnail
呢排搞件PVE,寫返篇自己的技術筆記先。 PVE,Proxmox Pro,Proxmox Virtual Environment,呢個係Sales 用的名詞,分分鐘係啲0codeSales 0codePM隨口出來比Upsell 個客用,其實當你覺得DevOps同Programmer係唔同(而人
Thumbnail
在實際生產中,容器化技術開始走向「容器編排技術」,如:Kubernetes。因為Docker無法獨立支撐大規模容器化部署。 Kubernetes起源於Borg系統,所以在大規模的叢集管理,優於其他容器編排技術。它提供拉取映像檔、拉取執行容器、路由閘道、水平擴充、監控和備份等,除外還可以自動化處理容
Thumbnail
這系列是我在 2023 六角學院 Vue作品實戰班的筆記,筆記以本人理解的方式記錄。此篇主題為 Slot Props 進階應用 ,其中包含單筆資料、多筆資料。
默默覺得,要解釋 docker 與 VM 在執行方式上的差異,可以用水族箱來說明。
Thumbnail
PoW (工作量證明機制)為去中心化驗證首開先例,但其浪費能源以及高昂成本的特點長期為人詬病,隨區塊鏈著技術的演進,PoS(權益證明機制)應時而生。本文將介紹何謂PoS 以及不同公鏈之間PoS的差異。
Thumbnail
引言 在當今的技術世界中,Kubernetes 已成為容器化應用的領導平台。作為一個高效的容器編排系統,它不僅管理著容器的部署和擴展,還提供了必要的自動化支持,以保證應用的高可用性和性能。在這個框架中,自動擴展功能起著至關重要的作用,特別是在面對不斷變化的負載和需求時。
Thumbnail
列表(List)和元組(Tuple)都是 Python 中用來存儲集合元素的數據結構,兩者看起來很像,在初學時很容易搞混,所以觀念要建立好。 可以把列表(List)和元組(Tuple)想像成是一個容器,什麼元素都可以塞
Thumbnail
現代社會跟以前不同了,人人都有一支手機,只要打開就可以獲得各種資訊。過去想要辦卡或是開戶就要跑一趟銀行,然而如今科技快速發展之下,金融App無聲無息地進到你生活中。但同樣的,每一家銀行都有自己的App時,我們又該如何選擇呢?(本文係由國泰世華銀行邀約) 今天我會用不同角度帶大家看這款國泰世華CUB
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
這篇文章將提供一個完整的Kubernetes安裝指南,包括控制平面節點和工作節點的安裝過程。文章中還會提及一些參考資料和解決常見錯誤的方法。
Thumbnail
玩完PVE到搭個NAS,今次用OpenMediaVault。 又係Debian base,太懶,係咁禁Next,一大隻Partition過,結果中晒伏。 Storage/File Systems 搵唔到 / 個file system,Google左輪,搵唔到。試下搞下fstab,除左會開
儲存庫 (Repository) 是檔案(File)的儲存區域。 在版本控制中,儲存庫是包含所有檔案的資料夾[1]。 每次改動檔案,你都可以選擇要不要儲存。 而那些有被處存的改動,就被稱為「提交 Commit」[2]。 而當一個儲存庫有多個開發者(Developer)在貢獻,
Thumbnail
呢排搞件PVE,寫返篇自己的技術筆記先。 PVE,Proxmox Pro,Proxmox Virtual Environment,呢個係Sales 用的名詞,分分鐘係啲0codeSales 0codePM隨口出來比Upsell 個客用,其實當你覺得DevOps同Programmer係唔同(而人
Thumbnail
在實際生產中,容器化技術開始走向「容器編排技術」,如:Kubernetes。因為Docker無法獨立支撐大規模容器化部署。 Kubernetes起源於Borg系統,所以在大規模的叢集管理,優於其他容器編排技術。它提供拉取映像檔、拉取執行容器、路由閘道、水平擴充、監控和備份等,除外還可以自動化處理容
Thumbnail
這系列是我在 2023 六角學院 Vue作品實戰班的筆記,筆記以本人理解的方式記錄。此篇主題為 Slot Props 進階應用 ,其中包含單筆資料、多筆資料。
默默覺得,要解釋 docker 與 VM 在執行方式上的差異,可以用水族箱來說明。
Thumbnail
PoW (工作量證明機制)為去中心化驗證首開先例,但其浪費能源以及高昂成本的特點長期為人詬病,隨區塊鏈著技術的演進,PoS(權益證明機制)應時而生。本文將介紹何謂PoS 以及不同公鏈之間PoS的差異。
Thumbnail
引言 在當今的技術世界中,Kubernetes 已成為容器化應用的領導平台。作為一個高效的容器編排系統,它不僅管理著容器的部署和擴展,還提供了必要的自動化支持,以保證應用的高可用性和性能。在這個框架中,自動擴展功能起著至關重要的作用,特別是在面對不斷變化的負載和需求時。
Thumbnail
列表(List)和元組(Tuple)都是 Python 中用來存儲集合元素的數據結構,兩者看起來很像,在初學時很容易搞混,所以觀念要建立好。 可以把列表(List)和元組(Tuple)想像成是一個容器,什麼元素都可以塞