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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 1. 前言 容器服务官网提供的分批发布基于 StatefulSet 开发,有状态副本集部署 POD 是按照顺序一台一台的发布重启,需要消耗很长的时间,并且控制台不尽人意,存在不少坑。 StatefulSet 分批发布不支持任意数目任意批数的发布,实际操作中往往需要先发布一台线上服务做灰度,然后逐步放大。

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
  1. 建立 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 都不支持此种分批发布模式,需要自己二次开发运维发布来实现。

相关实践学习
巧用云服务器ECS制作节日贺卡
本场景带您体验如何在一台CentOS 7操作系统的ECS实例上,通过搭建web服务器,上传源码到web容器,制作节日贺卡网页。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
2月前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
111 2
|
12天前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
76 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
2天前
|
人工智能 运维 监控
容器服务Kubernetes场景下可观测体系生产级最佳实践
阿里云容器服务团队在2024年继续蝉联Gartner亚洲唯一全球领导者象限,其可观测体系是运维的核心能力之一。该体系涵盖重保运维、大规模集群稳定性、业务异常诊断等场景,特别是在AI和GPU场景下提供了全面的观测解决方案。通过Tracing、Metric和Log等技术,阿里云增强了对容器网络、存储及多集群架构的监控能力,帮助客户实现高效运维和成本优化。未来,结合AI助手,将进一步提升问题定位和解决效率,缩短MTTR,助力构建智能运维体系。
|
2月前
|
运维 Kubernetes Docker
深入理解容器化技术:Docker与Kubernetes的协同工作
深入理解容器化技术:Docker与Kubernetes的协同工作
66 12
|
2月前
|
Kubernetes Cloud Native 持续交付
容器化、Kubernetes与微服务架构的融合
容器化、Kubernetes与微服务架构的融合
49 1
|
2月前
|
Kubernetes Cloud Native API
深入理解Kubernetes——容器编排的王者之道
深入理解Kubernetes——容器编排的王者之道
53 1
|
2月前
|
Kubernetes Cloud Native 持续交付
深入理解Kubernetes:容器编排的基石
深入理解Kubernetes:容器编排的基石
|
2月前
|
Kubernetes Cloud Native 云计算
云原生入门:Kubernetes 和容器化基础
在这篇文章中,我们将一起揭开云原生技术的神秘面纱。通过简单易懂的语言,我们将探索如何利用Kubernetes和容器化技术简化应用的部署和管理。无论你是初学者还是有一定经验的开发者,本文都将为你提供一条清晰的道路,帮助你理解和运用这些强大的工具。让我们从基础开始,逐步深入了解,最终能够自信地使用这些技术来优化我们的工作流程。
|
2月前
|
Kubernetes 监控 安全
容器化技术:Docker与Kubernetes的实战应用
容器化技术:Docker与Kubernetes的实战应用
|
2月前
|
存储 Kubernetes 调度
【赵渝强老师】K8s中Deployment控制器与StatefulSet控制器的区别
K8s中的Deployment控制器用于管理无状态应用程序,关注Pod数量、更新方式等;而StatefulSets控制器则管理有状态应用程序,提供持久存储和唯一标识符,适用于需要稳定网络标识符和持久化存储的场景。两者的主要区别在于是否维护状态和顺序。

相关产品

  • 容器计算服务
  • 容器服务Kubernetes版