K8sController-Deployment(无状态应用)

基于K8s 1.31

什么是Deployment

Deployment是一种面向无状态应用的多个Pod副本进行自动化管理的工作负载控制器

常见场景:

  • 部署一个或者多个副本应用
  • 多副本的Pod的版本更新,以及部署过程的暂停和回滚
  • Pod副本数量的水平拓展缩容

Deploy管理能力

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx-deployment
spec:
# 设置true,表述部署过程中属于暂停状态
paused: false
# 修订历史最大数量 每个修订版本都有一个对应的RS资源
revisionHistoryLimit: 10
# Pod最短就绪准备时间,Pod至少达到这个时间,才会进入Pod为Ready状态
minReadySeconds: 5
# 设置未能处于部署完成的超时空时间,默认600s来,达到这个时间之后,会把Progressing的Status设置为false
progressDeadlineSeconds: 600
# 更新策略
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
# 副本数,即期望运行的 Pod 数量
replicas: 3
# 标签选择器,用于管理具有指定标签的 Pod
selector:
matchLabels:
app: nginx
template:
# 模板,用于创建新的 Pod
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
containers:
- name: nginx-deployment
image: nginx:1.14.2
ports:
- containerPort: 80

更新机制

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>

# 查看特定的版本
kubectl rollout hostory deploy <deploymentname> --revision=3

# 回滚
kubectl rollout undo deploy <deployname>

# 回滚指定版本
kubectl rollout undo deploy <deployname> --to-version=3

部署的暂停和恢复

对于一次复杂的Deployment配置修改,为了避免频繁触发更新,可以先暂停Deployment的更新,修改配置,再恢复Deployment更新,一次性触发

1. 暂停更新部署:kubectl rollout pause deploy <deployname>
2. 修改Deployment配置项
3. 恢复更新部署:kubectl rollout resume deploy <deployname>
4. 查看Deploy的状态:kubetcl descrive 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的服务就绪启动探针失败
  • 容器应用启动失败