博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Kubernetes中StatefulSet介绍
阅读量:7077 次
发布时间:2019-06-28

本文共 5104 字,大约阅读时间需要 17 分钟。

StatefulSet 是Kubernetes1.9版本中稳定的特性,本文使用的环境为 Kubernetes 1.11。如何搭建环境可以参考

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: v1kind: Servicemetadata:  name: nginx  labels:    app: nginxspec:  ports:  - port: 80    name: web  clusterIP: None  selector:    app: nginx---apiVersion: apps/v1kind: StatefulSetmetadata:  name: webspec:  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" createdstatefulset "web" created[root@devops-101 ~]# kubectl get svcNAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGEkubernetes   ClusterIP   10.96.0.1    
443/TCP 9dnginx ClusterIP None
80/TCP 1d[root@devops-101 ~]# kubectl get statefulset NAME DESIRED CURRENT AGEweb 2 2 1d

看一下Pod是否是有顺序的

[root@devops-101 ~]# kubectl get pods -l app=nginxNAME      READY     STATUS    RESTARTS   AGEweb-0     1/1       Running   0          11mweb-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'; doneweb-0web-1

使用带有nslookup命令的busybox镜像启动一个Pod,检查集群内的DNS地址设置。

3. 扩缩容

将Pod实例扩充到5个。

[root@devops-101 ~]# kubectl scale sts web --replicas=5statefulset.apps/web scaled[root@devops-101 ~]# kubectl get pods -wNAME      READY     STATUS    RESTARTS   AGEweb-0     1/1       Running   0          5mweb-1     1/1       Running   0          5mweb-2     0/1       Pending   0         1sweb-2     0/1       Pending   0         1s

因为我的集群PV不是动态供给的,所以扩容停留在等待PV的阶段,本文要按照后面的办法手工创建相应的PV。

将实例减少到2个。

[root@devops-101 ~]# kubectl get podNAME      READY     STATUS    RESTARTS   AGEweb-0     1/1       Running   0          24mweb-1     1/1       Running   0          23mweb-2     1/1       Running   0          18mweb-3     1/1       Running   0          10mweb-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。关于存储的更详细的内容,可以参考。

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: ListapiVersion: v1items:- 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

39469-20180710163655709-89635310.png

参考资料

转载地址:http://iwcml.baihongyu.com/

你可能感兴趣的文章
vs2005,.net的C#语言开发生成com组件的tlb文件
查看>>
自动修改电脑IP地址.bat
查看>>
当网站上线时记得设置umbDebug为false--致Umbraco开发者
查看>>
JavaScript 操作 Cookie
查看>>
Asp.net MVC3扩展之Ajax异常处理特性
查看>>
Perl语言入门-第五章-输入与输出-习题
查看>>
【转载】wpf学习笔记数据绑定8
查看>>
制作iOS应用图标的最简单方法
查看>>
淘宝JavaScript 编码风格规范
查看>>
[原创]桓泽学音频编解码(8):关于MP3和AAC量化器设计的研究
查看>>
苹果开发者帐号(Company)申请流程
查看>>
字符串分拆并统计的处理示例.sql
查看>>
Nhibernate 3.0 cookbook学习笔记 一对多与多对多映射
查看>>
【内存管理】内存池技术
查看>>
Android日常开发总结
查看>>
数据库连接池php-cp介绍
查看>>
微信支付id出现的重复支付解决方法和app应用中多种支付方式之间的对比
查看>>
在CentOS下利用Eclipse调试FFmpeg
查看>>
Sed 命令详解 正则表达式元字符
查看>>
ng-include文件实现ng-repeat
查看>>