侧边栏壁纸
  • 累计撰写 45 篇文章
  • 累计创建 15 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

【kubernetes】无状态应用管理Deployment

Administrator
2024-11-30 / 0 评论 / 0 点赞 / 38 阅读 / 5937 字 / 正在检测是否收录...

Deployment一般用于部署公司的无状态服务,可以利用Deployment的高级功能做到无缝迁移、自动扩缩容、自动灾难恢复、一键回滚等功能。

1. 创建Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment  # Deployment的名称;
  labels:
    app: nginx
spec:
  replicas: 3   # 创建Pod的副本数;
  selector:  # 定义Deployment如何找到要管理的Pod,与template的label (标签)对应, apiVersion为apps/v1必须指定该字段;
   matchLabels:
     app: nginx
  template:
    metadata:
      labels:
        app: nginx   # nginx使用label(标签)标记Pod;
    spec:
      containers:
      - name: nginx   # 表示Pod运行一个名字为nginx的容器;
        image: registry.cn-beijing.aliyuncs.com/jiangxiaonan/nginx:1.22.1  # 运行此Pod使用的镜像;
        ports:
        - containerPort: 80   # 容器用于发送和接收流量的端口。

使用 kubectl create 创建此 Deployment:

kubectl create -f dp-nginx.yaml

使用 kubectl get 或者 kubectl describe 查看此 Deployment 的状态:

# kubectl get deploy
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           4m47s

➢ NAME: 集群中Deployment的名称;
➢ READY: Pod就绪个数和总副本数;
➢ UP-TO-DATE: 显示已达到期望状态的被更新的副本数;
➢ AVAILABLE: 显示用户可以使用的应用程序副本数,当前为0, 说明目前还没有达到期望的Pod;
➢ AGE: 显示应用程序运行的时间。


查看此 Deployment 当前对应的 ReplicaSet:

# kubectl get rs -l app=nginx
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-66b75bcd99   0         0         0       15m
nginx-deployment-694bb56878   3         3         3       89s

➢ DESIRED:应用程序副本数;
➢ CURRENT:当前正在运行的副本数;
Deployment 有过更新,对应的 RS 可能不止一个,可以通过-o yaml 获取当前对应的 RS是哪个,其余的 RS 为保留的历史版本,用于回滚等操作。

2. 更新 Deployment

当且仅当 Deployment 的 Pod 模板(即.spec.template)更改时,才会触发 Deployment更新,例如更改内存、 CPU 配置或者容器的 image。

假如更新 Nginx Pod 的 image,并使用--record 记录当前更改的参数,后期回滚时可以查看到对应的信息:

kubectl set image deployment nginx-deployment nginx=registry.cn-beijing.aliyuncs.com/jiangxiaonan/nginx:1.22.1 --record

# 其他修改,比如内存、CPU
kubectl set resources deployment.v1.apps/nginx-deployment -c=nginx --limits=cpu=200m,memory=512Mi --record

当然也可以使用 edit 命令直接编辑 Deployment,效果相同:

kubectl edit deployment.v1.apps/nginx-deployment

可以使用 kubectl rollout status 查看更新过程:

kubectl rollout status deployment.v1.apps/nginx-deployment

通过 describe 查看 Deployment 的详细信息:

kubectl describe deploy nginx-deployment

3. 回滚 Deployment

使用 kubectl rollout history 查看更新历史:

# kubectl rollout history deployment/nginx-deployment
deployment.apps/nginx-deployment
REVISION  CHANGE-CAUSE
1         kubectl set image deployment nginx-deployment nginx=registry.cn-beijing.aliyuncs.com/jiangxiaonan/nginx:1.22.1 --record=true
2         kubectl set image deployment nginx-deployment nginx=registry.cn-beijing.aliyuncs.com/jiangxiaonan/nginx:1.16.1 --record=true

查看 Deployment 某次更新的详细信息,使用--revision 指定某次更新版本号:

kubectl rollout history deployment/nginx-deployment --revision=1

如果只需要回滚到上一个稳定版本,使用 kubectl rollout undo 即可:

kubectl rollout undo deployment/nginx-deployment

如果要回滚到指定版本,使用--to-revision 参数:

kubectl rollout undo deployment/nginx-deployment --to-revision=2

4. 扩容 Deployment

使用 kubectl scale 动态调整 Pod 的副本数,比如增加 Pod 为 5 个:

kubectl scale deployment.v1.apps/nginx-deployment --replicas=5

# 或者使用patch命令
kubectl patch deploy nginx-deployment -p '{"spec":{"replicas":5}}'

5. 暂停和恢复 Deployment 更新

上述演示的均为更改某一处的配置,更改后立即触发更新,大多数情况下可能需要针对一个资源文件更改多处地方,而并不需要多次触发更新,此时可以使用 Deployment 暂停功能,临时禁用更新操作,对 Deployment 进行多次修改后在进行更新。

使用 kubectl rollout pause 命令即可暂停 Deployment 更新:

kubectl rollout pause deployment/nginx-deployment

然后对 Deployment 进行相关更新操作,比如先更新镜像,然后对其资源进行限制(如果使用的是 kubectl edit 命令,可以直接进行多次修改,无需暂停更新,

进行完最后一处配置更改后,使用 kubectl rollout resume 恢复 Deployment 更新:

kubectl rollout resume deployment.v1.apps/nginx-deployment

6. 更新 Deployment 的注意事项

历史版本清理策略:
在默认情况下, revision 保留 10 个旧的 ReplicaSet,其余的将在后台进行垃圾回收,可以在.spec.revisionHistoryLimit 设置保留 ReplicaSet 的个数。 当设置为 0 时,不保留历史记录。

更新策略:

spec.strategy.type==Recreate,表示重建,先删掉旧的Pod再创建新的Pod;

spec.strategy.type==RollingUpdate,表示滚动更新,可以指定maxUnavailable和maxSurge来控制滚动更新过程;

  • spec.strategy.rollingUpdate.maxUnavailable,指定在回滚更新时最大不可用的Pod数量,可选字段,默认为25%,可以设置为数字或百分比,如果maxSurge为0,则该值不能为0;

  • spec.strategy.rollingUpdate.maxSurge可以超过期望值的最大Pod数,可选字段,默认为25%,可以设置成数字或百分比,如果maxUnavailable为0,则该值不能为0。

0
博主关闭了所有页面的评论