CKA 07_Kubernetes 工作负载与调度 控制器 ReplicaSet Deployment Jobs CronJob

1. Pod 的分类

  • 自主式 Pod:Pod 退出后不会被创建
  • 控制器管理的 Pod:在控制器的生命周期里,始终要维持 Pod 的副本数目

2. 控制器类型

  • Replication Controller 和 ReplicaSet
  • Deployment
  • DaemonSet
  • StatefulSet
  • Jobs
  • CronJob
  • HPA全称Horizontal Pod Autoscaler

3. ReplicaSet

官方文档:概念 | 工作负载 | 工作负载资源 | ReplicaSet

  • ReplicaSet 的目的是维护一组在任何时候都处于运行状态的 Pod 副本的稳定集合。 因此,它通常用来保证给定数量的、完全相同的 Pod 的可用性。

3.1 工作原理

  • ReplicaSet 是通过一组字段来定义的,包括一个用来识别可获得的 Pod 的集合的选择算符、一个用来标明应该维护的副本个数的数值、一个用来指定应该创建新 Pod 以满足副本个数条件时要使用的 Pod 模板等等。 每个 ReplicaSet 都通过根据需要创建和删除 Pod 以使得副本个数达到期望值, 进而实现其存在价值。当 ReplicaSet 需要创建新的 Pod 时,会使用所提供的 Pod 模板。

  • ReplicaSet 通过 Pod 上的 metadata.ownerReferences 字段连接到附属 Pod,该字段给出当前对象的属主资源。 ReplicaSet 所获得的 Pod 都在其 ownerReferences 字段中包含了属主 ReplicaSet 的标识信息。正是通过这一连接,ReplicaSet 知道它所维护的 Pod 集合的状态, 并据此计划其操作行为。

  • ReplicaSet 使用其选择算符来辨识要获得的 Pod 集合。如果某个 Pod 没有 OwnerReference 或者其 OwnerReference 不是一个 控制器,且其匹配到 某 ReplicaSet 的选择算符,则该 Pod 立即被此 ReplicaSet 获得。

  • Replication Controller和ReplicaSet
    ReplicaSet 是下一代的 Replication Controller,官方推荐使用ReplicaSet。

3.2 何时使用 ReplicaSet

  • ReplicaSet 确保任何时间都有指定数量的 Pod 副本在运行。 然而,Deployment 是一个更高级的概念,它管理 ReplicaSet,并向 Pod 提供声明式的更新以及许多其他有用的功能。 因此,我们建议使用 Deployment 而不是直接使用 ReplicaSet,除非 你需要自定义更新业务流程或根本不需要更新。
  • 虽然 ReplicaSets 可以独立使用,但今天它主要被Deployments 用作协调 Pod 创建、删除和更新的机制。
  • 这实际上意味着,你可能永远不需要操作 ReplicaSet 对象:而是使用 Deployment,并在 spec 部分定义你的应用。

3.3 创建 ReplicaSet

  1. 示例
[root@k8s-1 ~]# vim rs.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replicaset-example
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
  • 生效后,查看当前被部署的 ReplicaSet ,并看到所创建的前端
[root@k8s-1 ~]# kubectl get rs
NAME                DESIRED   CURRENT   READY   AGE
replicaset-example   3         3         3       8m52s
  • 查看查看启动了的 Pods,总数为 3
[root@k8s-1 ~]# kubectl get pod --show-labels 
NAME                      READY   STATUS    RESTARTS   AGE     LABELS
eplicaset-example-gkpll   1/1     Running   0          2m18s   app=nginx
eplicaset-example-p85kh   1/1     Running   0          2m18s   app=nginx
eplicaset-example-xwt4r   1/1     Running   0          2m18s   app=nginx
  • 查看 Pods 的属主引用被设置为前端的 ReplicaSet。 要实现这点,可取回运行中的 Pods 之一的 YAML

  • 输出将类似这样,ReplicaSet 的信息被设置在 metadata 的 ownerReferences 字段中

  • pod 的名字由 RS- 随机数 组成,从下图的 ownerReference 可以查看到当前 pod 由 RS 创建

[root@k8s-1 ~]# kubectl get pod replicaset-example-gkpll -o yaml | less

在这里插入图片描述

  1. 修改示例,将副本数改成 6
[root@k8s-1 ~]# vim rs.yaml 
  replicas: 6
  • 生效后,查看启动了的 Pods,总数变为 6
[root@k8s-1 ~]# kubectl apply -f rs.yaml 
replicaset.apps/eplicaset-example configured
[root@k8s-1 ~]# kubectl get pod --show-labels 
NAME                      READY   STATUS    RESTARTS   AGE     LABELS
eplicaset-example-d75lr   1/1     Running   0          58s     app=nginx
eplicaset-example-gkpll   1/1     Running   0          6m50s   app=nginx
eplicaset-example-gnqv9   1/1     Running   0          58s     app=nginx
eplicaset-example-p85kh   1/1     Running   0          6m50s   app=nginx
eplicaset-example-xtddf   1/1     Running   0          58s     app=nginx
eplicaset-example-xwt4r   1/1     Running   0          6m50s   app=nginx
  • 查看当前被部署的 ReplicaSet
