Kubernetes 环境部署运维

本文主要介绍 Kubernetes 环境部署运维,支持滚动升级、分批发布部署策略,支持环境部署、扩缩容、回滚等操作。

1. 部署原理

重要

云效 AppStack 应用环境 K8s 部署运维操作采用 fabric8io kubernetes client 更新资源对象,支持 JSON Patch(覆盖更新)JSON Merge Patch(合并更新)两种策略,企业可按需配置使用。企业统一配置,对本企业下所有 AppStack 应用环境生效,生效时机为环境部署单创建时(部署单一旦创建,策略不会再随企业配置变化)。

image

以下以一个简单示例说明两种策略的区别。

  • 假设 K8s 集群上已有资源 YAML 描述如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  template:
    metadata:
      labels:
        app: myapp
        msePilotCreateAppName: myapp  
    spec:
      containers:
      - name: main
        image: nginx
  • 下一次部署 YAML 如下,差异在于去除了 msePilotCreateAppName: myapp 相关labels:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  template:
    metadata:
      labels: 
        app: myapp
        # 去除了 msePilotCreateAppName 相关 label
    spec:
      containers:
      - name: main
        image: nginx
  • 若采用 JSON Patch(覆盖更新)策略部署,部署结束后集群资源不会保留msePilotCreateAppName: myapp属性,与下发 YAML 保持一致,完全覆盖更新。若采用 JSON Merge Patch(合并更新)策略部署,部署结束后集群资源仍然会保留msePilotCreateAppName: myapp属性,不会覆盖已有属性,仅做合并追加。更多原理参考:Use a JSON merge patch to update a Deployment

2. 部署策略

云效AppStack Kubernetes环境部署支持分批发布、滚动升级策略,支持设置批次数量之间暂停策略、部署超时时间等。进入应用,选择目标环境 > 环境设置 > 部署设置,可以按需设置部署策略。

高的 (23).png

AppStack提供「托管复本数」和「非托管复本数」两种部署策略:

说明
  • 托管复本数:针对环境下Deployment工作负载,「托管复本数」策略云效AppStack将对Deployment replicas进行强管控,部署策略中指定的「目标实例数」为准进行 patch下发,支持通过环境扩缩容操作调整复本数。该策略下请避免通过其他工具或平台操作资源,以免环境基线不一致导致部署失败。

  • 非托管复本数:针对环境下Deployment工作负载,「非托管复本数」策略云效AppStack将使用应用编排+环境变量组渲染后的YAML直接下发部署, 以渲染后的 YAML中的replicas为准,不做复本数强管控。HPA等弹性水位场景建议使用该策略。

2.1 「托管复本数」策略

AppStack环境部署「托管复本数」策略,对本应用、本环境下的Deployment资源生效:

  • 目标实例数:期望的Deployment replicas复本数,请填写正整数。指定目标实例数后,会使用该数量patch到部署YAML中(以该数量替换YAML中的replicas值),以指定的目标实例数下发部署。后续可以通过环境上的扩缩容操作调整复本数。

  • 部署策略

    • 滚动升级:以K8s原生滚动方式部署,逐步更新应用Pod实例,直到新版本数量达到指定的目标实例数

    • 分批发布

      • 分批数量:发布的分批数,请填写正整数(需要小于等于目标实例数)。

      • 分批详情:每批次的更新的Pod数量,各批次数量相加之和等于目标实例数

      • 暂停策略

        • 不暂停:不暂停,每批次自动开始;上一批次结束,下一批次自动执行。

        • 首批暂停:第 1 批部署结束后暂停,需要手动单击「继续」触发第 2 批;第 3 及后续批次自动执行(如有)。

        • 每批暂停:第 1 批部署结束后暂停,后续每一批次都需要手动单击「继续」触发。

      • 超时时间:每批次超时时间,单位分钟,支持 1-30 的正整数。

image

