Pod控制器
什么是Pod控制器
Pod控制器是管理pod的中间层,使用了pod控制器之后,我们只需要告诉pod控制器,想要多少个什么样的pod就可以了,它就会创建出满足条件的pod并确保每一个pod处于用户期望的状态,如果pod在运行中出现故障,控制器会基于指定策略重启动或者重建pod。
在kubernetes中,有很多类型的pod控制器,每种都有自己的适合的场景,常见的有下面这些:
- ReplicationController:比较原始的pod控制器,已经被废弃,由ReplicaSet替代
- ReplicaSet:保证指定数量的pod运行,并支持pod数量变更,镜像版本变更
- Deployment:通过控制ReplicaSet来控制pod,并支持滚动升级、版本回退
- Horizontal Pod Autoscaler:可以根据集群负载自动调整Pod的数量,实现削峰填谷
- DaemonSet:在集群中的指定Node上都运行一个副本,一般用于守护进程类的任务
- Job:它创建出来的pod只要完成任务就立即退出,用于执行一次性任务
- Cronjob:它创建的pod会周期性的执行,用于执行周期性任务
- Statefulset:管理有状态应用
Deployment
Deployment包含ReplicaSet的所有功能,所以直接学习Deployment就可以了
Deployment资源清单如下,yaml主要分为三部分,第一部分元数据没啥说的,第三部分是pod容器也没啥说的,重点关注中间部分。
创建pc-deployment.yaml,内容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: pc-deployment
namespace: dev
spec :
replicas: 3
selector :
matchLabels :
app: nginx-pod
template :
metadata:
labels :
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.71.1
#变更副本数量为5个
[root@master ~]# kubectl scale deploy pc-deployment --replicas=5 -n dev
# 编辑deployment的副本数量,修改spec:replicas:4即可
[root@master ~]# kubectl edit deploy pc-feployment -n dev
镜像更新
Deployment支持两种镜像更新的策略:重建更新 和 滚动更新(默认)可以通过 strategy 选项进行配置。
strategy:指定新的Pod替换旧的Pod的策略,支持两个属性:
type:指定策略类型,支持两种策略
- Recreate:在创建出新的Pod之前会先杀掉所有已存在的Pod
- RollingUpdate:滚动更新,就是杀死一部分,就启动一部分,在更新过程中,存在两个版本Pod
rollingUpdate:当type为RollingUpdate时生效,用于为RollingUpdate设置参数,支持两个属性:
maxUnavailable:用来指定在升级过程中不可用Pod的最大数量,默认为25%。
maxSurge: 用来指定在升级过程中可以超过期望的Pod的最大数量,默认为25%。
# 变更镜像
[root@master ~]# kubectl set image deployment pc-deployment nginx=nginx:1.17.2 -n dev
版本回退
deployment支持版本升级过程中的暂停、继续功能以及版本回退等诸多功能,下面具体来看
kubectl rollout: 版本升级相关功能,支持下面的选项:
status 显示当前升级状态
history 显示升级历史记录
pause 暂停版本升级过程
resume 继续已经暂停的版本升级过程
restart 重启版本升级过程
undo 回滚到上一级版本(可以使用--to-revision回滚到指定版本)
#创建deployment并把这次命令记录到操作历史中
[rootemaster ~]# kubectl create -f pc-deployment.yaml --record
#查看升级历史记录
[rootemaster ~]# kubectl rollout history deploy pc-deployment -n dev
#版本回滚
#这里直接使用--to-revision=1回滚到了1版本, 如果省略这个选项,就是回退到上个版本
[rootmaster ~]# kubectl rollout undo deployment pc-deployment --to-revision=1 -n dev
Horizontal Pod Autoscaler(HPA)
之前我们可以通过手工执行kubectl scale 命令实现Pod扩容,但是这显然不符合Kubernetes的定位目标--自动化、智能化。Kubernetes期望可以通过监测Pod的使用情况,实现pod数量的自动调整,于是就产生了HPA这种控制器。
HPA可以获取每个pod利用率,然后和HPA中定义的指标进行对比,同时计算出需要伸缩的具体值,最后实现pod的数量的调整,其实HPA与之前的Deployment一样,也属于一种Kubernetes资源对象,它通过追踪分析目标pod的负载变化情况,来确定是否需要针对性地调整目标pod的副本数。
1.安装metrics-server
wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.6.3/components.yaml
下载不到文件的可以去我的主页下载
如果你下载到了,也最好改一下如下配置
kubectl apply -f components.yaml
检测是否部署成功
查看node cpu使用率
2.准备Deployment和Service
#创建deployment
[root@master 1.8+]# kubectl run nginx --image=nginx:latest --requests=cpu=100m -n dev
#创建service
[rootemaster 1.8+]# kubectl expose deployment nginx --type=NodePort --port=80 -n dev
3.部署HPA
创建pc-hpa.yaml
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: pc-hpa
namespace: dev
spec:
minReplicas:1 #最小pod数量
maxReplicas:10 #最大pod数量
targetCPUUtilizationPercentage:3 # CPU使用率指标
scaleTargetRef:#指定要控制的nginx信息
apiVersion: apps/v1
kind: Pod
name: nginx
4.测试
使用压测工具或postman对service地址压测,然后通过控制台查看hpa和pod的变化
DaemonSet
DaemonSet类型的控制器可以保证集群中的每一台(或指定)节点上都运行一个副本,一般适用于日志收集节点监控等场景。也就是说,如果一个pod提供的功能是节点级别的(每个节点都需要且只需要一个),那么这类Pod就适合使用DaemonSet类型的控制器创建。
资源清单如下:
创建pc-daemonset.yaml,内容如下:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: pc-daemonset
namespace: dev
spec:
selector :
matchLabels:
app: nginx-pod
template:
metadata:
labels:
app: nginx-pod
spec :
containers:
- name:nginx
image: nginx:1.17.1
Job
Job,主要用于负责批量处理短暂的一次性任务。
资源清单如下,主要用的就是前三个属性,比如completions为6,parallelism为3,就是运行6个pod,一次并行运行3个,执行两轮
创建pc-job.yaml,内容如下:
apiVersion: batch/v1
kind: Job
metadata:
name: pc-job
namespace: dev
spec :
manualSelector: true
selector:
matchLabels:
app: counter-pod
template:
metadata:
labels:
app: counter-pod
spec :
restartPolicy: Never
containers:
- name: counter
image: bsybox:1.30
command:["bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1; do echo $i;sleep 3;done"]
Cronjob
Cronlob控制器以lob控制器资源为其管控对象,并借助它管理pod资源对象,lob控制器定义的作业任务在其控制器资源创建之后便会立即执行,但Cronjob可以以类似于Linux操作系统的周期性任务作业计划的方式控制其运行时间点及重复运行的方式。也就是说,Cronob可以在特定的时间点(反复的)去运行job任务。
创建pc-cronjob.yaml,内容如下:
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: pc-cronjob
namespace: dev
labels:
controller: cronjob
spec :
schedule:"*/1 ** * *"
jobTemplate:
metadata:
spec:
template:
spec:
restartPolicy: Never
containers:
- name: counter
image: busybox:1.30
command: ["bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1; do echo $i;sleep 3;done"]