[toc]

六、Job

6.1 概述

Job主要用于负责批量处理短暂的一次性任务。
Job的特点:

  1. 当Job创建的Pod执行成功结束时,Job将记录成功结束的Pod数量。
  2. 当成功结束的Pod达到指定的数量时,Job将完成执行。

Job可以保证指定数量的Pod执行完成。
image.png

Job的资源清单:

apiVersion: batch/v1 # 版本号
kind: Job # 类型
metadata: # 元数据
  name:  # 名称
  namespace:  #命名空间
  labels: # 标签
    controller: job
spec: # 详情描述
  completions: 1 # 指定Job需要成功运行Pod的总次数,默认为1
  parallelism: 1 # 指定Job在任一时刻应该并发运行Pod的数量,默认为1
  activeDeadlineSeconds: 30 # 指定Job可以运行的时间期限,超过时间还没结束,系统将会尝试进行终止
  backoffLimit: 6 # 指定Job失败后进行重试的次数,默认为6
  manualSelector: true # 是否可以使用selector选择器选择Pod,默认为false
  selector: # 选择器,通过它指定该控制器管理那些Pod
    matchLabels: # Labels匹配规则
      app: counter-pod
    matchExpressions: # Expressions匹配规则
      - key: app
        operator: In
        values:
          - counter-pod
  template: # 模板,当副本数量不足时,会根据下面的模板创建Pod模板
     metadata:
       labels:
         app: counter-pod
     spec:
       restartPolicy: Never # 重启策略只能设置为Never或OnFailure
       containers:
         - name: counter
           image: busybox:1.30
           command: ["/bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1;do echo $i;sleep 20;done"]

关于模板中的重启策略的说明:

  1. 如果设置为OnFailure,则Job会在Pod出现故障的时候重启容器,而不是创建Pod,failed次数不变。
  2. 如果设置为Never,则Job会在Pod出现故障的时候创建新的Pod,并且故障Pod不会消失,也不会重启,failed次数+1。
  3. 如果指定为Always的话,就意味着一直重启,意味着Pod任务会重复执行,这和Job的定义冲突,所以不能设置为Always。

6.2 创建Job

创建pc-job.yaml文件,内容如下:

apiVersion: batch/v1 # 版本号
kind: Job # 类型
metadata: # 元数据
  name: pc-job # 名称
  namespace: dev #命名空间
spec: # 详情描述
  manualSelector: true # 是否可以使用selector选择器选择Pod,默认为false
  selector: # 选择器,通过它指定该控制器管理那些Pod
    matchLabels: # Labels匹配规则
      app: counter-pod
  template: # 模板,当副本数量不足时,会根据下面的模板创建Pod模板
    metadata:
      labels:
        app: counter-pod
    spec:
      restartPolicy: Never # 重启策略只能设置为Never或OnFailure
      containers:
        - name: counter
          image: busybox:1.30
          command: [ "/bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1;do echo $i;sleep 3;done" ]

创建Job:

kubectl create -f pc-job.yaml

6.3 查看Job

查看Job:

kubectl get job -n dev -w

image.png

查看Pod:

kubectl get pod -n dev -w

image.png

6.4 删除Job

删除Job:

kubectl delete -f pc-job.yaml

7 CronJob(CJ)

7.1 概述

CronJob控制器以Job控制器为其管控对象,并借助它管理Pod资源对象,Job控制器定义的作业任务在其控制器资源创建之后便会立即执行,但CronJob可以以类似Linux操作系统的周期性任务作业计划的方式控制器运行时间点及重复运行的方式,换言之,CronJob可以在特定的时间点反复去执行Job任务。

image.png

CronJob的资源清单:

apiVersion: batch/v1beta1 # 版本号
kind: CronJob # 类型
metadata: # 元数据
  name:  # 名称
  namespace:  #命名空间
  labels:
    controller: cronjob
spec: # 详情描述
  schedule: # cron格式的作业调度运行时间点,用于控制任务任务时间执行
  concurrencyPolicy: # 并发执行策略
  failedJobsHistoryLimit: # 为失败的任务执行保留的历史记录数,默认为1
  successfulJobsHistoryLimit: # 为成功的任务执行保留的历史记录数,默认为3
  jobTemplate: # job控制器模板,用于为cronjob控制器生成job对象,下面其实就是job的定义
    metadata: {}
    spec:
      completions: 1 # 指定Job需要成功运行Pod的总次数,默认为1
      parallelism: 1 # 指定Job在任一时刻应该并发运行Pod的数量,默认为1
      activeDeadlineSeconds: 30 # 指定Job可以运行的时间期限,超过时间还没结束,系统将会尝试进行终止
      backoffLimit: 6 # 指定Job失败后进行重试的次数,默认为6
      template: # 模板,当副本数量不足时,会根据下面的模板创建Pod模板
        spec:
          restartPolicy: Never # 重启策略只能设置为Never或OnFailure
          containers:
            - name: counter
              image: busybox:1.30
              command: [ "/bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1;do echo $i;sleep 20;done" ]

schedule:cron表达式,用于指定任务的执行时间。

*/1 * * * *:表示分钟 小时 日 月份 星期。

  1. 分钟的值从0到59。
  2. 小时的值从0到23。
  3. 日的值从1到31。
  4. 月的值从1到12。
  5. 星期的值从0到6,0表示星期日。

多个时间可以用逗号隔开,范围可以用连字符给出:* 可以作为通配符,/表示每...

