欢迎访问我的博客,你的支持,是我最大的动力!

马哥_K8s进阶实战(3)Pod控制器

Linux 马从东 75℃ 评论
目录:
[显示]

Pod控制器

kubelet对非主进程崩溃类的容器错误无法感知,需要借助存活性探测livenessProbe

Pod控制器:ReplicationController、ReplicaSet、Deployment、DaemouSet、StatefulSet、Job、CronJob

# k8s可用的控制器有:attachdetach,bootstrapsigner,clusterrole-aggregation,cronjob,csrapproving,csrcleaner,csrsigning,daemonset,deployment,disruption,endpoint,garbagecollector,horizontalpodautoscaling,job,namespace,node,persistentvolumebinder,persistentvolume-expander,podgc,pvc-protection,replicaset,replicationcontroller,resourcequota,route,service,serviceaccount,serviceaccount-token,statefulset,tokencleaner,ttl等等

Pod控制器通常包含三个组成部分:
标签选择器,期望的副本数,Pod模板

Pod 模板资源

spec.template 不需要apiVersion和kind字段,和自主式Pod对象支持的字段几乎完全一样

ReplicaSet RS

ReplicationController的替代者,确保Pod副本数在任一时刻都精确满足期望值

spec.selector 支持matchLabels和matchExpressions两种匹配机制
spec.minReadySeconds,Pod对象启动后多长时间认为就绪,默认0s

kubectl get replicasets.apps  # 查看
kubectl describe replicasets.apps rs-example

1、缺少Pod副本
删除某Pod后,replicaset会自动重建
删除某Pod标签后,replicaset会创建新的Pod
kubectl label pod rs-example-b59gz app= --overwrite  # 修改已有标签
若修改标签后的Pod不隶属于任何控制器,则会成为自主式Pod
2、多出Pod副本
自动删除多余的Pod

改动Pod模板定义对已存在的活动对象无效,仅影响新建的Pod
此时分批次删除旧有Pod或更改其标签,可实现滚动升级的效果,更替期间新旧版本共存

扩缩容

kubectl scale replicaset rs-example --replicas=5
kubectl scale replicaset rs-example --current-replicas=1 --replicas=2 # 当目前副本数量为1时 扩展到2

kubectl delete replicasets.apps rs-example --cascade=false  # 仅删除控制器 不级联删除所属Pod

Deployment deploy

Deployment构建于ReplicaSet之上
支持事件和状态查看,回滚,版本记录,暂停和启动升级,多种自动更新方案:Recreate,先删除再新建;RollingUpdate,滚动升级,逐步替换

kubectl get deployments.apps
Deployment会自动创建名称为 DeploymentName-PodTemplateHashValue格式的ReplicaSet

更新策略

滚动更新 rolling update 和 重新创建 recreate,默认为滚动更新

spec.strategy.rollingUpdate.maxSurge
# 升级期间允许的总Pod数超出期望值的个数,可以是具体数值或百分比,若为1,则表示可超出1个
spec.strategy.rollingUpdate.maxUnavailable
# 升级期间正常可用的Pod副本数,包含新旧版本,最多不能低于期望值的个数,可为具体数值或百分比
spec.minReadySeconds,可控制更新速度,此时间内更新操作会被阻塞
注意,maxSurge和maxUnavailable不能同时为0,否则无法升级

保留滚动更新历史版本
spec.revisionHistoryLimit 控制保存历史版本的数量
历史版本可用于回滚,要记录历史版本需要在创建Deployment时使用 --record选项
kubectl apply -f b.yaml --record

# 修改间隔时间
kubectl patch deployments.apps myapp-deploy -p '{"spec":{"minReadySeconds":5}}'
# 修改镜像 触发滚动更新
kubectl set image deployments.apps myapp-deploy myapp=ikubernetes/myapp:v2
# 查看滚动更新过程中状态信息
kubectl rollout status deployment myapp-deploy
kubectl get deployments.apps myapp-deploy --watch
# 旧的replicasets会保留 但此前管理的Pod对象会删除
kubectl get replicasets.apps -l app=myapp
# 访问 curl $(kubectl get pods myapp-deploy-79d4d5d95f-k2b7x -o go-template={{.status.podIP}})

金丝雀发布

金丝雀对瓦斯气体敏感,工人下井时,用来检测空气
发布时,第一批更新完成后,暂停升级,新旧同时提供服务,其中新的很少,待确认没有问题后,完成余下部分的升级

# 先添加一个新Pod
设置maxSurge为1,maxUnavailable为0
kubectl patch deployments.apps myapp-deploy -p '{"spec":{"strategy":{"rollingUpdate":{"maxSurge":1,"maxUnavailable":0}}}}'
启动更新 在启动后,在maxReadySeconds属性设置的时间内执行暂停 通常使用&&
kubectl set image deployments myapp-deploy myapp=ikubernetes/myapp:v3 && kubectl rollout pause deployment myapp-deploy
# 查看进度
kubectl rollout status deployment myapp-deploy
kubectl get replicasets.apps
此时,可将一部分流量引入新Pod上,进行验证
# 继续升级
kubectl rollout resume deployment myapp-deploy
# 回滚
kubectl rollout undo deployment myapp-deploy

