k8s之控制器

一、控制器

控制器也是管理pod的一种手段

  • 自主式pod:pod退出或意外关闭后不会被重新创建

  • 控制器管理的 Pod:在控制器的生命周期里,始终要维持 Pod 的副本数目

Pod控制器是管理pod的中间层,使用Pod控制器之后,只需要告诉Pod控制器,想要多少个什么样的Pod就可以了,它会创建出满足条件的Pod并确保每一个Pod资源处于用户期望的目标状态。如果Pod资源在运行中出现故障,它会基于指定策略重新编排Pod

当建立控制器后,会把期望值写入etcd,k8s中的apiserver检索etcd中我们保存的期望状态,并对比pod的当前状态,如果出现差异代码自驱动立即恢复

二、控制器常见类型

控制器名称 控制器用途
Replication Controller 比较原始的pod控制器,已经被废弃,由ReplicaSet替代
ReplicaSet ReplicaSet 确保任何时间都有指定数量的 Pod 副本在运行
Deployment 一个 Deployment 为 PodReplicaSet 提供声明式的更新能力
DaemonSet DaemonSet 确保全指定节点上运行一个 Pod 的副本
StatefulSet StatefulSet 是用来管理有状态应用的工作负载 API 对象。
Job 执行批处理任务,仅执行一次任务,保证任务的一个或多个Pod成功结束
CronJob Cron Job 创建基于时间调度的 Jobs。
HPA全称Horizontal Pod Autoscaler 根据资源利用率自动调整service中Pod数量,实现Pod水平自动缩放

三、replicaset控制器

3.1 replicaset功能

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

  • ReplicaSet和Replication Controller的唯一区别是选择器的支持,ReplicaSet支持新的基于集合的选择器需求

  • ReplicaSet 确保任何时间都有指定数量的 Pod 副本在运行

  • 虽然 ReplicaSets 可以独立使用,但今天它主要被Deployments 用作协调 Pod 创建、删除和更新的机制

3.2 replicaset参数

参数名称 字段类型 参数说明
spec Object 详细定义对象,固定值就写Spec
spec.replicas integer 指定维护pod数量
spec.selector Object Selector是对pod的标签查询,与pod数量匹配
spec.selector.matchLabels string 指定Selector查询标签的名称和值,以key:value方式指定
spec.template Object 指定对pod的描述信息,比如lab标签,运行容器的信息等
spec.template.metadata Object 指定pod属性
spec.template.metadata.labels string 指定pod标签
spec.template.spec Object 详细定义对象
spec.template.spec.containers list Spec对象的容器列表定义
spec.template.spec.containers.name string 指定容器名称
spec.template.spec.containers.image string 指定容器镜像

3.3 replicaset示例

通过标签识别

[root@k8s-master deployment]# kubectl create deployment replicaset --image myapp:v1 --dry-run=client -o yaml > replicaset.yml
[root@k8s-master deployment]# vim replicaset.yml 
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: replicaset
  name: replicaset
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - image: myapp:v1
        name: myapp                    
[root@k8s-master deployment]# kubectl get pod --show-labels 
NAME                          READY   STATUS    RESTARTS   AGE   LABELS
replicaset-5d886954d4-dllz2   1/1     Running   0          50s   app=myapp,pod-template-hash=5d886954d4
replicaset-5d886954d4-rz9l7   1/1     Running   0          50s   app=myapp,pod-template-hash=5d886954d4

