内容简介:StatefulSet 是Kubernetes1.9版本中稳定的特性,本文使用的环境为 Kubernetes 1.11。如何搭建环境可以参考使用Kubernetes来调度无状态的应用非常简单,那Kubernetes如何来管理调度有状态的应用呢?Kubernetes中提供了一个StatefulSet控制器来管理有状态的应用,本文就介绍StatefulSet的应用,解决以下几个问题:StatefulSet是Kubernetes提供的管理有状态应用的负载管理控制器API。在Pods管理的基础上,保证Pods的顺
StatefulSet 是Kubernetes1.9版本中稳定的特性,本文使用的环境为 Kubernetes 1.11。如何搭建环境可以参考 kubeadm安装kubernetes V1.11.1 集群
0. 介绍
使用Kubernetes来调度无状态的应用非常简单,那Kubernetes如何来管理调度有状态的应用呢?Kubernetes中提供了一个StatefulSet控制器来管理有状态的应用,本文就介绍StatefulSet的应用,解决以下几个问题:
- 如何创建StatefulSet
- StatefulSet如何管理Pods
- 如何删除StatefulSet
- 如何对StatefulSet进行扩容
- 如何更新StatefulSet中的Pods
1. StatefulSet 是什么
StatefulSet是Kubernetes提供的管理有状态应用的负载管理控制器API。在Pods管理的基础上,保证Pods的顺序和一致性。与Deployment一样,StatefulSet也是使用容器的Spec来创建Pod,与之不同StatefulSet创建的Pods在生命周期中会保持持久的标记(例如Pod Name)。
StatefulSet适用于具有以下特点的应用:
- 具有固定的网络标记(主机名)
- 具有持久化存储
- 需要按顺序部署和扩展
- 需要按顺序终止及删除
- 需要按顺序滚动更新
2. StatefulSet 创建
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 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: docker.io/nginx ports: - containerPort: 80 name: web volumeMounts: - name: www mountPath: /usr/share/nginx/html volumeClaimTemplates: - metadata: name: www spec: accessModes: ["ReadWriteOnce"] volumeMode: Filesystem resources: requests: storage: 50Mi storageClassName: local-storage
StatefulSet创建顺序是从0到N-1,终止顺序则是相反。如果需要对StatefulSet扩容,则之前的N个Pod必须已经存在。如果要终止一个Pod,则它的后序Pod必须全部终止。
If web-0 should fail, after web-1 is Running and Ready, but before web-2 is launched, web-2 will not be launched until web-0 is successfully relaunched and becomes Running and Ready.
在Kubernetes 1.7版本后,放松了顺序的保证策略,对应的参数为 .spec.podManagementPolicy
执行创建命令,并且观察对象是否正常创建。
[root@devops-101 ~]# kubectl create -f ss-nginx.yml service "nginx" created statefulset "web" created [root@devops-101 ~]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 9d nginx ClusterIP None <none> 80/TCP 1d [root@devops-101 ~]# kubectl get statefulset NAME DESIRED CURRENT AGE web 2 2 1d
看一下Pod是否是有顺序的
[root@devops-101 ~]# kubectl get pods -l app=nginx NAME READY STATUS RESTARTS AGE web-0 1/1 Running 0 11m web-1 1/1 Running 0 11m
根据Pod的顺序,每个Pod拥有对应的主机名,在Pod中执行 hostname
命令确认下。
[root@devops-101 ~]# for i in 0 1; do kubectl exec web-$i -- sh -c 'hostname'; done web-0 web-1
使用带有nslookup命令的busybox镜像启动一个Pod,检查集群内的DNS地址设置。
3. 扩缩容
将Pod实例扩充到5个。
[root@devops-101 ~]# kubectl scale sts web --replicas=5 statefulset.apps/web scaled [root@devops-101 ~]# kubectl get pods -w NAME READY STATUS RESTARTS AGE web-0 1/1 Running 0 5m web-1 1/1 Running 0 5m web-2 0/1 Pending 0 1s web-2 0/1 Pending 0 1s
因为我的集群PV不是动态供给的,所以扩容停留在等待PV的阶段,本文要按照后面的办法手工创建相应的PV。
将实例减少到2个。
[root@devops-101 ~]# kubectl get pod NAME READY STATUS RESTARTS AGE web-0 1/1 Running 0 24m web-1 1/1 Running 0 23m web-2 1/1 Running 0 18m web-3 1/1 Running 0 10m web-4 1/1 Running 0 6m [root@devops-101 ~]# kubectl patch sts web -p '{"spec":{"replicas":2}}' statefulset.apps/web patched
4. 更新策略
4.1 滚动更新
默认的更新策略,以相反的顺序依次更新Pod
4.2 Partition
4.3 金丝雀发布 Canary
金丝雀发布。
5. 删除 StatefulSet
StatefulSet支持级连删除和非级连删除,在非级连删除模式下,仅删除StatefulSet不删除Pod,级连删除则全部删除。
非级连删除StatefulSet后,如果删除Pod,就不会重新拉起原来的Pod,而是新建一个Pod。但是如果重新创建StatefulSet,则会对现有的Pod按照规则进行重新整理。
一些分布式系统,并不希望按照顺序来管理启停Pod,因此在1.7版本之后,提供了 .spec.podManagementPolicy
这个参数,默认为 OrderedReady
,可以设置为 Parallel
这样Pod的创建就不必等待,而是会同时创建、同时删除。
X. 坑
官方的文档没有创建PVC对应的PV,按照官方文档操作创建后会遇到下面的错误,需要提前创建PV及PVC。关于存储的更详细的内容,可以参考 Kubernetes 存储系统 Storage 介绍 。
pod has unbound PersistentVolumeClaims
官方文档里解释了,因为他所用的集群配置为动态提供PV,所以不用手工创建。
As the cluster used in this tutorial is configured to dynamically provision PersistentVolumes, the PersistentVolumes were created and bound automatically.
PV的创建脚本如下:
kind: List apiVersion: v1 items: - apiVersion: v1 kind: PersistentVolume metadata: name: es-storage-pv-01 spec: capacity: storage: 100Mi volumeMode: Filesystem accessModes: ["ReadWriteOnce"] persistentVolumeReclaimPolicy: Delete storageClassName: local-storage local: path: /home/es nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - devops-102 - devops-103 - apiVersion: v1 kind: PersistentVolume metadata: name: es-storage-pv-02 spec: capacity: storage: 100Mi volumeMode: Filesystem accessModes: ["ReadWriteOnce"] persistentVolumeReclaimPolicy: Delete storageClassName: local-storage local: path: /home/es01 nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - devops-102 - devops-103
参考资料
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- ASP.NET Core模块化前后端分离快速开发框架介绍之3、数据访问模块介绍
- 简编漫画介绍WebAssembly
- CGroup 介绍
- CGroup 介绍
- vue初步介绍
- Microbit MicroPython 介绍
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Twenty Lectures on Algorithmic Game Theory
Tim Roughgarden / Cambridge University Press / 2016-8-31 / USD 34.99
Computer science and economics have engaged in a lively interaction over the past fifteen years, resulting in the new field of algorithmic game theory. Many problems that are central to modern compute......一起来看看 《Twenty Lectures on Algorithmic Game Theory》 这本书的介绍吧!