容器服务 kubernetes Deployment实现分批发布

简介: 1. 前言 容器服务官网提供的分批发布基于 StatefulSet 开发,有状态副本集部署 POD 是按照顺序一台一台的发布重启,需要消耗很长的时间,并且控制台不尽人意,存在不少坑。 StatefulSet 分批发布不支持任意数目任意批数的发布,实际操作中往往需要先发布一台线上服务做灰度,然后逐步放大。 因而采用无状态副本集 Deployment 对象分批部署,并通过同一个 labels指向

1. 前言

容器服务官网提供的分批发布基于 StatefulSet 开发,有状态副本集部署 POD 是按照顺序一台一台的发布重启,需要消耗很长的时间,并且控制台不尽人意,存在不少坑。

StatefulSet 分批发布不支持任意数目任意批数的发布,实际操作中往往需要先发布一台线上服务做灰度,然后逐步放大。

因而采用无状态副本集 Deployment 对象分批部署,并通过同一个 labels指向统一一个 Service 暴露给访问者,成为大应用中最合适的分批发布。

2. 配置过程

1. 首先建立一个副本数目为1的初始灰度 Deployment,yaml 如下:

apiVersion: apps/v1beta2
kind: Deployment
metadata:
# service 选择标签
  labels:
    app: {app_name}-aone
  name: {app_name}-aone-1
  namespace: {app_name}
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: {app_name}-aone
  template:
    metadata:
      labels:
        app: {app_name}-aone
    spec:
      containers:
        - image: >-
            registry-vpc.cn-north-2-gov-1.aliyuncs.com/app-cloud/{app_name}:20190101191052
          imagePullPolicy: Always
# 在应用停止前调用优雅下线脚本,摘除 hsf,lwp 服务
          lifecycle:
            preStop:
              exec:
                command:
                  - sudo
                  - '-u'
                  - admin
                  - /home/admin/appconf/bin/appctl.sh
                  - {app_name}
                  - stop
# 就绪检查和存活检查
          livenessProbe:
            failureThreshold: 10
            initialDelaySeconds: 30
            periodSeconds: 10
            successThreshold: 1
            tcpSocket:
              port: 508
            timeoutSeconds: 1
          name: {app_name}-aone
          readinessProbe:
            failureThreshold: 10
            initialDelaySeconds: 30
            periodSeconds: 10
            successThreshold: 1
            tcpSocket:
              port: 508
            timeoutSeconds: 1
          resources:
            limits:
              cpu: '4'
              memory: 8196Mi
            requests:
              cpu: '4'
              memory: 8196Mi
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          volumeMounts:
            - mountPath: /home/admin/logs
              name: volume-1553680362129
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
# 日志统一写到映射的宿主机数据盘日志目录
      volumes:
        - hostPath:
            path: /var/lib/docker/logs/{app_name}
            type: ''
          name: volume-1553680362129

2. 第二批,比如设置为16台,分4次发布,每次25%,只需要复制上面脚本,编写 yaml 的 name 为{app_name}-aone-2, 注意保持labels 一致,确保 pod 为同一个Service 配置提供服务,并修改副本数为16,增加更新策略配置,同理同法建立第三批,第四批...。

metadata:
# service 选择标签
  labels:
    app: {app_name}-aone
  name: {app_name}-aone-2
  namespace: {app_name}
spec:
  progressDeadlineSeconds: 600
  replicas: 16
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: {app_name}-aone
strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate

3. 建立 Service 服务,通过 labels 标签映射指向以上每批 Deployment,使用 NodePort 结合 SLB 方式,解耦 SLB 负载均衡与 k8s service 关系,房子 Cloud controller manager 同步删除 Service 与 SLB 负载均衡。

apiVersion: v1
kind: Service
metadata:
  name: {app_name}-http
  namespace: {app_name}
spec:
  clusterIP: 133.33.33.33
  externalTrafficPolicy: Cluster
  ports:
    - nodePort: 32168
      port: 80
      protocol: TCP
      targetPort: 7001
  selector:
    app: {app_name}-aone
  sessionAffinity: None
  type: NodePort
status:
  loadBalancer: {}

配置好后,可以在容器服务的 Service 控制台这里点击服务名称,可以看到该服务对应以上4批部署(Deployment)。

至此,使用多个 Deployment 配置分批发布完成。

3. 使用多个 Deployment 分批发布优缺点

  • 优点:
    • 无状态部署速度快,回滚,重启速度也非常快,可以自己控制重启每批多少台机器;
    • 无状态部署可控性好,容器服务控制台在该类型操作坑少。
  • 缺点:
    • 云监控按照 Deployment 分组,监控信息变为在多个组查看;
    • 云效,EDAS 都不支持此种分批发布模式,需要自己二次开发运维发布来实现。

 

 

 

相关实践学习
使用ACS算力快速搭建生成式会话应用
阿里云容器计算服务 ACS(Container Compute Service)以Kubernetes为使用界面,采用Serverless形态提供弹性的算力资源,使您轻松高效运行容器应用。本文将指导您如何通过ACS控制台及ACS集群证书在ACS集群中快速部署并公开一个容器化生成式AI会话应用,并监控应用的运行情况。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
Kubernetes 容器
要获取ACK(阿里云容器服务)集群中的Deployment
要获取ACK(阿里云容器服务)集群中的Deployment【1月更文挑战第8天】【1月更文挑战第40篇】
255 4
|
Kubernetes 安全 Ubuntu
k8s学习-CKS真题-Dockerfile和deployment优化
k8s学习-CKS真题-Dockerfile和deployment优化
278 0
|
Kubernetes 应用服务中间件 nginx
【赵渝强老师】K8s中的Deployment控制器
Kubernetes中的Deployment用于部署无状态应用程序,管理Pod的数量、更新方式和资源限制。通过创建和管理ReplicaSet,Deployment可以实现Pod的自动扩缩容、滚动更新和回滚。本文介绍了Deployment的基本概念,并通过一个具体的示例演示了如何使用Deployment创建、更新和管理Pod。
273 1
|
存储 Kubernetes 调度
【赵渝强老师】K8s中Deployment控制器与StatefulSet控制器的区别
K8s中的Deployment控制器用于管理无状态应用程序,关注Pod数量、更新方式等;而StatefulSets控制器则管理有状态应用程序,提供持久存储和唯一标识符,适用于需要稳定网络标识符和持久化存储的场景。两者的主要区别在于是否维护状态和顺序。
529 0
|
Kubernetes 容器 Perl
在K8S中,Deployment⽀持扩容吗?它与HPA有什么区别?
在K8S中,Deployment⽀持扩容吗?它与HPA有什么区别?
|
弹性计算 运维 Kubernetes
Kubernetes(K8S) Controller - Deployment 介绍
Kubernetes(K8S) Controller - Deployment 介绍
163 1
|
存储 Kubernetes 网络协议
在K8S中,Deployment和Statefulset有何区别?
在K8S中,Deployment和Statefulset有何区别?
|
Kubernetes API 开发工具
在K8S中,Deployment的升级过程是什么?
在K8S中,Deployment的升级过程是什么?
|
存储 Kubernetes 调度
在K8S中,deployment的创建过程包括什么?
在K8S中,deployment的创建过程包括什么?
|
Kubernetes API 容器
在K8S中,deployment的yaml文件如何编写呢?
在K8S中,deployment的yaml文件如何编写呢?

相关产品

  • 容器计算服务
  • 容器服务Kubernetes版
  • 推荐镜像

    更多