文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-06-29 13:33

关注

本文小编为大家详细介绍“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=nginxpod-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:<none>    Host Port:<none>    Environment:<none>    Mounts:<none>  Volumes:<none>[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的注意项

滚动更新的策略:就是创建一个新的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副本无状态服务创建及水平扩展的方法”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