concurrencyPolicy:并发执行策略

  1. Allow:运行Job并发运行(默认)。
  2. Forbid:禁止并发运行,如果上一次运行尚未完成,则跳过下一次运行。
  3. Replace:替换,取消当前正在运行的作业并使用新作业替换它。

7.2 创建CronJob

创建pc-cronjob.yaml文件,内容如下:

apiVersion: batch/v1beta1 # 版本号
kind: CronJob # 类型
metadata: # 元数据
  name: pc-cronjob # 名称
  namespace: dev  #命名空间
spec: # 详情描述
  schedule: "*/1 * * * * " # cron格式的作业调度运行时间点,用于控制任务任务时间执行
  jobTemplate: # job控制器模板,用于为cronjob控制器生成job对象,下面其实就是job的定义
    metadata: {}
    spec:
      template: # 模板,当副本数量不足时,会根据下面的模板创建Pod模板
        spec:
          restartPolicy: Never # 重启策略只能设置为Never或OnFailure
          containers:
            - name: counter
              image: busybox:1.30
              command: [ "/bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1;do echo $i;sleep 2;done" ]

创建CronJob:

kubectl create -f pc-cronjob.yaml

7.3 查看CronJob

查看CronJob:

kubectl get cronjob -n dev -w

image.png

查看Job:

kubectl get job -n dev -w

image.png

查看Pod:

kubectl get pod -n dev -w

image.png

7.4 删除CronJob

删除CronJob:

kubectl delete -f pc-cronjob.yaml

八、StatefulSet(有状态)

8.1 概述

无状态应用:

  1. 认为Pod都是一样的。
  2. 没有顺序要求。
  3. 不用考虑在哪个Node节点上运行。
  4. 随意进行伸缩和扩展。

有状态应用:

  1. 有顺序的要求。
  2. 认为每个Pod都是不一样的。
  3. 需要考虑在哪个Node节点上运行。
  4. 需要按照顺序进行伸缩和扩展。
  5. 让每个Pod都是独立的,保持Pod启动顺序和唯一性。
  6. StatefulSet是Kubernetes提供的管理有状态应用的负载管理控制器。
  7. StatefulSet部署需要HeadLinessService(无头服务)。

为什么需要HeadLinessService(无头服务)?

在用Deployment时,每一个Pod名称是没有顺序的,是随机字符串,因此是Pod名称是无序的,但是在StatefulSet中要求必须是有序 ,每一个Pod不能被随意取代,Pod重建后pod名称还是一样的。
而Pod IP是变化的,所以是以Pod名称来识别。Pod名称是Pod唯一性的标识符,必须持久稳定有效。这时候要用到无头服务,它可以给每个Pod一个唯一的名称 。

StatefulSet常用来部署RabbitMQ集群、Zookeeper集群、MySQL集群、Eureka集群等。

8.2 创建StatefulSet

创建pc-stateful.yaml文件,内容如下:

apiVersion: v1
kind: Service
metadata:
  name: service-headliness
  namespace: dev
spec:
  selector:
    app: nginx-pod
  clusterIP: None # 将clusterIP设置为None,即可创建headliness Service
  type: ClusterIP
  ports:
    - port: 80 # Service的端口
      targetPort: 80 # Pod的端口
---

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: pc-statefulset
  namespace: dev
spec:
  replicas: 3
  serviceName: service-headliness
  selector:
    matchLabels:
      app: nginx-pod
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
        - name: nginx
          image: nginx:1.17.1
          ports:
            - containerPort: 80
  • 创建StatefulSet:
kubectl create -f pc-stateful.yaml

8.3 查看StatefulSet

查看StatefulSet:

kubectl get statefulset pc-statefulset -n dev -o wide

image.png

查看Pod:

kubectl get pod -n dev -o wide

image.png

8.4 删除StatefulSet

删除StatefulSet:

kubectl delete -f pc-stateful.yaml

8.5 Deployment和StatefulSet的区别

  1. Deployment和StatefulSet的区别:Deployment没有唯一标识而StatefulSet有唯一标识。
  2. StatefulSet的唯一标识是根据主机名+一定规则生成的。
  3. StatefulSet的唯一标识是主机名.无头Service名称.命名空间.svc.cluster.local

8.6 StatefulSet的金丝雀发布

StatefulSet支持两种更新策略:OnDelete和RollingUpdate(默认),其中OnDelete表示删除之后才更新,RollingUpdate表示滚动更新。

updateStrategy:
  rollingUpdate: # 如果更新的策略是OnDelete,那么rollingUpdate就失效
    partition: 2 # 表示从第2个分区开始更新,默认是0
  type: RollingUpdate /OnDelete # 滚动更新

示例:pc-statefulset.yaml

apiVersion: v1
kind: Service
metadata:
  name: service-headliness
  namespace: dev
spec:
  selector:
    app: nginx-pod
  clusterIP: None # 将clusterIP设置为None,即可创建headliness Service
  type: ClusterIP
  ports:
    - port: 80 # Service的端口
      targetPort: 80 # Pod的端口
---

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: pc-statefulset
  namespace: dev
spec:
  replicas: 3
  serviceName: service-headliness
  selector:
    matchLabels:
      app: nginx-pod
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
        - name: nginx
          image: nginx:1.17.1
          ports:
            - containerPort: 80
			
  updateStrategy:
    rollingUpdate:
      partition: 0
    type: RollingUpdate  			

Q.E.D.


只有创造,才是真正的享受,只有拚搏,才是充实的生活。