You need to enable JavaScript to run this app.
导航
基于持续交付的云原生 DevOps
最近更新时间:2024.01.24 16:34:46首次发布时间:2023.09.20 14:39:09

容器化场景下的一站式 DevOps 可以有效的实现持续集成和持续部署,显著提升业务应用创建和交付效率。本文通过 Python 容器应用部署的流程,为您介绍如何在火山引擎生态中实现容器化 DevOps。

场景介绍

使用容器镜像的方式交付 Python 应用,并将其部署在 Kubernetes 集群中,并当代码变更后自动触发应用部署。

操作流程

alt

相关产品

  • 持续交付:持续交付(Code Pipeline,CP)提供开发者友好的云原生应用交付平台和灵活易用的一站式流水线,帮助企业打通研发运维工程的各个环节,高质量、高效率完成业务的持续集成、持续验证和持续发布。产品详情参见 持续交付
  • 镜像仓库:火山引擎镜像仓库(Container Registry,CR)提供安全高可用的容器镜像、Helm Chart 等符合 OCI 标准的云原生制品托管服务,方便企业用户管理容器镜像和 Helm Chart 的全生命周期。产品详情参见 镜像仓库
  • 容器服务:容器服务(Volcengine Kubernetes Engine,VKE)通过深度融合新一代云原生技术,提供以容器为核心的高性能 Kubernetes 容器集群管理服务,助力用户快速构建容器化应用。。产品详情参见 [容器服务]

操作步骤

步骤一:获取代码仓库 HTTPS 地址和 Token

使用代码仓库存储代码源并使用持续交付实现 DevOps,首先您需要在代码仓库中准备一份代码源。本文以 Gitee 代码仓库为例为您介绍。

说明

持续交付支持 Gitee、Gitlab、Github、Codeup、Gerrit 等代码仓库托管的代码源,同时也指手动输入代码作为代码源。

  1. 注册 Gitee 账号,详情参见 Gitee 官网
  2. 在新建 Gitee 仓库。
    alt
  3. 在新建仓库页面填写仓库名称、路径,完成后单击 创建。本示例仓库名称和路径均为 projects-zhangsan2022
    alt
  4. 单击 初始化 readme 文件 创建项目的 Readme 文件。
    alt
  5. 单击 文件 > 新建文件,新建代码文件。
    alt
  6. 新建 Python 文件 app.py,完成后单击页面底部的 提交。示例代码如下。
    from flask import Flask
    app = Flask(__name__)
    @app.route('/')
    def hello_world():
        return 'Hello, World!'
    if __name__ == '__main__':
        app.run(host="0.0.0.0", port=5050)
    
  7. 获取代码源的 HTTPS 地址。
    alt
    8.在 设置 > 私人令牌 > 创建私人令牌 创建并获取私人令牌(Token)。
    alt

    注意

    必须选择 user_info、projects、hook。

步骤二:获取 OCI 制品仓库的地址

持续交付产品的流水线输出的最终产物为符合 OCI 规范容器镜像,需要保存到镜像仓库的 OCI 制品仓库中。镜像仓库提供了对原生 OCI 制品仓库的全生命周期管理能力。

  1. 创建标准版实例。操作详情参见 创建标准版实例
    alt
  2. 创建命名空间。操作详情参见 命名空间管理
    alt
  3. 创建 OCI 制品仓库。操作详情参见 OCI 制品仓库管理
    alt
  4. 获取 OCI 制品仓库的网络地址。
    alt

步骤三:创建部署资源的容器集群

镜像完成构建后,需要创建部署环境,即容器服务 VKE 集群,部署流水线中的应用。

  1. 创建 VPC。操作详情参见 创建私有网络
    alt
  2. 创建集群。操作详情参见 创建集群
    alt
  3. 运维管理 > 组件管理 中安装容器镜像免密组件 cr-credential-controller

    说明

    镜像仓库中的 OCI 制品可以被设置成为私有或公开。处于私有状态时,拉取需要提供认证。cr-credential-controller 组件可以为当前集群自动配置拉取对应镜像仓库的认证信息,实现私有镜像免密拉取。

    alt

