04.kubernetes笔记 Pod控制器(三) DaemonSet、Job、CronJob、StatefulSet

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

  • 使用 DaemonSet 的一些典型用法:
  • 运行集群存储 daemon,例如在每个 Node 上运行 glusterd 、 ceph
  • 在每个 Node 上运行日志收集 daemon,例如 fluentd 、 logstash
  • 在每个 Node 上运行监控 daemon,例如 Prometheus Node Exporter、 collectd 、Datadog 代理、New Relic 代理,或 Ganglia gmond
默认会在每个节点运行一个Pod (master节点除外)或根据标签匹配选择运行的节点
DaemonSet 配置规范
apiVersion: apps/v1 # API群组及版本 kind: DaemonSet#资源类型特有标识 metadata: name#资源名称,在作用域中要唯一 namespace#名称空间; DaemonSet资源隶属名称空间级别 spec: minReadySeconds # Pod就绪后多少秒内任一容器无crash方可视为“就绪” selector #标签选择器,必须匹配template字段中Pod模板中的标签 template #Pod模板对象; revisionHistoryLimit #滚动更新历史记录数量,默认为10; updateStrategy <0bject> #滚动更新策略 type#滚动更新类型,可用值有OnDelete和Rollingupdate; rollingUpdate #滚动更新参数,专用于RollingUpdate类型 maxUnavailable#更新期间可比期望的Pod数量缺少的数量或比例
示例1: 新建DaemonSet控制器 部署node-exporter
[root@k8s-master PodControl]# cat daemonset-demo.yaml apiVersion: apps/v1 kind: DaemonSet metadata: name: daemonset-demo namespace: default labels: app: prometheus component: node-exporter spec: selector: matchLabels: app: prometheus component: node-exporter template: metadata: name: prometheus-node-exporter labels: app: prometheus component: node-exporter spec: containers: - image: prom/node-exporter:v0.18.0 name: prometheus-node-exporter ports: - name: prom-node-exp containerPort: 9100 hostPort: 9100 livenessProbe: tcpSocket : port: prom-node-exp initialDelaySeconds: 3 readinessProbe: httpGet: path: '/metrics' port: prom-node-exp scheme: HTTP initialDelaySeconds: 5 hostNetwork: true hostPID: true[root@k8s-master PodControl]# kubectl apply -f daemonset-demo.yaml daemonset.apps/daemonset-demo created[root@k8s-master PodControl]# kubectl get pod NAMEREADYSTATUSRESTARTSAGE deployment-demo-77d46c4794-fhz4l1/1Running016h deployment-demo-77d46c4794-kmrhn1/1Running016h deployment-demo-fb544c5d8-5f9lp1/1Running017h[root@k8s-master PodControl]# cat daemonset-demo.yaml ... spec: containers: - image: prom/node-exporter:latest#更新为最新版 ...#默认为滚动更新[root@k8s-master PodControl]# kubectl apply -f daemonset-demo.yaml && kubectl rollout status daemonset/daemonset-demo daemonset.apps/daemonset-demo created Waiting for daemon set "daemonset-demo" rollout to finish: 0 of 3 updated pods are available... Waiting for daemon set "daemonset-demo" rollout to finish: 1 of 3 updated pods are available... Waiting for daemon set "daemonset-demo" rollout to finish: 2 of 3 updated pods are available... daemon set "daemonset-demo" successfully rolled out

