k8s 中 Pod 的控制器( 三 )


DaemonSet 的应用场景:
1、在每个节点上运行集群守护进程;
2、在每个节点上运行日志收集守护进程;
3、在每个节点上运行监控守护进程 。
来个栗子
cat <<EOF >./nginx-daemonset.yamlapiVersion: apps/v1kind: DaemonSetmetadata:name: nginx-daemonsetlabels:app: nginx-daemonsetspec:selector:matchLabels:app: nginx-daemonsettemplate:metadata:labels:app: nginx-daemonsetspec:containers:- name: nginx-daemonsetimage: nginx:alpineresources:limits:cpu: 250mmemory: 512Mirequests:cpu: 250mmemory: 512MiimagePullSecrets:- name: default-secretEOF这样就能在每个节点中部署一个 Pod 了,不过 DaemonSet 也支持通过 label 来选择部署的目标节点
cat <<EOF >./nginx-daemonset.yamlapiVersion: apps/v1kind: DaemonSetmetadata:name: nginx-daemonsetlabels:app: nginx-daemonsetspec:selector:matchLabels:app: nginx-daemonsettemplate:metadata:labels:app: nginx-daemonsetspec:nodeSelector: # 节点选择,当节点拥有nodeName=node7时才在节点上创建PodnodeName: node7containers:- name: nginx-daemonsetimage: nginx:alpineresources:limits:cpu: 250mmemory: 512Mirequests:cpu: 250mmemory: 512MiimagePullSecrets:- name: default-secretEOFJob 和 CronJobJob 和 CronJob 是负责处理定时任务的 。
两者的区别主要在于:
Job 负责处理一次性的定时任务,即仅需执行一次的任务;
CronJob 是基于时间的 Job,就类似于 Linux 系统的 crontab 文件中的一行,在指定的时间周期运行指定的 Job 。
首先来创建一个 Job
cat <<EOF >./job-demo.yamlapiVersion: batch/v1kind: Jobmetadata:name: job-demospec:template:metadata:name: job-demospec:restartPolicy: Nevercontainers:- name: counterimage: busyboxcommand:- "bin/sh"- "-c"- "echo hello"EOF运行
$ kubectl apply -f job-demo.yaml$ kubectl get podsNAMEREADYSTATUSRESTARTSAGEjob-demo-8qrd90/1Completed040s$ study-k8s kubectl get jobNAMECOMPLETIONSDURATIONAGEjob-demo1/136s45s$ kubectl logs -f job-demo-8qrd9hello再来看下 CronJob
cat <<EOF >./cronJob-demo.yamlapiVersion: batch/v1beta1kind: CronJobmetadata:name: hellospec:schedule: "* * * * *"jobTemplate:spec:template:spec:containers:- name: helloimage: busybox:1.28imagePullPolicy: IfNotPresentcommand:- /bin/sh- -c- date; echo HellorestartPolicy: OnFailureEOF通过 kubectl get jobs --watch 就能查看 CronJob 的调度
$ kubectl get jobs --watchNAMECOMPLETIONSDURATIONAGEhello-16644498601/12s4shello-16644499200/10shello-16644499200/10s0shello-16644499201/12s2s总结关于 pod 中的几个控制器最常用的就是 Deployment 和 ReplicaSet;
使用 Deployment 来管理 RS,来实现服务的部署,更新和滚动升级;
StatefulSet 主要用来管理无状态应用;
DaemonSet:主要是用来保证集群中的每个节点只运行一个 Pod , 且保证只有一个 Pod,这非常适合一些系统层面的应用,例如日志收集、资源监控等,这类应用需要每个节点都运行 , 且不需要太多实例,一个比较好的例子就是 Kubernetes 的 kube-proxy;
Job 和 CronJob 是负责处理定时任务的;
Job 负责处理一次性的定时任务,即仅需执行一次的任务;
CronJob 是基于时间的 Job,就类似于 Linux 系统的 crontab 文件中的一行,在指定的时间周期运行指定的 Job 。
参考【Deployments】https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/【Kubernetes 部署策略详解】https://www.qikqiak.com/post/k8s-deployment-strategies/【StatefulSet 和 Deployment 区别及选择方式】https://blog.csdn.net/nickDaDa/article/details/90401635【K8S: 有状态 vs 无状态服务】https://zhuanlan.zhihu.com/p/390440336【StatefulSet】https://support.huaweicloud.com/basics-cce/kubernetes_0015.html【k8s 中 Pod 的控制器】https://boilingfrog.github.io/2022/09/30/k8s中Pod控制器/

推荐阅读