k8s pod控制器使用以及详解

发布时间:2022-02-27 20:17:28 作者:yexindonglai@163.com 阅读(82)

什么是pod控制器

Pod控制器是管理pod的中间层,使用Pod控制器之后,只需要告诉Pod控制器,想要多少个什么样的Pod就可以了,它会创建出满足条件的Pod并确保每一个Pod资源处于用户期望的目标状态。如果Pod资源在运行中出现故障,它会基于指定策略重新编排Pod。

pod的创建方式

在k8s中,可以将pod的创建方式分为2类

  • 自主式pod: 由k8s直接创建出来的pod,这种pod删除之后就没有了,也不会重建
    1. kubectl run mynginx --image=nginx
  • 控制器创建的pod: 通过控制器创建的pod,这种pod删除了之后会自动重建;
    1. kubectl create deployment mynginx --image=nginx:1.17.1

控制器的种类

在kubernetes有很多种类型的pod控制器,每种都有自己的使用场景

  • ReplicationController:比较原始的pod控制器,已经被废弃,由ReplicaSet替代
  • ReplicaSet:保证副本数量一直维持在期望值,并支持pod数量扩缩容,镜像版本升级
  • Deployment:通过控制ReplicaSet来控制Pod,并支持滚动升级、回退版本
  • Horizontal Pod Autoscaler:可以根据集群负载自动水平调整Pod的数量,实现削峰填谷
  • DaemonSet:在集群中的指定Node上运行且仅运行一个副本,一般用于守护进程类的任务
  • Job:它创建出来的pod只要完成任务就立即退出,不需要重启或重建,用于执行一次性任务
  • Cronjob:它创建的Pod负责周期性任务控制,不需要持续后台运行,可以理解为是定时任务;
  • StatefulSet:管理有状态应用

1、ReplicaSet

简称为RS,主要的作用是保证一定数量的pod能够正常运行,它会持续监听这些pod的运行状态,提供了以下功能

  • 自愈能力:
    • 重启 :当某节点中的pod运行过程中出现问题导致无法启动时,k8s会不断重启,直到可用状态为止
    • 故障转移:当正在运行中pod所在的节点发生故障或者宕机时,k8s会选择集群中另一个可用节点,将pod运行到可用节点上;
  • pod数量的扩缩容:pod副本的扩容和缩容
  • 镜像升降级:支持镜像版本的升级和降级;
    在这里插入图片描述
配置模板

rs的所有配置如下

  1. apiVersion: apps/v1 # 版本号
  2. kind: ReplicaSet # 类型
  3. metadata: # 元数据
  4. name: # rs名称
  5. namespace: # 所属命名空间
  6. labels: #标签
  7. controller: rs
  8. spec: # 详情描述
  9. replicas: 3 # 副本数量
  10. selector: # 选择器,通过它指定该控制器管理哪些pod
  11. matchLabels: # Labels匹配规则
  12. app: nginx-pod
  13. matchExpressions: # Expressions匹配规则,key就是label的key,values的值是个数组,意思是标签值必须是此数组中的其中一个才能匹配上;
  14. - {key: app, operator: In, values: [nginx-pod]}
  15. template: # 模板,当副本数量不足时,会根据下面的模板创建pod副本
  16. metadata:
  17. labels: # 这里的标签必须和上面的matchLabels一致,将他们关联起来
  18. app: nginx-pod
  19. spec:
  20. containers:
  21. - name: nginx
  22. image: nginx:1.17.1
  23. ports:
  24. - containerPort: 80
1、创建一个ReplicaSet

新建一个文件 rs.yaml,内容如下

  1. apiVersion: apps/v1
  2. kind: ReplicaSet # pod控制器
  3. metadata: # 元数据
  4. name: pc-replicaset # 名字
  5. namespace: dev # 名称空间
  6. spec:
  7. replicas: 3 # 副本数
  8. selector: # 选择器,通过它指定该控制器管理哪些pod
  9. matchLabels: # Labels匹配规则
  10. app: nginx-pod
  11. template: # 模板,当副本数量不足时,会根据下面的模板创建pod副本
  12. metadata:
  13. labels:
  14. app: nginx-pod
  15. spec:
  16. containers:
  17. - name: nginx
  18. image: nginx:1.17.1

运行

  1. kubectl create -f rs.yaml

获取replicaset

  1. kubectl get replicaset -n dev
2、扩缩容

刚刚我们已经用第一种方式创建了一个replicaSet,现在就基于原来的rs进行扩容,原来的副本数量是3个,现在我们将其扩到6个,做法也很简单,运行编辑命令
第一种方式: scale

  1. # 使用scale命令实现扩缩容,后面`--replicas=n`直接指定目标数量即可
  2. kubectl scale rs pc-replicaset --replicas=2 -n dev

第二种方式:使用edit命令编辑rs

  1. # 这种方式相当于使用vi编辑修改yaml配置的内容,进去后将replicas的值改为1,保存后自动生效
  2. kubectl edit rs pc-replicaset -n dev
3、镜像版本变更

第一种方式:scale

  1. kubectl scale rs pc-replicaset nginx=nginx:1.71.2 -n dev

第二种方式:edit

  1. # 这种方式相当于使用vi编辑修改yaml配置的内容,进去后将nginx的值改为nginx:1.71.2,保存后自动生效
  2. kubectl edit rs pc-replicaset -n dev
4、删除rs
  1. # 第一种方式
  2. kubectl delete -f rs.yaml
  3. # 第二种方式 ,如果想要只删rs,但不删除pod,可在删除时加上`--cascade=false`参数(不推荐)
  4. kubectl delete rs pc-replicaset -n dev --cascade=false

