kubernetes-- DaemonSet and Job

目录

一、DaemonSet

1、Kube-proxy的特殊性

2、DaemonSet的特性

3、创建DaemonSet

4、DaemonSet查看

1.创建完成后,可以在worker1和worker2上分布看到一个pod

2.如将其中一个pod强制删除,daemonset会自动启动一个新的pod

3. 当kubernetes集群出现节点故障时:

二、Job(作业)

1、一次性任务场景

 2、运行一个Job

3、查看Job

三、CronJob

1、运行CronJob

2、Schedule参数配置


一、DaemonSet

1、Kube-proxy的特殊性

1. kube-proxy组件,它被封装在pod中,并且时刻运行在每个Node节点中

2.Replicaset 侧重保证 pod 数量的恒定,那该如何实现kube-proxy类应用的调度

$ kubectl -n kube-system get daemonsets.apps #查看daemonset,默认会有3个pod
NAME          DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
calico-node   3         3         3       3            3           kubernetes.io/os=linux   26d
kube-proxy    3         3         3       3            3           kubernetes.io/os=linux   26d
$ kubectl get nodes    #查看节点数量,因为有三个Node所以有3个pod
NAME          STATUS   ROLES           AGE   VERSION
k8s-master    Ready    control-plane   26d   v1.24.1
k8s-worker1   Ready    <none>          26d   v1.24.1
k8s-worker2   Ready    <none>          26d   v1.24.1
过滤标签
$ kubectl -n kube-system describe daemonsets.apps kube-proxy | grep -i label
Labels:         k8s-app=kube-proxy
  Labels:           k8s-app=kube-proxy
$ kubectl -n kube-system get pods -l k8s-app=kube-proxy    #根据标签名列出指定pod
NAME               READY   STATUS    RESTARTS        AGE
kube-proxy-5w5bz   1/1     Running   14 (2d3h ago)   26d
kube-proxy-6jhnr   1/1     Running   10 (2d3h ago)   26d
kube-proxy-kwgdm   1/1     Running   10 (2d3h ago)   26d
可以看成,3个pod运行在不同的节点上
$ kubectl -n kube-system get pods -l k8s-app=kube-proxy -o wide 
NAME               READY   STATUS    RESTARTS        AGE   IP                NODE          NOMINATED NODE   READINESS GATES
kube-proxy-5w5bz   1/1     Running   14 (2d3h ago)   26d   192.168.147.102   k8s-master    <none>           <none>
kube-proxy-6jhnr   1/1     Running   10 (2d3h ago)   26d   192.168.147.104   k8s-worker2   <none>           <none>
kube-proxy-kwgdm   1/1     Running   10 (2d3h ago)   26d   192.168.147.103   k8s-worker1   <none>           <none>

pod对应的就是相应的daemonset,默认node有几个节点,daemonset就会创建几个pod;

这个是和deployment的差异

2、DaemonSet的特性

1. DaemonSet 部署的副本Pod会分布在各个Node上;

                删除DaemonSet会删除它创建的所有Pod

2. DaemonSet 典型场景:

                - 在集群的每个节点上运行存储Daemon,如 glusterd,ceph

                - 在每个节点上运行监控 Daemon,如 Prometheus  Node  Exporter

3、创建DaemonSet

1. 创建DaemonSet 的  yaml 文件(和创建deployment使用的类似)

2. 类型(kind)选择DaemonSet

3. DaemonSet的 yaml 文件不需要副本数量项

4.默认情况下,DaemonSet会在所有Node上创建Pod

$ kubectl apply -f- <<EOF
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: nginx-daemonset
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
       app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
EOF

参考文档: 对 DaemonSet 执行滚动更新 | Kubernetes

4、DaemonSet查看

1.创建完成后,可以在worker1和worker2上分布看到一个pod

