前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >6.工作负载管理-认识和使用Deployment

6.工作负载管理-认识和使用Deployment

作者头像
AI码师
发布2024-04-10 11:22:15
920
发布2024-04-10 11:22:15
举报

Kubernetes Deployment是Kubernetes中用于管理应用程序副本的对象,它提供了对应用程序的声明式定义,自动化部署、扩展和更新

基本概念

「ReplicaSet」:Deployment使用ReplicaSet来确保指定数量的Pod副本正在运行。如果有Pod意外终止,ReplicaSet会创建新的Pod来代替。

「自动修复」:当使用Deployment时,Kubernetes能够自动修复故障,确保系统中运行指定数量的Pod。

「滚动升级」:Deployment支持滚动升级,允许无缝地将应用程序从旧版本切换到新版本,而不会中断服务。

Deployment的使用

  • 「创建Deployment」
代码语言:javascript
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-nginx
  labels:
    app: deployment-nginx
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
  selector:
    matchLabels:
      app: deployment-nginx
  template:
    metadata:
      labels:
        app: deployment-nginx
    spec:
      containers:
      - name: deployment-nginx
        imagePullPolicy: IfNotPresent
        image: nginx:1.14.2
        ports:
        - containerPort: 80
  • 「查看Deployment,Pod,ReplicaSet」
代码语言:javascript
复制
kubectl get deploy,pod,rs
  • 「Deployment 更新策略」
    • RollingUpdate(默认):在滚动升级期间,逐步替换旧版本的Pod,确保在整个升级过程中保持应用程序的可用性。控制滚动的速度,即每次替换的Pod数量和替换的时间间隔。这是大多数情况下推荐的策略,因为它允许应用程序在升级过程中保持连续的服务。
    • Recreate:这种策略会一次性删除所有旧版本的Pod,然后创建所有新版本的Pod。这种策略会导致在整个升级过程中应用程序短暂不可用。虽然 Recreate 策略的升级速度可能更快,但它的主要缺点是在升级期间可能存在短暂的服务中断。通过如下操作来演示这两种更新的区别
代码语言:javascript
复制
  kubectl set image deployment/deployment-nginx deployment-nginx=nginx:1.16.1
  kubectl get deploy,pod,rs 

从结果可以看出,滚动更新并不是结束所有pod,我们再看下Recreate

代码语言:javascript
复制
# 编辑模版更新
kubectl edit deployment deployment-nginx
代码语言:javascript
复制
kubectl get deploy,pod,rs

从图中可以看这种策略会将所有的pod全部杀死,这会导致该pod不可用

  • 「缩放Deployment」
代码语言:javascript
复制
kubectl scale deployment/deployment-nginx --replicas=5
  • 「查看更新历史版本」
代码语言:javascript
复制
kubectl rollout history deployment/deployment-nginx

可以看到我们已经更新了三个版本,但是change-cause看不到内容,不过我们可以用另外的命令能看到具体详情

代码语言:javascript
复制
kubectl rollout history deployment/deployment-nginx --revision=版本号

那回到第一个问题,我想在每次更新后,给当前版本家CHANGE-CASE,应该怎么做

代码语言:javascript
复制
# 第一种方式 在执行更新命令时加上 --record,虽然可以使用,但是已经被提示在将来版本会被移除
kubectl set image deployment/deployment-nginx deployment-nginx=nginx:1.16.1 --record

# 第二种方式,就是官方推荐的,使用annotate 方式
kubectl annotate deployment/deployment-nginx kubernetes.io/change-cause="image updated to 1.16.1"

大家可能注意到12版本没有了,这是因为k8s默认只会保留3个版本,我们可以通过设置spec.revisionHistoryLimit: 1

  • 「恢复到历史版本」
代码语言:javascript
复制
kubectl rollout undo deployment/deployment-nginx --to-revision=4
  • 「暂停、恢复 Deployment 的自动更新」如果想要执行多个操作之后,才进行应用新的模版部署,那么可以使用这种方式,先暂停,然后等所有更新完成,在恢复应用部署
代码语言:javascript
复制
# 暂停保存后自动更新
kubectl rollout pause deployment/deployment-nginx
kubectl rollout resume deployment/deployment-nginx

??

本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-04-09,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 乐哥聊编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基本概念
  • Deployment的使用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com