[root@k8s-1 ~]# kubectl get rs
NAME                DESIRED   CURRENT   READY   AGE
eplicaset-example   6         6         6       8m52s

3.4 修改 RS 管理 pod 的标签

  1. 修改第一个 pod 的标签,原本标签为 nginx,现在更改为 demo
[root@k8s-1 ~]# kubectl label pod eplicaset-example-d75lr app=demo --overwrite
pod/eplicaset-example-d75lr labeled
  1. 修改完成后,查看启动的 Pods,发现总数变为 7
[root@k8s-1 ~]# kubectl get pod --show-labels 
NAME                      READY   STATUS    RESTARTS   AGE     LABELS
eplicaset-example-d75lr   1/1     Running   0          2m41s   app=demo
eplicaset-example-gkpll   1/1     Running   0          8m33s   app=nginx
eplicaset-example-gnqv9   1/1     Running   0          2m41s   app=nginx
eplicaset-example-j9rn9   1/1     Running   0          20s     app=nginx
eplicaset-example-p85kh   1/1     Running   0          8m33s   app=nginx
eplicaset-example-xtddf   1/1     Running   0          2m41s   app=nginx
eplicaset-example-xwt4r   1/1     Running   0          8m33s   app=nginx
  1. 部署的 RS 的状态,发现还是 6
[root@k8s-1 ~]# kubectl get rs
NAME                DESIRED   CURRENT   READY   AGE
eplicaset-example   6         6         6       8m52s
  1. 查看 RS 的状态
  • 改了其中一个 Pod 的标签,RS 就会发现少了一个 nginx 标签的Pod。
  • 这个改了标签的 Pod 脱离了 RS 的管控,RS 会再拉起一个新的 Pod,满足 6 个 Pod
[root@k8s-1 ~]# kubectl describe rs eplicaset-example
Events:
  Type    Reason            Age    From                   Message
  ----    ------            ----   ----                   -------
  Normal  SuccessfulCreate  9m55s  replicaset-controller  Created pod: eplicaset-example-gkpll
  Normal  SuccessfulCreate  9m55s  replicaset-controller  Created pod: eplicaset-example-xwt4r
  Normal  SuccessfulCreate  9m55s  replicaset-controller  Created pod: eplicaset-example-p85kh
  Normal  SuccessfulCreate  4m3s   replicaset-controller  Created pod: eplicaset-example-d75lr
  Normal  SuccessfulCreate  4m3s   replicaset-controller  Created pod: eplicaset-example-xtddf
  Normal  SuccessfulCreate  4m3s   replicaset-controller  Created pod: eplicaset-example-gnqv9
  Normal  SuccessfulCreate  102s   replicaset-controller  Created pod: eplicaset-example-j9rn9

3.5 还原 RS 管理 pod 的标签

  1. 改回之前的 nginx 标签
[root@k8s-1 ~]# kubectl label pod eplicaset-example-d75lr app=nginx --overwrite
pod/eplicaset-example-d75lr labeled
  1. 查看启动的 Pods,并查看对应标签,发现总数为 6
[root@k8s-1 ~]# kubectl get pod --show-labels 
NAME                      READY   STATUS    RESTARTS   AGE     LABELS
eplicaset-example-d75lr   1/1     Running   0          4m56s   app=nginx
eplicaset-example-gkpll   1/1     Running   0          10m     app=nginx
eplicaset-example-gnqv9   1/1     Running   0          4m56s   app=nginx
eplicaset-example-p85kh   1/1     Running   0          10m     app=nginx
eplicaset-example-xtddf   1/1     Running   0          4m56s   app=nginx
eplicaset-example-xwt4r   1/1     Running   0          10m     app=nginx
  1. RS 的状态
  • 当将标签还原后,RS就会发现集群中就有 7 个符合要求和标签 Pods,超出了要求的副本数。于是,RS 就会回收新创建的那个 Pod

4. Deployment

官方文档: 概念 | 工作负载 | 工作负载资源 | Deployment

4.1 准备工作

  • 一个 Deployment 为 Pod 和 ReplicaSet 提供声明式的更新能力。

  • 你负责描述 Deployment 中的 目标状态,而 Deployment 控制器(Controller) 以受控速率更改实际状态, 使其变为期望状态。你可以定义 Deployment 以创建新的 ReplicaSet,或删除现有 Deployment, 并通过新的 Deployment 收养其资源。

4.2 用例

以下是 Deployments 的典型用例:

  • 创建 Deployment 以将 ReplicaSet 上线。 ReplicaSet 在后台创建 Pods。 检查 ReplicaSet 的上线状态,查看其是否成功。
  • 通过更新 Deployment 的 PodTemplateSpec,声明 Pod 的新状态 。 新的 ReplicaSet 会被创建,Deployment 以受控速率将 Pod 从旧 ReplicaSet 迁移到新 ReplicaSet。 每个新的 ReplicaSet 都会更新 Deployment 的修订版本。
  • 如果 Deployment 的当前状态不稳定,回滚到较早的 Deployment 版本。 每次回滚都会更新 Deployment 的修订版本。
  • 扩大 Deployment 规模以承担更多负载。
  • 暂停 Deployment 以应用对 PodTemplateSpec 所作的多项修改, 然后恢复其执行以启动新的上线版本。
  • 使用 Deployment 状态 来判定上线过程是否出现停滞。
  • 清理较旧的不再需要的 ReplicaSet 。

4.3 创建 Deployment

  1. 下面是一个 Deployment 示例。其中创建了一个 ReplicaSet,负责启动三个 nginx Pods
  • 创建名为 nginx-deployment(由 .metadata.name 字段标明)的 Deployment。

  • 该 Deployment 创建三个(由 replicas 字段标明)Pod 副本。

  • selector 字段定义 Deployment 如何查找要管理的 Pods。 在这里,你选择在 Pod 模板中定义的标签(app: nginx)。 不过,更复杂的选择规则是也可能的,只要 Pod 模板本身满足所给规则即可。

  • template 字段包含以下子字段:

    • Pod 被使用 .metadata.labels 字段打上 app: nginx 标签。
    • Pod 模板规约(即 .template.spec 字段)指示 Pods 运行一个 nginx 容器
    • 创建一个容器并使用 .spec.template.spec.containers[0].name 字段将其命名为 nginx。
[root@k8s-1 ~]# vim deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-example
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
  1. 生效创建 Deployment
[root@k8s-1 ~]# kubectl apply -f deployment.yaml 
deployment.apps/deployment-example created
  1. 运行 kubectl get all 检查 Deployment 是否已创建。 输出类似于
  • 在检查集群中的 Deployment 时,所显示的字段有:

    • NAME 列出了集群中 Deployment 的名称。
    • READY 显示应用程序的可用的“副本”数。显示的模式是“就绪个数/期望个数”。
    • UP-TO-DATE 显示为了达到期望状态已经更新的副本数。
    • AVAILABLE 显示应用可供用户使用的副本数。
    • AGE 显示应用程序运行的时间。
  • 请注意期望副本数是根据 .spec.replicas 字段设置 3。

[root@k8s-1 ~]# kubectl get all
NAME                                      READY   STATUS    RESTARTS   AGE
pod/deployment-example-6799fc88d8-6xgtr   1/1     Running   0          38s
pod/deployment-example-6799fc88d8-7bmbr   1/1     Running   0          38s
pod/deployment-example-6799fc88d8-bcn8x   1/1     Running   0          38s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   126m

NAME                                 READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/deployment-example   3/3     3            3           38s

NAME                                            DESIRED   CURRENT   READY   AGE
replicaset.apps/deployment-example-6799fc88d8   3         3         3       38s
  • 会发现最下方,创建了deployment 后有一个 RS,
    RS 的名字就是 deployment+rs版本,RS 控制业务版本,
    RS 控制副本数

4.4 Deployment 进行 Pod 的版本更新

  1. 修改 yaml 清单中 nginx 的版本
[root@k8s-1 ~]# vim deployment.yaml 

在这里插入图片描述

  1. 生效
[root@k8s-1 ~]# kubectl apply -f deployment.yaml 
deployment.apps/deployment-example configured
  1. 查看 Deployment 上线状态
  • 通过以下命令,查看到是滚动更新
[root@k8s-1 ~]# kubectl describe deployments.apps deployment-example 
Pod Template:
  Labels:  app=nginx
  Containers:
   nginx:
    Image:        nginx:1.21.1
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   deployment-example-54f48578cf (3/3 replicas created)
Events:
  Type    Reason             Age    From                   Message
  ----    ------             ----   ----                   -------
  Normal  ScalingReplicaSet  10m    deployment-controller  Scaled up replica set deployment-example-6799fc88d8 to 3
  Normal  ScalingReplicaSet  4m42s  deployment-controller  Scaled up replica set deployment-example-54f48578cf to 1
  Normal  ScalingReplicaSet  2m16s  deployment-controller  Scaled down replica set deployment-example-6799fc88d8 to 2
  Normal  ScalingReplicaSet  2m16s  deployment-controller  Scaled up replica set deployment-example-54f48578cf to 2
  Normal  ScalingReplicaSet  2m5s   deployment-controller  Scaled down replica set deployment-example-6799fc88d8 to 1
  Normal  ScalingReplicaSet  2m5s   deployment-controller  Scaled up replica set deployment-example-54f48578cf to 3
  Normal  ScalingReplicaSet  40s    deployment-controller  Scaled down replica set deployment-example-6799fc88d8 to 0

在这里插入图片描述

  1. 通过 kubectl get all 命令查看到最初的 RS 还存在,只是为 0 了,它将一直被保留下来作为之后的回滚使用
[root@k8s-1 ~]# kubectl get all
NAME                                      READY   STATUS    RESTARTS   AGE
pod/deployment-example-54f48578cf-hrntl   1/1     Running   0          3m1s
pod/deployment-example-54f48578cf-nx46r   1/1     Running   0          5m27s
pod/deployment-example-54f48578cf-z8d7b   1/1     Running   0          2m50s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   136m

