Kubernetes(K8S) 入门进阶实战完整教程-06k8s的Pod控制器02-HPA-DaemonSet-Job-CronJob
HPA(Horizontal Pod Authscaler)控制器-上
- 概述
我们已经可以通过手动执行kubectl scale命令实现Pod的扩缩容,但是这显然不符合kubernetes的定位目标–自动化和智能化。kubernetes期望可以通过监测Pod的使用情况,实现Pod数量的自动调整,于是就产生了HPA这种控制器。
HPA可以获取每个Pod的利用率,然后和HPA中定义的指标进行对比,同时计算出需要伸缩的具体值,最后实现Pod的数量的调整。其实HPA和之前的Deployment一样,也属于一种kubernetes资源对象,它通过追踪分析目标Pod的负载变化情况,来确定是否需要针对性的调整目标Pod的副本数。
- 下载配置matrics-server
matrics-server可以用来收集集群中的资源使用情况
# 安装git
yum install -y git
# 获取matrics-server,注意使用的版本
git clone -b v0.3.6 https://github.com/kubernetes-sigs/metrics-server
# 修改deployment,注意修改的是镜像和初始化参数
cd /root/metrics-server/deploy/1.8+/
vim matrics-server.deployment.yaml
# 按图中添加下面选项
hostNetwork: true
image: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server-amd64:v0.3.6
args:
- --kubelet-insecure-tls
- --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP
3. 安装metrics-server
# 注意在/root/metrics-server/deploy/1.8+这个目录下执行命令
kubectl apply -f ./
# 查看pod运行情况
kubectl get pod -n kube-system
# 使用kubectl top node/pod查看资源使用情况
kubectl top node # 查看node资源使用情况
kubectl top pod -n kube-system # 查看系统命名空间下的pod资源使用情况
- 准备deployment和service
# 为了操作简单,直接使用命令
kubectl run nginx --image=nginx:1.17.1 --requests=cpu=100m -n dev
# 创建service
kubectl expose deployment nginx --type=NodePort --port=80 -n dev
# 查看
kubectl get deployment,pod,service -n dev
HPA(Horizontal Pod Authscaler)控制器-下
- 部署HPA
创建pc-hpa.yaml
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: pc-hpa
namespace: dev
spec:
maxReplicas: 10 # 最大pod数量
minReplicas: 1 # 最小pod数量
targetCPUUtilizationPercentage: 3 # CPU使用率指标
scaleTargetRef: # 指定要控制的nginx信息
apiVersion: apps/v1
kind: Deployment
name: nginx
- 创建hpa
kubectl create -f pc-hpa.yaml
查看hpa
kubectl get hpa -n dev
- 开启三个窗口分别监听hpa、deploy、pod状态的变化,然后通过apifox发送压力测试请求
kubectl get hpa -n dev -w
kubectl get deploy -n dev -w
kubectl get pod -n dev -w
当CPU数量使用率超过3%的时候,就会扩展Pod的数量,一直扩展到了最大值10,当我们把压测工具停止后,过一段时间,pod的数量慢慢又缩回来了,知道最小的一个pod。
DaemonSet控制器
- 概述
DaemonSet类型的控制器可以保证集群中的每一台(或指定)节点上都运行一个副本,一般适用于日志收集、节点监控等场景。也就是说,如果一个Pod提供的功能是节点级别的(每个节点都需要且只需要一个),那么这类Pod就适合使用DaemonSet类型的控制器创建。
- DamonSet控制器的特点
- 每向集群中添加一个节点的时候,指定的Pod副本也会添加到该节点上
- 当节点从集群中移除时,Pod也就被垃圾回收了
- 下面来看一下DaemonSet的资源清单文件
apiVersion: apps/v1 # 版本号
kind: DaemonSet # 类型
metadata: # 元数据
name: # 名称
namespace: #命名空间
labels: #标签
controller: daemonset
spec: # 详情描述
revisionHistoryLimit: 3 # 保留历史版本
updateStrategy: # 更新策略
type: RollingUpdate # 滚动更新策略
rollingUpdate: # 滚动更新
maxUnavailable: 1 # 最大不可用状态的Pod的最大值,可用为百分比,也可以为整数
selector: # 选择器,通过它指定该控制器管理那些Pod
matchLabels: # Labels匹配规则
app: nginx-pod
matchExpressions: # Expressions匹配规则
- key: app
operator: In
values:
- nginx-pod
template: # 模板,当副本数量不足时,会根据下面的模板创建Pod模板
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- containerPort: 80
- 创建pc-daemonset.yaml文件
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: daemonset
namespace: dev
labels:
controller: daemonset
spec:
revisionHistoryLimit: 3
updateStrategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
selector:
matchLabels:
app: pod-nginx
matchExpressions:
- key: app
operator: In
values:
- pod-nginx
template:
metadata:
labels:
app: pod-nginx
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- containerPort: 80
- 创建daemonset
kubectl create -f pc-daemonset.yaml
- 查看daemonset
kubectl get ds/daemonset -n dev -o wide
查看pod
kubectl get daemonset,pod -n dev -o wide
我们发现并没有设置replicas,但是pod却运行了两个,一个节点上一个,这就是daemonset的特性。 - 删除daemonset
kubectl delete -f pc-daemonset.yaml
Job控制器
- 概述
Job主要用于批量处理短暂的一次性任务
Job的特点:
- 当Job创建的Pod执行成功结束时,Job将记录成功结束的Pod数量
- 当成功结束的Pod到达指定的数量时,Job将完成执行
总结:Job可以保证指定数量的Pod执行完成
- Job的资源清单
apiVersion: batch/v1 # 版本号
kind: Job # 类型
metadata: # 元数据
name: # 名称
namespace: #命名空间
labels: # 标签
controller: job
spec: # 详情描述
completions: 1 # 指定Job需要成功运行Pod的总次数,默认为1
parallelism: 1 # 指定Job在任一时刻应该并发运行Pod的数量,默认为1
activeDeadlineSeconds: 30 # 指定Job可以运行的时间期限,超过时间还没结束,系统将会尝试进行终止
backoffLimit: 6 # 指定Job失败后进行重试的次数,默认为6
manualSelector: true # 是否可以使用selector选择器选择Pod,默认为false
selector: # 选择器,通过它指定该控制器管理那些Pod
matchLabels: # Labels匹配规则
app: counter-pod
matchExpressions: # Expressions匹配规则
- key: app
operator: In
values:
- counter-pod
template: # 模板,当副本数量不足时,会根据下面的模板创建Pod模板
metadata:
labels:
app: counter-pod
spec:
restartPolicy: Never # 重启策略只能设置为Never或OnFailure
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 20;done"]
- 关于模板中重启策略的说明
关于模板中的重启策略的说明:
如果设置为OnFailure,则Job会在Pod出现故障的时候重启容器,而不是创建Pod,failed次数不变。
如果设置为Never,则Job会在Pod出现故障的时候创建新的Pod,并且故障Pod不会消失,也不会重启,failed次数+1。
如果指定为Always的话,就意味着一直重启,意味着Pod任务会重复执行,这和Job的定义冲突,所以不能设置为Always。
- 创建pc-job.yaml文件
apiVersion: batch/v1
kind: Job
metadata:
name: pc-job
namespace: dev
spec:
manualSelector: true
selector:
matchLabels:
app: pod-counter
template:
metadata:
labels:
app: pod-counter
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 4;done" ]
- 创建、查看、删除Job
kubectl create -f pc-job.yaml
kubectl get job -n dev -w
kubectl delete -f pc-job.yaml
CronJob控制器
- 概述
CronJob控制器以Job控制器为其管控对象,并借助它管理Pod资源对象,Job控制器定义的作业任务在其控制器资源创建之后便会立即执行,但CronJob可以以类似Linux操作系统的周期性任务作业计划的方式控制器运行时间点及重复运行的方式,换言之,CronJob可以在特定的时间点反复去执行Job任务。
- CronJob的资源清单
apiVersion: batch/v1beta1 # 版本号
kind: CronJob # 类型
metadata: # 元数据
name: # 名称
namespace: #命名空间
labels:
controller: cronjob
spec: # 详情描述
schedule: # cron格式的作业调度运行时间点,用于控制任务任务时间执行
concurrencyPolicy: # 并发执行策略, 用于定义前一次运行作业尚未完成时是否以及如何运行后一次作业
failedJobsHistoryLimit: # 为失败的任务执行保留的历史记录数,默认为1
successfulJobsHistoryLimit: # 为成功的任务执行保留的历史记录数,默认为3
jobTemplate: # job控制器模板,用于为cronjob控制器生成job对象,下面其实就是job的定义
metadata: {}
spec:
completions: 1 # 指定Job需要成功运行Pod的总次数,默认为1
parallelism: 1 # 指定Job在任一时刻应该并发运行Pod的数量,默认为1
activeDeadlineSeconds: 30 # 指定Job可以运行的时间期限,超过时间还没结束,系统将会尝试进行终止
backoffLimit: 6 # 指定Job失败后进行重试的次数,默认为6
template: # 模板,当副本数量不足时,会根据下面的模板创建Pod模板
spec:
restartPolicy: Never # 重启策略只能设置为Never或OnFailure
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 20;done" ]
- 资源清单相关解释:
schedule:cron表达式,用于指定任务的执行时间。
*/1 * * * *:表示分钟 小时 日 月份 星期。
分钟的值从0到59。
小时的值从0到23。
日的值从1到31。
月的值从1到12。
星期的值从0到6,0表示星期日。
多个时间可以用逗号隔开,范围可以用连字符给出:* 可以作为通配符,/表示每...
concurrencyPolicy:并发执行策略
Allow:运行Job并发运行(默认)。
Forbid:禁止并发运行,如果上一次运行尚未完成,则跳过下一次运行。
Replace:替换,取消当前正在运行的作业并使用新作业替换它。
- 创建pc-cronjob.yaml文件
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: pc-cronjob
namespace: dev
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;"]
- 创建、查看、删除cronjob
kubectl create -f pc-cronjob.yaml
kubectl get cronjob -n dev -w
kubectl delete -f pc-cronjob.yaml
查看Pod
kubectl get pod -n dev -w