原文链接:Kubernetes中StatefulSet介绍

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: nginxlabels:app: nginx
spec:ports:- port: 80name: webclusterIP: Noneselector:app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: web
spec:serviceName: "nginx"replicas: 2selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: docker.io/nginxports:- containerPort: 80name: webvolumeMounts:- name: wwwmountPath: /usr/share/nginx/htmlvolumeClaimTemplates:- metadata:name: wwwspec:accessModes: ["ReadWriteOnce"]volumeMode: Filesystemresources:requests:storage: 50MistorageClassName: 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: v1kind: PersistentVolumemetadata:name: es-storage-pv-01spec:capacity:storage: 100MivolumeMode: FilesystemaccessModes: ["ReadWriteOnce"]persistentVolumeReclaimPolicy: DeletestorageClassName: local-storagelocal:path: /home/esnodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- devops-102- devops-103
- apiVersion: v1kind: PersistentVolumemetadata:name: es-storage-pv-02spec:capacity:storage: 100MivolumeMode: FilesystemaccessModes: ["ReadWriteOnce"]persistentVolumeReclaimPolicy: DeletestorageClassName: local-storagelocal:path: /home/es01nodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- devops-102- devops-103

Kubernetes中StatefulSet介绍相关推荐

  1. Kubernetes 中的对象是如何删除的:Finalizers 字段介绍

    前言 Kubernetes 中的对象删除并不像表面上看起来那么简单,删除对象涉及一系列过程,例如对象的级联和非级联删除,在删除之前检查以确定是否可以安全删除对象等等.这些都是通过称为 Finalize ...

  2. Serverless Kubernetes 容器服务介绍

    作者 | 张维 阿里巴巴高级技术专家 导读:Serverless Kubernetes 是以容器和 kubernetes 为基础的 Serverless 服务,它提供了一种简单易用.极致弹性.最优成本 ...

  3. 教你在Kubernetes中快速部署ES集群

    摘要:ES集群是进行大数据存储和分析,快速检索的利器,本文简述了ES的集群架构,并提供了在Kubernetes中快速部署ES集群的样例:对ES集群的监控运维工具进行了介绍,并提供了部分问题定位经验,最 ...

  4. Kubernetes中Pod的调度策略

    Kubernetes中Pod的调度策略 1.Pod调度 在 Kubernetes 平台上,我们很少会直接创建一个 Pod,在大多数情况下会通过 RC.Deployment. DaemonSet.Job ...

  5. 万字长文带你全面认识 Kubernetes 中如何实现蓝绿部署、金丝雀发布和滚动更新...

    Kubernetes 中的部署策略 在本文中,我们将学习使用 Kubernetes 容器编排系统部署容器时的部署策略.在本文的最后,我们将学习如何在 Kubernetes 集群中使用不同的方式进行部署 ...

  6. Rook存储:Kubernetes中最优秀的存储

    本文讲的是Rook存储:Kubernetes中最优秀的存储[编者的话]Rook存储集群,其实是在著名的分布式存储系统Ceph的一个封装,以Kubernetes Application的方式运行了监控. ...

  7. Kubernetes 中创建 Pod 时集群中到底发生了些什么?

    想象一下,如果我想将 nginx 部署到 Kubernetes 集群,我可能会在终端中输入类似这样的命令: $ kubectl run --image=nginx --replicas=3 然后回车. ...

  8. Kubernetes中部署Docker registry2.7.1并通过containerd实现拉取镜像到应用Pod的部署

    这里主要介绍一下私有仓库(HTTPS)在Kubernetes中部署的问题,由于Kubernetes将弃用docker,因此这里主要介绍以下使用containerd替换docker后如何从私有仓库拉取镜 ...

  9. 如何发现 Kubernetes 中服务和工作负载的异常

    大家好,我是来自阿里云的李煌东,今天由我为大家分享 Kubernetes 监控公开课的第二节内容:如何发现 Kubernetes 中服务和工作负载的异常. 本次分享由三个部分组成: 一.Kuberne ...

最新文章

  1. 5分钟Serverless实践 | 构建无服务器的敏感词过滤后端系统
  2. boost::mp11::mp_replace相关用法的测试程序
  3. Java代码质量监控工具Sonar安装
  4. 常见前端数据格式转换
  5. ValueStack基础:OGNL
  6. vue 单文件组件中,输入template 按 tab 键不能自动补全标签的解决办法
  7. django 1.8 官方文档翻译: 2-2-3 查找 API 参考
  8. 随想录(windows静态库和动态库)
  9. Map接口与学习系列(二)---LinkedHashMap
  10. JAVA大数据习题Week2
  11. CodeForces 1B
  12. c++ 中类重复定义的分析与解决办法
  13. ffmpeg详细安装教程,亲测有效!
  14. ubuntu 10.04安装 sopcast player
  15. 浅谈智能卡技术在数字电视小额支付系统中的应用
  16. 第16课:郭盛华课程PHP文件打开,读取
  17. Topic 18. 临床预测模型之缺失值插补方法
  18. 比尔·盖茨、UNIX之父等全球14位IT大佬,总结的18句编程名言!
  19. 2021-2022年度“扣哒杯”AI世青赛初赛落下帷幕
  20. 江苏省学业水平测试信息技术软件,江苏2019年普通高中信息技术学业水平测试工作顺利结束...

热门文章

  1. 两轮差速驱动机器人运动模型及应用分析(图片版)
  2. python字符串的方法和列表的方法_python字符串,列表,字符串,元组,集合的一些方法...
  3. oracle 数据库基础配置,Oracle数据库网络服务配置基础、SQL编程详解-Oracle
  4. 大蜘蛛序列号_没事校个色?Datacolor Spyder5 Elite红蜘蛛五代校色仪体验
  5. c语言 指针_C语言野指针以及非法内存操作
  6. 力扣——字符串转换整数 (atoi)
  7. 标题、段落标签(HTML)
  8. AWT_Swing_初始化(Java)
  9. 解决Ubuntu16.04中文乱码问题
  10. POJ1061 青蛙的约会(扩展欧几里得)题解