NAME                                 READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/deployment-example   3/3     3            3           10m

NAME                                            DESIRED   CURRENT   READY   AGE
replicaset.apps/deployment-example-54f48578cf   3         3         3       5m27s
replicaset.apps/deployment-example-6799fc88d8   0         0         0       10m

4.5 Deployment 进行 Pod 版本回滚

  1. 将 YAML 清单中的 nginx 版本改为 latest
[root@k8s-1 ~]# vim deployment.yaml 

在这里插入图片描述

  1. 生效
[root@k8s-1 ~]# kubectl apply -f deployment.yaml 
deployment.apps/deployment-example configured
  1. 通过 kubectl get all 命令发现,RS 回到最初的版本了,Pod 中 nginx 容器的版本也回到了 latest
[root@k8s-1 ~]# kubectl get all
NAME                                      READY   STATUS    RESTARTS   AGE
pod/deployment-example-6799fc88d8-2vkw6   1/1     Running   0          42s
pod/deployment-example-6799fc88d8-dbxkc   1/1     Running   0          48s
pod/deployment-example-6799fc88d8-jq6zg   1/1     Running   0          34s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   140m

NAME                                 READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/deployment-example   3/3     3            3           14m

NAME                                            DESIRED   CURRENT   READY   AGE
replicaset.apps/deployment-example-54f48578cf   0         0         0       8m59s
replicaset.apps/deployment-example-6799fc88d8   3         3         3       14m
  1. 查看 Pod 的状态
[root@k8s-1 ~]# kubectl get pod deployment-example-6799fc88d8-2vkw6 -o yaml | less
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2022-05-09T06:10:39Z"
  generateName: deployment-example-6799fc88d8-
  labels:
    app: nginx
    pod-template-hash: 6799fc88d8
  name: deployment-example-6799fc88d8-2vkw6
  namespace: default
  ownerReferences:
  - apiVersion: apps/v1
    blockOwnerDeletion: true
    controller: true
    kind: ReplicaSet
    name: deployment-example-6799fc88d8
    uid: d9f42478-56f1-4f4c-8eb4-8541befa6d40
  resourceVersion: "12095"
  uid: 747ef794-427b-41c4-88f7-47d307a1400f
spec:
  containers:
  - image: nginx
    imagePullPolicy: Always
    name: nginx
  1. 查看 RS 的状态
[root@k8s-1 ~]# kubectl get rs deployment-example-6799fc88d8 -o yaml | less
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  annotations:
    deployment.kubernetes.io/desired-replicas: "3"
    deployment.kubernetes.io/max-replicas: "4"
    deployment.kubernetes.io/revision: "3"
    deployment.kubernetes.io/revision-history: "1"
  creationTimestamp: "2022-05-09T05:57:04Z"
  generation: 7
  labels:
    app: nginx
    pod-template-hash: 6799fc88d8
  name: deployment-example-6799fc88d8
  namespace: default
  ownerReferences:
  - apiVersion: apps/v1
    blockOwnerDeletion: true
    controller: true
    kind: Deployment
    name: deployment-example
    uid: 47d61e3f-3b59-4205-bd2a-08cff99fd529
  resourceVersion: "12139"
  uid: d9f42478-56f1-4f4c-8eb4-8541befa6d40
spec:
  replicas: 3
  selector:
    matchLabels:
  1. 通过上述 2 个命令查看到 Pod是由 RS 创建的,而 RS 是由 Deployment 创建的
  • deployment 只负责管理不同版本的 RS, RS 管理 Pod 副本数

  • 每个 RS 对应一个 deployment template 版本,同一个 replicaset 下的 Pod 版本相同

  • 当进行版本更新时,deployment 生效后,当前 RS 会先回收现有的 Pod,再进行更新,创建新的 Pod

4.6 Deployment 可以调整的参数

  1. 对 Deployment 执行 edit 操作并调整滚动更新策略
  • 更新一个删一个
[root@k8s-1 ~]# kubectl edit deployments.apps deployment-example 
  replicas: 3								//
    rollingUpdate:
      maxSurge: 0
      maxUnavailable: 1
  • 写完退出即生效

  • 拉伸副本数为 6

[root@k8s-1 ~]# kubectl scale deployment deployment-example --replicas=6
deployment.apps/deployment-example scaled
  • 查看状态
[root@k8s-1 ~]# kubectl get all
NAME                                      READY   STATUS    RESTARTS   AGE
pod/deployment-example-6799fc88d8-2vkw6   1/1     Running   0          9m57s
pod/deployment-example-6799fc88d8-79z4m   1/1     Running   0          2m9s
pod/deployment-example-6799fc88d8-bvxfz   1/1     Running   0          2m9s
pod/deployment-example-6799fc88d8-dbxkc   1/1     Running   0          10m
pod/deployment-example-6799fc88d8-jq6zg   1/1     Running   0          9m49s
pod/deployment-example-6799fc88d8-pp4wl   1/1     Running   0          2m9s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   149m

NAME                                 READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/deployment-example   6/6     6            6           23m

