千家信息网

Deployment副本无状态服务创建及水平扩展的方法

发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,本文小编为大家详细介绍"Deployment副本无状态服务创建及水平扩展的方法",内容详细,步骤清晰,细节处理妥当,希望这篇"Deployment副本无状态服务创建及水平扩展的方法"文章能帮助大家解决
千家信息网最后更新 2026年11月04日Deployment副本无状态服务创建及水平扩展的方法

本文小编为大家详细介绍"Deployment副本无状态服务创建及水平扩展的方法",内容详细,步骤清晰,细节处理妥当,希望这篇"Deployment副本无状态服务创建及水平扩展的方法"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

本文单词:

replace(/rɪˈpleɪs/)替换、取代;在本文中是修改后的yaml文件替换旧的yaml文件

rollout(/ɑː®/)记录;在本文中是记录历史的deploy副本版本

describe(/dɪˈskraɪb/)描述;在本文中是说记录过程

scale(/skeɪl/)缩放;在本文中是说缩放副本的个数

pause(/pɔːz/)暂停;在本文中是说暂停更新

resume(/rɪˈzjuːm/)恢复;在本文中是说从暂停恢复到正常状态

RC(Replication Controller)和RS(ReplicaSet)

(几乎弃用)RC是复制控制器,确保Pod数量达到期望值,保证副本始终处于可用的状态。

(不建议单独使用)RS是RC的下一代,支持标签集。

无状态服务Deployment意思就是无状态的。。。用于部署无状态的服务。

类似网页访问之类的请求就是无状态的,每次请求都包含了需要的所有信息,每次请求都和上次没有关系。
Deployment是最常用的控制器。一般用于管理维护企业内部的无状态的微服务,比如configserver、zuul、springboot。可以管理多个副本的Pod实现无缝迁移、自动扩容缩容、自动灾难恢复、一键回滚等功能。

deployment的创建

可以通过命令创建一个Deployment:

kubectl create deployment nginx --image=nginx:1.20.2

可以将创建的副本生成yaml文件:

kubectl get deployment nginx -o yaml > nginx.yaml

然后可以修改yaml文件的参数,然后重新加载新的yaml文件:

kubectl replace -f nginx.yaml

也可以通过在线修改yaml文件,退出后直接生效:

kubectl edit deploy nginx

从yaml文件生成deployment:

apiVersion: v1items:- apiVersion: apps/v1  kind: Deployment  metadata:    annotations:      deployment.kubernetes.io/revision: "2"    creationTimestamp: "2022-02-08T07:52:05Z"    generation: 2    labels:      app: nginx    name: nginx    namespace: default    resourceVersion: "266395"    uid: d4a3dbe9-5156-42cf-aaf5-3dfefccf4753  spec:    progressDeadlineSeconds: 600    replicas: 1  # 副本数    revisionHistoryLimit: 10  # 保留历史的版本    selector:      matchLabels:        app: nginx    strategy:      rollingUpdate:        maxSurge: 25%        maxUnavailable: 25%      type: RollingUpdate    template:      metadata:        creationTimestamp: null        labels:          app: nginx      spec:        containers:        - image: nginx:1.18.0          imagePullPolicy: Always          name: nginx          resources: {}          terminationMessagePath: /dev/termination-log          terminationMessagePolicy: File        dnsPolicy: ClusterFirst        restartPolicy: Always        schedulerName: default-scheduler        securityContext: {}        terminationGracePeriodSeconds: 30  status:    availableReplicas: 1    conditions:    - lastTransitionTime: "2022-02-08T07:52:10Z"      lastUpdateTime: "2022-02-08T07:52:10Z"      message: Deployment has minimum availability.      reason: MinimumReplicasAvailable      status: "True"      type: Available    - lastTransitionTime: "2022-02-08T07:52:05Z"      lastUpdateTime: "2022-02-08T07:55:54Z"      message: ReplicaSet "nginx-86dddd6686" is progressing.      reason: ReplicaSetUpdated      status: "True"      type: Progressing    observedGeneration: 2    readyReplicas: 1    replicas: 2    unavailableReplicas: 1    updatedReplicas: 1kind: Listmetadata:  resourceVersion: ""  selfLink: ""

deployment状态说明:

[root@k8s-master01 ~]# kubectl get deployments.apps -o wide NAME      READY   UP-TO-DATE   AVAILABLE   AGE    CONTAINERS   IMAGES   SELECTORmynginx   1/1     1            1           4d5h   mynginx      nginx    k8s-app=mynginx

NAME:Deployment名称

READY:Pod的状态,已经达到Ready的个数

UP-TO-DATE:已经达到期望状态的副本数

AVAILABLE:已经可以使用的个数

AGE:程序运行的时间

CONTAINERS:容器的自定义名称

IMAGES:容器镜像名称

SELECTOR:管理的Pod标签

deployment的升级

查看创建nginx的deploy中镜像的版本:可以看到是1.18.0

[root@k8s-master01 ~]# kubectl get deploy -o yaml | grep image        - image: nginx:1.18.0          imagePullPolicy: Always

我们可以使用set命令更新镜像的版本:这里的set是设置的意思。

[root@k8s-master01 ~]# kubectl set image deploy nginx nginx=nginx:1.20.2 --record[root@k8s-master01 ~]# kubectl get deployments.apps nginx -o yaml | grep image    kubernetes.io/change-cause: kubectl set image deploy nginx nginx=1.18.1 --record=true      - image: nginx:1.20.2        imagePullPolicy: Always

可以使用下列命令查看升级过程:

[root@k8s-master01 ~]# kubectl rollout status deployment nginx[root@k8s-master01 ~]# kubectl describe deployments.apps nginx

升级过程大概为:创建deploy时,系统也会同时创建depoly的RS,更新deploy时,系统会增加一个新的RS,旧的RS会相应减少1,直到替换完成。

