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
留言分享你的想法!
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
孩子寫功課時瞇眼?小心近視!這款喜光全光譜TIONE⁺光健康智慧檯燈,獲眼科院長推薦,網路好評不斷!全光譜LED、180cm大照明範圍、5段亮度及色溫調整、350度萬向旋轉,讓孩子學習更舒適、保護眼睛!
Thumbnail
孩子寫功課時瞇眼?小心近視!這款喜光全光譜TIONE⁺光健康智慧檯燈,獲眼科院長推薦,網路好評不斷!全光譜LED、180cm大照明範圍、5段亮度及色溫調整、350度萬向旋轉,讓孩子學習更舒適、保護眼睛!
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
從官網可以知道,我們在建立一組高可用的Kubernetes Cluster時,針對ETCD有二種做法,一種是與Master節點共用,另一種則是將ETCD再獨立出來三個節點成為一組Cluster來進行運作。 本文將說明如何建置出外部的ETCD Cluster,並以Static Pod的方式運行與管理
Thumbnail
從官網可以知道,我們在建立一組高可用的Kubernetes Cluster時,針對ETCD有二種做法,一種是與Master節點共用,另一種則是將ETCD再獨立出來三個節點成為一組Cluster來進行運作。 本文將說明如何建置出外部的ETCD Cluster,並以Static Pod的方式運行與管理
Thumbnail
今天簡單演示如何在Kubernetes cluster利用local-path provider建構出storage class來提供應用程式進行資料的存放。
Thumbnail
今天簡單演示如何在Kubernetes cluster利用local-path provider建構出storage class來提供應用程式進行資料的存放。
Thumbnail
本篇將補完上一篇所提到關於StatefulSet的實作部份。
Thumbnail
本篇將補完上一篇所提到關於StatefulSet的實作部份。
Thumbnail
本篇將說明關於StatefulSet的基本概念
Thumbnail
本篇將說明關於StatefulSet的基本概念
Thumbnail
本文將說明關於Local volume 與hostPath二種類型的差異與一些注意事項。
Thumbnail
本文將說明關於Local volume 與hostPath二種類型的差異與一些注意事項。
Thumbnail
在建置完Kubernetes cluster之後,通常我會做的前幾件事之一就是建立一個StorageClass給應用服務使用,而NFS我認為是相對容易實現的做法。
Thumbnail
在建置完Kubernetes cluster之後,通常我會做的前幾件事之一就是建立一個StorageClass給應用服務使用,而NFS我認為是相對容易實現的做法。
Thumbnail
宣告式管理是一種管理方法,其中您描述系統或資源的期望狀態,而不必關心實際如何達到該狀態。kubectl apply 命令在 Kubernetes 中實現了這種宣告式管理方式,以下是執行指令時的運作流程...
Thumbnail
宣告式管理是一種管理方法,其中您描述系統或資源的期望狀態,而不必關心實際如何達到該狀態。kubectl apply 命令在 Kubernetes 中實現了這種宣告式管理方式,以下是執行指令時的運作流程...
Thumbnail
相信Docker近幾年已經是IT與軟體開發者最常使用的一套虛擬系統了, 詳細是什麼就不多說了, 歡迎參考「📚【Docker】初探微服務時代的虛擬化技術」, 而我們使用Docker時, 有時候因為有AI的需求,需要載入別台機器的大容量模型, 但我們又不希望整個模型搬移, 浪費了兩台的空間, 這時候就
Thumbnail
相信Docker近幾年已經是IT與軟體開發者最常使用的一套虛擬系統了, 詳細是什麼就不多說了, 歡迎參考「📚【Docker】初探微服務時代的虛擬化技術」, 而我們使用Docker時, 有時候因為有AI的需求,需要載入別台機器的大容量模型, 但我們又不希望整個模型搬移, 浪費了兩台的空間, 這時候就
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是現代應用程序開發和部署的重要技術,而Pod是Kubernetes中最小的部署單位。Pod是一個或多個container的集合,它們共享一個網路命名空間和一個網路接口。Pod不僅提供了一個簡單而強大的container環境,還可以用於實現多種container編排方案,例如負載平
Thumbnail
Kubernetes是現代應用程序開發和部署的重要技術,而Pod是Kubernetes中最小的部署單位。Pod是一個或多個container的集合,它們共享一個網路命名空間和一個網路接口。Pod不僅提供了一個簡單而強大的container環境,還可以用於實現多種container編排方案,例如負載平
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News