NAME                                            DESIRED   CURRENT   READY   AGE
replicaset.apps/deployment-example-54f48578cf   0         0         0       18m
replicaset.apps/deployment-example-6799fc88d8   6         6         6       23m
  1. 对 Deployment 执行 edit 操作
  • 副本数改为 6 ,
  • nginx的版本改为 latest,
  • 镜像策略为 “有则拉取本地的,没有则拉取外网”,
  • 最少等待 5 秒就绪
[root@k8s-1 ~]# kubectl edit deployments.apps deployment-example 
spec:
  minReadySeconds: 5
  progressDeadlineSeconds: 600
  replicas: 6

在这里插入图片描述

  • 通过 kubectl get pod 查看到,pod 是每更新一个删除一个,且 5s 的速度
[root@k8s-1 ~]# kubectl get pod
NAME                                  READY   STATUS    RESTARTS   AGE
deployment-example-7cf7d6dbc8-2hqhr   1/1     Running   0          3s
deployment-example-7cf7d6dbc8-grj42   1/1     Running   0          68s
deployment-example-7cf7d6dbc8-mx965   1/1     Running   0          54s
deployment-example-7cf7d6dbc8-nxr8z   1/1     Running   0          43s
deployment-example-7cf7d6dbc8-pp56h   1/1     Running   0          17s
deployment-example-7cf7d6dbc8-sd8qz   1/1     Running   0          32s
[root@k8s-1 ~]# kubectl rollout history deployment 
deployment.apps/deployment-example 
REVISION  CHANGE-CAUSE
2         <none>
3         <none>
4         <none>
  1. 对 Deployment 执行 edit 操作并将滚动更新策略改为 一次更新 2 个,将 nginx 的版本改为 1.21.1
  • 先修改滚动更新策略
[root@k8s-1 ~]# kubectl edit deployments.apps deployment-example 
    rollingUpdate:
      maxSurge: 0
      maxUnavailable: 2

在这里插入图片描述

  • 关闭之后即生效,再次执行 edit 操作并修改 nginx 的版本
[root@k8s-1 ~]# kubectl edit deployments.apps deployment-example 
    spec:
      containers:
      - image: nginx:1.21.1
        imagePullPolicy: IfNotPresent
        name: nginx

在这里插入图片描述

  • kubectl get pod 查看状态
[root@k8s-1 ~]# kubectl get pod
NAME                                  READY   STATUS              RESTARTS   AGE
deployment-example-585c7c497-cbstf    0/1     ContainerCreating   0          1s
deployment-example-585c7c497-cnwzr    1/1     Running             0          15s
deployment-example-585c7c497-gqb4q    0/1     ContainerCreating   0          1s
deployment-example-585c7c497-h8d4r    1/1     Running             0          24s
deployment-example-585c7c497-lj4n5    1/1     Running             0          13s
deployment-example-585c7c497-tx55h    1/1     Running             0          24s
deployment-example-7cf7d6dbc8-2hqhr   1/1     Terminating         0          6m5s
deployment-example-7cf7d6dbc8-grj42   1/1     Terminating         0          7m10s
[root@k8s-1 ~]# kubectl get pod
NAME                                 READY   STATUS    RESTARTS   AGE
deployment-example-585c7c497-cbstf   1/1     Running   0          11s
deployment-example-585c7c497-cnwzr   1/1     Running   0          25s
deployment-example-585c7c497-gqb4q   1/1     Running   0          11s
deployment-example-585c7c497-h8d4r   1/1     Running   0          34s
deployment-example-585c7c497-lj4n5   1/1     Running   0          23s
deployment-example-585c7c497-tx55h   1/1     Running   0          34s
  1. 暂停更新
  • 更新的时候,把它暂停
  • 查看当前 RS 状态
[root@k8s-1 ~]# kubectl rollout history deployment 
deployment.apps/deployment-example 
REVISION  CHANGE-CAUSE
2         <none>
3         <none>
4         <none>
5         <none>
[root@k8s-1 ~]# kubectl get rs
NAME                            DESIRED   CURRENT   READY   AGE
deployment-example-54f48578cf   0         0         0       36m
deployment-example-585c7c497    6         6         6       79s
deployment-example-6799fc88d8   0         0         0       42m
deployment-example-7cf7d6dbc8   0         0         0       8m4s
  • 暂停更新
[root@k8s-1 ~]# kubectl rollout pause deployment deployment-example 
deployment.apps/deployment-example paused
  • 对 Deployment 执行 edit 操作并将 nginx 的版本改为 latest
  • 关闭即生效,发现没有自动完成更新,因为已经使用 pause 暂停了 Departments 更新
[root@k8s-1 ~]# kubectl edit deployments.apps deployment-example 

在这里插入图片描述

