背景描述
通过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: {}
操作步骤
在云平台的顶部导航栏中,依次选择[产品与服务]-[DevOps]-[流水线],进入“流水线”页面。
在“流水线”页面中,单击页面上方的
创建流水线
,弹出“创建流水线”对话框。在“创建流水线”对话框中,选择“从零开始创建”后,单击
创建
,进入“创建流水线”页面。在“创建流水线”页面的画布中,根据本次业务需求配置“Source”、“Build”、“Publish”和“Deploy”阶段后,依次在各阶段完成以下任务配置。
在“Source”阶段添加项目代码源。
在当前画布的“Source”卡片中,单击``添加代码源``,弹出“添加代码源”对话框。在该对话框中,配置代码源信息后,单击
保存
,保存项目的代码源设置,并关闭对话框。在“Build”阶段添加“构建并发布镜像”任务。
在当前画布的“Build”卡片中,单击
添加任务
,弹出“添加任务”对话框。在该对话框中,“任务类型”选择“构建并发布镜像”,“Dockerfile”输入“Dockerfile”,“镜像名称”输入“nginx”,“镜像版本”输入“6.0.1-alpha.${BUILD_ID}”,“工作空间”选择“devops”,并配置名称后,单击保存
,完成任务创建,并关闭对话框。在“Publish”阶段添加“构建并发布Chart模板”任务。
在当前画布的“Publish”卡片中,单击
添加任务
,弹出“添加任务”对话框。在该对话框中,“任务类型”选择“构建并发布Chart模板”,“Chart目录”输入“nginx”,“应用模板名称”输入“nginx”,“模板版本”输入“6.0.1-alpha.${BUILD_ID}”,并配置名称后,单击保存
,完成任务创建,并关闭对话框。在“Deploy”阶段添加“通过Chart模板部署”任务。
在当前画布的“Deploy”卡片中,单击
添加任务
,弹出“添加任务”对话框。在该对话框中,“任务类型”选择“通过Chart模板部署”,“部署实例名称”输入“nginx”,“应用模板名称”输入“nginx”,“模板版本”输入“6.0.1-alpha.${BUILD_ID}”,并配置名称和Chart模板的部署目标集群及命名空间后,单击保存
,完成任务创建,并关闭对话框。说明:
在上述对话框中,“应用模板名称”和“模板版本”支持“选择”和“输入”两种配置方式,本实践方案需要选择“输入”配置方式。关于两种配置方式的具体说明如下,在实际使用过程中请酌情选择:
- 当待部署的应用模板为“容器应用中心”云产品中已有的自有模板时,请选择“选择”配置方式,依次选择本流水线任务所需的应用模板名称和版本。
- 当待部署的应用模板为本流水线前述阶段新构建发布的Chart模板时,请选择“输入”配置方式,依次输入前述构建发布阶段所配置的Chart模板的名称和版本。
在“创建流水线”页面的画布中,单击画布右上方的
保存
后,在弹出的“保存”对话框中,选择保存方式后,单击保存
,完成流水线创建,并关闭当前页面。执行流水线。
本实践方案中以手动触发方式为例,触发流水线执行。如需配置流水线自动触发,请参考 配置流水线执行策略(可选)。
- 在“流水线”页面中,单击上述流水线所在行的
执行
,弹出“执行流水线”提示框。 - 在“执行流水线”提示框中,单击
执行
,执行该流水线,并关闭提示框。
- 在“流水线”页面中,单击上述流水线所在行的
结果验证
确认流水线成功执行。
在“流水线”页面中,单击上述流水线名称 ,进入其详情页面。在详情页面的[运行记录]页签中,确认该流水线执行成功并记录此次“运行编号”。
确认镜像成功构建。
在云平台的顶部导航栏中,依次选择[产品与服务]-[容器服务]-[容器镜像服务],进入“镜像管理”页面。在该页面中,确认已生成名为“nginx”的镜像文件。然后,单击此镜像文件名称,进入其详情页面后,在[镜像版本]页签中,确认该镜像文件的生成版本为“6.0.1-alpha.<运行编号>”。
确认Chart模板成功发布。
在云平台的顶部导航栏中,依次选择[产品与服务]-[容器服务]-[容器应用中心],进入“应用模板”页面。在该页面中,选择[自有模板]页签后,确认已生成名为“nginx”的模板文件。然后,单击此模板文件名称,进入其详情页面后,在“基本信息”区域框的右上方,确认最新生成的该模板文件的版本为“6.0.1-alpha.<运行编号>”。
确认应用程序成功部署。
在云平台的顶部导航栏中,依次选择[产品与服务]-[容器服务]-[容器应用中心],进入容器应用中心服务页面后,再在该页面的左侧导航栏中,选择“模板实例”,进入“模板实例”页面。在该页面中,确认已生成名为“nginx”的模板实例,且“模板来源”为“nginx: 6.0.1-alpha.<运行编号>”。然后,单击此模板实例名称,进入其详情页面后,在[工作负载]页签中,确认所用镜像为“hub.ecns.io/devops/nginx:6.0.1-alpha.<运行编号>”。
在云平台的顶部导航栏中,依次选择[产品与服务]-[容器服务]-[Kubernetes容器服务],进入Kubernetes容器服务页面后,再在该页面的左侧导航栏中,先选择“业务视图”以及该应用程序的所在项目、部署集群和命名空间,再选择[工作负载]-[部署],进入部署页面。在该页面中,确认已生成名为“nginx”的部署且状态为“运行中”。
确认应用程序成功访问。