website/content/zh/docs/v3.3/devops-user-guide/examples/create-multi-cluster-pipeli...
Bettygogo2021 3c8d470ece update k8s versions
Signed-off-by: Bettygogo2021 <bettygogo@kubesphere.io>
2022-11-01 19:04:07 +08:00

12 KiB
Raw Blame History

title keywords description linkTitle weight
创建多集群流水线 KubeSphere, Kubernetes, 多集群, 流水线, DevOps 学习如何在 Kubesphere 上创建多集群流水线。 创建多集群流水线 11440

由于云场上提供不同的托管 Kubernetes 服务DevOps 流水线必须处理涉及多个 Kubernetes 集群的使用场景。

本教程将演示如何在 KubeSphere 创建一个多集群流水线。

准备工作

工作流程概述

本教程使用三个集群作为工作流中三个独立的环境。如下图所示:

use-case-for-multi-cluster

三个集群分别用于开发,测试和生产。当代码被提交至 Git 仓库,就会触发流水线并执行以下几个阶段 — 单元测试SonarQube 分析构建 & 推送部署到开发集群。开发者使用开发集群进行自我测试和验证。当开发者批准后,流水线就会进入到下一个阶段 部署到测试集群 进行更严格的验证。最后,流水线在获得必要的批准之后,将会进入下一个阶段 部署到生产集群,并向外提供服务。

动手实验

步骤 1准备集群

下图展示每个集群对应的角色。

集群名称 集群角色 用途
host 主集群 测试
shire 成员集群 生产
rohan 成员集群 开发

{{< notice note >}}

这些 Kubernetes 集群可以被托管至不同的云厂商,也可以使用不同的 Kubernetes 版本。针对 KubeSphere 3.3 推荐的 Kubernetes 版本v1.19.x、v1.20.x、v1.21.x、v1.22.x实验性支持和 v1.23.x实验性支持

{{</ notice >}}

步骤 2创建企业空间

  1. 使用 ws-manager 帐户登录主集群的 Web 控制台。在企业空间页面中,点击创建

  2. 基本信息页面中,将企业空间命名为 devops-multicluster,选择 ws-admin管理员,然后点击下一步

  3. 集群设置页面,选择所有集群(总共三个集群),然后点击创建

  4. 创建的企业空间会显示在列表。您需要登出控制台并以 ws-admin 身份重新登录,以邀请 project-adminproject-regular 至企业空间,然后分别授予他们 work-space-self-provisionerworkspace-viwer 角色。有关更多信息,请参见创建企业空间、项目、用户和角色

步骤 3创建 DevOps 项目

  1. 您需要登出控制台,并以 project-admin 身份重新登录。转到 DevOps 项目页面并点击创建

  2. 在出现的对话框中,输入 mulicluster-demo 作为名称,在集群设置中选择 host,然后点击确定

    {{< notice note >}}

    下拉列表中只有启用 DevOps 组件的集群可用。

    {{</ notice >}}

  3. 创建的 DevOps 项目将显示在列表中。请确保邀请用户 project-regular 至这个项目,并赋予 operator 角色。有关更多信息,请参见创建企业空间、项目、用户和角色

步骤 4在集群上创建项目

提前创建如下表所示的项目。请确保邀请 project-regular 用户到这些项目中,并赋予 operator 角色。有关更多信息,请参见创建企业空间、项目、用户和角色

集群名 用途 项目名
host 测试 kubesphere-sample-prod
shire 生产 kubesphere-sample-prod
rohan 开发 kubesphere-sample-dev

步骤 5创建凭证

  1. 登出控制台,以 project-regular 身份重新登录。在 DevOps 项目页面,点击 DevOps 项目 multicluster-demo

  2. 凭证页面,您需要创建如下表所示的凭证。有关如何创建凭证的更多信息,请参见凭证管理使用 Jenkinsfile 创建流水线

凭证 ID 类型 应用场所
host kubeconfig 用于主集群测试
shire kubeconfig 用于成员集群生产
rohan kubeconfig 用于成员集群开发
dockerhub-id 用户名和密码 Docker Hub
sonar-token 访问令牌 SonarQube

{{< notice note >}}

在创建 kubeconfig 凭证 shirerohan 时,必须手动输入成员集群的 kubeconfig。确保主集群可以访问成员集群的 API Server 地址。

{{</ notice >}}

  1. 共创建五个凭证。