# 修改标签
[root@k8s-master deployment]# kubectl label pod replicaset-5d886954d4-dllz2 app=replicaset --overwrite 
pod/replicaset-5d886954d4-dllz2 labeled
# 通过标签识别,如果标签改变,就不属于原来的控制器管理了,会重新生成新的pod
[root@k8s-master deployment]# kubectl get pod --show-labels 
NAME                          READY   STATUS    RESTARTS   AGE   LABELS
replicaset-5d886954d4-dllz2   1/1     Running   0          80s   app=replicaset,pod-template-hash=5d886954d4
replicaset-5d886954d4-rz9l7   1/1     Running   0          80s   app=myapp,pod-template-hash=5d886954d4
replicaset-5d886954d4-v5gjf   1/1     Running   0          2s    app=myapp,pod-template-hash=5d886954d4        # 开启新的pod
# 删除app标签
[root@k8s-master deployment]# kubectl label pod replicaset-5d886954d4-dllz2 app-
pod/replicaset-5d886954d4-dllz2 unlabeled
[root@k8s-master deployment]# kubectl get pod --show-labels 
NAME                          READY   STATUS    RESTARTS   AGE    LABELS
replicaset-5d886954d4-dllz2   1/1     Running   0          110s   pod-template-hash=5d886954d4
replicaset-5d886954d4-rz9l7   1/1     Running   0          110s   app=myapp,pod-template-hash=5d886954d4
replicaset-5d886954d4-v5gjf   1/1     Running   0          32s    app=myapp,pod-template-hash=5d886954d4
# 将原来的pod的标签更改为原来的标签
[root@k8s-master deployment]# kubectl label pod replicaset-5d886954d4-dllz2 app=myapp --overwrite 
pod/replicaset-5d886954d4-dllz2 labeled
# 之前重新生成的pod消失,replicaset自动控制副本数量,pod可以自愈
[root@k8s-master deployment]# kubectl get pod --show-labels 
NAME                          READY   STATUS    RESTARTS   AGE     LABELS
replicaset-5d886954d4-rz9l7   1/1     Running   0          2m25s   app=myapp,pod-template-hash=5d886954d4
replicaset-5d886954d4-v5gjf   1/1     Running   0          67s     app=myapp,pod-template-hash=5d886954d4
[root@k8s-master deployment]# kubectl delete -f replicaset.yml 

四、deployment控制器

4.1 deployment控制器功能

  • 为了更好的解决服务编排的问题,kubernetes在V1.2版本开始,引入了Deployment控制器。
  • Deployment控制器并不直接管理pod,而是通过管理ReplicaSet来间接管理Pod
  • Deployment管理ReplicaSet,ReplicaSet管理Pod
  • Deployment 为 Pod 和 ReplicaSet 提供了一个申明式的定义方法
  • 在Deployment中ReplicaSet相当于一个版本

应用场景

  • 用来创建Pod和ReplicaSet
  • 滚动更新和回滚
  • 扩容和缩容
  • 暂停与恢复

4.2 deployment控制器示例

[root@k8s-master deployment]# vim deployment.yml 
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: deployment
  name: deployment
spec:
  replicas: 4
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - image: myapp:v1
        name: myapp
[root@k8s-master deployment]# kubectl apply -f deployment.yml 
[root@k8s-master deployment]# kubectl get pod --show-labels
NAME                          READY   STATUS    RESTARTS   AGE   LABELS
deployment-5d886954d4-2r2cv   1/1     Running   0          29s   app=myapp,pod-template-hash=5d886954d4
deployment-5d886954d4-6cz5t   1/1     Running   0          29s   app=myapp,pod-template-hash=5d886954d4
deployment-5d886954d4-jgpj6   1/1     Running   0          29s   app=myapp,pod-template-hash=5d886954d4
deployment-5d886954d4-zb75r   1/1     Running   0          57s   app=myapp,pod-template-hash=5d886954d4
[root@k8s-master deployment]# kubectl get all
NAME                              READY   STATUS    RESTARTS   AGE
pod/deployment-5d886954d4-2r2cv   1/1     Running   0          18m
pod/deployment-5d886954d4-6cz5t   1/1     Running   0          18m
pod/deployment-5d886954d4-jgpj6   1/1     Running   0          18m
pod/deployment-5d886954d4-zb75r   1/1     Running   0          18m

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

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/deployment   4/4     4            4           18m

NAME                                    DESIRED   CURRENT   READY   AGE
replicaset.apps/deployment-5d886954d4   4         4         4       18m
[root@k8s-master deployment]# kubectl rollout history deployment deployment 
deployment.apps/deployment 
REVISION  CHANGE-CAUSE
1         <none>

