k8s笔记七(使用statefulset控制器部署有状态的pod应用)
1、statefulset控制器Setatefulset控制器是pod资源控制器的一种实现,用于部署和扩展有状态应用的pod资源,确保他们的运行顺序及每个pod资源的唯一性。Statefulset主要用于以下类型的应用程序:(1)未定且唯一的网络标识符(2)稳定且持久的存储(3)有序、优雅的部署和扩展(4)有序、优雅的删除和终止(5)有序而自动的滚动更新...
1、statefulset控制器
Setatefulset控制器是pod资源控制器的一种实现,用于部署和扩展有状态应用的pod资源,确保他们的运行顺序及每个pod资源的唯一性。Statefulset主要用于以下类型的应用程序:
(1)未定且唯一的网络标识符
(2)稳定且持久的存储
(3)有序、优雅的部署和扩展
(4)有序、优雅的删除和终止
(5)有序而自动的滚动更新
2、statefulset控制器的创建与管理
(1)创建statefulset对象
一个完整的statefulset控制器是由一个Headless Service、statefulset、volumeClaimTemplate三个组件组成。为了方便pvc的创建,使用glusterfs提供动态的pv供给。
# 查看创建的存储类
]# kubectl get StorageClass
NAME PROVISIONER AGE
glusterfs kubernetes.io/glusterfs 16s
# 为stateful对象创建创建headless service
]# cat stateful-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp-svc
labels:
app: myapp-svc
spec:
ports:
- name: web
port: 80
clusterIP: None
selector:
app: myapp-sfs
# 定义创建stateful格式对象
]# cat statefulset-pod.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: myapp
spec:
serviceName: myapp-svc
replicas: 2
selector:
matchLabels:
app: myapp-sfs
template:
metadata:
labels:
app: myapp-sfs
spec:
containers:
- name: myapp
image: nginx:1.12
ports:
- name: http
containerPort: 80
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: html
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "glusterfs"
resources:
requests:
storage: 2Gi
默认情况下,statefulset控制器以串行的方式运行创建各pod副本,如果想要以并行的方式创建和删除pod资源,则可以设定.spec.podManagementPolicy字段值为“Parallel”,默认值为“OrderadReady”。
(2)setatefulset控制器中pod资源的标识符及存储卷
由statefulset控制器创建的pod资源拥有固定、唯一的标识和专用的存储卷,即使重新调度或终止后重建,其名称也依然保持不变,且此前的存储卷及数据不会丢失。它们的唯一标识符是通过唯一的索引号及相关的statefulset对象的名称而生成,格式为“<statefulset name>-<ordinalindex>”。
(3)statefulset资源扩缩容
Statefulset资源的扩缩容与deployment资源相似,均可通过“kubectl scale”或“kubectl patch”或“kubectl edit”命令直接修改其副本数。
3、statefulset资源升级
statefulset控制器支持资源自动更新机制,更新策略由spec.updateStrategy字段定义。
默认为RollingUpdate,即滚动更新;另一个可用策略为OnDelete即删除更新。
(1)滚动更新
滚动更新是以逆序的方式从其最大索引编号的pod资源逐一进行。
# 升级nginx版本
]# kubectl set image statefulset myapp myapp=nginx:1.14-alpine
statefulset.apps/myapp image updated
# 观察升级过程
~]# kubectl get pods -l app=myapp-sfs -w
NAME READY STATUS RESTARTS AGE
myapp-0 1/1 Running 0 55s
myapp-1 1/1 Running 0 67s
myapp-2 1/1 Running 0 75s
myapp-2 1/1 Terminating 0 86s
myapp-2 0/1 Terminating 0 87s
myapp-2 0/1 Terminating 0 88s
myapp-2 0/1 Terminating 0 88s
myapp-2 0/1 Pending 0 0s
myapp-2 0/1 Pending 0 0s
(2)暂存更新
当用户需要设定一个更新操作,但又不希望他立即执行时,可将跟新操作予以“暂存”,待条件满足后再手动触发更新。Statefulset资源的分区跟新机制能够实现此项功能。
# 首先将滚动更新分区制设置大于pod副本数量
]# kubectl patch statefulset myapp -p '{"spec":{"updateStrategy":{"rollingUpdate":{"partition":3}}}}'
statefulset.apps/myapp patched
# 更新pod镜像
]# kubectl set image statefulset myapp myapp=nginx:latest
statefulset.apps/myapp image updated
# 检查各pod中镜像版本并未发生改变
~]# kubectl get pods -l app=myapp-sfs -o custom-columns=NAME:metadata.name,IMAGE:spec.containers[0].image
NAME IMAGE
myapp-0 nginx:1.14-alpine
myapp-1 nginx:1.14-alpine
myapp-2 nginx:1.14-alpine
(3)金丝雀部署
将处于暂存状态的更新操作的partition定位于pod资源的最大索引号,即只放出一只金丝雀,由其测试第一轮的跟新操作,在确认无误后通过修改partition属性的值跟新其他的pod对象。
(4)并行操作
Statefulset控制器管理的pod资源的策略除了默认的OrderedReady(顺序创建及逆序删除)外,还支持并行的创建及删除操作,即同事创建所有的pod资源及同事删除所有的pod资源,完成该操作需要将spec.podManageMentPolicy字段的值设置为Parallel。
更多推荐
所有评论(0)