2、Deployment

k8s v1.2版本后加入Deployment;这种控制器不直接控制pod,而是通过管理ReplicaSet来间接管理pod;也就是Deployment管理ReplicaSet,ReplicaSet管理pod;所以 Deployment 比 ReplicaSet 功能更加强大
==当我们创建了一个Deployment之后,也会自动创建一个ReplicaSet==
在这里插入图片描述

功能

  1. 支持ReplicaSet 的所有功能
  2. 支持发布的停止、继续
  3. 支持版本的滚动更新和回退功能

配置模板

新建文件

  1. apiVersion: apps/v1 # 版本号
  2. kind: Deployment # 类型
  3. metadata: # 元数据
  4. name: # rs名称
  5. namespace: # 所属命名空间
  6. labels: #标签
  7. controller: deploy
  8. spec: # 详情描述
  9. replicas: 3 # 副本数量
  10. revisionHistoryLimit: 3 # 保留历史版本的数量,默认10,内部通过保留rs来实现
  11. paused: false # 暂停部署,默认是false
  12. progressDeadlineSeconds: 600 # 部署超时时间(s),默认是600
  13. strategy: # 策略
  14. type: RollingUpdate # 滚动更新策略
  15. rollingUpdate: # 滚动更新
  16. maxSurge: 30% # 最大额外可以存在的副本数,可以为百分比,也可以为整数
  17. maxUnavailable: 30% # 最大不可用状态的 Pod 的最大值,可以为百分比,也可以为整数
  18. selector: # 选择器,通过它指定该控制器管理哪些pod
  19. matchLabels: # Labels匹配规则
  20. app: nginx-pod
  21. matchExpressions: # Expressions匹配规则
  22. - {key: app, operator: In, values: [nginx-pod]}
  23. template: # 模板,当副本数量不足时,会根据下面的模板创建pod副本
  24. metadata:
  25. labels:
  26. app: nginx-pod
  27. spec:
  28. containers:
  29. - name: nginx
  30. image: nginx:1.17.1
  31. ports:
  32. - containerPort: 80
1、创建和删除Deployment

创建pc-deployment.yaml,内容如下:

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: pc-deployment
  5. namespace: dev
  6. spec:
  7. replicas: 3
  8. selector:
  9. matchLabels:
  10. app: nginx-pod
  11. template:
  12. metadata:
  13. labels:
  14. app: nginx-pod
  15. spec:
  16. containers:
  17. - name: nginx
  18. image: nginx:1.17.1

创建和查看

  1. # 创建deployment,--record=true 表示记录整个deployment更新过程
  2. [root@k8s-master01 ~]# kubectl create -f pc-deployment.yaml --record=true
  3. deployment.apps/pc-deployment created
  4. # 查看deployment
  5. # READY 可用的/总数
  6. # UP-TO-DATE 最新版本的pod的数量
  7. # AVAILABLE 当前可用的pod的数量
  8. [root@k8s-master01 ~]# kubectl get deploy pc-deployment -n dev
  9. NAME READY UP-TO-DATE AVAILABLE AGE
  10. pc-deployment 3/3 3 3 15s
  11. # 查看rs
  12. # 发现rs的名称是在原来deployment的名字后面添加了一个10位数的随机串
  13. [root@k8s-master01 ~]# kubectl get rs -n dev
  14. NAME DESIRED CURRENT READY AGE
  15. pc-deployment-6696798b78 3 3 3 23s
  16. # 查看pod
  17. [root@k8s-master01 ~]# kubectl get pods -n dev
  18. NAME READY STATUS RESTARTS AGE
  19. pc-deployment-6696798b78-d2c8n 1/1 Running 0 107s
  20. pc-deployment-6696798b78-smpvp 1/1 Running 0 107s
  21. pc-deployment-6696798b78-wvjd8 1/1 Running 0 107s

删除deployment

  1. # 删除deployment,其下的rs和pod也将被删除
  2. kubectl delete -f pc-deployment.yaml
2、扩缩容

deployment的扩缩容和 ReplicaSet 的扩缩容一样,只需要将rs或者replicaSet改为deployment即可,具体请参考上面的 ReplicaSet 扩缩容

3、镜像更新

刚刚在创建时加上了--record=true参数,所以在一旦进行了镜像更新,就会新建出一个pod出来,将老的old-pod上的容器全删除,然后在新的new-pod上在新建对应数量的容器,此时old-pod是不会删除的,因为这个old-pod是要进行回退的;

镜像更新策略有2种

  • 滚动更新(RollingUpdate):(默认值),杀死一部分,就启动一部分,在更新过程中,存在两个版本Pod
  • 重建更新(Recreate):在创建出新的Pod之前会先杀掉所有已存在的Pod
  1. strategy:指定新的Pod替换旧的Pod的策略, 支持两个属性:
  2. type:指定策略类型,支持两种策略
  3. Recreate:在创建出新的Pod之前会先杀掉所有已存在的Pod
  4. RollingUpdate:滚动更新,就是杀死一部分,就启动一部分,在更新过程中,存在两个版本Pod
  5. rollingUpdate:当typeRollingUpdate时生效,用于为RollingUpdate设置参数,支持两个属性:
  6. maxUnavailable:用来指定在升级过程中不可用Pod的最大数量,默认为25%。
  7. maxSurge 用来指定在升级过程中可以超过期望的Pod的最大数量,默认为25%。

重建更新

