目录
Pod控制器,又称之为工作负载(workload),是用于实现管理pod的中间层,确保pod资源符合预期的状态,pod的资源出现故障时,会尝试进行重启,当根据重启策略无效,则会重新新建pod的资源。
代用户创建指定数量的pod副本,确保pod副本数量符合预期状态,并且支持滚动式自动扩容和缩容功能。
帮助用户管理无状态的pod资源,精确反应用户定义的目标数量,但是RelicaSet不是直接使用的控制器,而是使用Deployment。
用于确保集群中的每一个节点只运行特定的pod副本,通常用于实现系统级后台任务。比如ELK服务
特性:服务是无状态的
服务必须是守护进程
管理有状态应用
只要完成就立即退出,不需要重启或重建
周期性任务控制,不需要持续后台运行
- vim nginx-deployment.yaml
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- name: nginx-deployment
- labels:
- app: nginx
- spec:
- replicas: 3
- selector:
- matchLabels:
- app: nginx
- template:
- metadata:
- labels:
- app: nginx
- spec:
- containers:
- - name: nginx
- image: nginx:1.15.4
- ports:
- - containerPort: 80
-
- kubectl create -f nginx-deployment.yaml
-
- kubectl get pods,deploy,rs
- kubectl edit deployment/nginx-deployment
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- annotations:
- deployment.kubernetes.io/revision: "1"
- creationTimestamp: "2021-04-19T08:13:50Z"
- generation: 1
- labels:
- app: nginx #Deployment资源的标签
- name: nginx-deployment
- namespace: default
- resourceVersion: "167208"
- selfLink: /apis/extensions/v1beta1/namespaces/default/deployments/nginx-deployment
- uid: d9d3fef9-20d2-4196-95fb-0e21e65af24a
- spec:
- progressDeadlineSeconds: 600
- replicas: 3 #期望的pod数量,默认是1
- revisionHistoryLimit: 10
- selector:
- matchLabels:
- app: nginx
- strategy:
- rollingUpdate:
- maxSurge: 25% #升级过程中会先启动的新Pod的数量不超过期望的Pod数量的25%,也可以是一个绝对值
- maxUnavailable: 25% #升级过程中在新的Pod启动好后销毁的旧Pod的数量不超过期望的Pod数量的25%,也可以是一个绝对值
- type: RollingUpdate #滚动升级
- template:
- metadata:
- creationTimestamp: null
- labels:
- app: nginx #Pod副本关联的标签
- spec:
- containers:
- - image: nginx:1.15.4 #镜像名称
- imagePullPolicy: IfNotPresent #镜像拉取策略
- name: nginx
- ports:
- - containerPort: 80 #容器暴露的监听端口
- protocol: TCP
- resources: {}
- terminationMessagePath: /dev/termination-log
- terminationMessagePolicy: File
- dnsPolicy: ClusterFirst
- restartPolicy: Always #容器重启策略
- schedulerName: default-scheduler
- securityContext: {}
- terminationGracePeriodSeconds: 30
- ......
- kubectl rollout history deployment/nginx-deployment
- deployment.apps/nginx-deployment
- REVISION CHANGE-CAUSE
- 1
常见的应用场景:数据库
https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/
-
- apiVersion: v1
- kind: Service
- metadata:
- name: nginx
- labels:
- app: nginx
- spec:
- ports:
- - port: 80
- name: web
- clusterIP: None #不创建custerip,也就是无头服务的service
- selector:
- app: nginx
- ---
- apiVersion: apps/v1
- kind: StatefulSet
- metadata:
- name: web
- spec:
- selector:
- matchLabels:
- app: nginx
- serviceName: "nginx"
- replicas: 3 #三个副本
- template: #定义容器的模板
- metadata:
- labels:
- app: nginx
- spec:
- terminationGracePeriodSeconds: 10 #10秒内pod没关闭,就强制杀死
- containers:
- - name: nginx
- image: nginx:1.14.1
- ports:
- - containerPort: 80
- name: web
- volumeMounts: #容器内挂载
- - name: www
- mountPath: /usr/share/nginx/html
- volumeClaimTemplates: #存储卷的申请模板
- - metadata:
- name: www
- spec:
- accessModes: [ "ReadWriteOnce" ] #可读可写,仅能一个节点挂载
- storageClassName: "nfs-client-storageclass" #使用动态创建的pv
- resources: #设置请求的资源大小
- requests:
- storage: 2Gi
由于StatefulSet资源依赖于一个实现存在的Headless类型的Service资源,所以需要先定义一个名为nginx的Headless Service资源,用于为关联到每个Pod资源创建DNS资源记录。接着定义了一个名为web的StatefulSet资源,它通过Pod模板创建了3个Pod资源副本,并基于volumeClaimTemplates向存储类进行了请求大小为2Gi的专用存储卷。
在deployment中,每一个pod是没有名称,是随机字符串,是无序的。而statefulset中是要求有序的,每一个pod的名称必须是固定的。当节点挂了,重建之后的标识符是不变的,每一个节点的节点名称是不能改变的。pod名称是作为pod识别的唯一标识符,必须保证其标识符的稳定并且唯一。为了实现标识符的稳定,这时候就需要一个headless service 解析直达到pod,还需要给pod配置一个唯一的名称。
大部分有状态副本集都会用到持久存储,比如分布式系统来说,由于数据是不一样的,每个节点都需要自己专用的存储节点。而在 deployment中pod模板中创建的存储卷是一个共享的存储卷,多个pod使用同一个存储卷,而statefulset定义中的每一个pod都不能使用同一个存储卷,由此基于pod模板创建pod是不适应的,这就需要引入volumeClaimTemplate,当在使用statefulset创建pod时,会自动生成一个PVC,从而请求绑定一个PV,从而有自己专用的存储卷。
DaemonSet 确保全部(或者一些)Node 上运行一个 Pod 的副本。当有 Node 加入集群时,也会为他们新增一个 Pod 。当有 Node 从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。
应用场景:Agent
//官方案例(监控)
https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/
- vim ds.yaml
- apiVersion: apps/v1
- kind: DaemonSet
- metadata:
- name: nginx-daemonSet
- labels:
- app: nginx
- spec:
- selector:
- matchLabels:
- app: nginx
- template:
- metadata:
- labels:
- app: nginx
- spec:
- containers:
- - name: nginx
- image: nginx:1.15.4
- ports:
- - containerPort: 80
- kubectl apply -f ds.yaml
-
- //DaemonSet会在每个node节点都创建一个Pod
Job分为普通任务(Job)和定时任务(CronJob),常用于运行那些仅需要执行一次的任务
应用场景:数据库迁移、批处理脚本、kube-bench扫描、离线数据处理,视频解码等业务
https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/
- vim job.yaml
- 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
.spec.template.spec.restartPolicy该属性拥有三个候选值:OnFailure,Never和Always。默认值为Always。它主要用于描述Pod内容器的重启策略。在Job中只能将此属性设置为OnFailure或Never,否则Job将不间断运行。
.spec.backoffLimit用于设置job失败后进行重试的次数,默认值为6。默认情况下,除非Pod失败或容器异常退出,Job任务将不间断的重试,此时Job遵循 .spec.backoffLimit上述说明。一旦.spec.backoffLimit达到,作业将被标记为失败。
- docker pull perl
-
- kubectl apply -f job.yaml
-
- kubectl get pods
-
-
- //结果输出到控制台
- kubectl logs pi-bqtf7
- 3.14159265......
-
- //清除job资源
- kubectl delete -f job.yaml
- vim job-limit.yaml
- apiVersion: batch/v1
- kind: Job
- metadata:
- name: busybox
- spec:
- template:
- spec:
- containers:
- - name: busybox
- image: busybox
- imagePullPolicy: IfNotPresent
- command: ["/bin/sh", "-c", "sleep 10;date;exit 1"]
- restartPolicy: Never
- backoffLimit: 2
- kubectl apply -f job-limit.yaml
-
- kubectl get job,pods
- NAME COMPLETIONS DURATION AGE
- job.batch/busybox 0/1 4m34s 4m34s
-
- NAME READY STATUS RESTARTS AGE
- pod/busybox-dhrkt 0/1 Error 0 4m34s
- pod/busybox-kcx46 0/1 Error 0 4m
- pod/busybox-tlk48 0/1 Error 0 4m21s
-
- kubectl describe job busybox
- ......
- Warning BackoffLimitExceeded 43s job-controller Job has reached the specified backoff limit
-
周期性任务 类似Linux的Crontab。
应用场景:通知,备份
https://kubernetes.io/docs/tasks/job/automated-tasks-with-cron-jobs/
- //每分钟打印hello
- vim cronjob.yaml
- apiVersion: batch/v1beta1
- kind: CronJob
- metadata:
- name: hello
- spec:
- schedule: "*/1 * * * *"
- jobTemplate:
- spec:
- template:
- spec:
- containers:
- - name: hello
- image: busybox
- imagePullPolicy: IfNotPresent
- args:
- - /bin/sh
- - -c
- - date; echo Hello from the Kubernetes cluster
- restartPolicy: OnFailure
- spec:
- concurrencyPolicy: Allow #声明了 CronJob 创建的任务执行时发生重叠如何处理(并发性规则仅适用于相同 CronJob 创建的任务)。spec仅能声明下列规则中的一种:
- ●Allow (默认):CronJob 允许并发任务执行。
- ●Forbid:CronJob 不允许并发任务执行;如果新任务的执行时间到了而老任务没有执行完,CronJob 会忽略新任务的执行。
- ●Replace:如果新任务的执行时间到了而老任务没有执行完,CronJob 会用新任务替换当前正在运行的任务。
- startingDeadlineSeconds: 15 #它表示任务如果由于某种原因错过了调度时间,开始该任务的截止时间的秒数。过了截止时间,CronJob 就不会开始任务,且标记失败.如果此字段未设置,那任务就没有最后期限。
- successfulJobsHistoryLimit: 3 #要保留的成功完成的任务数(默认为3)
- failedJobsHistoryLimit:1 #要保留多少已完成和失败的任务数(默认为1)
- suspend:true #如果设置为 true ,后续发生的执行都会被挂起。 这个设置对已经开始的执行不起作用。默认是 false。
- schedule: '*/1 * * * *' #必需字段,作业时间表。在此示例中,作业将每分钟运行一次
- jobTemplate: #必需字段,作业模板。这类似于工作示例
- kubectl create -f cronjob.yaml
-
- kubectl get cronjob
- NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
- hello */1 * * * * False 0
25s