k8s控制器statefulset
StatefulSet是Kubernetes提供的管理有状态应用的负载管理控制器API。在Pods管理的基础上,保证Pods的顺序和一致性。与Deployment一样,StatefulSet也是使用容器的Spec来创建Pod,与之不同StatefulSet创建的Pods在生命周期中会保持持久的标记(例如Pod Name)。
Petset-> StatefulSet
- 稳定且唯一的网络标示符
- 稳定且持久的存储
- 有序 平滑的部署和扩展
- 有序平滑的删除和终止
- 有序的滚动更新
三个组件 headless service, StatefulSet , volimeClaimTemplate
需要提前创建pv 至少和副本数量相同
部署一个sts
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:
selector:
matchLabels:
app: nginx # has to match .spec.template.metadata.labels
serviceName: "nginx"
replicas: 3 # by default is 1
template:
metadata:
labels:
app: nginx # has to match .spec.selector.matchLabels
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
StatefulSet创建顺序是从0到N-1,终止顺序则是相反。如果需要对StatefulSet扩容,则之前的N个Pod必须已经存在。如果要终止一个Pod,则它的后序Pod必须全部终止。
查看
[root@node1 volumes]# kubectl get sts
NAME READY AGE
web 3/3 42s
[root@node1 volumes]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
myappdata-web-0 Bound pv001 5Gi RWO,RWX 48s
myappdata-web-1 Bound pv002 5Gi RWO,RWX 46s
myappdata-web-2 Bound pv003 5Gi RWO,RWX 14s
[root@node1 volumes]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv001 5Gi RWO,RWX Retain Bound default/myappdata-web-0 21m
pv002 5Gi RWO,RWX Retain Bound default/myappdata-web-1 21m
pv003 5Gi RWO,RWX Retain Bound default/myappdata-web-2 21m
pv004 10Gi RWO,RWX Retain Available 21m
pv005 10Gi RWO,RWX Retain Available 21m
[root@node1 volumes]# kubectl get pods
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 59s
web-1 1/1 Running 0 57s
web-2 1/1 Running 0 25s
设置副本为5个
设置更新策略 id大于3的更新新的镜像
[root@node1 volumes]# kubectl patch sts web -p '{"spec":{"updateStrategy":{"rollingUpdate":{"partition":3}}}}'
statefulset.apps/web patched
更新镜像
[root@node1 volumes]# kubectl set image sts/web nginx=ikubernetes/myapp:v2
statefulset.apps/web image updated
查看,发现3镜像已经升级,小于3的没有升级,这种方法用于实现金丝雀发布,如发现测试没有问题 则修改partition为0 全部更新
[root@node1 volumes]# kubectl get pods web-3 -o yaml grep image
- image: ikubernetes/myapp:v2
imagePullPolicy: IfNotPresent
image: ikubernetes/myapp:v2
imageID: docker-pullable://ikubernetes/myapp@sha256:85a2b81a62f09a414ea33b74fb8aa686ed9b168294b26b4c819df0be0712d358
[root@node1 volumes]# kubectl get pods web-2 -o yaml grep image
- image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
image: ikubernetes/myapp:v1
imageID: docker-pullable://ikubernetes/myapp@sha256:9c3dc30b5219788b2b8a4b065f548b922a34479577befb54b03330999d30d513
容器内DNS解析地址机构如下
pod名.service名.ns名.svc.cluster.local
k8s控制器statefulset
http://www.jcwit.com/article/113/