使用 Jenkinsfile 在多集群项目中部署应用
准备工作
- 您需要启用多集群功能并创建一个多集群企业空间。
- 您需要有一个 Docker Hub 帐户。
- 您需要在 Host 集群上启用 KubeSphere DevOps 系统。
- 您需要使用具有
workspace-self-provisioner
角色的帐户(例如project-admin
)创建一个多集群项目,并在 Host 集群上创建一个 DevOps 工程。本教程中的多集群项目创建于 Host 集群和一个 Member 集群上。 - 您需要邀请一个帐户(例如
project-regular
)至 DevOps 工程中,赋予operator
角色。有关更多信息,请参见创建企业空间、项目、帐户和角色、多集群管理和多集群项目。
创建 Docker Hub 访问令牌 (Token)
-
登录 Docker Hub 并在右上角的菜单中选择 Account Settings。
-
在左侧点击 Security,然后点击 New Access Token。
-
输入令牌名称,点击 Create。
-
点击 Copy and Close 并务必保存该访问令牌。
创建凭证
您需要在 KubeSphere 中为已创建的访问令牌创建凭证,以便流水线能够向 Docker Hub 推送镜像。此外,您还需要创建 kubeconfig 凭证,用于访问 Kubernetes 集群。
-
以
project-regular
身份登录 KubeSphere Web 控制台,前往您的 DevOps 工程,在凭证页面点击创建。 -
在弹出对话框中,设置凭证 ID,稍后会用于 Jenkinsfile 中,类型选择帐户凭证。用户名输入您的 Docker Hub 帐户名称,token / 密码中输入刚刚创建的访问令牌。操作完成后,点击确定。
提示
有关如何创建凭证的更多信息,请参见凭证管理。 -
登出 KubeSphere Web 控制台,再以
project-admin
身份登录。前往您的 DevOps 工程,在凭证页面点击创建。类型选择 kubeconfig,KubeSphere 会自动填充 Content 字段,即当前帐户的 kubeconfig。设置凭证 ID,然后点击确定。备注
在未来版本中,您可以邀请project-regular
帐户至您的多集群项目中,并赋予必要角色,以使用此帐户创建 kubeconfig 凭证。
创建流水线
创建完上述凭证后,您可以使用 project-regular
帐户按照以下步骤使用示例 Jenkinsfile 创建流水线。
-
要创建流水线,请在流水线页面点击创建。
-
在弹出窗口中设置名称,然后点击下一步。
-
在本教程中,您可以为所有字段使用默认值。在高级设置页面,直接点击创建。
编辑 Jenkinsfile
-
在流水线列表中,点击该流水线进入其详情页面。点击编辑 Jenkinsfile 定义一个 Jenkinsfile,流水线会基于它来运行。
-
将以下所有内容复制并粘贴到弹出窗口中,用作流水线的示例 Jenkinsfile。您必须将
DOCKERHUB_USERNAME
、DOCKERHUB_CREDENTIAL
、KUBECONFIG_CREDENTIAL_ID
、MULTI_CLUSTER_PROJECT_NAME
和MEMBER_CLUSTER_NAME
的值替换成您自己的值。操作完成后,点击确定。pipeline { agent { node { label 'maven' } } environment { REGISTRY = 'docker.io' // Docker Hub 用户名 DOCKERHUB_USERNAME = 'Your Docker Hub username' APP_NAME = 'devops-go-sample' // ‘dockerhub-go’ 即您在 KubeSphere 控制台上创建的 Docker Hub 凭证 ID DOCKERHUB_CREDENTIAL = credentials('dockerhub-go') // 您在 KubeSphere 控制台上创建的 kubeconfig 凭证 ID KUBECONFIG_CREDENTIAL_ID = dockerhub-go-kubeconfig // 您企业空间中的多集群项目名称 MULTI_CLUSTER_PROJECT_NAME = 'demo-multi-cluster' // 您用来部署应用的 Member 集群名称 // 本教程中,应用部署在 Host 集群和一个 Member 集群上 // 若需要部署在多个 Member 集群上, 请编辑 manifest/multi-cluster-deploy.yaml MEMBER_CLUSTER_NAME = 'Your Member Cluster name' } stages { stage('docker login') { steps { container('maven') { sh 'echo $DOCKERHUB_CREDENTIAL_PSW | docker login -u $DOCKERHUB_CREDENTIAL_USR --password-stdin' } } } stage('build & push') { steps { container('maven') { sh 'git clone https://github.com/yuswift/devops-go-sample.git' sh 'cd devops-go-sample && docker build -t $REGISTRY/$DOCKERHUB_USERNAME/$APP_NAME .' sh 'docker push $REGISTRY/$DOCKERHUB_USERNAME/$APP_NAME' } } } stage('deploy app to multi cluster') { steps { container('maven') { script { withCredentials([ kubeconfigFile( credentialsId: 'dockerhub-go-kubeconfig', variable: 'KUBECONFIG') ]) { sh 'envsubst < devops-go-sample/manifest/multi-cluster-deploy.yaml | kubectl apply -f -' } } } } } } }
备注
如果您的流水线成功运行,将会推送镜像至 Docker Hub。如果您使用 Harbor,则无法通过 Jenkins 凭证使用环境变量将参数传送到docker login -u
。这是因为每个 Harbor Robot 帐户的用户名都包含一个$
字符,当用于环境变量时,Jenkins 会将其转换为$$
。了解更多信息。
运行流水线
保存 Jenkinsfile 后,点击运行。如果一切顺利,您会在您的多集群项目中看到部署 (Deployment) 工作负载。
反馈
这篇文章对您有帮助吗?
感谢您的反馈。如果您有关于如何使用 KubeSphere 的具体问题,请在 Slack 上提问。如果您想报告问题或提出改进建议,请在 GitHub 存储库中打开问题。