4.2.1 版本迭代

# 更新为版本2
[root@k8s-master deployment]# vim deployment.yml 
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: deployment
  name: deployment
spec:
  replicas: 4
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - image: myapp:v2
        name: myapp

[root@k8s-master deployment]# kubectl apply -f deployment.yml 
deployment.apps/deployment configured
[root@k8s-master deployment]# kubectl get all
NAME                              READY   STATUS        RESTARTS   AGE
pod/deployment-5d886954d4-6cz5t   0/1     Terminating   0          3h21m
pod/deployment-7f4786db9c-2kjgf   1/1     Running       0          3s
pod/deployment-7f4786db9c-8m6ql   1/1     Running       0          2s
pod/deployment-7f4786db9c-hbgpb   1/1     Running       0          2s
pod/deployment-7f4786db9c-jq26w   1/1     Running       0          3s

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

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/deployment   4/4     4            4           3h21m

NAME                                    DESIRED   CURRENT   READY   AGE
replicaset.apps/deployment-5d886954d4   0         0         0       3h21m
replicaset.apps/deployment-7f4786db9c   4         4         4       3s
# 将端口暴露,使其可以访问
[root@k8s-master deployment]# kubectl expose deployment deployment --port 80 --target-port 80 dry-run=client -o yaml >> deployment.yml 
[root@k8s-master deployment]# vim deployment.yml 
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: deployment
  name: deployment
spec:
  replicas: 4
  selector:
    matchLabels:
      app: myapp        # 与spec.template.metadata.labels.app相同
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - image: myapp:v2
        name: myapp

---            # 注意
apiVersion: v1
kind: Service
metadata:
  labels:
    app: deploy
  name: deploy
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: myapp  # 需要与deployment中的spec.selector.matchLabels.app相同

[root@k8s-master deployment]# kubectl get all
NAME                              READY   STATUS    RESTARTS   AGE
pod/deployment-5d886954d4-7p5bt   1/1     Running   0          23m
pod/deployment-5d886954d4-jjw6m   1/1     Running   0          23m
pod/deployment-5d886954d4-t6h87   1/1     Running   0          23m
pod/deployment-5d886954d4-vgnlv   1/1     Running   0          23m

NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
service/deploy       ClusterIP   10.105.175.237   <none>        80/TCP    24m
service/kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP   25h

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/deployment   4/4     4            4           25m

NAME                                    DESIRED   CURRENT   READY   AGE
replicaset.apps/deployment-5d886954d4   4         4         4       23m
replicaset.apps/deployment-7f4786db9c   0         0         0       25m
# 查看service
[root@k8s-master deployment]# kubectl get svc deploy 
NAME     TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
deploy   ClusterIP   10.105.175.237   <none>        80/TCP    24m
[root@k8s-master deployment]# curl 10.105.175.237
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>

4.2.2 版本回滚

[root@k8s-master deployment]# vim deployment.yml 
[root@k8s-master deployment]# kubectl apply -f deployment.yml 
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: deployment
  name: deployment
spec:
  replicas: 4
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - image: myapp:v1
        name: myapp

---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: deploy
  name: deploy
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: myapp


[root@k8s-master deployment]# curl 10.105.175.237
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

4.2.3 滚动更新

[root@k8s-master deployment]# vim deployment.yml 
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: deployment
  name: deployment
spec:
  minReadySeconds: 5
  replicas: 4
  strategy:
    rollingUpdate:
      maxSurge: 1        # 一次更新一个
      maxUnavailable: 0
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - image: myapp:v2
        name: myapp
[root@k8s-master deployment]# kubectl apply -f deployment.yml 
[root@k8s-master deployment]# kubectl get all
NAME                              READY   STATUS    RESTARTS   AGE
pod/deployment-5d886954d4-7p5bt   1/1     Running   0          70m
pod/deployment-5d886954d4-jjw6m   1/1     Running   0          70m
pod/deployment-5d886954d4-t6h87   1/1     Running   0          70m
pod/deployment-5d886954d4-vgnlv   1/1     Running   0          70m
pod/deployment-7f4786db9c-pm84r   1/1     Running   0          6s

NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
service/deploy       ClusterIP   10.105.175.237   <none>        80/TCP    70m
service/kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP   26h

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/deployment   5/4     1            4           71m

NAME                                    DESIRED   CURRENT   READY   AGE
replicaset.apps/deployment-5d886954d4   4         4         4       70m
replicaset.apps/deployment-7f4786db9c   1         1         1       71m
[root@k8s-master deployment]# kubectl get all
NAME                              READY   STATUS              RESTARTS   AGE
pod/deployment-5d886954d4-7p5bt   1/1     Running             0          70m
pod/deployment-5d886954d4-jjw6m   1/1     Running             0          70m
pod/deployment-5d886954d4-vgnlv   1/1     Running             0          70m
pod/deployment-7f4786db9c-pm84r   1/1     Running             0          8s
pod/deployment-7f4786db9c-zvbxd   0/1     Running             0          2s

NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
service/deploy       ClusterIP   10.105.175.237   <none>        80/TCP    70m
service/kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP   26h

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/deployment   4/4     2            4           71m

NAME                                    DESIRED   CURRENT   READY   AGE
replicaset.apps/deployment-5d886954d4   3         3         3       70m
replicaset.apps/deployment-7f4786db9c   2         2         2       71m
[root@k8s-master deployment]# kubectl get all
NAME                              READY   STATUS        RESTARTS   AGE
pod/deployment-5d886954d4-vgnlv   0/1     Terminating   0          70m
pod/deployment-7f4786db9c-bnpn9   1/1     Running       0          13s
pod/deployment-7f4786db9c-glxnh   1/1     Running       0          7s
pod/deployment-7f4786db9c-pm84r   1/1     Running       0          26s
pod/deployment-7f4786db9c-zvbxd   1/1     Running       0          20s

NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
service/deploy       ClusterIP   10.105.175.237   <none>        80/TCP    71m
service/kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP   26h

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/deployment   4/4     4            4           72m

NAME                                    DESIRED   CURRENT   READY   AGE
replicaset.apps/deployment-5d886954d4   0         0         0       70m
replicaset.apps/deployment-7f4786db9c   4         4         4       72m

4.2.4 暂停和恢复

在实际生产环境中我们做的变更可能不止一处,当修改了一处后,如果执行变更就直接触发了

我们期望的触发时当我们把所有修改都搞定后一次触发

暂停,避免触发不必要的线上更新

# 暂停
[root@k8s-master deployment]# kubectl rollout pause deployment deployment 
deployment.apps/deployment paused
[root@k8s-master deployment]# vim deployment.yml 
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: deployment
  name: deployment
spec:
  minReadySeconds: 5
  replicas: 4
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - image: myapp:v1
        name: myapp
        resources:
          limits:
            cpu: 0.5
            memory: 200M
          requests:
            cpu: 0.5
            memory: 200M

[root@k8s-master deployment]# kubectl apply -f deployment.yml
# 更改了版本,但并未生效
[root@k8s-master deployment]# curl 10.105.175.237
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
#更新镜像和修改资源并没有触发更新
[root@k8s-master deployment]# kubectl rollout history deployment deployment-example
deployment.apps/deployment-example
REVISION  CHANGE-CAUSE
3         <none>
4         <none>


# 恢复后,触发更新
[root@k8s-master deployment]# kubectl rollout resume deployment deployment 
error: deployments.apps "deployment" is not paused
[root@k8s-master deployment]# kubectl get svc deploy 
NAME     TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
deploy   ClusterIP   10.105.175.237   <none>        80/TCP    121m
[root@k8s-master deployment]# kubectl rollout history deployment deployment 
deployment.apps/deployment 
REVISION  CHANGE-CAUSE
3         <none>
4         <none>
5         <none>
[root@k8s-master deployment]# curl 10.105.175.237
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@k8s-master deployment]# kubectl delete -f deployment.yml 
deployment.apps "deployment" deleted
service "deploy" deleted

