StatefulSets服务部署测试
1:StatefulSet:有状态应用部署
StatefulSet被设计用来部署有状态应用,比如有以下一个或多个需求:
Pod具有稳定且唯一的网络标识符;
Pod需要分配稳定的、持久化的存储;
有序地部署、扩缩容、删除和停止Pod;
自动且有序地实现Pod的滚动更新。
StatefulSet的使用限制
为Pod分配的存储必须由PersistentVolume Provisioner基于所请求的存储类(storage class)来制备,或者由集群管理员预先制备。
删除或者扩缩容StatefulSet并不会删除它关联的存储卷,这样做是为了保证数据安全。
需要创建无头服务(Headless Service)来负责StatefulSet中Pod的网络标识。
当删除一个StatefulSet时,该StatefulSet不提供任何终止Pod的保证。为了实现StatefulSet中的Pod可以有序且优雅地终止,可以在删除之前将StatefulSet缩容到0。
在默认Pod管理策略(OrderedReady)下进行滚动更新时,可能会进入需要人工干预才能修复的损坏状态。
2:部署实践
创建一个nginx-sts.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None # 指定集群内部IP为None
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet # 类型为StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx # 必须与.spec.template.metadata.labels匹配
serviceName: "nginx" # 必须与上面Service中.metadata.name匹配
replicas: 3
template:
metadata:
labels:
app: nginx # 必须与.spec.selector.matchLabels匹配
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
name: web
kubectl create -f nginx-sts.yaml
3: 查看sts的创建删除过程
查看pod的labels
kubectl get pod --show-labels
4:监控pod的状态
kubectl get pod -l app=nginx -w
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 19m
web-1 1/1 Running 0 19m
web-2 1/1 Running 0 18m
5:测试
kubectl scale --replicas=5 sts web
kubectl scale --replicas=2 sts web
kubectl get pod -l app=nginx -w
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 19m
web-1 1/1 Running 0 19m
web-2 1/1 Running 0 18m
web-3 0/1 Pending 0 0s
web-3 0/1 Pending 0 0s
web-3 0/1 ContainerCreating 0 0s
web-3 1/1 Running 0 5s
web-4 0/1 Pending 0 0s
web-4 0/1 Pending 0 0s
web-4 0/1 ContainerCreating 0 0s
web-4 1/1 Running 0 4s
web-0 1/1 Terminating 0 21m
web-0 0/1 Terminating 0 21m
web-0 0/1 Terminating 0 21m
web-0 0/1 Terminating 0 21m
web-0 0/1 Pending 0 0s
web-0 0/1 Pending 0 0s
web-0 0/1 ContainerCreating 0 0s
web-0 1/1 Running 0 3s
web-4 1/1 Terminating 0 2m33s
web-4 0/1 Terminating 0 2m34s
web-4 0/1 Terminating 0 2m46s
web-4 0/1 Terminating 0 2m46s
web-3 1/1 Terminating 0 2m51s
web-3 0/1 Terminating 0 2m52s
web-3 0/1 Terminating 0 2m53s
web-3 0/1 Terminating 0 2m53s
web-2 1/1 Terminating 0 23m
web-2 0/1 Terminating 0 23m
web-2 0/1 Terminating 0 23m
web-2 0/1 Terminating 0 23m
6:RollingUpdate更新,可以看得出是倒序更新的。
updateStrategy:
rollingUpdate:
partition: 0
type: RollingUpdate #滚动更新
web-1 1/1 Terminating 0 35m
web-1 0/1 Terminating 0 35m
web-1 0/1 Terminating 0 35m
web-1 0/1 Terminating 0 35m
web-1 0/1 Pending 0 0s
web-1 0/1 Pending 0 0s
web-1 0/1 ContainerCreating 0 0s
web-1 1/1 Running 0 76s
web-0 1/1 Terminating 0 16m
web-0 0/1 Terminating 0 16m
web-0 0/1 Terminating 0 16m
web-0 0/1 Terminating 0 16m
web-0 0/1 Pending 0 0s
web-0 0/1 Pending 0 0s
web-0 0/1 ContainerCreating 0 0s
web-0 1/1 Running 0 70s
7:OnDelete更新方式
updateStrategy:
type: OnDelete #删除才会更新
修改镜像的版本再删除查看
[root@k8s-master mysql]# kubectl get pod web-1 -o yaml | grep image
- image: nginx:1.15.3
imagePullPolicy: Always
image: nginx:1.15.3
imageID: docker-pullable://nginx@sha256:24a0c4b4a4c0eb97a1aabb8e29f18e917d05abfe1b7a7c07857230879ce7d3d3
[root@k8s-master mysql]# kubectl get pod web-0 -o yaml | grep image
- image: nginx:1.15.2
imagePullPolicy: Always
image: nginx:1.15.2
imageID: docker-pullable://nginx@sha256:d85914d547a6c92faa39ce7058bd7529baacab7e0cd4255442b04577c4d1f424
8:灰度发布
如要更新镜像,可以设置小于2的不跟新。
updateStrategy:
rollingUpdate:
partition: 2 #序号小于2不更新
type: RollingUpdate #滚动更新
9:级联删除和非级联删除
级联删除: 删除sts同时删除pod
非级联删除:删除sts不删除pod,pod成为了孤儿pod
kubectl delete sts web --cascade=false #非级联删除