从前面的学习我们知道使用Deployment创建的pod是无状态的,当挂载了Volume之后,如果该pod挂了,Replication Controller会再启动一个pod来保证可用性,但是由于pod是无状态的,pod挂了就会和之前的Volume的关系断开,新创建的Pod无法找到之前的Pod。但是对于用户而言,他们对底层的Pod挂了是没有感知的,但是当Pod挂了之后就无法再使用之前挂载的存储卷。

    为了解决这一问题,就引入了StatefulSet用于保留Pod的状态信息。

    StatefulSet是为了解决有状态服务的问题(对应Deployments和ReplicaSets是为无状态服务而设计),其应用场景包括:

  • 1、稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现
  • 2、稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service(即没有Cluster IP的Service)来实现
  • 3、有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依次进行(即从0到N-1,在下一个Pod运行之前所有之前的Pod必须都是Running和Ready状态),基于init containers来实现
  • 4、有序收缩,有序删除(即从N-1到0)
  • 5、有序的滚动更新

参考:https://kubernetes.io/docs/tutorials/stateful-application/basic-stateful-set/

创建statefulSet示例
[root@k8s-master1 volume]# cat nginx-demo.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port:
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx
serviceName: "nginx"
replicas:
template:
metadata:
labels:
app: nginx
spec:
terminationGracePeriodSeconds:
containers:
- name: nginx
image: nginx
ports:
- containerPort:
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "managed-nfs-storage"
resources:
requests:
storage: 1Gi [root@k8s-master1 volume]# kubectl apply -f nginx-demo.yaml
service/nginx created
statefulset.apps/web created
[root@k8s-master1 volume]# kubectl get svc,sts    #查看无头服务,svc的CLUSTER—IP为None
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.0.0.1 <none> /TCP 9d
service/nginx ClusterIP None <none> /TCP 13s NAME READY AGE
statefulset.apps/web / 13s
[root@k8s-master1 volume]# kubectl get pv,pvc    #查看pv动态供给
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/default-www-web--pvc-7fe5d833-0a44-11e9-b58a-000c298a2b5f 1Gi RWO Delete Bound default/www-web- managed-nfs-storage 18s
persistentvolume/default-www-web--pvc-85d17f15-0a44-11e9-b58a-000c298a2b5f 1Gi RWO Delete Bound default/www-web- managed-nfs-storage 14s
persistentvolume/default-www-web--pvc-8aa41937-0a44-11e9-b58a-000c298a2b5f 1Gi RWO Delete Bound default/www-web- managed-nfs-storage 6s NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/www-web- Bound default-www-web--pvc-7fe5d833-0a44-11e9-b58a-000c298a2b5f 1Gi RWO managed-nfs-storage 24s
persistentvolumeclaim/www-web- Bound default-www-web--pvc-85d17f15-0a44-11e9-b58a-000c298a2b5f 1Gi RWO managed-nfs-storage 14s
persistentvolumeclaim/www-web- Bound default-www-web--pvc-8aa41937-0a44-11e9-b58a-000c298a2b5f 1Gi RWO managed-nfs-storage 6s
[root@k8s-master1 volume]# kubectl get pod    #查看pod
NAME READY STATUS RESTARTS AGE
nfs-client-provisioner-f69cd5cf-rfbdb / Running 2m16s
web- / Running 33s
web- / Running 23s
web- / Running 15s

删除statefulSet,PVC依旧存在的,再重新创建pod时,依旧会重新去绑定原来的pvc

[root@k8s-master1 volume]# kubectl delete -f nginx-demo.yaml
service "nginx" deleted
statefulset.apps "web" deleted
[root@k8s-master1 volume]# kubectl get pods -w
NAME READY STATUS RESTARTS AGE
nfs-client-provisioner-f69cd5cf-rfbdb / Running 7m58s
web- / Terminating 6m15s
web- / Terminating 6m5s
web- / Terminating 5m57s
web- / Terminating 6m17s
web- / Terminating 6m17s
web- / Terminating 5m59s
web- / Terminating 5m59s
web- / Terminating 6m11s
web- / Terminating 6m11s
[root@k8s-master1 volume]# kubectl apply -f nginx-demo.yaml
service/nginx created
statefulset.apps/web created
[root@k8s-master1 volume]# kubectl get pv,pvc
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/default-www-web--pvc-7fe5d833-0a44-11e9-b58a-000c298a2b5f 1Gi RWO Delete Bound default/www-web- managed-nfs-storage 9m34s
persistentvolume/default-www-web--pvc-85d17f15-0a44-11e9-b58a-000c298a2b5f 1Gi RWO Delete Bound default/www-web- managed-nfs-storage 9m30s
persistentvolume/default-www-web--pvc-8aa41937-0a44-11e9-b58a-000c298a2b5f 1Gi RWO Delete Bound default/www-web- managed-nfs-storage 9m22s NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/www-web- Bound default-www-web--pvc-7fe5d833-0a44-11e9-b58a-000c298a2b5f 1Gi RWO managed-nfs-storage 9m40s
persistentvolumeclaim/www-web- Bound default-www-web--pvc-85d17f15-0a44-11e9-b58a-000c298a2b5f 1Gi RWO managed-nfs-storage 9m30s
persistentvolumeclaim/www-web- Bound default-www-web--pvc-8aa41937-0a44-11e9-b58a-000c298a2b5f 1Gi RWO managed-nfs-storage 9m22s
滚动更新