1、 编辑pc-deployment.yaml,在spec节点下添加更新策略

  1. spec:
  2. strategy: # 策略
  3. type: Recreate # 重建更新

2、 创建deploy进行验证

  1. # 变更镜像
  2. [root@k8s-master01 ~]# kubectl set image deployment pc-deployment nginx=nginx:1.17.2 -n dev
  3. deployment.apps/pc-deployment image updated
  4. # 观察升级过程
  5. [root@k8s-master01 ~]# kubectl get pods -n dev -w
  6. NAME READY STATUS RESTARTS AGE
  7. pc-deployment-5d89bdfbf9-65qcw 1/1 Running 0 31s
  8. pc-deployment-5d89bdfbf9-w5nzv 1/1 Running 0 31s
  9. pc-deployment-5d89bdfbf9-xpt7w 1/1 Running 0 31s
  10. pc-deployment-5d89bdfbf9-xpt7w 1/1 Terminating 0 41s
  11. pc-deployment-5d89bdfbf9-65qcw 1/1 Terminating 0 41s
  12. pc-deployment-5d89bdfbf9-w5nzv 1/1 Terminating 0 41s
  13. pc-deployment-675d469f8b-grn8z 0/1 Pending 0 0s
  14. pc-deployment-675d469f8b-hbl4v 0/1 Pending 0 0s
  15. pc-deployment-675d469f8b-67nz2 0/1 Pending 0 0s
  16. pc-deployment-675d469f8b-grn8z 0/1 ContainerCreating 0 0s
  17. pc-deployment-675d469f8b-hbl4v 0/1 ContainerCreating 0 0s
  18. pc-deployment-675d469f8b-67nz2 0/1 ContainerCreating 0 0s
  19. pc-deployment-675d469f8b-grn8z 1/1 Running 0 1s
  20. pc-deployment-675d469f8b-67nz2 1/1 Running 0 1s
  21. pc-deployment-675d469f8b-hbl4v 1/1 Running 0 2s

滚动更新

1、 编辑pc-deployment.yaml,在spec节点下添加更新策略

  1. spec:
  2. strategy: # 策略
  3. type: RollingUpdate # 滚动更新策略
  4. rollingUpdate:
  5. maxSurge: 25%
  6. maxUnavailable: 25%

2、 创建deploy进行验证

  1. # 变更镜像
  2. [root@k8s-master01 ~]# kubectl set image deployment pc-deployment nginx=nginx:1.17.3 -n dev
  3. deployment.apps/pc-deployment image updated
  4. # 观察升级过程
  5. [root@k8s-master01 ~]# kubectl get pods -n dev -w
  6. NAME READY STATUS RESTARTS AGE
  7. pc-deployment-c848d767-8rbzt 1/1 Running 0 31m
  8. pc-deployment-c848d767-h4p68 1/1 Running 0 31m
  9. pc-deployment-c848d767-hlmz4 1/1 Running 0 31m
  10. pc-deployment-c848d767-rrqcn 1/1 Running 0 31m
  11. pc-deployment-966bf7f44-226rx 0/1 Pending 0 0s
  12. pc-deployment-966bf7f44-226rx 0/1 ContainerCreating 0 0s
  13. pc-deployment-966bf7f44-226rx 1/1 Running 0 1s
  14. pc-deployment-c848d767-h4p68 0/1 Terminating 0 34m
  15. pc-deployment-966bf7f44-cnd44 0/1 Pending 0 0s
  16. pc-deployment-966bf7f44-cnd44 0/1 ContainerCreating 0 0s
  17. pc-deployment-966bf7f44-cnd44 1/1 Running 0 2s
  18. pc-deployment-c848d767-hlmz4 0/1 Terminating 0 34m
  19. pc-deployment-966bf7f44-px48p 0/1 Pending 0 0s
  20. pc-deployment-966bf7f44-px48p 0/1 ContainerCreating 0 0s
  21. pc-deployment-966bf7f44-px48p 1/1 Running 0 0s
  22. pc-deployment-c848d767-8rbzt 0/1 Terminating 0 34m
  23. pc-deployment-966bf7f44-dkmqp 0/1 Pending 0 0s
  24. pc-deployment-966bf7f44-dkmqp 0/1 ContainerCreating 0 0s
  25. pc-deployment-966bf7f44-dkmqp 1/1 Running 0 2s
  26. pc-deployment-c848d767-rrqcn 0/1 Terminating 0 34m
  27. # 至此,新版本的pod创建完毕,就版本的pod销毁完毕
  28. # 中间过程是滚动进行的,也就是边销毁边创建
4、版本回退
  1. 更新

刚刚在创建时加上了--record=true参数,所以在一旦进行了镜像更新,就会新建出一个pod出来,将老的old-pod上的容器全删除,然后在新的new-pod上在新建对应数量的容器,此时old-pod是不会删除的,因为这个old-pod是要进行回退的;

  1. 回退

在回退时会将new-pod上的容器全部删除,在将old-pod上恢复原来的容器;

在这里插入图片描述

回退命令

kubectl rollout: 版本升级相关功能,支持下面的选项:

  • status 显示当前升级状态
  • history 显示 升级历史记录
  • pause 暂停版本升级过程
  • resume 继续已经暂停的版本升级过程
  • restart 重启版本升级过程
  • undo 回滚到上一级版本(可以使用—to-revision回滚到指定版本)

用法

  1. # 查看当前升级版本的状态
  2. kubectl rollout status deploy pc-deployment -n dev
  3. # 查看升级历史记录
  4. kubectl rollout history deploy pc-deployment -n dev
  5. # 版本回滚
  6. # 这里直接使用--to-revision=1回滚到了1版本, 如果省略这个选项,就是回退到上个版本
  7. kubectl rollout undo deployment pc-deployment --to-revision=1 -n dev