Job的简介及 配置规范 Job 负责批处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个 Pod 成功结束
Job 配置规范
apiVersion: batch/v1 #API群组及版本 kind: Job#资源类型特有标识 metadata: name#资源名称,在作用域中要唯一 namespace#名称空间; Job资源隶属名称空间级别 spec: selector #标签选择器,必须匹配template字段中Pod模板中的标签 template #Pod模板对象 completions #期望的成功完成的作业次数,成功运行结束的Pod数量 ttlSecondsAfterFinished #终止状态作业的生存时长,超期将被删除 parallelism #作业的最大并行度,默认为1 backoffLimit #将作业标记为Failed之前的重试次数,默认为6 activeDeadlineSeconds #作业启动后可处于活动状态的时长 restartPolicy#重启策略 #1. Always: 容器失效时,kubelet 自动重启该容器; #2. OnFailure: 容器终止运行且退出码不为0时重启; #3. Never: 不论状态为何, kubelet 都不重启该容器。
示例2: 创建Job控制器 完成2次任务
[root@k8s-master PodControl]# cat job-demo.yaml apiVersion: batch/v1 kind: Job metadata: name: job-demo spec: template: spec: containers: - name: myjob image: alpine:3.11 imagePullPolicy: IfNotPresent command: ["/bin/sh" , "-c", "sleep 60"] restartPolicy: Never completions: 2#完成2次 没有配置并行 所以是单队列 完成1次后在启动一次 ttlSecondsAfterFinished: 3600 #保存1个小时 backoffLimit: 3#重试次数 默认为6改为3 activeDeadlineSeconds: 300 #启动后的存活时长[root@k8s-master PodControl]# kubectl apply -f job-demo.yaml [root@k8s-master PodControl]# kubectl get pod NAMEREADYSTATUSRESTARTSAGE daemonset-demo-4zfwp1/1Running020m daemonset-demo-j7m7k1/1Running020m daemonset-demo-xj6wc1/1Running020m job-demo-w4nkh0/1ContainerCreating02s[root@k8s-master PodControl]# kubectl get pod NAMEREADYSTATUSRESTARTSAGE daemonset-demo-4zfwp1/1Running022m daemonset-demo-j7m7k1/1Running022m daemonset-demo-xj6wc1/1Running022m job-demo-vfh9r1/1Running049s#串行运行 job-demo-w4nkh0/1Completed02m5s #已完成[root@k8s-master PodControl]# cat job-para-demo.yaml apiVersion: batch/v1 kind: Job metadata: name: job-para-demo spec: template: spec: containers: - name: myjob image: alpine:3.11 imagePullPolicy: IfNotPresent command: ["/bin/sh" , "-c", "sleep 60"] restartPolicy: Never completions: 12#完成12次 parallelism: 2#同时运行2个个2个Pod同时运行 ttlSecondsAfterFinished: 3600 backoffLimit: 3 activeDeadlineSeconds: 1200[root@k8s-master PodControl]# kubectl apply-fjob-para-demo.yaml job.batch/job-para-demo created[root@k8s-master PodControl]# kubectl get job NAMECOMPLETIONSDURATIONAGE job-demo2/22m25s11m job-para-demo10/126m37s7s[root@k8s-master PodControl]# kubectl get pod NAMEREADYSTATUSRESTARTSAGE daemonset-demo-4zfwp1/1Running025m daemonset-demo-j7m7k1/1Running025m daemonset-demo-xj6wc1/1Running025m deployment-demo-fb544c5d8-lj5gt0/1Terminating017h deployment-demo-with-strategy-59468cb976-vkxdg0/1Terminating016h job-demo-vfh9r0/1Completed03m41s job-demo-w4nkh0/1Completed04m57s job-para-demo-9jtnv0/1ContainerCreating07s#同一时间并行数为2个共循环6次 job-para-demo-q2h6g0/1ContainerCreating07s[root@k8s-master PodControl]# kubectl get pod NAMEREADYSTATUSRESTARTSAGE daemonset-demo-4zfwp1/1Running030m daemonset-demo-j7m7k1/1Running030m daemonset-demo-xj6wc1/1Running030m job-demo-vfh9r0/1Completed09m38s job-demo-w4nkh0/1Completed010m job-para-demo-8fz780/1Completed03m48s job-para-demo-9jtnv0/1Completed06m4s job-para-demo-bnw470/1Completed02m42s job-para-demo-dsmbm0/1Completed096s job-para-demo-j4zw51/1Running030s job-para-demo-jkbw40/1Completed04m55s job-para-demo-l9pwc0/1Completed096s job-para-demo-lxxrv1/1Running030s job-para-demo-nljhg0/1Completed04m55s job-para-demo-q2h6g0/1Completed06m4s job-para-demo-rc9qt0/1Completed03m48s job-para-demo-xnzsq0/1Completed02m42s

cronJob简介及字段格式 Cron Job 管理基于时间的 Job,即:
  1. 在给定时间点只运行一次
  2. 周期性地在给定时间点运行
