StatefulSet是专门针对有状态服务进行部署的一个控制器
配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| --- apiVersion: v1 kind: Service metadata: name: nginx labels: app: nginx spec: ports: - port: 80 name: web clusterIP: None selector: app: nginx --- apiVersion: apps/v1 kind: StatefulSet metadata: name: web spec: serviceName: "nginx" replicas: 2 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80 name: web volumeMounts: - name: www mountPath: /usr/share/nginx/html volumeClaimTemplates: - metadata: name: www annotations: volume.alpha.kubernetes.io/storage-class: anything spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 1Gi
|
先检查一下有没有重名的svc和deploy,如果有先删除
使用kubectl create -f web.yaml
创建
扩容与缩容
1 2 3 4 5
| $ kubectl scale statefulset web --replicas=5
$ kubectl patch statefulset web -p '{"spec":{"replicas":3}}'
|
执行扩容操作后,增加了web-2.3.4三个pod
执行缩容操作后web-4,3被删除
镜像更新
1
| kubectl patch sts web --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/image", "value":"nginx:1.9.1"}]'
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| [root@k8s-master statefulset] statefulset.apps/web with revision Pod Template: Labels: app=nginx Containers: nginx: Image: nginx:1.9.1 Port: 80/TCP Host Port: 0/TCP Environment: <none> Mounts: <none> Volumes: <none>
[root@k8s-master statefulset] statefulset.apps/web with revision Pod Template: Labels: app=nginx Containers: nginx: Image: nginx:1.7.9 Port: 80/TCP Host Port: 0/TCP Environment: <none> Mounts: <none> Volumes: <none>
[root@k8s-master statefulset]
|
灰度发布
灰度发布(又名金丝雀发布)是指在黑与白之间,能够平滑过渡的一种发布方式。在其上可以进行A/B testing,即让一部分用户继续用产品特性A,一部分用户开始用产品特性B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B 上面来。灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度。
利用滚动更新中的 partition 属性,可以实现简易的灰度发布的效果
例如我们有 5 个 pod,如果当前 partition 设置为 3,那么此时滚动更新时,只会更新那些 序号 >= 3 的 pod
更新nginx的版本后,因为partition=3,所以只有3和4进行了更新
将partition修改为0后,所以的pod都进行了更新
更新策略:OnDelete
顾名思义OnDelete的意思就是只有在 pod 被删除时会进行更新操作。
首先通过edit将配置文件中的更新策略改为OnDelete
1 2
| updateStrategy: type: OnDelete
|
然后再将nginx的版本改为1.9.1,查看版本发现所以pod都没有更新
删除web-2,再次查看版本发现web-2已经更新完成
删除
1 2 3 4 5 6 7 8 9 10
|
kubectl delete statefulset web
kubectl deelte sts web --cascade=false
kubectl delete service nginx
$ kubectl delete pvc www-web-0 www-web-1
|