[root@k8s-1 ~]# kubectl get rs
NAME                            DESIRED   CURRENT   READY   AGE
deployment-example-54f48578cf   0         0         0       42m
deployment-example-585c7c497    6         6         6       7m29s
deployment-example-6799fc88d8   0         0         0       48m
deployment-example-7cf7d6dbc8   0         0         0       14m
[root@k8s-1 ~]# kubectl get pod
NAME                                 READY   STATUS    RESTARTS   AGE
deployment-example-585c7c497-cbstf   1/1     Running   0          7m13s
deployment-example-585c7c497-cnwzr   1/1     Running   0          7m27s
deployment-example-585c7c497-gqb4q   1/1     Running   0          7m13s
deployment-example-585c7c497-h8d4r   1/1     Running   0          7m36s
deployment-example-585c7c497-lj4n5   1/1     Running   0          7m25s
deployment-example-585c7c497-tx55h   1/1     Running   0          7m36s
  • 在暂停更新的过程中,可以更改它的副本数
[root@k8s-1 ~]# kubectl scale deployment deployment-example --replicas=3
deployment.apps/deployment-example scaled
[root@k8s-1 ~]# kubectl get pod
NAME                                 READY   STATUS    RESTARTS   AGE
deployment-example-585c7c497-gqb4q   1/1     Running   0          7m50s
deployment-example-585c7c497-h8d4r   1/1     Running   0          8m13s
deployment-example-585c7c497-tx55h   1/1     Running   0          8m13s
  • 恢复 Deployment 更新,发现在 5s 后 Pod 两个两个的完成更新
[root@k8s-1 ~]# kubectl rollout resume deployment deployment-example 
deployment.apps/deployment-example resumed
[root@k8s-1 ~]# kubectl get pod
NAME                                 READY   STATUS              RESTARTS   AGE
deployment-example-585c7c497-gqb4q   1/1     Terminating         0          8m37s
deployment-example-585c7c497-h8d4r   1/1     Running             0          9m
deployment-example-bb957bbb5-498db   0/1     ContainerCreating   0          2s
deployment-example-bb957bbb5-5wfvq   0/1     ContainerCreating   0          2s
[root@k8s-1 ~]# kubectl get pod
NAME                                 READY   STATUS    RESTARTS   AGE
deployment-example-bb957bbb5-498db   1/1     Running   0          25s
deployment-example-bb957bbb5-5wfvq   1/1     Running   0          25s
deployment-example-bb957bbb5-mszrg   1/1     Running   0          15s

5. DaemonSet

官方文档:概念 | 工作负载 | 工作负载资源 | DaemonSet

5.1 准备工作

  • 最常见的情况:DaemonSet 使得每个node上都有一个flannel网络组件

  • DaemonSet 确保全部(或者某些)节点上运行一个 Pod 的副本。 当有节点加入集群时, 也会为他们新增一个 Pod 。 当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。

  • DaemonSet 的一些典型用法:

    在每个节点上运行集群守护进程
    在每个节点上运行日志收集守护进程
    在每个节点上运行监控守护进程

  • 一种简单的用法是为每种类型的守护进程在所有的节点上都启动一个 DaemonSet。 一个稍微复杂的用法是为同一种守护进程部署多个 DaemonSet;每个具有不同的标志, 并且对不同硬件类型具有不同的内存、CPU 要求。

5.2 创建 DaemonSet

  1. 示例
[root@k8s-1 ~]# vim daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: daemonset-example
  labels:
    k8s-app: zabbix-agent
spec:
  selector:
    matchLabels:
      name: zabbix-agent
  template:
    metadata:
      labels:
        name: zabbix-agent
    spec:
      containers:
      - name: zabbix-agent
        image: zabbix/zabbix-agent
  1. 生效
[root@k8s-1 ~]# kubectl apply -f daemonset.yaml 
daemonset.apps/daemonset-example created
  1. kubectl get pod 后,发现只有 2 个DaemonSet
  • DaemonSet 中不需要指定副本数, deployment 默认 Pod 副本数为 1
  • 因为当前有 2 个 node,所以,DaemonSet 创建了 2 个 pod
  • 有几个 node,起几个 pod
  • 通过下列信息可知,每个 node 上都有一个 Pod
[root@k8s-1 ~]# kubectl get pod -o wide
NAME                      READY   STATUS    RESTARTS   AGE    IP            NODE    NOMINATED NODE   READINESS GATES
daemonset-example-7vm9l   1/1     Running   0          2m1s   10.244.2.23   k8s-3   <none>           <none>
daemonset-example-hzmft   1/1     Running   0          2m1s   10.244.1.21   k8s-2   <none>           <none>
  1. 查看 DaemonSet 更新策略
[root@k8s-1 ~]# kubectl describe daemonsets.apps 
Name:           daemonset-example
Selector:       name=zabbix-agent
Node-Selector:  <none>
Labels:         k8s-app=zabbix-agent
Annotations:    deprecated.daemonset.template.generation: 1
Desired Number of Nodes Scheduled: 2
Current Number of Nodes Scheduled: 2
Number of Nodes Scheduled with Up-to-date Pods: 2
Number of Nodes Scheduled with Available Pods: 2
Number of Nodes Misscheduled: 0
Pods Status:  2 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
  Labels:  name=zabbix-agent
  Containers:
   zabbix-agent:
    Image:        zabbix/zabbix-agent
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Events:
  Type    Reason            Age   From                  Message
  ----    ------            ----  ----                  -------
  Normal  SuccessfulCreate  3m1s  daemonset-controller  Created pod: daemonset-example-hzmft
  Normal  SuccessfulCreate  3m1s  daemonset-controller  Created pod: daemonset-example-7vm9l

