k8s学习-DaemonSet和Job

1.1DaemonSet是什么

Deployment部署的副本Pod会分布在各个Node上,每个Node都可能运行好几个副本。DaemonSet的不同之处在于:每个Node上最多只能运行⼀个副本。DaemonSet的典型应用场景有:

(1)在集群的每个节点上运⾏存储Daemon,比如glusterd或ceph。

(2)在每个节点上运行日志收集Daemon,比如flunentd或logstash。

(3)在每个节点上运行监控Daemon,比如PrometheusNodeExporter或collectd。

其实Kubernetes自己就在用DaemonSet运行系统组件。执行如下命令,如下所示。

bash 复制代码
kubectl get daemonset --namespace=kube-system
kubectl get daemonset --namespace=kube-flannel

DaemonSet kube-flannel-ds和kube-proxy分别负责在每个节点上运⾏flannel和kube-proxy组件,在通过查看Pod副本,看看各个节点的分布情况:

bash 复制代码
kubectl get pod --namespace=kube-system -o wide

1.2 DaemonSet的创建和运行

本小节以Prometheus Node Exporter为例演示用户如何运行自己的DaemonSet。Prometheus 是 流行的系统监控方案 , Node Exporter 是Prometheus的agent,以Daemon的形式运行在每个被监控节点

上。

vi node-exporter.yaml

yaml 复制代码
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-exporter-daemonset
  namespace: agent
spec:
  selector:
    matchLabels:
      app: prometheus
  template:
    metadata:
      labels:
        app: prometheus
    spec:
      hostNetwork: true
      containers:
      - name: node-exporter
        image: prom/node-exporter
        imagePullPolicy: IfNotPresent
        command:
        - /bin/node_exporter
        - --path.procfs
        - /host/proc
        - --path.sysfs
        - /host/sys
        -  --collector.filesystem.ignored-mount-points
        - ^/(sys|proc|dev|host|etc)($|/)
        volumeMounts:
        - name: proc
          mountPath: /host/proc
        - name: sys
          mountPath: /host/sys
        - name: root
          mountPath: /rootfs
      volumes:
      - name: proc
        hostPath:
          path: /proc
      - name: sys
        hostPath:
          path: /sys
      - name: root
        hostPath:
          path: /

先创建个命名空间

bash 复制代码
kubectl create namespace agent

通过kubectl创建资源:

bash 复制代码
kubectl apply -f node-exporter.yaml

然后,通过kubectl查看Pod分布情况:

2.1 Job

容器按照持续运行的时间可分为两类:服务类容器和工作类容器。

服务类容器通常持续提供服务,需要⼀直运行,比如HTTPServer、Daemon等。工作类容器则是⼀次性任务,比如批处理程序,完成后容器就退出。

Kubernetes的Deployment、ReplicaSet和DaemonSet都用于管理服务类容器;

对于工作类容器,我们使用Job。先看⼀个简单的Job配置文件件myjob.yml。

vi myjob.yml

yaml 复制代码
apiVersion: batch/v1
kind: Job
metadata:
  name: myjob
  namespace: jobs
spec:
  template:
    metadata:
      labels:
        app: myjob
    spec:
      containers:
      - name: hello-job
        image: busybox
        imagePullPolicy: IfNotPresent
        command: ["echo", "hello  k8s job!"]
      restartPolicy: Never
bash 复制代码
kubectl apply -f myjob.yml

通过查看Job运行情况可以知道,其运行结束就结束了,如下图所示,变成了Completed状态。

bash 复制代码
kubectl get pod -n jobs

还可以通过查看Log看看这个Job留下的足迹:

bash 复制代码
kubectl logs myjob-krgdh -n jobs #查看日志
kubectl describe pods/myjob-krgdh --namespace jobs #查看job描述

2.2 并行Job

如果希望能够同时并行运行多个Pod以提高Job的执行效率,Job提供了一个贴心的配置:parallesim。例如下面的配置,我们将上面的小Job改为并行运行的Pod数量设置为3。

修改 myjob.yml

yaml 复制代码
apiVersion: batch/v1
kind: Job
metadata:
  name: testjob
spec:
  parallelism: 3
  template:
    metadata:
      labels:
        app: testjob
    spec:
      containers:
      - name: hello-job
        image: busybox
        imagePullPolicy: IfNotPresent
        command: ["echo", "hello  k8s job!"]
      restartPolicy: Never
bash 复制代码
kubectl get pod -o wide -n default

可以看出,Job一共启动了3个Pod,都是同时结束的(可以看到三个Pod的AGE都是相同的)。

2.3 定时Job

Linux中有cron程序定时执行任务,Kubernetes的CronJob提供了类似的功能,可以定时执行Job。

vi hello-cron-job.yml

yaml 复制代码
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello-cron-job
  namespace: jobs
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello-cron-job
            image: busybox
            imagePullPolicy: IfNotPresent
            command: ["echo", "hello edison's k8s cron job!"]
          restartPolicy: OnFailure

上面加粗的配置是CronJob的独有配置,需要注意的是schedule,它的格式和Linux Cron一样,这里的"*/1 * * * *"代表每一分钟启动执行一次。对于CronJob,它需要的是jobTemplate来定义Job的模板。

bash 复制代码
kubectl get cronjob -n jobs

查看job

可以看到,在过去的三分钟里,每一分钟都启动了一个Pod,符合预期。

bash 复制代码
kubectl get jobs -n jobs
相关推荐
alfiy2 分钟前
Elasticsearch学习笔记(六)使用集群令牌将新加点加入集群
笔记·学习·elasticsearch
北极无雪17 分钟前
Spring源码学习:SpringMVC(4)DispatcherServlet请求入口分析
java·开发语言·后端·学习·spring
望森FPGA31 分钟前
HDLBits中文版,标准参考答案 |3.1.1 Basic Gates | 基本门电路
学习·fpga开发
JavaGPT40 分钟前
prometheus学习笔记之PromQL
笔记·学习·prometheus
纪伊路上盛名在1 小时前
如何初步部署自己的服务器,达到生信分析的及格线
linux·运维·服务器·python·学习·r语言·github
地球空间-技术小鱼1 小时前
嵌入式系统学习
嵌入式硬件·学习
dengqingrui1237 小时前
【树形DP】AT_dp_p Independent Set 题解
c++·学习·算法·深度优先·图论·dp
我的心永远是冰冰哒7 小时前
ad.concat()学习
学习
ZZZ_O^O7 小时前
二分查找算法——寻找旋转排序数组中的最小值&点名
数据结构·c++·学习·算法·二叉树
slomay9 小时前
关于对比学习(简单整理
经验分享·深度学习·学习·机器学习