**使用前提条件:当前使用的 Kubernetes 集群,版本 >= 1.8(对 CronJob)。对于先前版本的集群,版本 < 1.8,启动 API Server时,通过传递选项--runtime-config=batch/v2alpha1=true可以开启 batch/v2alpha1
API**
典型的用法如下所示:
1.在给定的时间点调度 Job 运行
2.创建周期性运行的 Job,例如:数据库备份、发送邮件
cronJob 借助Job来完成任务 他们的有关系类似Deployment 与 ReplicaSet的关系
cronJob 配置规范
apiVersion: batch/v1betal #API群组及版本 kind: CronJob #资源类型特有标识 metadata: name#资源名称,在作用域中要唯一 namespace#名称空间; CronJob资源隶属名称空间级别 spec: jobTemplate #job作业模板,必选字段 metadata #模板元数据 spec_ #作业的期望状态 schedule string> #调度时间设定,必选字段 concurrencyPolicy#并发策略,可用值有Allow、Fprbid和Replace 指前一个任务还没有执行完 下一个任务时间又到了,是否允许两个任务同时运行 failedJobsHistoryLimit #失败作业的历史记录数,默认为1 successfulJobsHistoryLimit #成功作业的历史记录数,默认为3 startingDeadlineSeconds #因错过时间点而未执行的作业的可超期时长 suspend #是否挂起后续的作业,不影响当前作业,默认为false
示例3 :创建 cronJob 每2分钟执行1次任务
[root@k8s-master PodControl]# cat cronjob-demo.yaml apiVersion: batch/v1beta1 kind: CronJob metadata: name: cronjob-demo namespace: default spec: schedule: "*/2 * * * *"#第2分种执行一次 和Linux定时任务一样分别是 分 时 日 月 周 jobTemplate: metadata: labels: controller: cronjob-demo spec:#Job的定义 parallelism: 1#并行数为1 completions: 1#执行1次 ttlSecondsAfterFinished: 600#完成600后删除 backoffLimit: 3 #最多执行3次 activeDeadlineSeconds: 60 template: spec: containers: - name: myjob image: alpine command: - /bin/sh - -c - date; echo Hello from cronJob, sleep a while...; sleep10 restartPolicy: OnFailure#容器终止运行且退出码不为0时重启 startingDeadlineSeconds: 300[root@k8s-master PodControl]# kubectl get cronjob NAMESCHEDULESUSPENDACTIVELAST SCHEDULEAGE cronjob-demo*/2 * * * *False058s[root@k8s-master PodControl]# kubectl get pod NAMEREADYSTATUSRESTARTSAGE cronjob-demo-1629169560-vn8hk0/1ContainerCreating012s daemonset-demo-4zfwp1/1Running051m daemonset-demo-j7m7k1/1Running051m daemonset-demo-xj6wc1/1Running051m

StatefulSet 无状态应用控制器 【04.kubernetes笔记 Pod控制器(三) DaemonSet、Job、CronJob、StatefulSet】StatefulSet 作为 Controller 为 Pod 提供唯一的标识。它可以保证部署和 scale 的顺序
StatefulSet是为了解决有状态服务的问题(对应Deployments和ReplicaSets是为无状态服务而设计),其应用
场景包括:
  1. 稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现
  2. 稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service(即没 Cluster IP的Service)来实现
  3. 有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依次进行(即从0到N-1,在下一个Pod运行之前所有之前的Pod必须都是Running和Ready状态),基于init containers来实现有序
  4. 收缩,有序删除(即从N-1到0)
  • StatefulSet:通用的有状态应用控制器
    每个Pod都有自己的惟一标识,故障时,它只能被拥有同一标识的新实例所取代;
    $ {STATEFULSET_NAME}-${ORDINAL},web-O, web-1,web-2, 如果更新和删除都是从逆序从最后一个开始StatefulSet 强依赖于 Headless Service 无头服务创建Pod唯一标识 确定域名解析到能解析到唯一Pod之上如果有必要,可以为被Pod配置专用的存储卷,且只能是PVC格式;