五、daemonset控制器

5.1 daemonset功能

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

DaemonSet 的典型用法:

- 在每个节点上运行集群存储 DaemonSet,例如 glusterd、ceph。
- 在每个节点上运行日志收集 DaemonSet,例如 fluentd、logstash。
- 在每个节点上运行监控 DaemonSet,例如 Prometheus Node Exporter、zabbix agent等
- 一个简单的用法是在所有的节点上都启动一个 DaemonSet,将被作为每种类型的 daemon 使用
- 一个稍微复杂的用法是单独对每种 daemon 类型使用多个 DaemonSet,但具有不同的标志, 并且对不同硬件类型具有不同的内存、CPU 要求

5.2 daemonset示例

# 查看污点
[root@k8s-master deployment]# kubectl describe nodes k8s-node1 | grep Taints
Taints:             <none>
[root@k8s-master deployment]# kubectl describe nodes k8s-node2 | grep Taints
Taints:             <none>
[root@k8s-master deployment]# kubectl describe nodes k8s-master | grep Taints
Taints:             node-role.kubernetes.io/control-plane:NoSchedule
# 不能create daemonset
[root@k8s-master deployment]# kubectl create 
clusterrolebinding   (Create a cluster role binding for a particular cluster role)
clusterrole          (Create a cluster role)
configmap            (Create a config map from a local file, directory or literal value)
cronjob              (Create a cron job with the specified name)
deployment           (Create a deployment with the specified name)
ingress              (Create an ingress with the specified name)
job                  (Create a job with the specified name)
namespace            (Create a namespace with the specified name)
poddisruptionbudget  (Create a pod disruption budget with the specified name)
priorityclass        (Create a priority class with the specified name)
quota                (Create a quota with the specified name)
rolebinding          (Create a role binding for a particular role or cluster role)
role                 (Create a role with single rule)
secret               (Create a secret using a specified subcommand)
serviceaccount       (Create a service account with the specified name)
service              (Create a service using a specified subcommand)
token                (Request a service account token)
[root@k8s-master deployment]# vim daemonset.yml 
apiVersion: apps/v1
kind: DaemonSet
metadata:
  labels:
    app: daemonset
  name: daemonset
spec:
  selector:
    matchLabels:
      app: daemonset
  template:
    metadata:
      labels:
        app: daemonset
    spec:
      containers:
      - image: myapp:v1
        name: myapp

[root@k8s-master deployment]# kubectl apply -f daemonset.yml 
daemonset.apps/daemonset created
service/deploy unchanged
[root@k8s-master deployment]# kubectl get daemonsets.apps daemonset 
NAME        DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
daemonset   2         2         2       2            2           <none>          12s
# 对污点进行容忍
[root@k8s-master deployment]# vim daemonset.yml 
apiVersion: apps/v1
kind: DaemonSet
metadata:
  labels:
    app: daemonset
  name: daemonset
spec:
  selector:
    matchLabels:
      app: daemonset
  template:
    metadata:
      labels:
        app: daemonset
    spec:                    # 在模板spec中设置
      tolerations:
      - effect: NoSchedule    #对于污点节点的容忍
        operator: Exists
      containers:
      - image: myapp:v1
        name: myapp

[root@k8s-master deployment]# kubectl apply -f daemonset.yml 
daemonset.apps/daemonset configured
service/deploy unchanged
# 
[root@k8s-master deployment]# kubectl get daemonsets.apps daemonset 
NAME        DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
daemonset   3         3         3       3            3           <none>          2m3s
[root@k8s-master deployment]# kubectl get pod
NAME              READY   STATUS    RESTARTS   AGE
daemonset-7bsvh   1/1     Running   0          4m
daemonset-b9kzq   1/1     Running   0          3m56s
daemonset-fcknv   1/1     Running   0          3m58s
[root@k8s-master deployment]# kubectl delete -f daemonset.yml 

六、job控制器

6.1 job控制器功能

Job,主要用于负责批量处理(一次要处理指定数量任务)短暂的一次性(每个任务仅运行一次就结束)任务。

