K8sController-Deployment(无状态应用)
K8sController-Deployment(无状态应用)
基于K8s 1.31
什么是Deployment
Deployment是一种面向无状态应用的多个Pod副本进行自动化管理的工作负载控制器
常见场景:
- 部署一个或者多个副本应用
- 多副本的Pod的版本更新,以及部署过程的暂停和回滚
- Pod副本数量的水平拓展缩容
Deploy管理能力
apiVersion: apps/v1 |
更新机制
Deployment支持对Pod进行自动更新,通常以滚动更新的方式进行多个RS版本完成Pod对自动更新
更新策略
spec:
# 更新策略
strategy:
type: RollingUpdate
rollingUpdate:
# Pod总数量超过副本数量最大值
maxSurge: 1
# 不可用状态的Pod最大上限
maxUnavailable: 1- Recreate:表示Deployment在更新Pod,会先“kill”旧版本Pod,等旧版本全部终止之后,才会常见新的Pod
- RollingUpdate:更新的方式逐个更新
多重更新(立即更新到最新的):上一次更新在进行中,再次发起更新,Deployment会为每一次更新都创建一个RS,在每次新的RS创建成功之后,会逐个增加Pod副本数量,同时吧正在拓容得RS停止,将其加入到旧版本的RS 列表中,然后开始缩容到0
回滚
在Deployment更新过程中出现意外,写错镜像名称、新镜像还没有被加入镜像仓库,新镜像启动参数不对,需要退回到之前的版本。
kubectl rollout hostory deploy <deploymentname> |
部署的暂停和恢复
对于一次复杂的Deployment配置修改,为了避免频繁触发更新,可以先暂停Deployment的更新,修改配置,再恢复Deployment更新,一次性触发
1. 暂停更新部署:kubectl rollout pause deploy <deployname> |
生命周期
Deployment的生命周期可以用几种状态进行描述:
- Progressing:部署进行中
- Complete:部署完成
- Failed:部署失败,无法继续
Progressing
在系统执行一下几种过程中,会被标记为Progressing
- 正在创建新的RS
- 正在为最新的RS进行水平扩容操作
- 正在为旧RS进行水平缩容操作
- 新的Pod处于Ready或者Available状态
这些操作,系统会在Deployment中的spec.conditions设置详细的Reason信息
Complete
在Deployment具备以下特点的时候,Deployment会被标记为Complete状态
- 最新版本的RS已部署完成
- Pod副本数量已经达到期望状态,并且处于可用
- 没有旧的Pod副本还在运行
系统会为一家部署完成的Deployment资源类型为Progressing的状况设置为reason=NewReplicaSetAvailable
通过kubectl rollout status 检查Deployment,如果推出码不为0,还有Pod副本还没有部署完成
Failed
部署Pod副本中,由于一些原因,超过(默认时间600s),会被标记为Failed状态
可能情况如下
- 容器镜像下载失败
- Pod所需要的资源配额不足
- 启动Pod权限不足
- 资源限制范围LimitRange配置不正确
- Pod的服务就绪启动探针失败
- 容器应用启动失败
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Joohwan!
评论