StatefulSet 配置规范:
apiVersion:apps/v1 #API群组及版本; kind: StatefulSet #资源类型的特有标识 metadata: name#资源名称,在作用域中要唯一 namespace#名称空间; StatefulSet隶属名称空间级别 spec: replicas #期望的Pod副本数,默认为1 selector #标签选择器,须匹配Pod模板中的标签,必选字段 template #Pod模板对象,必选字段 revisionHistoryLimit #滚动更新历史记录数量,默认为10 updateStrategy' #滚动更新策略 type#滚动更新类型,可用值有OnDelete和Rollingupdate rollingUpdate #滚动更新参数,专用于RollingUpdate类型 partition #分区指示索引值,默认为0 如果为2表示只更新序号大于2的Pod serviceName#相关的Headless Service的名称,必选字段 volumeclaimTemplates <[]0bject> #存储卷申请模板 apiVersion#PVC资源所属的API群组及版本,可省略 kind#PVc资源类型标识,可省略 metadata #卷申请模板元数据 spec #期望的状态,可用字段同PVC podManagementPolicy# Pod管理策略,默认的“OrderedReady"表示顺序创 # 建并逆序删除,另一可用值“Parallel"表示并行模式
示例4:创建StatefulSet控制器
[root@k8s-master PodControl]# cat statefulset-demo.yaml apiVersion: v1 kind: Service metadata: name: demoapp-sts namespace: default spec: clusterIP: None#创造无头服务 ports: - port: 80 name: http selector: app: demoapp controller: sts-demo --- apiVersion: apps/v1 kind: StatefulSet metadata: name: sts-demo spec: serviceName: demoapp-sts #绑定无头服务 replicas: 2 selector: matchLabels : app: demoapp controller: sts-demo template:#以下为Pod模板 metadata: labels: app: demoapp controller: sts-demo spec: containers: - name: demoapp image: ikubernetes/demoapp:v1.0#不是无状态服务只模拟StatefulSet创建过程 ports: - containerPort: 80 name: web volumeMounts: - name: appdata mountPath: /app/data volumeClaimTemplates: - metadata: name: appdata spec: accessModes: ["ReadWriteOnce"]#单路读写 storageClassName: "longhorn"#使用之前创建的sc resources: requests: storage: 2Gi[root@k8s-master PodControl]# kubectl apply -f statefulset-demo.yaml service/demoapp-sts created#Pod是按序创建 先创造完成第1个才会创造2个Pod [root@k8s-master PodControl]# kubectl get pod NAMEREADYSTATUSRESTARTSAGE sts-demo-00/1ContainerCreating012s[root@k8s-master PodControl]# kubectl get pod NAMEREADYSTATUSRESTARTSAGE sts-demo-01/1Running029s sts-demo-10/1ContainerCreating09s

示例4: StatefulSet 扩容、缩容
[root@k8s-master PodControl]# cat demodb.yaml # demodb ,an educational Kubernetes-native NoSQL data store. It is a distributed # key-value store,supporting permanent read and write operations. # Environment Variables: DEMODB_DATADIR,DEMODB_HOST,DEMODB_PORT # default port: 9907/tcp for clients, 9999/tcp for members. # Maintainter: MageEdu --- apiVersion: v1 kind: Service metadata: name: demodb namespace: default labels: app: demodb spec: clusterIP: None ports: - port: 9907 selector: app: demodb --- apiVersion: apps/v1 kind: StatefulSet metadata: name: demodb namespace: default spec: selector: matchLabels: app: demodb serviceName: "demodb" replicas: 3 template: metadata: labels: app: demodb spec: nodeName: k8s-node3#指定节点 测试环境node系统资源比较 充裕 containers : - name: demodb-shard image: ikubernetes/demodb:v0.1 ports: - containerPort: 9907 name: db env: - name: DEMODB_DATADIR value: "/demodb/data" volumeMounts: - name: data mountPath: /demodb/data volumeClaimTemplates: - metadata: name: data spec: accessModes: ["ReadWriteOnce"] storageClassName: "longhorn" resources: requests: storage: 1Gi[root@k8s-master PodControl]# kubectl apply -f demodb.yaml[root@k8s-master PodControl]# kubectl get sts NAMEREADYAGE demodb1/331s [root@k8s-master PodControl]# kubectl get pod#按序创建 NAMEREADYSTATUSRESTARTSAGE centos-deployment-66d8cd5f8b-9x47c1/1Running122h demodb-01/1Running033s demodb-10/1ContainerCreating05s[root@k8s-master PodControl]# kubectl get pod -o wide NAMEREADYSTATUSRESTARTSAGEIPNODENOMINATED NODEREADINESS GATES demodb-01/1Running05m22s10.244.3.69k8s-node3 demodb-11/1Running05m1s10.244.3.70k8s-node3 demodb-21/1Running04m37s10.244.3.71k8s-node3[root@k8s-master PodControl]# kubectl get pvc# PVC 绑定成功 NAMESTATUSVOLUMECAPACITYACCESS MODESSTORAGECLASSAGE data-demodb-0Boundpvc-bef2c61d-4ab4-4652-9902-f4bc2a918beb1GiRWOlonghorn14m data-demodb-1Boundpvc-2ebb5510-b9c1-4b7e-81d0-f540a1451eb31GiRWOlonghorn9m8s data-demodb-2Boundpvc-74ee431f-794c-4b3d-837a-9337a6767f491GiRWOlonghorn8m

  • 新开启一个终端 测试使用