$ kubectl get daemonsets.apps #因为创建时没有指定命名空间,默认就是default
NAME              DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
nginx-daemonset   2         2         0       2            0           <none>          26s
节点数量为2,对于用户而言pod工作在“工作节点”,master节点不创建,只创建在工作节点
$ kubectl get pods -l app=nginx    #查看pod
NAME                                READY   STATUS    RESTARTS       AGE
nginx-daemonset-4v85r               1/1     Running   0              3m40s
nginx-daemonset-5sx4x               1/1     Running   0              3m40s
$ kubectl get pods -l app=nginx -o wide #查看pod运行位置
NAME                                READY   STATUS    RESTARTS       AGE     IP               NODE          NOMINATED NODE   READINESS GATES
nginx-daemonset-4v85r               1/1     Running   0              7m4s    172.16.194.105   k8s-worker1   <none>           <none>
nginx-daemonset-5sx4x               1/1     Running   0              7m4s    172.16.126.60    k8s-worker2   <none>           <none>

2.如将其中一个pod强制删除,daemonset会自动启动一个新的pod

关闭其中一台设备,会发现节点数量会减1

$ kubectl get pod -l app=nginx
NAME                                READY   STATUS    RESTARTS       AGE
nginx-daemonset-52mbm               1/1     Running   0              20s
nginx-daemonset-5sx4x               1/1     Running   0              21m

kiosk@k8s-master:~$ kubectl delete pod nginx-daemonset-52mbm #删除pod
pod "nginx-daemonset-52mbm" deleted

$ kubectl get pod -l app=nginx #查询他会马上重新创建一个出来
NAME                                READY   STATUS    RESTARTS       AGE
nginx-daemonset-5sx4x               1/1     Running   0              22m
nginx-daemonset-lkv5l               1/1     Running   0              4s

3. 当kubernetes集群出现节点故障时:

daemonset中的pod数量会减少,不会像deployment一样将受到影响的 pod 在其他节点启动

daemonset节点若出问题,这个节点就不需要这个pod,这个pod只为这个节点来服务

deployment针对的是应用,若节点出问题,pod数量不会变,都会移到一个Node上

$ kubectl get daemonset
NAME              DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
nginx-daemonset  `1`        1         1       1            1           <none>          7m37s

二、Job(作业)

1、一次性任务场景

1.通过Deployment我们可以部署常驻型应用,它可以保证pod数量、保证应用的实时可用,也可以通过灵活的扩缩容让业务处于最佳状态

2.通过DaemonSet 我们可以部署守护进程,它使得每个node上运行着一个固定pod

3. 应该使用哪种方式解决如下问题?

 2、运行一个Job

1. 相对于Deployment 和 DaemonSet通常提供持续性的服务,Job执行一次性任务

$ kubectl apply -f- <<EOF    #运行一个圆周率
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
EOF

2. 类型(kind)选择Job

3.restartPolicy 只能选择Never 或 OnFailure

4.backoffLimit:参数指定job失败后进行重试的次数

3、查看Job

1. 运行job后,查看状态

$ kubectl get job    #0/1表示执行中
NAME   COMPLETIONS   DURATION   AGE
pi     0/1           6s         6s

2.过一段时间后继续查看状态,completions状态从“0/1”变为“1/1”,表示任务已经完成

$ kubectl get job
NAME   COMPLETIONS   DURATION   AGE
pi     1/1           33s        68s

3. 查看job使用的pod状态,发现pod已经运行完成并且关闭

$ kubectl get pods
NAME                    READY   STATUS      RESTARTS   AGE
`pi-ht7xr`              0/1    `Completed`  0          2m13s

4.使用kubectl logs 命令可以查看该Job运行结果

$ kubectl logs pi-ht7xr
3.1415926...

三、CronJob

1、运行CronJob

1.在日常应用中,一种常见场景是需要Job在指定时间或周期运行,这种类型我们称其为Cron Job,主要管理基于时间的Job

        - 在给定时间点只运行一次

        - 在给定时间点周期性地运行

参考文档: CronJob | Kubernetes

2. 使用配置文件创建Cron Job

kubectl apply -f- <<EOF
apiVersion: batch/v1
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
EOF

3.查看Cron Job

$ kubectl get cronjobs.batch hello 
NAME    SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
hello   */1 * * * *   False     1        11s             4m19s

2、Schedule参数配置

1. Schedule 的格式和 linux 中 crontab命令类似

2. 如果每个小时的第15分钟执行任务

3. 如果需要每15分钟执行一次任务


版权声明:本文为qq_41619571原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。