步骤四:创建持续交付流水线

  1. 创建持续交付工作区。操作详情参加 创建工作区
    alt

  2. 创建持续交付代码源。操作详情参见 创建代码源

    说明

    支持交付代码源配置页面,填写 Gitee 中已获取的代码仓库 HTTPS 地址和 Token。

    alt

  3. 创建 Python-镜像构建推送至镜像仓库服务 流水线。操作详情参见 创建流水线
    alt

  4. 配置输入源,选择已配置的代码源。操作详情参见 配置代码源

    说明

    在 Webhook 设置中开启 代码提交 事件触发,当 Gitee 中代码源有变更提交后,即可触发流水线的自动运行。

    alt

  5. 编辑任务。其中 镜像打包推送至镜像仓库服务 区域中的 镜像版本dockfile 填写说明如下,其他配置保持默认或者选择前置步骤中已创建的资源。

    alt

    • 镜像版本 本示例填写 v1。

    • dockfile:选择 自定义文件,本示例中代码如下。

      FROM python:3
      RUN mkdir app
      ADD app.py /app/app.py
      WORKDIR app
      #Install other libs
      RUN pip3 install flask -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
      EXPOSE 5050
      CMD ["python3", "-m", "flask", "run", "--host=0.0.0.0", "--port=5050"]
      
  6. 添加 Kubectl 发布。操作详情参见 Kubectl 发布
    (https://www.volcengine.com/docs/6461/71591)。
    alt

    • 部署资源:将已创建的容器集群设置为部署资源,部署资源的创建方法参见 接入容器服务集群
    • YAML 文件:选择 自定义文件 的方式。示例代码如下,需要将示例代码中镜像地址 cr-zhangsan2022-cn-beijing.cr.volces.com/namespace-zhangsan2022/oci-zhangsan2022:v1 替换为 {已获取的 OCI 制品仓库的地址}:v1
      apiVersion: v1
      kind: Service
      metadata:
        name: demo
        namespace: default
      spec:
        externalTrafficPolicy: Cluster
        ports:
        - name: port1
          port: 5050
          protocol: TCP
          targetPort: 5050
        selector:
          app: demo
        sessionAffinity: None
        type: LoadBalancer
      ---
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: demo
        namespace: default
      spec:
        progressDeadlineSeconds: 600
        replicas: 1
        revisionHistoryLimit: 10
        selector:
          matchLabels:
            app: demo
        strategy:
          rollingUpdate:
            maxSurge: 25%
            maxUnavailable: 25%
          type: RollingUpdate
        template:
          metadata:
            annotations:
              kubectl.kubernetes.io/restartedAt: "2022-03-30T14:37:35Z"
            creationTimestamp: null
            labels:
              app: demo
          spec:
            containers:
            - image: cr-zhangsan2022-cn-beijing.cr.volces.com/namespace-zhangsan2022/oci-zhangsan2022:v1
              imagePullPolicy: IfNotPresent
              name: demo
              ports:
              - containerPort: 5050
                protocol: TCP
              resources:
                limits:
                  cpu: 300m
                  memory: 64Mi
                requests:
                  cpu: 300m
                  memory: 64Mi
              terminationMessagePath: /dev/termination-log
              terminationMessagePolicy: File
            dnsPolicy: ClusterFirst
            restartPolicy: Always
            schedulerName: default-scheduler
            securityContext: {}
            terminationGracePeriodSeconds: 30
      
  7. 单击 保存,完成流水线创建。

步骤五:发布应用

运行流失水后即可实现应用的发布。

  1. 在已创建的流水线页面,单击 运行
    alt
  2. 选择运行目标为 master 分支。
    alt
  3. 运行完成后,即完成了应用发布。
    alt

操作结果
完成应用部署后,即可通过外网地址访问应用。

  1. 在 VKE 集群 服务 列表中查看已部署的服务的外网地址。
    alt

  2. 在浏览器输入外网地址即可访问应用。
    alt

步骤六:持续发布

本示例在持续交付代码源的 Webhook 设置中开启 代码提交 事件触发,即在 Gitee 代码源中更新代码后,会自动触达流水钱的运行,部署更新后的应用。

  1. 在 Gitee 中更新代码源。
    alt
  2. 流水线自动触发运行,部署更新后的应用。刷新浏览器即可查看新的应用。
    alt

相关文档

更多容器 DevOps 相关内容请参见 持续交付帮助文档 中的 最佳实践 章节。