一、StatefulSet 資源對象需求背景
現(xiàn)在基本上很多服務(wù)中的應(yīng)用都是有狀態(tài)的,比如MySQL數(shù)據(jù)庫、Redis等,因?yàn)槠渲械臄?shù)據(jù)在不斷地變化,所以這些應(yīng)用每個(gè)時(shí)刻都處于一個(gè)不同的狀態(tài)?;蛘咭粋€(gè)系統(tǒng)中存在多個(gè)不同的應(yīng)用,這些應(yīng)用存在一定的依賴關(guān)系。例如一個(gè)博客服務(wù),該服務(wù)中包含了Redis緩存和MySQL數(shù)據(jù)庫,我們在啟動(dòng)時(shí)需要先啟動(dòng) MySQL數(shù)據(jù)庫,Redis緩存,再去啟動(dòng)博客應(yīng)用。Kubernetes 未這種存在狀態(tài)的應(yīng)用專門設(shè)計(jì)了一種資源對象,就是 StatefulSet
。
二、在 Yaml 文件中定義 StatefulSet 資源對象
StatefulSet 資源對象類似于 Deployment 資源對象,都是包含多個(gè) Pod 副本,但是 Deployment 資源對象的 Pod 副本Pod 名稱不固定,而且啟動(dòng)順序也是隨機(jī)的,但是 StatefulSet 資源對象Pod 副本的名稱是固定的,且啟動(dòng)關(guān)系也是確定的。
2.1 StatefulSet 資源對象狀態(tài)
- StatefulSet 資源對象的Pod 副本名一般取值為節(jié)點(diǎn)名 + 序號(hào)(序號(hào)從0開始,最大值未Pod副本數(shù)目-1)。StatefulSet 資源對象的Pod副本的啟動(dòng)先后順序依賴于這個(gè)Pod副本的序號(hào)。
- StatefulSet 資源對象的訪問需要額外的創(chuàng)建對應(yīng)的 Service 資源對象,該Service 資源對象的名稱要與 StatefulSet 資源對象中定義的 ServiceName 一致。
2.2 StatefulSet 資源對象定義
StatefulSet 資源對象的簡稱是sts
。下面是 StatefulSet 資源對象與其對應(yīng)的 Service 資源對象在 Yaml 文件中定義的內(nèi)容示例:
apiVersion: apps/v1 # API 資源對象的版本
kind: StatefulSet # API 資源對象的類型
metadata:
name: test-sts # # API 資源對象名
spec:
serviceName: test-svc
volumeClaimTemplates: # 在StatefulSet 資源對象中直接定義對應(yīng)的PVC
- metadata:
name: test-redis-pvc # 定義了該 PVC 的名稱
spec:
storageClassName: nfs-client # 明確PVC與PV綁定的StorageClass
accessModes: # 定義需要的存儲(chǔ)設(shè)備的權(quán)限
- ReadWriteMany
resources: # 定義需要的存儲(chǔ)容量大小
requests:
storage: 60Mi
replicas: 2 # 明確 statefulSet 資源對象對應(yīng)的 pod 副本數(shù)
selector: # 定義statefulSet 標(biāo)簽選擇器
matchLabels:
app: test-sts
template:
metadata: # statefulSet資源對象下Pod 副本中的標(biāo)簽
labels:
app: test-sts
spec:
containers:
- image: redis:5-alpine
name: redis
ports:
- containerPort: 6379
volumeMounts:
- name: test-redis-pvc
mountPath: /redis-data
---
apiVersion: v1
kind: Service
metadata:
name: test-svc
spec:
selector:
app: test-sts
ports:
- port: 6379
protocol: TCP
targetPort: 6379
2.3 StatefulSet 資源對象
與我們之前討論的 Deployment 資源對象相比,StatefulSet 資源對象的定義主要有2處獨(dú)特之處,一個(gè)是serviceName,一個(gè)是volumeClaimTemplates。
- serviceName: 該字段規(guī)定了使用 DNS 訪問Pod時(shí),Pod所屬的子域。形式如:$(pod 名稱).$(serviceName)
- volumeClaimTemplates: StatefulSet 資源對象內(nèi)置的專門用于定義 PVC 的字段;
因?yàn)?StatefulSet 資源對象是有狀態(tài)的,不存在 Pod 漂移的情況,因此可以通過域名 \$(pod 名稱).\$(serviceName)
被穩(wěn)定的訪問。
三、StatefulSet 資源對象的使用
利用上面的Yaml 文件,我們通過如下命令直接創(chuàng)建 StatefulSet
和 Service
資源對象:文章來源:http://www.zghlxwxcb.cn/news/detail-765917.html
kubectl apply -f test-svc-sts.yaml
通過如下命令可查看 statefulSet
資源對象和 service
資源對象的狀態(tài),同時(shí)使用hostname
命令查看短格式節(jié)點(diǎn)名與Pod名稱的關(guān)系:文章來源地址http://www.zghlxwxcb.cn/news/detail-765917.html
# 查看節(jié)點(diǎn)名短格式
hostname
# 查看StatefulSet資源對象狀態(tài)
kubectl get sts
# 查看Service資源對象狀態(tài)
kubectl get svc
# 查看資源對象test-sts詳細(xì)信息
kubectl describe test-sts
# 查看資源對象test-svc詳細(xì)信息
kubectl describe test-svc
到了這里,關(guān)于【K8S】Kubernetes 中有狀態(tài)的資源對象——StatefulSet的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!