金丝雀发布

Deployment控制器支持控制更新过程中的控制,如“暂停(pause)”或“继续(resume)”更新操作。

比如有一批新的Pod资源创建完成后立即暂停更新过程,此时,仅存在一部分新版本的应用,主体部分还是旧的版本。然后,再筛选一小部分的用户请求路由到新版本的Pod应用,继续观察能否稳定地按期望的方式运行。确定没问题之后再继续完成余下的Pod资源滚动更新,否则立即回滚更新操作。这就是所谓的金丝雀发布。
在这里插入图片描述

金丝雀发布不是自动完成的,需要人为手动去操作,才能达到金丝雀发布的标准;

  1. # 更新deployment的版本,并配置暂停deployment
  2. kubectl set image deploy pc-deployment nginx=nginx:1.17.4 -n dev && kubectl rollout pause deployment pc-deployment -n dev
  3. # 观察更新状态
  4. kubectl rollout status deploy pc-deployment -n dev 
  5. # 监控更新的过程
  6. kubectl get rs -n dev -o wide
  7. # 确保更新的pod没问题了,继续更新
  8. kubectl rollout resume deploy pc-deployment -n dev
  9. # 如果有问题,就回退到上个版本回退到上个版本
  10. kubectl rollout undo deployment pc-deployment -n dev

Horizontal Pod Autoscaler

简称HPA,使用deployment可以手动调整pod的数量来实现扩容和缩容;但是这显然不符合k8s的自动化的定位,k8s期望可以通过检测pod的使用情况,实现pod数量自动调整,于是就有了HPA控制器;

HPA可以获取每个Pod利用率,然后和HPA中定义的指标进行对比,同时计算出需要伸缩的具体值,最后实现Pod的数量的调整。比如说我指定了一个规则:当我的cpu利用率达到90%或者内存使用率到达80%的时候,就需要进行调整pod的副本数量,每次添加n个pod副本;

其实HPA与之前的Deployment一样,也属于一种Kubernetes资源对象,它通过追踪分析ReplicaSet控制器的所有目标Pod的负载变化情况,来确定是否需要针对性地调整目标Pod的副本数,也就是HPA管理Deployment,Deployment管理ReplicaSet,ReplicaSet管理pod,这是HPA的实现原理。
在这里插入图片描述

1、安装metrics-server

metrics-server可以用来收集集群中的资源使用情况

  1. # 安装git
  2. [root@k8s-master01 ~]# yum install git -y
  3. # 获取metrics-server, 注意使用的版本
  4. [root@k8s-master01 ~]# git clone -b v0.3.6 https://github.com/kubernetes-incubator/metrics-server
  5. # 修改deployment, 注意修改的是镜像和初始化参数
  6. [root@k8s-master01 ~]# cd /root/metrics-server/deploy/1.8+/
  7. [root@k8s-master01 1.8+]# vim metrics-server-deployment.yaml
  8. 按图中添加下面选项
  9. hostNetwork: true
  10. image: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server-amd64:v0.3.6
  11. args:
  12. - --kubelet-insecure-tls
  13. - --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP

2、安装metrics-server

  1. [root@k8s-master01 1.8+]# kubectl apply -f ./

3、查看pod运行情况

  1. [root@k8s-master01 1.8+]# kubectl get pod -n kube-system
  2. metrics-server-6b976979db-2xwbj 1/1 Running 0 90s

4、使用kubectl top node 查看资源使用情况

  1. [root@k8s-master01 1.8+]# kubectl top node
  2. NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
  3. k8s-master01 289m 14% 1582Mi 54%
  4. k8s-node01 81m 4% 1195Mi 40%
  5. k8s-node02 72m 3% 1211Mi 41%
  6. [root@k8s-master01 1.8+]# kubectl top pod -n kube-system
  7. NAME CPU(cores) MEMORY(bytes)
  8. coredns-6955765f44-7ptsb 3m 9Mi
  9. coredns-6955765f44-vcwr5 3m 8Mi
  10. etcd-master 14m 145Mi
  11. ...
  12. # 至此,metrics-server安装完成

5、 准备deployment和servie

创建pc-hpa-pod.yaml文件,内容如下:

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: nginx
  5. namespace: dev
  6. spec:
  7. strategy: # 策略
  8. type: RollingUpdate # 滚动更新策略
  9. replicas: 1
  10. selector:
  11. matchLabels:
  12. app: nginx-pod
  13. template:
  14. metadata:
  15. labels:
  16. app: nginx-pod
  17. spec:
  18. containers:
  19. - name: nginx
  20. image: nginx:1.17.1
  21. resources: # 资源配额
  22. limits: # 限制资源(上限)
  23. cpu: "1" # CPU限制,单位是core数
  24. requests: # 请求资源(下限)
  25. cpu: "100m" # CPU限制,单位是core数

创建deployment

  1. [root@k8s-master01 1.8+]# kubectl run nginx --image=nginx:1.17.1 --requests=cpu=100m -n dev

6、创建service

  1. [root@k8s-master01 1.8+]# kubectl expose deployment nginx --type=NodePort --port=80 -n dev

7、查看

  1. [root@k8s-master01 1.8+]# kubectl get deployment,pod,svc -n dev
  2. NAME READY UP-TO-DATE AVAILABLE AGE
  3. deployment.apps/nginx 1/1 1 1 47s
  4. NAME READY STATUS RESTARTS AGE
  5. pod/nginx-7df9756ccc-bh8dr 1/1 Running 0 47s
  6. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  7. service/nginx NodePort 10.101.18.29 <none> 80:31830/TCP 35s