5.3 DaemonSet 可以调整的参数

  1. 对 DaemonSet 执行 edit 操作,并修改滚动更新策略
  • OnDelete 类型(手动删除 pod 后,再进行更新)
[root@k8s-1 ~]# kubectl edit daemonsets.apps 
  updateStrategy:
    rollingUpdate:
      maxSurge: 0
      maxUnavailable: 1
    type: OnDelete

在这里插入图片描述

  1. 关闭即生效,再对 DaemonSet 执行 edit 操作并将镜像修改为 zabbix-agent2
  • 关闭即生效,但是发现没有更新
[root@k8s-1 ~]# kubectl edit daemonsets.apps daemonset-example 
    spec:
      containers:
      - image: zabbix/zabbix-agent2
        imagePullPolicy: Always
        name: zabbix-agent

在这里插入图片描述

  1. 删除一个 Pod 后,再次查看状态,发现更新成功
[root@k8s-1 ~]# kubectl delete pod daemonset-example-7vm9l
[root@k8s-1 ~]# kubectl delete pod daemonset-example-hzmft 
[root@k8s-1 ~]# kubectl get pod -o wide
NAME                      READY   STATUS    RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATES
daemonset-example-4ttgm   1/1     Running   0          80s   10.244.2.24   k8s-3   <none>           <none>
daemonset-example-fdm52   1/1     Running   0          31s   10.244.1.22   k8s-2   <none>           <none>

6. Jobs

官方文档:概念 | 工作负载 | 工作负载资源 | Jobs

6.1 准备工作

  • Job 会创建一个或者多个 Pods,并将继续重试 Pods 的执行,直到指定数量的 Pods 成功终止。 随着 Pods 成功结束,Job 跟踪记录成功完成的 Pods 个数。 当数量达到指定的成功个数阈值时,任务(即 Job)结束。 删除 Job 的操作会清除所创建的全部 Pods。 挂起 Job 的操作会删除 Job 的所有活跃 Pod,直到 Job 被再次恢复执行。

  • 一种简单的使用场景下,你会创建一个 Job 对象以便以一种可靠的方式运行某 Pod 直到完成。 当第一个 Pod 失败或者被删除(比如因为节点硬件失效或者重启)时,Job 对象会启动一个新的 Pod。

  • 你也可以使用 Job 以并行的方式运行多个 Pod。

6.2 创建 Jobs

  1. 下面是一个 Job 配置示例。它负责计算 π 到小数点后 2000 位,并将结果打印出来。 此计算大约需要 10 秒钟完成。
[root@k8s-1 ~]# 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: 4
  1. 生效后,查看状态
[root@k8s-1 ~]# kubectl get pod
NAME          READY   STATUS      RESTARTS   AGE
pi--1-g58wh   0/1     Completed   0          8m55s
[root@k8s-1 ~]# kubectl logs pi--1-g58wh

在这里插入图片描述

  1. 查看 Job 的部署信息,资源类型是 Job
[root@k8s-1 ~]# kubectl get pod pi--1-g58wh -o yaml 
  ownerReferences:
  - apiVersion: batch/v1
    blockOwnerDeletion: true
    controller: true
    kind: Job
    name: pi
    uid: 851f4445-e554-44f5-979e-adfeae39e403

6.3 控制并行性

  • 并行性请求(.spec.parallelism)可以设置为任何非负整数。 如果未设置,则默认为 1。 如果设置为 0,则 Job 相当于启动之后便被暂停,直到此值被增加。

  • 实际并行性(在任意时刻运行状态的 Pods 个数)可能比并行性请求略大或略小, 原因如下:

    • 对于 确定完成计数 Job,实际上并行执行的 Pods 个数不会超出剩余的完成数。 如果 .spec.parallelism 值较高,会被忽略。
    • 对于 工作队列 Job,有任何 Job 成功结束之后,不会有新的 Pod 启动。 不过,剩下的 Pods 允许执行完毕。
    • 如果 Job 控制器 没有来得及作出响应,或者
    • 如果 Job 控制器因为任何原因(例如,缺少 ResourceQuota 或者没有权限)无法创建 Pods。 Pods 个数可能比请求的数目小。
    • Job 控制器可能会因为之前同一 Job 中 Pod 失效次数过多而压制新 Pod 的创建。
    • 当 Pod 处于体面终止进程中,需要一定时间才能停止。
  1. 设置任务执行数
  • 6 个 pod,每次 2 个并行
[root@k8s-1 ~]# vim job.yaml 
apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  completions: 6
  parallelism: 2
  template:
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
  backoffLimit: 4
  1. 生效后,查看状态
  • 每次都是 2 个 Pod 并行执行
