作为 Code Stream 管理员或开发人员,您可以使用 Code Stream 和 VMware Tanzu Kubernetes Grid Integrated Edition(以前称为 VMware Enterprise PKS)自动将软件应用程序部署到 Kubernetes 集群。此用例提到其他方法,这些方法可用于自动执行应用程序的发布。

在此用例中,您将创建包含两个阶段的管道,并使用 Jenkins 生成和部署应用程序。

  • 第一个阶段是进行开发。此阶段使用 Jenkins 从 GitHub 存储库中的分支提取代码,然后生成、测试并发布该代码。
  • 第一个阶段是进行部署。此阶段运行需要关键用户批准的用户操作任务,然后管道才可以将应用程序部署到 Kubernetes 集群。

在管道工作区中使用 Kubernetes API 端点时, Code Stream 会创建必要的 Kubernetes 资源(如 ConfigMap、密钥和 Pod)以运行持续集成 (CI) 任务或自定义任务。 Code Stream 使用 NodePort 与容器进行通信。

要在各个管道运行过程中共享数据,您必须提供持久卷声明, Code Stream 会将此持久卷声明挂载到容器以存储数据,并将其用于后续管道运行。

Code Stream 管道工作区支持使用 Docker 和 Kubernetes 执行持续集成任务和自定义任务。

有关配置工作区的详细信息,请参见配置管道工作区

将应用程序部署到 Kubernetes 集群的工作流使用 Jenkins、Code Stream、GitHub、适用于 Git 的触发器和 Kubernetes。

开发工具、开发实例和管道 YAML 文件必须可用,以便管道可以生成、测试、发布和部署应用程序。管道会将应用程序部署到 Kubernetes 集群的开发实例和生产实例。

该工作流可帮助您了解将应用程序发布到 Kubernetes 集群的过程。

可用于自动执行应用程序的发布的其他方法是:

  • 可以使用 Code Stream 本地构建功能和 Docker 生成主机,而不必使用 Jenkins 来构建应用程序。
  • 可以将应用程序部署到 Amazon Web Services (AWS) 集群,而不必部署到 Kubernetes 集群。

有关使用 Code Stream 本地构建功能和 Docker 主机的更多信息,请参见:

前提条件

  • 确认要部署的应用程序代码位于工作 GitHub 存储库中。
  • 验证您是否具有 Jenkins 工作实例。
  • 验证您是否具有工作电子邮件服务器。
  • Code Stream 中,创建连接到电子邮件服务器的电子邮件端点。
  • Amazon Web Services (AWS) 上设置两个分别用于开发和生产的 Kubernetes 集群,管道会将应用程序部署到这两个集群。
  • 验证 GitHub 存储库是否包含管道的 YAML 代码,或者验证是否包含定义环境的元数据和规范的 YAML 文件。

