从前面的学习我们知道使用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. Django-1 简介

    1.1 MVC与MTV模型 MVCWeb服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的.松耦合的方式连接在一起,模型负 ...

  2. 以多进程读取oss符合条件的数据为例,综合使用多进程间的通信、获取多进程的数据

    import datetime import sys import oss2 from itertools import islice import pandas as pd import re im ...

  3. Factorization Machines with libFM 论文阅读

    Factorization Machines with libFM https://pan.baidu.com/s/1aAyhHGNSrZQFDfoz8VsHIQ libFM网站:http://www ...

  4. lscons 命令,设置当前控制台设备的名称写至标准输出

    用途 将当前控制台设备的名称写至标准输出. 语法 lscons [ -s ] [ -a | -O ] lscons -b [ -s ] [ -a | -O ] lscons -d [ -s ] 描述 ...

  5. 利用jquery给指定的table动态添加一行、删除一行,复制,值不重复等操作

    $("#mytable tr").find("td:nth-child(1)") 1表示获取每行的第一列$("#mytable tr").f ...

  6. C#多样式EXECl导出

    sing NPOI.HPSF; using NPOI.HSSF.UserModel; using NPOI.HSSF.Util; using System; using System.Collecti ...

  7. python反爬之封IP

    # requests是第三方库,需要安装 pip install requests import requests # 在日常的爬虫中,封ip也是一个很常用的反爬虫手段,遇到这种情况,我们只需要在每次 ...

  8. .NET 自动内存管理(垃圾收集GC)

    自动内存管理(垃圾收集GC) 在面向对象的环境里, 要使用资源,必须为响应 的类型分配一定 的内存空间.下面是访问一个资源所需要的几个步骤: 1. 调用中间语言(IL)的newobj 指令.当我们用N ...

  9. JAVA的图片文字识别技术

    从2013年的记录看,JAVA中图片文字识别技术大部分采用ORC的tesseract的软件功能,后来渐渐开放了java-api调用接口. 图片文字识别技术,还是采用训练的方法.并未从根本上解决图片与文 ...

  10. 跨平台移动开发phonegap/cordova 3.3全系列教程-helloworld

    1.    建立专案(cordova) 打开cmd命令行 cordova create ACESMobile aces.mobile ACES cd aces mobile 如图 2.    安装插件 ...