以下示例,目标实例数 3,分 2 批,第一批 1 个复本,第二批 2 个复本,单批次超时时间 10 分钟。可以按批次查看部署进度。

高的 (30).png

以下示例,目标实例数 3,滚动升级,逐步更新应用Pod实例。

高的 (33).png

2.2 「非托管复本数」策略

AppStack环境部署「非托管复本数」策略,对本应用、本环境下的Deployment资源生效:

  • 部署策略:

    • 滚动升级:以K8s原生滚动方式部署,逐步更新应用Pod实例。

    • 分批发布:支持按比例分批发布。

      • 分批数量:发布的分批数,请填写正整数。

      • 分批详情:每批次的更新的Pod数量比例,各批次比例相加之和需要等于100%。

      • 暂停策略

        • 不暂停:不暂停,每批次自动开始;上一批次结束,下一批次自动执行。

        • 首批暂停:第 1 批部署结束后暂停,需要手动单击「继续」触发第 2 批;第 3 及后续批次自动执行(如涉及)。

        • 每批暂停:第 1 批部署结束后暂停,后续每一批次都需要手动单击「继续」触发。

      • 超时时间:每批次超时时间,单位分钟,支持 1-30 的正整数。

说明
  • 若部署编排YAML中指定了replicas: n,则按策略逐步更新新版本Pod数量达到n。

  • 若部署编排YAML中未指定replicas,且K8s集群上已存在该Deployment,且集群上复本数为m,则按策略逐步更新新版本Pod数量达到m。

高的 (34).png

3. 部署运维操作

3.1 部署

应用环境部署通常用于应用制品或配置变更时去更新环境服务。

提交部署单

  1. 进入目标应用 > 环境,在环境列表找到目标环境卡片,单击部署 或进入目标环境详情页面,单击右上角操作区域的部署

  2. 填写部署内容。

    • 部署单名称:部署单名称,默认填充:${秒级时间戳}-部署,可按需修改。

    • 部署版本号:部署版本号,自动生成:${秒级时间戳}-${三位毫秒},不可修改。

    • 镜像列表:镜像由Kubernetes部署编排里定义的镜像占位符决定,可直接输入镜像地址(请确保待部署到的K8s集群可直接拉取到镜像)。

    • 自定义参数:自定义参数由Kubernetes部署编排定义,当占位符 部署时可改 开关打开时,可以在提交部署单时动态修改取值。高的 (65).png

  3. 确认部署选项。

    • 展示当前环境待部署的所有服务以及镜像列表,单击YAML可以查看各个组件的部署配置。

    • 特别的是,针对Deployment工作负载类型的组件,可以直接单击调整部署策略进行设置,详见 2. 部署策略

  4. 单击 提交 部署单,生成部署工单,跳转部署详情页面。

    高的 (66).png

观测部署过程

  • 上述提交部署单后,跳转部署单详情页面,可以观测部署进度。也可以从 应用-部署单 列表页面,找到目标部署单,单击进入工单详情观测进度。

    • 部署工单概要:展示 部署单名称部署单ID组件类型提交人提交时间结束时间等基本信息。

    • 环境部署流程:按顺序展示当前环境部署的所有组件,部署内容和部署顺序由应用编排决定(云效AppStack当前按照helm chart默认顺序执行),单击卡片可以查看具体资源的部署详情。

    • 资源部署详情:展示指定资源的部署详情。

      • 非工作负载

        • 展示 资源名部署版本部署配置、以及其他资源类型相关信息。

      • 工作负载(当前仅支持Deployment)

        • 基本信息展示 资源名制品目标实例数部署策略部署配置等。

        • 部署进度可以按批次展示实例部署状态,单击实例块可以查看Pod更多 基本信息关键事件,还可以查看容器日志等。

高的 (35).png

高的 (36).png

暂停/继续

  • 部署过程中,可以单击 暂停 当前任务,可用于异常情况下暂停任务观察服务状态。

  • 已手动暂停的任务或者受暂停策略控制暂停的任务,可以单击 继续 执行任务。

