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

相关实践学习
Docker镜像管理快速入门
本教程将介绍如何使用Docker构建镜像,并通过阿里云镜像服务分发到ECS服务器,运行该镜像。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
1月前
|
缓存 Kubernetes Docker
容器服务ACK常见问题之容器服务ACK ingress websocket配置失败如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
|
1月前
|
存储 运维 Kubernetes
容器服务ACK常见问题之容器服务ACK 淘宝源过期了如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
|
25天前
|
Kubernetes 容器
k8s容器时间与服务器时间不一致问题
k8s容器时间与服务器时间不一致问题
21 0
|
2天前
|
存储 Kubernetes Docker
Kubernetes(K8S)集群管理Docker容器(概念篇)
Kubernetes(K8S)集群管理Docker容器(概念篇)
|
14天前
|
JSON Kubernetes Go
无缝集成:在IntelliJ IDEA中利用Kubernetes插件轻松管理容器化应用
无缝集成:在IntelliJ IDEA中利用Kubernetes插件轻松管理容器化应用
25 0
无缝集成:在IntelliJ IDEA中利用Kubernetes插件轻松管理容器化应用
|
27天前
|
人工智能 监控 Serverless
如何基于ACK Serverless快速部署AI推理服务
通过上述步骤,可以在ACK Serverless上快速部署AI推理服务,实现高可用、弹性扩展的服务架构。
20 1
|
28天前
|
Kubernetes 网络协议 Docker
K8S核心插件-coredns服务
K8S核心插件-coredns服务
15 0
|
28天前
|
Kubernetes API 调度
总结归纳Kubernetes | 一站式速查知识,助您轻松驾驭容器编排技术(水平扩展控制)
总结归纳Kubernetes | 一站式速查知识,助您轻松驾驭容器编排技术(水平扩展控制)
60 0
|
1月前
|
Kubernetes SDN 微服务
微服务与 Kubernetes 容器云的边界
【2月更文挑战第30天】该文探讨了微服务与Kubernetes集群的关系,主要关注是否应跨多集群部署。理想的状况是每个微服务对应一个Kubernetes集群,配置和注册中心在同一集群内,以减少网络延迟。
|
1月前
|
存储 Kubernetes 监控
容器服务ACK常见问题之容器服务ACK启动时readiness告警如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。

相关产品

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

    更多