过程

  1. Code Stream 中,单击端点 > 新建端点,然后创建 Jenkins 端点以在管道中用于从 GitHub 存储库提取代码。
  2. 要创建 Kubernetes 端点,请单击新建端点
    1. 创建用于 Kubernetes 开发集群的端点。
    2. 创建用于 Kubernetes 生产集群的端点。
      Kubernetes 集群的 URL 可能包含端口号,也可能不包含端口号。
      例如:
      https://10.111.222.333:6443
      https://api.kubernetesserver.fa2c1d78-9f00-4e30-8268-4ab81862080d.k8s-user.com
  3. 创建一个管道以用于将应用程序(例如 Wordpress)的容器部署到 Kubernetes 开发集群,并设置管道的输入属性。
    1. 要使管道能够识别 GitHub 中会触发管道的代码提交,请在管道中单击输入选项卡并选择自动注入属性
    2. 添加名为 GIT_COMMIT_ID 的属性,然后单击该属性旁边的星标。
      当管道运行时,管道执行将显示 Git 触发器返回的提交 ID。
    在使用 Jenkins 和 Kubernetes 的管道中,输入选项卡显示 Git 输入属性。
  4. 添加通知以在管道成功或失败时发送电子邮件。
    1. 在管道中,单击通知选项卡,然后单击添加
    2. 要添加在管道完成运行时发送的电子邮件通知,请依次选择电子邮件完成。然后选择电子邮件服务器,输入电子邮件地址,并单击保存
    3. 要添加在管道失败时发送的另一个电子邮件通知,请选择失败,然后单击保存
    添加电子邮件通知时,需要选择一种管道状态,以及选择电子邮件服务器和收件人。
  5. 向管道添加开发阶段,并添加生成、测试和发布应用程序的任务。然后验证每个任务。
    1. 要生成应用程序,请添加使用 Jenkins 端点的 Jenkins 任务,并从 Jenkins 服务器运行生成作业。然后,要使管道能够提取代码,请按以下格式输入 Git 分支:${input.GIT_BRANCH_NAME}
    2. 要测试应用程序,请添加使用同一个 Jenkins 端点的 Jenkins 任务,并从 Jenkins 服务器运行测试作业。然后输入与上述相同的 Git 分支。
    3. 要发布应用程序,请添加使用同一个 Jenkins 端点的 Jenkins 任务,并从 Jenkins 服务器运行发布作业。然后输入与上述相同的 Git 分支。
    在使用 Jenkins 和 Kubernetes 的管道中,构建应用程序的 Jenkins 任务使用 Jenkins 端点、Jenkins 作业和分支名称。
  6. 向管道添加部署阶段,然后添加需要批准才能部署应用程序的任务,并添加将应用程序部署到 Kubernetes 集群的另一个任务。然后验证每个任务。
    1. 要指定需要批准才能部署应用程序,请添加一个用户操作任务,添加必须批准该任务的用户的电子邮件地址,并输入消息。然后启用发送电子邮件
    2. 要部署应用程序,请添加一个 Kubernetes 任务。然后,在 Kubernetes 任务属性中,选择您的 Kubernetes 开发集群,选择创建操作,并选择本地定义负载源。然后选择本地 YAML 文件。
  7. 添加可使 Code Stream 能够使用 Git 触发器的 Git Webhook,该触发器会在开发人员提交代码时触发管道。
    在触发 Kubernetes 管道的 Git Webook 中,必须输入分支和密钥令牌。
  8. 要测试管道,请转到 GitHub 存储库,更新应用程序 YAML 文件,并提交更改。
    1. Code Stream 中,验证是否显示该提交。
    1. 单击触发器 > Git > 活动
    2. 查找管道的触发器。
    3. 单击仪表板 > 管道仪表板
    4. 在管道仪表板上,在最新的成功更改区域中找到 GIT_COMMIT_ID。
  9. 检查管道代码并验证是否显示相应更改。

结果

恭喜!您已自动执行软件应用程序到 Kubernetes 集群的部署。

示例: 将应用程序部署到 Kubernetes 集群的示例管道 YAML

对于此示例中使用的管道类型,YAML 类似于以下代码:

apiVersion: v1
kind: Namespace
metadata:
  name: ${input.GIT_BRANCH_NAME}
  namespace: ${input.GIT_BRANCH_NAME}
---  
apiVersion: v1
data:
  .dockercfg: eyJzeW1waG9ueS10YW5nby1iZXRhMi5qZnJvZy5pbyI6eyJ1c2VybmFtZSI6InRhbmdvLWJldGEyIiwicGFzc3dvcmQiOiJhRGstcmVOLW1UQi1IejciLCJlbWFpbCI6InRhbmdvLWJldGEyQHZtd2FyZS5jb20iLCJhdXRoIjoiZEdGdVoyOHRZbVYwWVRJNllVUnJMWEpsVGkxdFZFSXRTSG8zIn19
kind: Secret
metadata:
  name: jfrog
  namespace: ${input.GIT_BRANCH_NAME}
type: kubernetes.io/dockercfg
---   
apiVersion: v1
kind: Service
metadata:
  name: codestream
  namespace: ${input.GIT_BRANCH_NAME}
  labels:
    app: codestream
spec:
  ports:
    - port: 80
  selector:
    app: codestream
    tier: frontend
  type: LoadBalancer 
---
apiVersion: extensions/v1
kind: Deployment
metadata:
  name: codestream
  namespace: ${input.GIT_BRANCH_NAME}
  labels:
    app: codestream
spec:
  selector:
    matchLabels:
      app: codestream
      tier: frontend
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: codestream
        tier: frontend
    spec:
      containers:
      - name: codestream
        image: cas.jfrog.io/codestream:${input.GIT_BRANCH_NAME}-${Dev.PublishApp.output.jobId}
        ports:
        - containerPort: 80
          name: codestream
      imagePullSecrets:
      - name: jfrog
      

下一步做什么

要将软件应用程序部署到 Kubernetes 生产集群,请再次执行相应步骤并选择生产集群。

要了解有关将 Code Stream 与 Jenkins 集成的更多信息,请参见如何将 Code Stream 与 Jenkins 集成