一、StatefulSet理論知識
官方中文參考文檔
1、StatefulSet Pod控制器特性
StatefulSet(簡寫sts)也是K8S集群中的一種Pod資源管理器,與deployment Pod控制器不同的是,StatefulSet用于管理無狀態(tài)程序,特性如下:
- 穩(wěn)定的網(wǎng)絡標識符:管理的Pod都擁有一個穩(wěn)定的網(wǎng)絡標識符??梢酝ㄟ^網(wǎng)絡標識符進行訪問。
- 有序部署和擴展:StatefulSet會按照指定的順序逐個部署Pod,每個Pod都有一個唯一的序號,這個序號在整個生命周期中都不會改變。在擴展時,也會按照指定的順序逐個增加Pod。
- 穩(wěn)定的存儲:每個Pod都用一個獨立的持久卷存儲,比如NFS。
- 有狀態(tài)服務:StatefulSet適用于有狀態(tài)的服務,例如數(shù)據(jù)庫、緩存等,這些服務需要穩(wěn)定的網(wǎng)絡標識符和持久化存儲。
總之,StatefulSet提供了一種可靠的、有序的、有狀態(tài)的服務部署和擴展方式,適用于需要穩(wěn)定網(wǎng)絡標識符和持久化存儲的有狀態(tài)服務。
2、什么是有狀態(tài)服務和無狀態(tài)服務?
無狀態(tài)服務則是指不需要持久化存儲和狀態(tài)的服務,例如Web服務器、API服務器等。這些服務可以在任何節(jié)點上運行,因為它們不需要在不同節(jié)點之間共享數(shù)據(jù),也不需要在節(jié)點故障時進行快速恢復。無狀態(tài)服務可以通過水平擴展來提高性能和可用性。
有狀態(tài)服務是指需要持久化存儲并且需要保持狀態(tài)的服務,例如數(shù)據(jù)庫、緩存等。這些服務需要在不同的節(jié)點之間保持數(shù)據(jù)同步,并且需要在節(jié)點故障時能夠快速恢復。
3、Deployment和StatefulSet區(qū)別
Deployment和StatefulSet是Kubernetes中常用的兩種控制器,它們的主要區(qū)別如下:
-
Deployment是用于管理無狀態(tài)應用的控制器,而StatefulSet則是用于管理有狀態(tài)應用的控制器。
-
Deployment可以創(chuàng)建多個Pod副本,這些Pod副本之間沒有任何順序關系,可以隨意調度和替換。而StatefulSet創(chuàng)建的Pod副本有固定的順序,每個Pod副本都有唯一的標識符,可以保證有狀態(tài)應用的數(shù)據(jù)持久性和穩(wěn)定性。
-
Deployment可以進行滾動更新,即在更新過程中保持應用的可用性。而StatefulSet的更新過程需要手動控制,需要先刪除舊的Pod副本,再創(chuàng)建新的Pod副本,因此更新過程中會有一定的停機時間。
-
Deployment可以使用RollingUpdate策略進行滾動更新,而StatefulSet則可以使用OnDelete和RollingUpdate兩種策略進行更新。
總之,Deployment適用于管理無狀態(tài)應用,而StatefulSet適用于管理有狀態(tài)應用。如果應用需要保證數(shù)據(jù)的持久性和穩(wěn)定性,建議使用StatefulSet。
二、案例:StatefulSet資源實戰(zhàn)演示
1、創(chuàng)建WEB站點并驗證StatefulSet特點
第一步:創(chuàng)建名為 sts-web-svc
的SVC ,用于創(chuàng)建statefulset資源時需要關聯(lián)service,YAML如下:
cat sts-web-svc.yaml
---
apiVersion: v1
kind: Service
metadata:
name: sts-web-svc
spec:
selector:
app: web-nginx
ports:
- port: 80
targetPort: 80
clusterIP: None # 設置無IP地址
創(chuàng)建 svc 資源:
kubectl apply -f sts-web-svc.yaml
查看創(chuàng)建的 svc 資源,如下圖可以看到創(chuàng)建的svc并沒有分配IP地址:
kubectl get svc sts-web-svc
第二步:創(chuàng)建statefulset資源
cat sts-web.yaml
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: sts-web
namespace: default
spec:
serviceName: sts-web-svc # 關聯(lián)SVC資源
replicas: 2 # 副本數(shù)
selector:
matchLabels: # 關聯(lián)具有app=web-nginx標簽的Pod
app: web-nginx
volumeClaimTemplates: # 卷申請模板
- metadata:
name: www # 卷申請模板名稱
spec:
accessModes: ["ReadWriteOnce"] # 訪問模式
storageClassName: nfs # 指定供應商,前提是需要存在此供應商
resources:
requests:
storage: 1Gi # 存儲大小1G
template:
metadata:
labels:
app: web-nginx
spec:
containers:
- name: web-nginx
image: nginx:1.18.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www # 指定卷申請模板名稱
mountPath: /usr/share/nginx/html
startupProbe: # 啟動探測
tcpSocket:
port: 80
執(zhí)行 YAML :
kubectl apply -f sts-web.yaml
第三步:特點測試
1、Pod都有一個唯一的序號:如下圖Pod名字有序
kubectl get pods -l app=web-nginx -o wide
刪除 sts-web-0,Pod后自動創(chuàng)建出來的Pod名稱不會改變
kubectl delete pod sts-web-0
2、Pod獨立持久卷存儲:查看PVC,自動生成兩個PVC,相互隔離
kubectl get pvc -l app=web-nginx
ls /data/nfs_pro|grep default-www-sts-web-*
3、穩(wěn)定的網(wǎng)絡標識符:我們使用busybox運行Pod,nslookup進行解析
kubectl run busybox --image docker.io/library/busybox:1.28 --rm -it busybox -- sh
2、StatefulSet滾動更新
滾動更新使用 spec.updateStrategy
字段定義,目前statefulset支持兩種更新策略如下:
- RollingUpdate:滾動更新
- OnDelete:不會自動更新,手動刪除Pod后進行更新
下面演示滾動更新:
第一步:創(chuàng)建并執(zhí)行statefulset資源
cat web-svc.yaml
---
apiVersion: v1
kind: Service
metadata:
name: web
spec:
selector:
app: web
ports:
- port: 80
targetPort: 80
clusterIP: None
創(chuàng)建statefulset,使用nginx:1.18 鏡像
cat web.yaml
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
namespace: default
spec:
serviceName: web
replicas: 5
selector:
matchLabels:
app: web
updateStrategy:
rollingUpdate:
maxUnavailable: 0 # 最多不可用Pod,0表示2個Pod可用
partition: 2 # 只更新序號大于等于partition值的Pod
volumeClaimTemplates:
- metadata:
name: web
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: nfs
resources:
requests:
storage: 1Gi
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: nginx:1.18.0 # 使用1.18.0版本鏡像
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
name: web
volumeMounts:
- name: web
mountPath: /usr/share/nginx/html
執(zhí)行YAML文件
kubectl apply -f web-svc.yaml
kubectl apply -f web.yaml
第二步:更新使用 nginx:latest
鏡像
重新YAML 一下:
kubectl apply -f web.yaml
驗證:由于我們partition: 2
所以Pod不會全部更新,只會更新序號大于2的Pod,包括2文章來源:http://www.zghlxwxcb.cn/news/detail-546466.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-546466.html
三、總結
- statefulset管理的Pod名稱是有序的,刪除指定Pod后自動創(chuàng)建的Pod名稱不會改變。
- statefulset創(chuàng)建時必須指定server名稱,如果server沒有IP地址,則會對server進行DNS解析,找到對應的Pod域名。
- statefulset具有volumeclaimtemplate卷管理模板,創(chuàng)建出來的Pod都具有獨立卷,相互沒有影響。
- statefulset創(chuàng)建出來的Pod,擁有獨立域名,我們在指定訪問Pod資源時,可以使用域名指定,IP會發(fā)生改變,但是域名不會(域名組成:Pod名稱svc名稱.svc名稱空間.svc.cluster.local)
到了這里,關于【Kubernetes資源篇】StatefulSet無狀態(tài)服務管理入門實戰(zhàn)詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!