目录
1.创建完成后,可以在worker1和worker2上分布看到一个pod
2.如将其中一个pod强制删除,daemonset会自动启动一个新的pod
一、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
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分钟执行一次任务