回滚操作

回滚到之前版本或指定的历史版本

# 回滚到之前的版本
kubectl rollout undo deployment myapp-deploy
# 查看历史版本
kubectl rollout history deployment myapp-deploy
# 查看当前版本
kubectl describe deployments.apps myapp-deploy
# 回滚到第1个版本
kubectl rollout undo deployment myapp-deploy --to-revision=1
若此前滚动更新过程处于暂停状态,那么回滚操作需要先将Pod模板的版本改回到之前的版本,然后继续更新,否则会一直处理暂停状态而无法回滚

扩容和缩容

修改spec.replicas的值,可用kubectl apply、kubectl edit、kubectl scale等命令实现

DaemonSet

在集群中所有节点同时运行的Pod,新加入的节点也会自动创建,节点从集群移除时会自动回收
可用节点选择器及节点标签指定仅在部分节点运行
常用于存储、日志、监控类守护进程

DaemonSet 不支持 replicas参数,默认不会部署到master节点

kubectl describe daemonsets.apps filebeat-ds
kubectl get pods -l app=filebeat -o custom-columns=NAME:metadata.name,NODE:spec.nodeName

spec.template.spec.nodeSelector 可用于指定节点
kubectl patch daemonsets.apps filebeat-ds -p '{"spec":{"template":{"spec":{"nodeSelector":{"disktype":"ssd"}}}}}'

更新 DaemonSet

更新配置定义在 spec.updateStrategy 下,支持 RollingUpdate 滚动更新 和 OnDelete 删除时更新(删除后重建启用新版本)
kubectl set image daemonsets filebeat-ds filebeat=ikubernetes/filebeat:5.6.6-alpine

Job

运行一次性任务,容器中进程在正常结束后不会再重启

单工作队列,串行方式执行,某个时刻仅存在一个Pod资源对象
多工作队列,多队列并行运行

kubectl get jobs.batch
# Pod资源能以Job控制器名称为标签进行匹配
kubectl get jobs -l job-name=job-example

并行式 Job

spec.parallelism 并行度属性;spec.completion 总任务数
串行运行5次任务:spec.parallelism=1 spec.completion=5
并行2队列5次任务:spec.parallelism=2 spec.completion=5

kubectl get pods -l job-name=job-multi -w

Job 扩容

spec.parallelism 并行度,即同时运行的Pod对象数,支持运行时调整,实现扩容和缩容
命令为: kubectl scale --replicas
kubectl scale jobs job-multi --replicas=2  # 注意该命令即将废除

删除 Job

spec.activeDeadlineSeconds 指定最大活动时间,超出将被终止
spec.backoffLimit 默认6,将作业标记为失败前的重试次数

CronJob

指定运行时间点及是否重复运行
指定时间点时,?* 都表示任何可用的有效值

kubectl explain cronjob.spec
jobTemplate  Job控制器模板,必须
schedule obj 运行时间点,必须
concurrencyPolicy string 并发执行策略,值为 Allow、Forbid、Replace 定义前一次作业未执行完又遇到后一次作业的情形
failedJobHistoryLimit int 为失败任务保留的历史记录数,默认1
successfulJobsHistoryLimit int 为成功任务保留的历史记录数,默认3
startingDeadlineSeconds int 启动作业错误的超时时长
suspend bool 是否挂起后续的任务执行,默认false,对运行中作业没有影响

kubectl get cronjobs.batch cronjob-example

CronJob 控制机制

kubectl get jobs -l app=mycronjob-jobs  # 默认显示3条历史记录

ReplicationController RC

类似于ReplicaSet,即将废弃

PDB Pod中断预算

PodDisruptionBudget,PDB,限制可自愿中断的最大Pod副本数或确保最少可用Pod副本数,确保服务的高可用性

非自愿中断,由不可控外界因素导致的Pod中断退出,如硬件或系统内核故障、网络故障、节点资源不足导致的Pod被驱逐等
自愿中断,由用户特地执行的管理操作导致的Pod中断退出,如排空节点、人为删除Pod对象、由更新触发的Pod重建等

每个应用程序都可创建一个对应的PDB对象以限制自愿中断时最大可以中断的副本数或最少应该保持可用的副本数,从而保证自身高可用

kubectl explain poddisruptionbudget.spec
selector obj,标签选择器,一般与相关的Pod控制器使用同一个选择器
minAvailable string,最少保证可用Pod对象数量或比例,要限止发生自愿中断,可设置为100%
maxUnavailable string,最多不可用状态的Pod对象数量或比例,0表示不允许Pod对象进行自愿中断,此字段与minAvailable互斥

kubectl get pods -l app=myapp
kubectl get pdb
kubectl describe pdb myapp-pdb

转载请注明:轻风博客 » 马哥_K8s进阶实战(3)Pod控制器

喜欢 (0)or分享 (0)