RollingUpdate 更新策略在 StatefulSet 中实现 Pod 的自动滚动更新。 当StatefulSet的 .spec.updateStrategy.type 设置为 RollingUpdate 时,默认为:RollingUpdate。StatefulSet 控制器将在 StatefulSet 中删除并重新创建每个 Pod。 它将以与 Pod 终止相同的顺序进行(从最大的序数到最小的序数),每次更新一个 Pod。 在更新其前身之前,它将等待正在更新的 Pod 状态变成正在运行并就绪。如下操作的滚动更新是有2-0的顺序更新。

[root@k8s-master1 volume]# vim nginx-demo.yaml
[root@k8s-master1 volume]# kubectl apply -f nginx-demo.yaml
service/nginx unchanged
statefulset.apps/web configured
[root@k8s-master1 volume]# kubectl get pods -w
NAME READY STATUS RESTARTS AGE
nfs-client-provisioner-f69cd5cf-rfbdb / Running 14m
web- / Running 3m42s
web- / Running 3m34s
web- / Terminating 3m24s
web- / Terminating 3m35s
web- / Terminating 3m35s
web- / Pending 0s
web- / Pending 0s
web- / ContainerCreating 0s
web- / Running 7s
web- / Terminating 3m52s
web- / Terminating 3m53s
web- / Terminating 3m54s
web- / Terminating 3m54s
web- / Pending 0s
web- / Pending 0s
web- / ContainerCreating 0s
web- / Running 23s
web- / Terminating 4m25s
web- / Terminating 4m26s
web- / Terminating 4m33s
web- / Terminating 4m33s
web- / Pending 0s
web- / Pending 0s
web- / ContainerCreating 0s
web- / Running 4s
扩展伸缩
[root@k8s-master1 volume]# kubectl scale sts web --replicas=5  #扩展到5个副本
statefulset.apps/web scaled
[root@k8s-master1 volume]# kubectl get pod -w    #动态查看扩容
NAME READY STATUS RESTARTS AGE
nfs-client-provisioner-f69cd5cf-rfbdb / Running 25m
web- / Running 9m40s
web- / Running 10m
web- / Running 10m
web- / ContainerCreating 12s
web- / Running 21s
web- / Pending 0s
web- / Pending 0s
web- / Pending 1s
web- / ContainerCreating 1s
web- / Running 9s
[root@k8s-master1 volume]# kubectl get pv,pvc    #查看pv绑定
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/default-www-web--pvc-7fe5d833-0a44-11e9-b58a-000c298a2b5f 1Gi RWO Delete Bound default/www-web- managed-nfs-storage 25m
persistentvolume/default-www-web--pvc-85d17f15-0a44-11e9-b58a-000c298a2b5f 1Gi RWO Delete Bound default/www-web- managed-nfs-storage 25m
persistentvolume/default-www-web--pvc-8aa41937-0a44-11e9-b58a-000c298a2b5f 1Gi RWO Delete Bound default/www-web- managed-nfs-storage 25m
persistentvolume/default-www-web--pvc-c7efc39f-0a47-11e9-b58a-000c298a2b5f 1Gi RWO Delete Bound default/www-web- managed-nfs-storage 2m10s
persistentvolume/default-www-web--pvc-d498cf02-0a47-11e9-b58a-000c298a2b5f 1Gi RWO Delete Bound default/www-web- managed-nfs-storage 112s NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/www-web- Bound default-www-web--pvc-7fe5d833-0a44-11e9-b58a-000c298a2b5f 1Gi RWO managed-nfs-storage 25m
persistentvolumeclaim/www-web- Bound default-www-web--pvc-85d17f15-0a44-11e9-b58a-000c298a2b5f 1Gi RWO managed-nfs-storage 25m
persistentvolumeclaim/www-web- Bound default-www-web--pvc-8aa41937-0a44-11e9-b58a-000c298a2b5f 1Gi RWO managed-nfs-storage 25m
persistentvolumeclaim/www-web- Bound default-www-web--pvc-c7efc39f-0a47-11e9-b58a-000c298a2b5f 1Gi RWO managed-nfs-storage 2m13s
persistentvolumeclaim/www-web- Bound default-www-web--pvc-d498cf02-0a47-11e9-b58a-000c298a2b5f 1Gi RWO managed-nfs-storage 112s [root@k8s-master1 volume]# kubectl patch sts web -p '{"spec":{"replicas":2}}'  #缩容到两个副本
statefulset.apps/web patched
[root@k8s-master1 volume]# kubectl get pod -w    #动态查看缩容
NAME READY STATUS RESTARTS AGE
nfs-client-provisioner-f69cd5cf-rfbdb / Running 28m
web- / Running 12m
web- / Running 13m
web- / Running 13m
web- / Running 3m16s
web- / Terminating 2m55s
web- / Terminating 2m57s
web- / Terminating 2m57s
web- / Terminating 3m18s
web- / Terminating 3m19s
web- / Terminating 3m22s
web- / Terminating 3m22s
web- / Terminating 13m
web- / Terminating 13m
web- / Terminating 13m
web- / Terminating 13m
更新策略
[root@k8s-master1 volume]# kubectl patch sts web -p '{"spec":{"updateStrategy":{"rollingUpdate":{"partition":2}}}}'
statefulset.apps/web patched
[root@k8s-master1 volume]# kubectl describe sts web
Name: web
Namespace: default
CreationTimestamp: Fri, Dec :: +
Selector: app=nginx
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"apps/v1","kind":"StatefulSet","metadata":{"annotations":{},"name":"web","namespace":"default"},"spec":{"replicas":,"select...
Replicas: desired | total
Update Strategy: RollingUpdate
Partition:
Pods Status: Running / Waiting / Succeeded / Failed
。。。
版本升级
[root@k8s-master1 volume]# kubectl get sts -o wide
NAME READY AGE CONTAINERS IMAGES
web / 29m nginx nginx:1.14
[root@k8s-master1 volume]# kubectl set image sts/web nginx=nginx:1.15
statefulset.apps/web image updated
[root@k8s-master1 volume]# kubectl get sts -o wide
NAME READY AGE CONTAINERS IMAGES
web / 32m nginx nginx:1.15

headless service做dns解析是直接解析到pod的

[root@k8s-master1 volume]# kubectl get pod,svc -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/nfs-client-provisioner-f69cd5cf-rfbdb / Running 74m 172.17.73.3 192.168.0.126 <none> <none>
pod/web- / Running 59m 172.17.32.3 192.168.0.125 <none> <none>
pod/web- / Running 59m 172.17.73.5 192.168.0.126 <none> <none> NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/kubernetes ClusterIP 10.0.0.1 <none> /TCP 9d <none>
service/nginx ClusterIP None <none> /TCP 63m app=nginx
[root@k8s-master1 volume]# kubectl run -it --image=busybox:1.28. --rm --restart=Never sh
If you don't see a command prompt, try pressing enter.
/ # nslookup web-.nginx
Server: 10.0.0.2
Address : 10.0.0.2 kube-dns.kube-system.svc.cluster.local Name: web-.nginx
Address : 172.17.32.3 web-.nginx.default.svc.cluster.local
/ # nslookup web-.nginx
Server: 10.0.0.2
Address : 10.0.0.2 kube-dns.kube-system.svc.cluster.local Name: web-.nginx
Address : 172.17.73.5 web-.nginx.default.svc.cluster.local

JOB

https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/

Job分为普通任务(Job)和定时任务(CronJob)

一次性执行

应用场景:离线数据处理,视频解码等业务

job示例
[root@k8s-master1 ~]# vim job.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
backoffLimit: [root@k8s-master1 ~]# kubectl apply -f job.yaml
job.batch/pi created
[root@k8s-master1 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nfs-client-provisioner-f69cd5cf-rfbdb / Running 87m
pi-nslj8 / Completed 119s
web- / Running 71m
web- / Running 72m
[root@k8s-master1 ~]# kubectl logs pi-nslj8
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275898

cronjob

https://kubernetes.io/docs/tasks/job/automated-tasks-with-cron-jobs/

定时任务,像Linux的Crontab一样。

应用场景:通知,备份

cronjob示例

[root@k8s-master1 ~]# vim cronjob.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure [root@k8s-master1 ~]# kubectl apply -f cronjob.yaml
cronjob.batch/hello created
[root@k8s-master1 ~]# kubectl get cronjob
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
hello */ * * * * False 5s 8s
[root@k8s-master1 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
hello--zhf2w / Completed 67s
hello--zftxj / ContainerCreating 7s
nfs-client-provisioner-f69cd5cf-rfbdb / Running 96m
pi-nslj8 / Completed 10m
web- / Running 80m
web- / Running 81m
[root@k8s-master1 ~]# kubectl logs hello--zhf2w
Fri Dec :: UTC
Hello from the Kubernetes cluster

kubernetes-控制器statefulset和Job(十三)的更多相关文章

  1. 图解kubernetes控制器StatefulSet核心实现原理

    StatefulSet是k8s中有状态应用管理的标准实现,今天就一起来了解下其背后设计的场景与原理,从而了解其适用范围与场景 1. 基础概念 首先介绍有状态应用里面的需要考虑的一些基础的事情,然后在下 ...

  2. Kubernetes 控制器

    在实际使用的时候并不会直接使用 Pod,而是会使用各种控制器来满足我们的需求,Kubernetes 中运行了一系列控制器来确保集群的当前状态与期望状态保持一致,它们就是 Kubernetes 的大脑. ...

  3. Kubernetes学习之路(十三)之Pod控制器--DaemonSet

    一.什么是DaemonSet? DaemonSet 确保全部(或者一些)Node 上运行一个 Pod 的副本.当有 Node 加入集群时,也会为他们新增一个 Pod .当有 Node 从集群移除时,这 ...

  4. 9、kubernetes之statefulset控制器

    一.StatefulSet 有状态副本集 必要的三个组件:headless service.StatefulSet.volumeClaimTemplate 准备pv apiVersion: v1 ki ...

  5. Kubernetes — 控制器

    Pod 这个看似复杂的 API 对象,实际上就是对容器的进一步抽象和封装而已. 说得更形象些,“容器”镜像虽然好用,但是容器这样一个“沙盒”的概念,对于描述应用来说, 还是太过简单了. 这就好比,集装 ...

  6. Kubernetes之StatefulSet

    什么是StatefulSet StatefulSet 是Kubernetes中的一种控制器,他解决的什么问题呢?我们知道Deployment是对应用做了一个简化设置,Deployment认为一个应用的 ...

  7. Kubernetes中StatefulSet介绍

    StatefulSet 是Kubernetes1.9版本中稳定的特性,本文使用的环境为 Kubernetes 1.11.如何搭建环境可以参考kubeadm安装kubernetes V1.11.1 集群 ...

  8. kubernetes之StatefulSet详解

    系列目录 概述 RC.Deployment.DaemonSet都是面向无状态的服务,它们所管理的Pod的IP.名字,启停顺序等都是随机的,而StatefulSet是什么?顾名思义,有状态的集合,管理所 ...

  9. kubernetes 控制器详解【持续完善中】

    目录 资源创建详解 一:Pod及常用参数 1.简介 2.模板 3.删除pod 4.设置Pod主机名 5.镜像拉取策略(ImagePullPolicy) 二:RC 1.简介 2.模板 三:Deploym ...

  10. kubernetes之StatefulSet部署zk和kafka

    前提 至少需要三个node节点,否则修改亲和性配置 如果外部访问,需要自己暴露 需要有个storageClass,这样做的原因是避免手动创建pv了 部署zk和kafka 参考: https://www ...

随机推荐

  1. from表单,图片预览,和表单提交

    <form> <input id="file" class="topsub-file" type="file" name= ...

  2. JS判断所有IE浏览器所有版本

    原来判断IE浏览器版本很简单,但是随着版本的升级,navigator.userAgent显示的信息也不一样:下图是IE11显示的信息

  3. ajax禁止浏览器缓存

    把cache 设置为false ,把 ifModified 设置为true //工作计划function workprogram(date_time){    $.ajax({        asyn ...

  4. maya2012无法安装卸载激活失败

    AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...

  5. CentOS 7 Linux 卸载/安装 Mariadb MySQL mysql 5.7

    [root@localhost mysql]# ls mysql-community-client--.el7.x86_64.rpm mysql-community-embedded-compat-- ...

  6. PV、UV、VV,CV的含义

    其中VV和CV是播放类指标,PV和UV是浏览类指标. 1. 播放类指标 VV(Video View,播放数),是指在一个统计周期内,视频被打开的次数之和. CV(Connect Views,内容播放数 ...

  7. LeetCode 62.不同路径(C++)

    一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为“Finish”). 问总共有多 ...

  8. NASM在Ubuntu上的安装与简单使用

    一 .安装NASM 1. 下载安装文件 地址是:http://www.nasm.us/pub/nasm/releasebuilds/2.11.08/ 2.解压(具体命令要根据压缩包的类型来选用) 3. ...

  9. 【转】Android 中的 Service 全面总结

    1.Service的种类   按运行地点分类: 类别 区别  优点 缺点   应用 本地服务(Local) 该服务依附在主进程上,  服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另 ...

  10. Devexpress Xtrareport 并排报表

    什么是并排报表呢? 按照我个人理解:并排报表是把两张或者两张以上的报表,放在一个报表页面. 注:为了方便,本示例使用同一个数据源,但是您可以使用相同的方法,而在一个报表文档中显示两个完全不同的 (使用 ...