8、 部署HPA

创建pc-hpa.yaml文件,内容如下:

  1. apiVersion: autoscaling/v1
  2. kind: HorizontalPodAutoscaler
  3. metadata:
  4. name: pc-hpa
  5. namespace: dev
  6. spec:
  7. minReplicas: 1 #最小pod数量
  8. maxReplicas: 10 #最大pod数量 ,pod数量会在1~10之间自动伸缩
  9. targetCPUUtilizationPercentage: 3 # CPU使用率指标,如果cpu使用率达到3%就会进行扩容;为了测试方便,将这个数值调小一些
  10. scaleTargetRef: # 指定要控制的nginx信息
  11. apiVersion: /v1
  12. kind: Deployment
  13. name: nginx

创建hpa

  1. [root@k8s-master01 1.8+]# kubectl create -f pc-hpa.yaml
  2. horizontalpodautoscaler.autoscaling/pc-hpa created

查看hpa

  1. [root@k8s-master01 1.8+]# kubectl get hpa -n dev
  2. NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
  3. pc-hpa Deployment/nginx 0%/3% 1 10 1 62s

9、 测试

使用压测工具对service地址192.168.5.4:31830进行压测,然后通过控制台查看hpa和pod的变化

hpa变化

  1. [root@k8s-master01 ~]# kubectl get hpa -n dev -w
  2. NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
  3. pc-hpa Deployment/nginx 0%/3% 1 10 1 4m11s
  4. pc-hpa Deployment/nginx 0%/3% 1 10 1 5m19s
  5. pc-hpa Deployment/nginx 22%/3% 1 10 1 6m50s
  6. pc-hpa Deployment/nginx 22%/3% 1 10 4 7m5s
  7. pc-hpa Deployment/nginx 22%/3% 1 10 8 7m21s
  8. pc-hpa Deployment/nginx 6%/3% 1 10 8 7m51s
  9. pc-hpa Deployment/nginx 0%/3% 1 10 8 9m6s
  10. pc-hpa Deployment/nginx 0%/3% 1 10 8 13m
  11. pc-hpa Deployment/nginx 0%/3% 1 10 1 14m

deployment变化

  1. [root@k8s-master01 ~]# kubectl get deployment -n dev -w
  2. NAME READY UP-TO-DATE AVAILABLE AGE
  3. nginx 1/1 1 1 11m
  4. nginx 1/4 1 1 13m
  5. nginx 1/4 1 1 13m
  6. nginx 1/4 1 1 13m
  7. nginx 1/4 4 1 13m
  8. nginx 1/8 4 1 14m
  9. nginx 1/8 4 1 14m
  10. nginx 1/8 4 1 14m
  11. nginx 1/8 8 1 14m
  12. nginx 2/8 8 2 14m
  13. nginx 3/8 8 3 14m
  14. nginx 4/8 8 4 14m
  15. nginx 5/8 8 5 14m
  16. nginx 6/8 8 6 14m
  17. nginx 7/8 8 7 14m
  18. nginx 8/8 8 8 15m
  19. nginx 8/1 8 8 20m
  20. nginx 8/1 8 8 20m
  21. nginx 1/1 1 1 20m

pod变化

  1. [root@k8s-master01 ~]# kubectl get pods -n dev -w
  2. NAME READY STATUS RESTARTS AGE
  3. nginx-7df9756ccc-bh8dr 1/1 Running 0 11m
  4. nginx-7df9756ccc-cpgrv 0/1 Pending 0 0s
  5. nginx-7df9756ccc-8zhwk 0/1 Pending 0 0s
  6. nginx-7df9756ccc-rr9bn 0/1 Pending 0 0s
  7. nginx-7df9756ccc-cpgrv 0/1 ContainerCreating 0 0s
  8. nginx-7df9756ccc-8zhwk 0/1 ContainerCreating 0 0s
  9. nginx-7df9756ccc-rr9bn 0/1 ContainerCreating 0 0s
  10. nginx-7df9756ccc-m9gsj 0/1 Pending 0 0s
  11. nginx-7df9756ccc-g56qb 0/1 Pending 0 0s
  12. nginx-7df9756ccc-sl9c6 0/1 Pending 0 0s
  13. nginx-7df9756ccc-fgst7 0/1 Pending 0 0s
  14. nginx-7df9756ccc-g56qb 0/1 ContainerCreating 0 0s
  15. nginx-7df9756ccc-m9gsj 0/1 ContainerCreating 0 0s
  16. nginx-7df9756ccc-sl9c6 0/1 ContainerCreating 0 0s
  17. nginx-7df9756ccc-fgst7 0/1 ContainerCreating 0 0s
  18. nginx-7df9756ccc-8zhwk 1/1 Running 0 19s
  19. nginx-7df9756ccc-rr9bn 1/1 Running 0 30s
  20. nginx-7df9756ccc-m9gsj 1/1 Running 0 21s
  21. nginx-7df9756ccc-cpgrv 1/1 Running 0 47s
  22. nginx-7df9756ccc-sl9c6 1/1 Running 0 33s
  23. nginx-7df9756ccc-g56qb 1/1 Running 0 48s
  24. nginx-7df9756ccc-fgst7 1/1 Running 0 66s
  25. nginx-7df9756ccc-fgst7 1/1 Terminating 0 6m50s
  26. nginx-7df9756ccc-8zhwk 1/1 Terminating 0 7m5s
  27. nginx-7df9756ccc-cpgrv 1/1 Terminating 0 7m5s
  28. nginx-7df9756ccc-g56qb 1/1 Terminating 0 6m50s
  29. nginx-7df9756ccc-rr9bn 1/1 Terminating 0 7m5s
  30. nginx-7df9756ccc-m9gsj 1/1 Terminating 0 6m50s
  31. nginx-7df9756ccc-sl9c6 1/1 Terminating 0 6m50s