[root@k8s-1 ~]# kubectl get pod
NAME          READY   STATUS              RESTARTS   AGE
pi--1-4zc4w   0/1     ContainerCreating   0          10s
pi--1-nsjqf   0/1     ContainerCreating   0          10s
[root@k8s-1 ~]# kubectl get pod
NAME          READY   STATUS      RESTARTS   AGE
pi--1-4zc4w   0/1     Completed   0          7m24s
pi--1-57cqr   0/1     Completed   0          6m57s
pi--1-9b5fw   0/1     Completed   0          6m32s
pi--1-nsjqf   0/1     Completed   0          7m24s
pi--1-ntn6l   0/1     Completed   0          7m8s
pi--1-z2d75   0/1     Completed   0          6m46s
  1. 检查 Job 的状态
[root@k8s-1 ~]# kubectl describe jobs.batch 
Name:             pi
Namespace:        default
Selector:         controller-uid=dfb106e0-2f8d-4799-8805-95666c97bfa8
Labels:           controller-uid=dfb106e0-2f8d-4799-8805-95666c97bfa8
                  job-name=pi
Annotations:      <none>
Parallelism:      2
Completions:      6
Completion Mode:  NonIndexed
Start Time:       Mon, 09 May 2022 15:23:29 +0800
Completed At:     Mon, 09 May 2022 15:27:49 +0800
Duration:         4m20s
Pods Statuses:    0 Running / 6 Succeeded / 0 Failed
Pod Template:
  Labels:  controller-uid=dfb106e0-2f8d-4799-8805-95666c97bfa8
           job-name=pi
  Containers:
   pi:
    Image:      perl
    Port:       <none>
    Host Port:  <none>
    Command:
      perl
      -Mbignum=bpi
      -wle
      print bpi(2000)
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Events:
  Type    Reason            Age    From            Message
  ----    ------            ----   ----            -------
  Normal  SuccessfulCreate  7m54s  job-controller  Created pod: pi--1-4zc4w
  Normal  SuccessfulCreate  7m54s  job-controller  Created pod: pi--1-nsjqf
  Normal  SuccessfulCreate  7m38s  job-controller  Created pod: pi--1-ntn6l
  Normal  SuccessfulCreate  7m27s  job-controller  Created pod: pi--1-57cqr
  Normal  SuccessfulCreate  7m16s  job-controller  Created pod: pi--1-z2d75
  Normal  SuccessfulCreate  7m2s   job-controller  Created pod: pi--1-9b5fw
  Normal  Completed         3m34s  job-controller  Job completed

7. CronJob

官方文档:概念 | 工作负载 | 工作负载资源 | CronJob

7.1 准备工作

  • CronJob 创建基于时隔重复调度的 Jobs。

  • 一个 CronJob 对象就像 crontab (cron table) 文件中的一行。 它用 Cron 格式进行编写, 并周期性地在给定的调度时间执行 Job

  • CronJob 用于执行周期性的动作,例如备份、报告生成等。 这些任务中的每一个都应该配置为周期性重复的(例如:每天/每周/每月一次); 你可以定义任务开始执行的时间间隔。

7.2 Cron 时间表语法

在这里插入图片描述在这里插入图片描述

  • 例如,下面这行指出必须在每个星期五的午夜以及每个月 13 号的午夜开始任务:
0 0 13 * 5

7.3 创建 CronJob

  1. CronJob 用于执行周期性的动作
  • 例如备份、报告生成等。 这些任务中的每一个都应该配置为周期性重复的(例如:每天/每周/每月一次); 你可以定义任务开始执行的时间间隔。
[root@k8s-1 ~]# vim cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: cronjob-example
spec:
  schedule: "* * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: cronjob
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from k8s cluster
          restartPolicy: OnFailure
  1. 生效后,查看状态
[root@k8s-1 ~]# kubectl get cronjobs.batch 
NAME              SCHEDULE    SUSPEND   ACTIVE   LAST SCHEDULE   AGE
cronjob-example   * * * * *   False     0        <none>          18s
[root@k8s-1 ~]# kubectl get jobs.batch 
NAME                       COMPLETIONS   DURATION   AGE
cronjob-example-27534699   1/1           26s        41s
[root@k8s-1 ~]# kubectl get pod
NAME                                READY   STATUS      RESTARTS   AGE
cronjob-example-27534699--1-2h84n   0/1     Completed   0          42s

7.4 CronJob 可以调整的参数

  1. 对 CronJob 执行 edit 操作,查看可以调整的参数(没有做修改)
[root@k8s-1 ~]# kubectl edit cronjobs.batch 
Edit cancelled, no changes made.

在这里插入图片描述在这里插入图片描述

  1. 查看pod,发现已经有 3 个,因为 CronJob 会保留 3 个 history
[root@k8s-1 ~]# kubectl get pod
NAME                                READY   STATUS      RESTARTS   AGE
cronjob-example-27534701--1-cgfm9   0/1     Completed   0          2m24s
cronjob-example-27534702--1-f7mtx   0/1     Completed   0          84s
cronjob-example-27534703--1-98jr4   0/1     Completed   0          24s
[root@k8s-1 ~]# kubectl get jobs.batch 
NAME                       COMPLETIONS   DURATION   AGE
cronjob-example-27534701   1/1           9s         2m45s
cronjob-example-27534702   1/1           26s        105s
cronjob-example-27534703   1/1           7s         45s
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值