deployment的回滚

deployment的回滚可以回滚到上个版本,也可以回滚到指定指定版本,历史版本的数量由下面这个参数控制:

    revisionHistoryLimit: 10

查看历史版本:可以看到副本发生了几次变化

[root@k8s-master01 ~]# kubectl rollout history deployment nginx deployment.apps/nginx REVISION  CHANGE-CAUSE8         kubectl set image deploy nginx nginx=1.18.1 --record=true9         kubectl set image deploy nginx nginx=nginx:1.20.2 --record=true

回滚到上一个版本:undo是撤销的意思(我的理解是撤销现在的版本回到之前的版本)

[root@k8s-master01 ~]# kubectl rollout undo deployment nginxdeployment.apps/nginx rolled back

查看已经由1.20.2回到了1.18.0版本:

[root@k8s-master01 ~]# kubectl get deployments.apps nginx -o yaml | grep image    kubernetes.io/change-cause: kubectl set image deploy nginx nginx=1.18.1 --record=true      - image: nginx:1.18.0        imagePullPolicy: Always

如果多次发布,回滚到指定版本:

[root@k8s-master01 ~]# kubectl rollout history deployment nginx deployment.apps/nginx REVISION  CHANGE-CAUSE9         kubectl set image deploy nginx nginx=nginx:1.20.2 --record=true10        kubectl set image deploy nginx nginx=1.18.1 --record=true您在 /var/spool/mail/root 中有新邮件[root@k8s-master01 ~]# kubectl rollout history deployment nginx --revision=9deployment.apps/nginx with revision #9Pod Template:  Labels:     app=nginx        pod-template-hash=67d5b4548c  Annotations:        kubernetes.io/change-cause: kubectl set image deploy nginx nginx=nginx:1.20.2 --record=true  Containers:   nginx:    Image:  nginx:1.20.2    Port:       Host Port:     Environment:        Mounts:   Volumes:    [root@k8s-master01 ~]# kubectl rollout undo deployment nginx --to-revision=9deployment.apps/nginx rolled back[root@k8s-master01 ~]# kubectl get deployments.apps nginx -o yaml | grep image    kubernetes.io/change-cause: kubectl set image deploy nginx nginx=nginx:1.20.2      - image: nginx:1.20.2        imagePullPolicy: Always

可以看到以上信息版本已经回滚到1.20.2版本;另外就算更新时候失败,新镜像拉取失败,旧的副本不会停止工作,会一直持续工作,直到升级成功。

deployment的扩容和缩容

使用命令扩容:将nginx副本由一个变成两个,注意扩容RS不会发生变化,因为Pod的本质没有发生改变。scale这个单词在这里是缩放的意思。

[root@k8s-master01 ~]# kubectl get deployments.apps NAME    READY   UP-TO-DATE   AVAILABLE   AGEnginx   1/1     1            1           17h[root@k8s-master01 ~]# kubectl scale --replicas=2 deployment nginx deployment.apps/nginx scaled[root@k8s-master01 ~]# kubectl get deployments.apps NAME    READY   UP-TO-DATE   AVAILABLE   AGEnginx   2/2     2            2           17h

deployment的更新暂停及恢复

更新暂停:这条命令的作用是将更新暂停后,你使用kubectl set命令修改Pod的配置后不会立刻生效,即使多次修改也只是积累起来不会马上生效。

[root@k8s-master01 ~]# kubectl rollout pause deployment nginx

暂停恢复:解除之前的更新暂停功能,在暂停期间做过的修改将都会生效

[root@k8s-master01 ~]# kubectl rollout resume deployment nginx

deployment的注意项

  • .spec.revisionHistoryLimit: 10:设置保留RS的旧的版本的个数,为0的话不保存

  • .spec.minReadySeconds:可选,指定新创建的Pod在没有任何容器崩溃的情况下是为Ready的最小秒数,默认为0,就是一但创建就被视为可用

滚动更新的策略:就是创建一个新的Pod,然后删除一个旧的Pod,用新的替换旧的。

spec.strategy.type:更新deploy的方式,默认是RollingUpdate

RollingUpdate:滚动更新,可以指定maxSurge和maxUnavailable

maxUnavailable:指定在回滚或更新时最大不可用的Pod数量,默认25%,也可以设置数字;如果为0那么maxSurge就不能为0 。

maxSurge:可以超过期望值的的最大Pod数,可选,默认为25%。如果为0那maxUnavailable就不能为0 。

Recreate:重建,先删除旧的Pod,在创建新的Pod。

读到这里,这篇"Deployment副本无状态服务创建及水平扩展的方法"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。

版本 副本 状态 更新 文件 服务 命令 个数 历史 就是 意思 镜像 升级 方法 水平 名称 容器 数量 文章 过程 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 咖啡 亿人帮互联网科技有限公司 互联网 卓越科技 广州宏创互联网科技 世界互联网领先科技成果 中国最先进互联网科技公司 科技赋能互联网健康 和信科技工业互联网 宜昌元轩互联网科技有限公司 中国互联网十大科技股排名 中和天地互联网科技有限公司 上海科技产业互联网平台 互联网金融科技元年 美国互联网科技公司 富国互联网科技002692 南京一网一红互联网科技有限公司 福州德业互联网科技 互联网科技自媒体灵感 现代科技的标志之一的互联网 互联网科技快速发展优美句子 小米移动互联网科技园 喔噻互联网科技有限公司 中关村互联网科技集团 互联网巨头反垄断金融科技 崇明区互联网教育科技诚信经营 知域互联网科技有限公司大骗子 恒生互联网科技指数跳水 科技类公司包括互联网吗 互联网科技股为什么大涨 互联网科技对化妆品行业
0