终止

  • 部署过程中,可以手动 终止 当前部署任务,可选 置为成功 置为失败 。可用于一些不需要继续部署的特殊场景:如SRE通过手动管理集群,已部署应用服务到目标版本,无需工单继续处理的情况。

回退

  • 部署过程中,可以单击 回退 ,回退当前环境到上次部署状态。单击 回退 后,当前部署任务将取消,并生成新的回退任务,回退任务将使用环境的最近的部署基线进行一次重新部署。 可用于当前部署版本不符合预期,需要快速恢复环境到上次可用状态的场景。

查看执行日志

  • 单击 执行日志 可以查看工单部署的全部详细日志,可以用于问题追溯和排查。

高的 (37).png

3.2 扩缩容

环境扩缩容通常用于环境工作负载过高或过低时,动态调整环境对外提供服务实例数。仅「托管复本数」策略支持在环境上提交扩缩容;「非托管复本数」策略请通过调整 YAML中的replicas调整复本数。

提交扩缩单

  • 进入应用-环境 ,进入目标环境详情页面,单击右上角操作区域的 扩缩 按钮。

  • 填写扩缩单参数

    • 工单名称:默认填充:${秒级时间戳}-部署,可按需修改。

    • 版本号:展示当前环境最近一次部署的版本号。

    • 组件信息:展示当前环境待扩缩的工作负载组件信息。

      • 镜像列表:环境最近一次部署的镜像,只读不可改。

      • 目标实例数:本次扩缩操作期望达到的环境目标实例数。

      • 部署策略:指定扩缩容策略,可选滚动升级分批发布

        • 滚动升级:以 K8s 原生滚动方式扩缩,逐步新增或缩减 Pod 实例。

        • 分批发布

          • 分批数量:根据待扩容/缩容的实例数(增量),划分合适的分批数,以及每批扩/缩数量。

          • 分批详情:根据待扩容/缩容的实例数、分批数,划分每批扩/缩实例数量。

          • 暂停策略 :针对待扩缩的批次可选暂停策略,支持 不暂停首批暂停每批暂停 三种策略。

          • 超时时间:每批次超时时间,单位分钟,支持 1-30 的正整数。

  • 单击 提交 ,生成扩缩容工单,跳转工单详情页面。

高的 (22).png

观测扩缩过程

  • 扩缩单详情页,针对环境下的工作负载进行实例数扩缩容,可以查看实例扩缩进度。

高的 (29).png

  • 如果环境部署策略为分批发布,则环境扩缩容成功后会自动调整分批详情,调整批次数以及每批次数量,以适应下一次环境部署。

高的 (28).png

3.3 回滚

回滚可一次性将环境快速恢复到目标版本,适用于新版本发布后不符合预期,需要回滚到最近可用版本场景。回滚相当于使用历史版本进行一次重新部署,请谨慎操作!

提交回滚单

  • 进入 应用 > 部署版本,在版本列表找到目标部署的版本,单击回滚提交回滚工单;或者进入目标环境详情,单击右上角操作区域回滚提交回滚工单。

  • 填写回滚单参数。

    • 部署单名称:默认填充:${秒级时间戳}-回滚。

    • 回滚版本:选择待回滚到的部署版本。

    • 组件信息:展示目标回滚版本下环境待回滚的组件服务,其中工作负载类型展示待回滚的 ServiceDeployment目标实例数, 您也可按实际情况调整部署策略,指定分批数和暂停策略。 请仔细核对待回滚的组件信息是否符合预期。

  • 单击 提交 ,生成回滚工单,跳转工单详情页面。

高的 (26).png

观测回滚过程

  • 回滚进度显示上一个版本和当前部署的目标版本,目标版本会把当前环境版本回滚到上一个历史版本。

高的 (27).png

3.4 环境删除

  • 通常适用于开发、测试等线下环境联调测试完毕后,不再使用了,可以使用删除环境功能释放资源。