一、概念
1.1.無狀态和有狀态的差別
1.1.無狀态和有狀态的差別
主要從網絡和存儲來對比
無狀态不考慮存儲和網絡,可以任意漂移,每個副本是一樣的,如Nginx
有狀态應用需要考慮存儲和網絡,每個副本是不對等的,具有唯一的ID,如etcd、mysql
1.2.StatefulSet的特點
1.2.StatefulSet的特點
專為部署有狀态服務而生
解決Pod獨立生命周期,保持Pod啟動順序和唯一性
應用場景:分布式應用、資料庫叢集
穩定,唯一的網絡辨別符,持久存儲
有序,優雅的部署和擴充、删除、終止
有序,滾動更新
1.3.Headless Service
1.3.Headless Service
也是一種Service,但不需要Cluster IP,需要設定clusterIP: None
1.4.serviceName
1.4.serviceName
告訴StatefulSet要使用serviceName指定的headless service來保證Pod的身份
1.5.穩定的存儲
1.5.穩定的存儲
存儲卷使用volumeClaimTemplates建立,稱為卷申請模闆;當建立一個PV時,同樣會為每個Pod配置設定并且建立一個編号PVC
二、執行個體
拿Nginx測試,主要示範yaml的寫法,實際應用中需用有狀态服務
2.1.statefulset.yaml
2.1.statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
labels:
app: web
name: web
spec:
replicas: 3
selector:
matchLabels:
app: web
serviceName: "headless-web"
template:
metadata:
labels:
app: web
spec:
containers:
- image: nginx
imagePullPolicy: IfNotPresent
name: web
ports:
- containerPort: 8080
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
storageClassName: "managed-nfs-storage"
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
設定了3個副本,從0開始标号,建立3個副本

自動建立PV和PVC
2.2.headless-svc.yaml
2.2.headless-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: headless-web
spec:
clusterIP: None
ports:
- port: 80
protocol: TCP
selector:
app: web
CLUSTER-IP為None
啟動一個busybox的Pod
kubectl run test -it --rm --image=busybox -- sh
nslookup headless-web