DaemonSet

简称DS,ds可以保证在集群中的每一台节点(或指定节点)上都运行一个副本,一般适用于日志收集、节点监控等场景;也就是说,如果一个Pod提供的功能是节点级别的(每个节点都需要且只需要一个),那么这类Pod就适合使用DaemonSet类型的控制器创建。
在这里插入图片描述

DaemonSet控制器的特点:

  • 每当向集群中添加一个节点时,指定的 Pod 副本也将添加到该节点上
  • 当节点从集群中移除时,Pod 也就被垃圾回收了

配置模板

  1. apiVersion: apps/v1 # 版本号
  2. kind: DaemonSet # 类型
  3. metadata: # 元数据
  4. name: # rs名称
  5. namespace: # 所属命名空间
  6. labels: #标签
  7. controller: daemonset
  8. spec: # 详情描述
  9. revisionHistoryLimit: 3 # 保留历史版本
  10. updateStrategy: # 更新策略
  11. type: RollingUpdate # 滚动更新策略
  12. rollingUpdate: # 滚动更新
  13. maxUnavailable: 1 # 最大不可用状态的 Pod 的最大值,可以为百分比,也可以为整数
  14. selector: # 选择器,通过它指定该控制器管理哪些pod
  15. matchLabels: # Labels匹配规则
  16. app: nginx-pod
  17. matchExpressions: # Expressions匹配规则
  18. - {key: app, operator: In, values: [nginx-pod]}
  19. template: # 模板,当副本数量不足时,会根据下面的模板创建pod副本
  20. metadata:
  21. labels:
  22. app: nginx-pod
  23. spec:
  24. containers:
  25. - name: nginx
  26. image: nginx:1.17.1
  27. ports:
  28. - containerPort: 80

1、创建ds

创建pc-daemonset.yaml,内容如下:

  1. apiVersion: apps/v1
  2. kind: DaemonSet
  3. metadata:
  4. name: pc-daemonset
  5. namespace: dev
  6. spec:
  7. selector:
  8. matchLabels:
  9. app: nginx-pod
  10. template:
  11. metadata:
  12. labels:
  13. app: nginx-pod
  14. spec:
  15. containers:
  16. - name: nginx
  17. image: nginx:1.17.1

运行

  1. # 创建daemonset
  2. [root@k8s-master01 ~]# kubectl create -f pc-daemonset.yaml
  3. daemonset.apps/pc-daemonset created
  4. # 查看daemonset
  5. [root@k8s-master01 ~]# kubectl get ds -n dev -o wide
  6. NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES
  7. pc-daemonset 2 2 2 2 2 24s nginx nginx:1.17.1
  8. # 查看pod,发现在每个Node上都运行一个pod
  9. [root@k8s-master01 ~]# kubectl get pods -n dev -o wide
  10. NAME READY STATUS RESTARTS AGE IP NODE
  11. pc-daemonset-9bck8 1/1 Running 0 37s 10.244.1.43 node1
  12. pc-daemonset-k224w 1/1 Running 0 37s 10.244.2.74 node2

2、删除daemonset

  1. [root@k8s-master01 ~]# kubectl delete -f pc-daemonset.yaml
  2. daemonset.apps "pc-daemonset" deleted

Job

主要用于负责批量处理一次性(每个任务仅运行一次就结束)任务。当然,你也可以运行多次,配置好即可,Job特点如下:

  • 当Job创建的pod执行成功结束时,Job将记录成功结束的pod数量
  • 当成功结束的pod达到指定的数量时,Job将完成执行

在这里插入图片描述

配置模板

  1. apiVersion: batch/v1 # 版本号
  2. kind: Job # 类型
  3. metadata: # 元数据
  4. name: # rs名称
  5. namespace: # 所属命名空间
  6. labels: #标签
  7. controller: job
  8. spec: # 详情描述
  9. completions: 1 # 指定job需要成功运行Pods的次数。默认值: 1
  10. parallelism: 1 # 指定job在任一时刻应该并发运行Pods的数量。默认值: 1
  11. activeDeadlineSeconds: 30 # 指定job可运行的时间期限,超过时间还未结束,系统将会尝试进行终止。
  12. backoffLimit: 6 # 指定job失败后进行重试的次数。默认是6
  13. manualSelector: true # 是否可以使用selector选择器选择pod,默认是false
  14. selector: # 选择器,通过它指定该控制器管理哪些pod
  15. matchLabels: # Labels匹配规则
  16. app: counter-pod
  17. matchExpressions: # Expressions匹配规则
  18. - {key: app, operator: In, values: [counter-pod]}
  19. template: # 模板,当副本数量不足时,会根据下面的模板创建pod副本
  20. metadata:
  21. labels:
  22. app: counter-pod
  23. spec:
  24. restartPolicy: Never # 重启策略只能设置为Never或者OnFailure
  25. containers:
  26. - name: counter
  27. image: busybox:1.30
  28. command: ["bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1; do echo $i;sleep 2;done"]