Job特点如下:

- 当Job创建的pod执行成功结束时,Job将记录成功结束的pod数量
- 当成功结束的pod达到指定的数量时,Job将完成执行

6.2 job示例

# 创建job控制器yaml文件
# perl镜像,位于私有仓库的perl项目中
[root@k8s-master deployment]# kubectl create job job --image perl/perl:5.34.0 --dry-run=client -o yaml > job.yml
apiVersion: batch/v1
kind: Job
metadata:
  name: job
spec:
  completions: 6        # 一共完成任务数为6
  parallelism: 2        # 每次并行完成2个
  template:
    metadata:
    spec:
      containers:
      - image: perl/perl:5.34.0
        name: pi
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never        # 关闭后不自动重启
  backoffLimit: 4                # 运行失败后尝试4次
[root@k8s-master deployment]# kubectl apply -f job.yml 
[root@k8s-master deployment]# kubectl get all
NAME            READY   STATUS              RESTARTS   AGE
pod/job-8wnm6   0/1     ContainerCreating   0          5s
pod/job-f7kr8   0/1     ContainerCreating   0          5s

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

NAME            STATUS    COMPLETIONS   DURATION   AGE
job.batch/job   Running   0/6           5s         5s
[root@k8s-master deployment]# kubectl get all
NAME            READY   STATUS      RESTARTS   AGE
pod/job-8wnm6   0/1     Completed   0          58s
pod/job-9ldg4   0/1     Completed   0          26s
pod/job-f7kr8   0/1     Completed   0          58s
pod/job-s7g26   0/1     Completed   0          30s
pod/job-x96kw   0/1     Completed   0          17s
pod/job-xck2t   0/1     Completed   0          22s

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

NAME            STATUS     COMPLETIONS   DURATION   AGE
job.batch/job   Complete   6/6           50s        58s
[root@k8s-master deployment]# kubectl delete -f job.yml 
job.batch "job" deleted

注意: 

关于重启策略设置的说明:

  • 如果指定为OnFailure,则job会在pod出现故障时重启容器

    而不是创建pod,failed次数不变

  • 如果指定为Never,则job会在pod出现故障时创建新的pod

    并且故障pod不会消失,也不会重启,failed次数加1

  • 如果指定为Always的话,就意味着一直重启,意味着job任务会重复去执行了

七、cronjob控制器

7.1 cronjob控制器功能

  • Cron Job 创建基于时间调度的 Jobs。

  • CronJob控制器以Job控制器资源为其管控对象,并借助它管理pod资源对象,

  • CronJob可以以类似于Linux操作系统的周期性任务作业计划的方式控制其运行时间点及重复运行的方式。

  • CronJob可以在特定的时间点(反复的)去运行job任务。

7.2 cronjob控制器示例 

# 查看参数帮助
[root@k8s-master deployment]# kubectl explain cronjob.spec
[root@k8s-master deployment]# vim cb.yml 
apiVersion: batch/v1
kind: CronJob
metadata:
  name: cronjob
spec:
  schedule: "* * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: testjob
            image: busybox:latest
            imagePullPolicy: IfNotPresent
            command:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure

[root@k8s-master deployment]# kubectl apply -f cb.yml 
cronjob.batch/cronjob created
[root@k8s-master deployment]# kubectl get cronjobs.batch cronjob 
NAME      SCHEDULE    TIMEZONE   SUSPEND   ACTIVE   LAST SCHEDULE   AGE
cronjob   * * * * *   <none>     False     0        <none>          9s
[root@k8s-master deployment]# kubectl get pods
NAME                     READY   STATUS      RESTARTS   AGE
cronjob-28775838-d8zbq   0/1     Completed   0          12s
# 使用监控命令查看效果
[root@k8s-master deployment]# watch -n 1 kubectl get pods
[root@k8s-master deployment]# kubectl delete -f cb.yml 
cronjob.batch "cronjob" deleted

猜你喜欢

转载自blog.csdn.net/hotslow/article/details/142304797