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
相关推荐
蝎子莱莱爱打怪2 天前
Centos7中一键安装K8s集群以及Rancher安装记录
运维·后端·kubernetes
西岸行者2 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意2 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
阿里云云原生2 天前
Kubernetes 官方再出公告,强调立即迁移 Ingress NGINX
kubernetes
至此流年莫相忘2 天前
Kubernetes实战篇之配置与存储
云原生·容器·kubernetes
别催小唐敲代码2 天前
嵌入式学习路线
学习
毛小茛3 天前
计算机系统概论——校验码
学习
babe小鑫3 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms3 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下3 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs