Loading
close

通过Chart部署自定义构建镜像和Chart模板

time 更新时间:2022-03-14 17:38:24

背景描述

通过DevOps云产品,可以创建从源代码获取到项目构建、测试和部署上线的全流程自动交付流水线,大大缩短交付周期,提升交付效率。本文将以nginx应用程序为例,介绍如何快速通过DevOps流水线在构建并发布应用程序镜像后,先打包发布Chart模板,再通过此Chart模板部署该应用程序。

本实践方案中,流水线各项规划信息规划如下:

流水线-Chart部署nginx镜像和Chart模板
Source阶段 项目代码使用 nginx.git 仓库下的 master 分支代码
Build阶段 通过“构建并发布镜像”类型任务构建nginx镜像
* Dockerfile文件路径:名为Dockerfile的文件,其直接放置在代码仓库根目录下,方便任务获取
* 镜像名称:nginx
* 镜像版本:6.0.1-alpha.${BUILD_ID}
* 工作空间:devops
Publish阶段 通过“构建并发布Chart模板”类型任务发布nginx模板
* Chart目录:nginx。即名为Chart.yaml的文件放置在代码仓库的nginx目录下
* 应用模板名称:nginx
* 模板版本:6.0.1-alpha.${BUILD_ID}
Deploy阶段 通过“通过Chart模板部署”类型任务部署nginx应用程序
* 部署实例名称:nginx
* 应用模板名称:nginx(与发布阶段的应用模板名称保持一致)
* 模板版本:6.0.1-alpha.${BUILD_ID}(与发布阶段的模板版本保持一致)
* 访问域名:nginx.example.cn

前提条件

  • DevOps流水线需要预先配置承载其运行的Kubernetes集群,具体步骤请参考 配置集群

  • DevOps流水线需要预先关联应用程序源代码的代码仓库,具体步骤请参考 配置代码仓库

  • 本DevOps流水线需要预先制作用于构建镜像的Dockerfile文本文件,并放置在代码仓库的根目录下。本实践方案中,根据规划信息Dockerfile文件的内容如下:

      FROM alpine:latest
    
      RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories \
          && apk --update add nginx \
          && mkdir -p /run/nginx
    
      ADD default.conf /etc/nginx/http.d/
      ADD source/html /var/lib/nginx/html/
    
      EXPOSE 80
    
      ENTRYPOINT [ "nginx", "-g", "daemon off;" ]
    
  • 本DevOps流水线需要预先制作用于发布Chart模板的 values.yaml 文件,并放置在代码仓库的nginx目录下。本实践方案中,根据规划信息values.yaml文件的内容如下。其中,repository: hub.ecns.io/devops/nginx 参数配置中,devops 为流水线“构建”阶段所选择的工作空间,nginx 为流水线“构建”阶段所构建镜像的名称。tag: 6.0.1-alpha.${BUILD_ID} 参数配置中,6.0.1-alpha.${BUILD_ID} 为流水线“构建”阶段所构建镜像的版本。host: nginx.example.cn 参数配置中,nginx.example.cn 为流水线“部署”阶段所规划的访问域名。

      # Default values for nginx-chart.
      # This is a YAML-formatted file.
      # Declare variables to be passed into your templates.
    
      replicaCount: 1
    
      image:
        repository: hub.ecns.io/devops/nginx
        pullPolicy: IfNotPresent
        # Overrides the image tag whose default is the chart appVersion.
        tag: 6.0.1-alpha.${BUILD_ID}
    
      imagePullSecrets: []
      nameOverride: ""
      fullnameOverride: ""
    
      serviceAccount:
        # Specifies whether a service account should be created
        create: true
        # Annotations to add to the service account
        annotations: {}
        # The name of the service account to use.
        # If not set and create is true, a name is generated using the fullname template
        name: ""
    
      podAnnotations: {}
    
      podSecurityContext: {}
        # fsGroup: 2000
    
      securityContext: {}
        # capabilities:
        #   drop:
        #   - ALL
        # readOnlyRootFilesystem: true
        # runAsNonRoot: true
        # runAsUser: 1000
    
      service:
        type: ClusterIP
        port: 80
    
      ingress:
        enabled: true
        annotations: {}
          # kubernetes.io/ingress.class: nginx
          # kubernetes.io/tls-acme: "true"
        hosts:
          - host: nginx.example.cn
            paths:
              - path: /
    
        #  - secretName: chart-example-tls
        #    hosts:
        #      - chart-example.local
    
      resources: {}
        # We usually recommend not to specify default resources and to leave this as a conscious
        # choice for the user. This also increases chances charts run on environments with little
        # resources, such as Minikube. If you do want to specify resources, uncomment the following
        # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
        # limits:
        #   cpu: 100m
        #   memory: 128Mi
        # requests:
        #   cpu: 100m
        #   memory: 128Mi
    
      autoscaling:
        enabled: false
        minReplicas: 1
        maxReplicas: 100
        targetCPUUtilizationPercentage: 80
        # targetMemoryUtilizationPercentage: 80
    
      nodeSelector: {}
    
      tolerations: []
    
      affinity: {}
    

操作步骤

  1. 在云平台的顶部导航栏中,依次选择[产品与服务]-[DevOps]-[流水线],进入“流水线”页面。

  2. 在“流水线”页面中,单击页面上方的 创建流水线 ,弹出“创建流水线”对话框。

  3. 在“创建流水线”对话框中,选择“从零开始创建”后,单击 创建 ,进入“创建流水线”页面。

    ../images/gs_image_11.png

  4. 在“创建流水线”页面的画布中,根据本次业务需求配置“Source”、“Build”、“Publish”和“Deploy”阶段后,依次在各阶段完成以下任务配置。

    ../images/bp_image_14.png

    1. 在“Source”阶段添加项目代码源。

      在当前画布的“Source”卡片中,单击``添加代码源``,弹出“添加代码源”对话框。在该对话框中,配置代码源信息后,单击 保存 ,保存项目的代码源设置,并关闭对话框。

      ../images/bp_image_15.png

    2. 在“Build”阶段添加“构建并发布镜像”任务。

      在当前画布的“Build”卡片中,单击 添加任务 ,弹出“添加任务”对话框。在该对话框中,“任务类型”选择“构建并发布镜像”,“Dockerfile”输入“Dockerfile”,“镜像名称”输入“nginx”,“镜像版本”输入“6.0.1-alpha.${BUILD_ID}”,“工作空间”选择“devops”,并配置名称后,单击 保存 ,完成任务创建,并关闭对话框。

      ../images/bp_image_16.png

    3. 在“Publish”阶段添加“构建并发布Chart模板”任务。

      在当前画布的“Publish”卡片中,单击 添加任务 ,弹出“添加任务”对话框。在该对话框中,“任务类型”选择“构建并发布Chart模板”,“Chart目录”输入“nginx”,“应用模板名称”输入“nginx”,“模板版本”输入“6.0.1-alpha.${BUILD_ID}”,并配置名称后,单击 保存 ,完成任务创建,并关闭对话框。

      ../images/bp_image_17.png

    4. 在“Deploy”阶段添加“通过Chart模板部署”任务。

      在当前画布的“Deploy”卡片中,单击 添加任务 ,弹出“添加任务”对话框。在该对话框中,“任务类型”选择“通过Chart模板部署”,“部署实例名称”输入“nginx”,“应用模板名称”输入“nginx”,“模板版本”输入“6.0.1-alpha.${BUILD_ID}”,并配置名称和Chart模板的部署目标集群及命名空间后,单击 保存 ,完成任务创建,并关闭对话框。

      说明:

      在上述对话框中,“应用模板名称”和“模板版本”支持“选择”和“输入”两种配置方式,本实践方案需要选择“输入”配置方式。关于两种配置方式的具体说明如下,在实际使用过程中请酌情选择:

      • 当待部署的应用模板为“容器应用中心”云产品中已有的自有模板时,请选择“选择”配置方式,依次选择本流水线任务所需的应用模板名称和版本。
      • 当待部署的应用模板为本流水线前述阶段新构建发布的Chart模板时,请选择“输入”配置方式,依次输入前述构建发布阶段所配置的Chart模板的名称和版本。

      ../images/bp_image_18.png

  5. 在“创建流水线”页面的画布中,单击画布右上方的 保存 后,在弹出的“保存”对话框中,选择保存方式后,单击 保存 ,完成流水线创建,并关闭当前页面。

    ../images/bp_image_07.png

  6. 执行流水线。

    本实践方案中以手动触发方式为例,触发流水线执行。如需配置流水线自动触发,请参考 配置流水线执行策略(可选)

    1. 在“流水线”页面中,单击上述流水线所在行的 执行 ,弹出“执行流水线”提示框。
    2. 在“执行流水线”提示框中,单击 执行 ,执行该流水线,并关闭提示框。

结果验证

  1. 确认流水线成功执行。

    在“流水线”页面中,单击上述流水线名称 ,进入其详情页面。在详情页面的[运行记录]页签中,确认该流水线执行成功并记录此次“运行编号”。

    ../images/admin_bp_image_21.png

  2. 确认镜像成功构建。

    在云平台的顶部导航栏中,依次选择[产品与服务]-[容器服务]-[容器镜像服务],进入“镜像管理”页面。在该页面中,确认已生成名为“nginx”的镜像文件。然后,单击此镜像文件名称,进入其详情页面后,在[镜像版本]页签中,确认该镜像文件的生成版本为“6.0.1-alpha.<运行编号>”。

    ../images/bp_image_22.png

  3. 确认Chart模板成功发布。

    在云平台的顶部导航栏中,依次选择[产品与服务]-[容器服务]-[容器应用中心],进入“应用模板”页面。在该页面中,选择[自有模板]页签后,确认已生成名为“nginx”的模板文件。然后,单击此模板文件名称,进入其详情页面后,在“基本信息”区域框的右上方,确认最新生成的该模板文件的版本为“6.0.1-alpha.<运行编号>”。

    ../images/bp_image_23.png

  4. 确认应用程序成功部署。

    1. 在云平台的顶部导航栏中,依次选择[产品与服务]-[容器服务]-[容器应用中心],进入容器应用中心服务页面后,再在该页面的左侧导航栏中,选择“模板实例”,进入“模板实例”页面。在该页面中,确认已生成名为“nginx”的模板实例,且“模板来源”为“nginx: 6.0.1-alpha.<运行编号>”。然后,单击此模板实例名称,进入其详情页面后,在[工作负载]页签中,确认所用镜像为“hub.ecns.io/devops/nginx:6.0.1-alpha.<运行编号>”。

      ../images/bp_image_24.png

    2. 在云平台的顶部导航栏中,依次选择[产品与服务]-[容器服务]-[Kubernetes容器服务],进入Kubernetes容器服务页面后,再在该页面的左侧导航栏中,先选择“业务视图”以及该应用程序的所在项目、部署集群和命名空间,再选择[工作负载]-[部署],进入部署页面。在该页面中,确认已生成名为“nginx”的部署且状态为“运行中”。

      ../images/bp_image_25.png

  5. 确认应用程序成功访问。

    1. 在云平台的顶部导航栏中,依次选择[产品与服务]-[容器服务]-[Kubernetes容器服务],进入“管理视图”的“集群管理”页面。在该页面中,查看并记录该应用程序所在Kubernetes集群的IP地址,即该Kubernetes集群所在行中,API Server列https://后的IP地址。

      ../images/bp_image_26.png

    2. 在本地计算机的 hosts 文件中,添加该应用程序所在Kubernetes集群IP地址与values.yaml文件定义域名的访问映射。

      ../images/bp_image_27.png

    3. 在本地计算机的浏览器地址栏中输入values.yaml文件定义域名,访问部署的应用程序。

      ../images/bp_image_49.png

此篇文章对你是否有帮助?
没帮助
locked-file

您暂无权限访问该产品