[root@k8s-master PodControl]# kubectl run pod-$RANDOM --image=ikubernetes/admin-box:latest -it --rm --command -- /bin/shroot@pod-31692 # nslookup -query=A demodb#解析测试 Server:10.96.0.10 Address:10.96.0.10#53Name:demodb.default.svc.cluster.local Address: 10.244.3.69 Name:demodb.default.svc.cluster.local Address: 10.244.3.71 Name:demodb.default.svc.cluster.local Address: 10.244.3.70root@pod-31692 # nslookup -query=PTR10.244.3.70#对IP进行反解析 Server:10.96.0.10 Address:10.96.0.10#5370.3.244.10.in-addr.arpaname = demodb-1.demodb.default.svc.cluster.local. #解析对唯一Podroot@pod-31692 # nslookup -query=PTR10.244.3.71 Server:10.96.0.10 Address:10.96.0.10#5371.3.244.10.in-addr.arpaname = demodb-2.demodb.default.svc.cluster.local.#解析对唯一Podroot@pod-31692 # echo "www.google.com" >/tmp/data root@pod-31692 # curl -L -XPUT -T /tmp/data http://demodb:9907/set/data#通过svc上传数据 数据上传set 下载get WRITE completedroot root@pod-31692 # curl http://demodb:9907/get/data#虽然位于不同的PV 不同Pod之前会同步数据 保持数据的一致性 www.google.com

  • 更新: 如果是更新镜你 可以用 set 命令 或 编译yaml文件 还可以用patch 打补丁
#编译yaml文件image版本为v0.2[root@k8s-master PodControl]# kubectl apply -f demodb.yaml service/demodb unchanged statefulset.apps/demodb configured[root@k8s-master PodControl]# kubectl get sts -o wide NAMEREADYAGECONTAINERSIMAGES demodb2/318mdemodb-shardikubernetes/demodb:v0.2#之前说过是逆序更新 demodb-2 最先更新 [root@k8s-master PodControl]# kubectl get pod -o wide NAMEREADYSTATUSRESTARTSAGEIPNODENOMINATED NODEREADINESS GATES centos-deployment-66d8cd5f8b-9x47c1/1Running122h10.244.1.160k8s-node1 demodb-01/1Running018m10.244.3.69k8s-node3 demodb-11/1Running018m10.244.3.70k8s-node3 demodb-20/1ContainerCreating016sk8s-node3

  • 扩缩容 Pod 也是逆序执行
#使用patch 打补丁修改副本数 [root@k8s-master PodControl]# kubectl patch sts/demodb -p '{"spec":{"replicas":5}}' #扩容数量为5 statefulset.apps/demodb patched[root@k8s-master PodControl]# kubectl get pod NAMEREADYSTATUSRESTARTSAGE demodb-01/1Running06m43s demodb-11/1Running07m3s demodb-21/1Running07m53s demodb-30/1ContainerCreating010s[root@k8s-master PodControl]# kubectl get pod NAMEREADYSTATUSRESTARTSAGE demodb-01/1Running06m52s demodb-11/1Running07m12s demodb-21/1Running08m2s demodb-30/1ContainerCreating019s[root@k8s-master PodControl]# kubectl patch sts/demodb -p '{"spec":{"replicas":2}}'#缩容数据为2 逆序缩[root@k8s-master PodControl]# kubectl get pod NAMEREADYSTATUSRESTARTSAGE demodb-01/1Running09m19s demodb-11/1Running06m9s demodb-21/1Running05m25s demodb-31/1Running02m18s demodb-40/1Terminating083s[root@k8s-master PodControl]# kubectl get pod NAMEREADYSTATUSRESTARTSAGE demodb-01/1Running010m demodb-11/1Running07m34s demodb-21/1Running06m50s demodb-31/1Terminating03m43s[root@k8s-master PodControl]# kubectl get pod NAMEREADYSTATUSRESTARTSAGE demodb-01/1Running012m demodb-11/1Running09m46s pod-316921/1Running085m#测试数据一致性 虽然不同位于的PV 不同Pod之前会同步数据 保持数据的一致性root@pod-31692 # curl http://demodb:9907/get/data www.google.com

    推荐阅读