关于重启策略设置的说明:(==这里只能设置为Never或者OnFailure==)

  • 如果指定为OnFailure,则job会在pod出现故障时重启容器,而不是创建pod,failed次数不变
  • 如果指定为Never,则job会在pod出现故障时创建新的pod,并且故障pod不会消失,也不会重启,failed次数加1
  • 如果指定为Always的话,就意味着一直重启,意味着job任务会重复去执行了,当然不对,所以不能设置为Always

1、创建一个job

创建pc-job.yaml,内容如下:

  1. apiVersion: batch/v1
  2. kind: Job
  3. metadata:
  4. name: pc-job
  5. namespace: dev
  6. spec:
  7. manualSelector: true
  8. selector:
  9. matchLabels:
  10. app: counter-pod
  11. template:
  12. metadata:
  13. labels:
  14. app: counter-pod
  15. spec:
  16. restartPolicy: Never
  17. containers:
  18. - name: counter
  19. image: busybox:1.30
  20. command: ["bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1; do echo $i;sleep 3;done"]

创建

  1. # 创建job
  2. [root@k8s-master01 ~]# kubectl create -f pc-job.yaml
  3. job.batch/pc-job created
  4. # 查看job
  5. [root@k8s-master01 ~]# kubectl get job -n dev -o wide -w
  6. NAME COMPLETIONS DURATION AGE CONTAINERS IMAGES SELECTOR
  7. pc-job 0/1 21s 21s counter busybox:1.30 app=counter-pod
  8. pc-job 1/1 31s 79s counter busybox:1.30 app=counter-pod
  9. # 通过观察pod状态可以看到,pod在运行完毕任务后,就会变成Completed状态
  10. [root@k8s-master01 ~]# kubectl get pods -n dev -w
  11. NAME READY STATUS RESTARTS AGE
  12. pc-job-rxg96 1/1 Running 0 29s
  13. pc-job-rxg96 0/1 Completed 0 33s
  14. # 接下来,调整下pod运行的总数量和并行数量 即:在spec下设置下面两个选项
  15. # completions: 6 # 指定job需要成功运行Pods的次数为6
  16. # parallelism: 3 # 指定job并发运行Pods的数量为3
  17. # 然后重新运行job,观察效果,此时会发现,job会每次运行3个pod,总共执行了6个pod
  18. [root@k8s-master01 ~]# kubectl get pods -n dev -w
  19. NAME READY STATUS RESTARTS AGE
  20. pc-job-684ft 1/1 Running 0 5s
  21. pc-job-jhj49 1/1 Running 0 5s
  22. pc-job-pfcvh 1/1 Running 0 5s
  23. pc-job-684ft 0/1 Completed 0 11s
  24. pc-job-v7rhr 0/1 Pending 0 0s
  25. pc-job-v7rhr 0/1 Pending 0 0s
  26. pc-job-v7rhr 0/1 ContainerCreating 0 0s
  27. pc-job-jhj49 0/1 Completed 0 11s
  28. pc-job-fhwf7 0/1 Pending 0 0s
  29. pc-job-fhwf7 0/1 Pending 0 0s
  30. pc-job-pfcvh 0/1 Completed 0 11s
  31. pc-job-5vg2j 0/1 Pending 0 0s
  32. pc-job-fhwf7 0/1 ContainerCreating 0 0s
  33. pc-job-5vg2j 0/1 Pending 0 0s
  34. pc-job-5vg2j 0/1 ContainerCreating 0 0s
  35. pc-job-fhwf7 1/1 Running 0 2s
  36. pc-job-v7rhr 1/1 Running 0 2s
  37. pc-job-5vg2j 1/1 Running 0 3s
  38. pc-job-fhwf7 0/1 Completed 0 12s
  39. pc-job-v7rhr 0/1 Completed 0 12s
  40. pc-job-5vg2j 0/1 Completed 0 12s

2、删除

  1. # 删除job
  2. kubectl delete -f pc-job.yaml

CronJob

简称为CJ,CronJob控制器以 Job控制器资源为其管控对象,并借助它管理pod资源对象,Job控制器定义的作业任务在其控制器资源创建之后便会立即执行,但CronJob可以以类似于Linux操作系统的周期性任务作业计划的方式控制其运行时间点及重复运行的方式。也就是说,CronJob可以在特定的时间点(反复的)去运行job任务。==可以理解为定时任务==
在这里插入图片描述

配置模板

  1. apiVersion: batch/v1beta1 # 版本号
  2. kind: CronJob # 类型
  3. metadata: # 元数据
  4. name: # rs名称
  5. namespace: # 所属命名空间
  6. labels: #标签
  7. controller: cronjob
  8. spec: # 详情描述
  9. schedule: # cron格式的作业调度运行时间点,用于控制任务在什么时间执行
  10. concurrencyPolicy: # 并发执行策略,用于定义前一次作业运行尚未完成时是否以及如何运行后一次的作业
  11. failedJobHistoryLimit: # 为失败的任务执行保留的历史记录数,默认为1
  12. successfulJobHistoryLimit: # 为成功的任务执行保留的历史记录数,默认为3
  13. startingDeadlineSeconds: # 启动作业错误的超时时长
  14. jobTemplate: # job控制器模板,用于为cronjob控制器生成job对象;下面其实就是job的定义
  15. metadata:
  16. spec:
  17. completions: 1
  18. parallelism: 1
  19. activeDeadlineSeconds: 30
  20. backoffLimit: 6
  21. manualSelector: true
  22. selector:
  23. matchLabels:
  24. app: counter-pod
  25. matchExpressions: 规则
  26. - {key: app, operator: In, values: [counter-pod]}
  27. template:
  28. metadata:
  29. labels:
  30. app: counter-pod
  31. spec:
  32. restartPolicy: Never
  33. containers:
  34. - name: counter
  35. image: busybox:1.30
  36. command: ["bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1; do echo $i;sleep 20;done"]

cron表达式写法

  1. 需要重点解释的几个选项:
  2. schedule: cron表达式,用于指定任务的执行时间
  3. */1 * * * *
  4. <分钟> <小时> <日> <月份> <星期>
  5. 分钟 值从 0 59.
  6. 小时 值从 0 23.
  7. 值从 1 31.
  8. 值从 1 12.
  9. 星期 值从 0 6, 0 代表星期日
  10. 多个时间可以用逗号隔开; 范围可以用连字符给出;*可以作为通配符; /表示每... 例如
  11. 1 * * * * // 每个小时的第一分钟执行
  12. */1 * * * * // 每分钟都执行
  13. concurrencyPolicy:
  14. Allow: 允许Jobs并发运行(默认)
  15. Forbid: 禁止并发运行,如果上一次运行尚未完成,则跳过下一次运行
  16. Replace: 替换,取消当前正在运行的作业并用新作业替换它

1、创建cronJob

创建pc-cronjob.yaml,内容如下:

  1. apiVersion: batch/v1beta1
  2. kind: CronJob
  3. metadata:
  4. name: pc-cronjob
  5. namespace: dev
  6. labels:
  7. controller: cronjob
  8. spec:
  9. schedule: "*/1 * * * *" # 每分钟执行一次
  10. jobTemplate:
  11. metadata:
  12. spec:
  13. template:
  14. spec:
  15. restartPolicy: Never
  16. containers:
  17. - name: counter
  18. image: busybox:1.30
  19. command: ["bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1; do echo $i;sleep 3;done"]

运行

  1. # 创建cronjob
  2. [root@k8s-master01 ~]# kubectl create -f pc-cronjob.yaml
  3. cronjob.batch/pc-cronjob created
  4. # 查看cronjob
  5. [root@k8s-master01 ~]# kubectl get cronjobs -n dev
  6. NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
  7. pc-cronjob */1 * * * * False 0 <none> 6s
  8. # 查看job
  9. [root@k8s-master01 ~]# kubectl get jobs -n dev
  10. NAME COMPLETIONS DURATION AGE
  11. pc-cronjob-1592587800 1/1 28s 3m26s
  12. pc-cronjob-1592587860 1/1 28s 2m26s
  13. pc-cronjob-1592587920 1/1 28s 86s
  14. # 查看pod
  15. [root@k8s-master01 ~]# kubectl get pods -n dev
  16. pc-cronjob-1592587800-x4tsm 0/1 Completed 0 2m24s
  17. pc-cronjob-1592587860-r5gv4 0/1 Completed 0 84s
  18. pc-cronjob-1592587920-9dxxq 1/1 Running 0 24s

2、删除cronjob

  1. kubectl delete -f pc-cronjob.yaml

pod调度

什么是调度

默认情况下,一个pod在哪个node节点上运行,是通过scheduler组件采用相应的算法计算出来的,这个过程是不受人工控制的;

调度规则

但是在实际使用中,我们想控制某些pod定向到达某个节点上,应该怎么做呢?其实k8s提供了四类调度规则

调度方式 描述
自动调度 通过scheduler组件采用相应的算法计算得出运行在哪个节点上
定向调度 运行到指定的node节点上,通过NodeName、NodeSelector实现
亲和性调度 跟谁关系好就调度到哪个节点上 <br> 1、nodeAffinity :节点亲和性,调度到关系好的节点上 <br>2、podAffinity:pod亲和性,调度到关系好的pod所在的节点上<br>3、PodAntAffinity:pod反清河行,调度到关系差的那个pod所在的节点上
污点(容忍)调度 污点是站在node的角度上的,比如果nodeA有一个污点,大家都别来,此时nodeA会拒绝master调度过来的pod

定向调度

指的是利用在pod上声明nodeName或nodeSelector的方式将pod调度到指定的pod节点上,因为这种定向调度是==强制性==的,所以如果node节点不存在的话,也会向上面进行调度,只不过pod会运行失败;

1、定向调度-> nodeName

nodeName 是将pod强制调度到指定名称的node节点上,这种方式跳过了scheduler的调度逻辑,直接将pod调度到指定名称的节点上,配置文件内容如下

  1. apiVersion: v1 # 版本号
  2. kind: Pod # 资源类型
  3. metadata:
  4. name: pod-name
  5. namespace: dev
  6. spec:
  7. containers:
  8. - image: nginx:1.17.1
  9. name: nginx-container
  10. nodeName: node1 # 调度到node1节点上
2、定向调度 -> NodeSelector

NodeSelector是将pod调度到添加了指定label标签的node节点上,它是通过k8s的label-selector机制实现的,也就是说,在创建pod之前,会由scheduler用matchNodeSelecto调度策略进行label标签的匹配,找出目标node,然后在将pod调度到目标node;

要实验NodeSelector,首先得给node节点加上label标签

  1. kubectl label nodes node1 nodetag=node1

配置文件内容如下

  1. apiVersion: v1 # 版本号
  2. kind: Pod # 资源类型
  3. metadata:
  4. name: pod-name
  5. namespace: dev
  6. spec:
  7. containers:
  8. - image: nginx:1.17.1
  9. name: nginx-container
  10. nodeSelector:
  11. nodetag: node1 # 调度到具有nodetag=node1标签的节点上

关键字Kubernetes