operator:
statefulset:有狀態副本集
特點
運行在: 1,穩定且唯一的網絡標識符
2,穩定且持久的存儲
3,有序,平滑地部署和擴展
4,有序,平滑地刪除和終止
5,有序的滾動更新
三個組件:headless service(無頭服務), statefuleset,volumeClaimTemplate(存儲卷申請模板)
先准備pv
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv001
labels:
name: pv001
polity: fast
spec:
nfs:
path: /data/volumes/v1
server: node2
accessModes: ["ReadWriteMany","ReadWriteOnce"]
capacity:
storage: 5Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv002
labels:
name: pv002
polity: fast
spec:
nfs:
path: /data/volumes/v2
server: node2
accessModes: ["ReadWriteOnce"]
capacity:
storage: 5Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv003
labels:
name: pv003
polity: fast
spec:
nfs:
path: /data/volumes/v3
server: node2
accessModes: ["ReadWriteMany","ReadWriteOnce"]
capacity:
storage: 5Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv004
labels:
name: pv004
polity: fast
spec:
nfs:
path: /data/volumes/v4
server: node2
accessModes: ["ReadWriteMany","ReadWriteOnce"]
capacity:
storage: 10Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv005
labels:
name: pv005
polity: fast
spec:
nfs:
path: /data/volumes/v5
server: node2
accessModes: ["ReadWriteMany","ReadWriteOnce"]
capacity:
storage: 10Gi
kubectl apply -f pv-demo.yaml
kubectl get pv
實例
apiVersion: v1
kind: Service
metadata:
name: myapp-svc service名
labels:
app: myapp
spec:
ports:
- port: 80 service端口
name: web service端口名
clusterIP: None statefulset要求無頭服務
selector: 與pod關聯的標簽
app: myapp-pod
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: myapp statefulset控制器名 創建的pod名也為這個
spec:
serviceName: myapp-svc 關聯的service服務名,必須是無頭服務
replicas: 2
selector: 管理哪些pod,關聯pod的label
matchLabels:
app: myapp-pod
template: 定義pod模板
metadata:
labels: 定義的pod的標簽label
app: myapp-pod
spec:
containers:
- name: myapp pod中容器名
image: ikubernetes/myapp:v1
ports:
- containerPort: 80
name: web
volumeMounts:
- name: myappdata 掛載myappdata存儲卷
mountPath: /usr/share/nginx/html 容器中掛載的路徑
volumeClaimTemplates: pvc模板 為每個pod定義volume 自動創建pvc
- metadata:
name: myappdata 定義的pvc名
spec:
accessModes: ["ReadWriteOnce"] 單路讀寫
resources: 資源
requests: 請求
storage: 5Gi 大小5Gi存儲空間
創建
kubectl explain sts
kubectl apply -f stateful-demo.yaml
驗證:
kubectl get sts
kubectl get pvc
kubectl get svc
kubectl get pv
kubectl get pods
刪除sts時
逆向刪除pod
kubectl delete -f stateful-demo.yaml
刪除時pvc還在,且一直保留給固定的pod
statefulset支持滾動更新,規模擴展
逆向更新
dns解析
kubectl exec -it myapp-0 -- /bin/sh
nslookup myapp-3.myapp-svc.default.svc.cluster.local
域名構成 pod名 service名 命名空間 集群域名svc.cluster.local
域名 pod_name.service_name.namaspace_name.svc.cluster.local
nslookup myapp-3.myapp-svc
擴容宿容
kubectl scale sts myapp --replicas=3
kubectl patch sts myapp -p '{"spec":{"replicas":2}}'
更新策略
kubectl explain sts.spec.updateStrategy
kubectl explain sts.spec.updateStrategy.rollingUpdate
分區更新
kubectl explain sts.spec.updateStrategy.rollingUpdate.partition
myapp-0
myapp-1
myapp-2
myapp-3
myapp-4
partition:N
N>=3
即更新3和4,即myapp-3,myapp-4 這叫金絲雀發布
驗證
方法一
kubectl patch sts myapp -p '{"spec":{"replicas":5}}'
kubectl patch sts myapp -p '{"spec":{"updateStrategy":{"rollingUpdate":{"partition":4}}}}' 打上補丁 partition>=4
kubectl describe sts myapp 查看更新策略
kubectl set image sts/myapp myapp=ikubernetes/myapp:v2 改變鏡像就會更新了
kubectl get sts -o wide
方法二
vim stateful-demo.yaml
kind: StatefulSet
...
spec:
updateStrategy:
rollingUpdate:
partition: 3
kubectl apply -f stateful-demo.yaml
如果版本沒問題,就全部更新
vim stateful-demo.yaml
kind: StatefulSet
...
spec:
updateStrategy:
rollingUpdate:
partition: 0
kubectl apply -f stateful-demo.yaml