步骤 6创建流水线

  1. 流水线页面点击创建。在显示的对话框中,输入 build-and-deploy-application 作为名称然后点击下一步

  2. 高级设置中选项卡中,点击创建即使用默认配置。

  3. 列表会展示被创建的流水线,点击流水线名称进入详情页面。

  4. 点击编辑 Jenkinsfile,复制和粘贴以下内容。请确保将 DOCKERHUB_NAMESPACE 的值替换为您自己的值,然后点击确定

    pipeline {
      agent {
        node {
          label 'maven'
        }
    
      }
      parameters {
            string(name:'BRANCH_NAME',defaultValue: 'master',description:'')
        }
      environment {
            DOCKER_CREDENTIAL_ID = 'dockerhub-id'
            PROD_KUBECONFIG_CREDENTIAL_ID = 'shire'
            TEST_KUBECONFIG_CREDENTIAL_ID = 'host'
            DEV_KUBECONFIG_CREDENTIAL_ID = 'rohan'
    
            REGISTRY = 'docker.io'
            DOCKERHUB_NAMESPACE = 'your Docker Hub account ID'
            APP_NAME = 'devops-maven-sample'
            SONAR_CREDENTIAL_ID = 'sonar-token'
            TAG_NAME = "SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER"
        }
      stages {
        stage('checkout') {
          steps {
            container('maven') {
              git branch: 'master', url: 'https://github.com/kubesphere/devops-maven-sample.git'
            }
          }
        }
        stage('unit test') {
          steps {
            container('maven') {
              sh 'mvn clean test'
            }
          }
        }
        stage('sonarqube analysis') {
          steps {
            container('maven') {
              withCredentials([string(credentialsId: "$SONAR_CREDENTIAL_ID", variable: 'SONAR_TOKEN')]) {
                withSonarQubeEnv('sonar') {
                  sh "mvn sonar:sonar -Dsonar.login=$SONAR_TOKEN"
                }
              }
            }
          }
        }
        stage('build & push') {
          steps {
            container('maven') {
              sh 'mvn -Dmaven.test.skip=true clean package'
              sh 'docker build -f Dockerfile-online -t $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER .'
              withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$DOCKER_CREDENTIAL_ID" ,)]) {
                sh 'echo "$DOCKER_PASSWORD" | docker login $REGISTRY -u "$DOCKER_USERNAME" --password-stdin'
                sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER'
              }
            }
          }
        }
        stage('push latest') {
          steps {
            container('maven') {
              sh 'docker tag  $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:latest '
              sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:latest '
            }
          }
        }
        stage('deploy to dev') {
          steps {
             container('maven') {
                withCredentials([
                    kubeconfigFile(
                    credentialsId: env.DEV_KUBECONFIG_CREDENTIAL_ID,
                    variable: 'KUBECONFIG')
                    ]) {
                    sh 'envsubst < deploy/dev-all-in-one/devops-sample.yaml | kubectl apply -f -'
                }
             }
          }
        }
        stage('deploy to staging') {
          steps {
             container('maven') {
                input(id: 'deploy-to-staging', message: 'deploy to staging?')
                withCredentials([
                    kubeconfigFile(
                    credentialsId: env.TEST_KUBECONFIG_CREDENTIAL_ID,
                    variable: 'KUBECONFIG')
                    ]) {
                    sh 'envsubst < deploy/prod-all-in-one/devops-sample.yaml | kubectl apply -f -'
                }
             }
          }
        }
        stage('deploy to production') {
          steps {
             container('maven') {
                input(id: 'deploy-to-production', message: 'deploy to production?')
                withCredentials([
                    kubeconfigFile(
                    credentialsId: env.PROD_KUBECONFIG_CREDENTIAL_ID,
                    variable: 'KUBECONFIG')
                    ]) {
                    sh 'envsubst < deploy/prod-all-in-one/devops-sample.yaml | kubectl apply -f -'
                }
             }
          }
        }
      }
    }
    

    {{< notice note >}}

    mvn 命令中的标志 -o 表示启用脱机模式。如果您在本地准备好了相关的 maven 依赖和缓存,可以保持脱机模式以节约时间。

    {{</ notice >}}

  5. 流水线创建之后,可以在图形编辑面板上查看流水线的阶段和步骤。

步骤7运行流水线并查看结果

  1. 点击运行按钮运行流水线。当流水线运行达到部署到暂存的阶段,将会暂停,因为资源已经被部署到集群进行开发。您需要手动点击继续两次,以将资源部署到测试集群 host 和生产集群 shire

  2. 一段时间过后,您可以看见流水线的状态展示为成功

  3. 在右上角点击查看日志,查看流水线运行日志。对于每个阶段,您可以点击显示日志以检查日志,同时日志可以被下载到本地进行进一步的分析。

  4. 当流水线运行成功时,点击代码检查,通过 SonarQube 检查结果。

  5. 转到项目页面,您可以通过从下拉列表中选择特定集群,来查看部署在各集群不同项目中的资源。