KubeSphere内网环境实践Maven项目流水线

KubeSphere 内网环境实践Maven项目流水线

kubesphere官方给出的流水线都是在公网环境下,并对接github、dockerhub等环境。本文在内网实践部署,代码库使用内网部署的gitlab,镜像仓库使用harbor。

1. 环境准备

1.1 部署kubesphere环境

参考官方文档完成:

https://www.kubesphere.io/zh/docs/v4.1/03-installation-and-upgrade/02-install-kubesphere/02-install-kubernetes-and-kubesphere/

本文使用到的版本如下:

  • KubeSphere 版本 : v3.4.1

  • kubernetes 版本: v1.23.15

  • 操作系统版本:Ubuntu 20.04.2 LTS

1.2 部署kubesphere devops环境

devops作为kubesphere的扩展组件使用,需要在扩容组件中安装kubesphere。

1.3 devops用户指南完成基本的项目和人员创建

并创建对应的项目和人员账号。本文记录流水线配置的关键点,配置步骤主题参考kubesphere官方文档:

  1. Devops用户指南:https://www.kubesphere.io/zh/docs/v4.1/11-use-extensions/01-devops/
  2. 构建和部署 Maven 项目:https://www.kubesphere.io/zh/docs/v3.3/devops-user-guide/examples/a-maven-project/

2. 代码导入私有仓库并修改

官方给出的maven示例项目代码库地址:https://github.com/kubesphere/devops-maven-sample.git,这里将代码库导入到本地部署的gitlab环境,可以离线下载然后导入(通过git操作),或者通过gitlab导入项目的功能完成(gitlab需要联网)。

导入完成后对于代码库内容进行必要的修改。

2.1 dockerfile修改

修改代码仓库根路径下的Dockerfile-online文件,主要修改构建的基础镜像,此处指向内网的harbor仓库,需要提前在harbor仓库中上传java镜像:

# FROM java:8u92-jre-alpine
FROM 10.210.10.236:30002/java/java:8u92-jre-alpine

WORKDIR /home

COPY target/*.jar /home

ENTRYPOINT java -jar *.jar

使用jre镜像作为应用的基础镜像,将编译构建的jar包打包后作为应用部署的镜像。

2.2 部署YAML修改

官方demo中,部署使用的是dockerhub镜像仓库,这里改为内部的harbor仓库。修改deploy/all-in-one/文件夹下面的devops-sample.yaml文件,主要修改image 路径:

          	  # image: $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER
              image: $REGISTRY/$HARBOR_NAMESPACE/$APP_NAME:SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER

说明

image url采用环境变量的方式传递,上述环境变量名称需要与下文中jenkinsfile中定义的环境变量保持一致。

2.3 流水线对接内部的nexus仓库

Nexus 是存储、组织和分发制品的存储管理器。

参考文档:https://www.kubesphere.io/zh/docs/v3.3/devops-user-guide/examples/use-nexus-in-pipelines/

在 GitHub 仓库修改 pom.xml

修改代码仓库根目录下的文件 pom.xml,修改 <distributionManagement> 代码片段。设置 <id> 并使用内网Nexus 仓库的 URL。

这里按需进行修改,本文使用的代码示例devops-maven-sample该步骤没有进行修改,主要修改下面步骤的配置。

修改 ConfigMap
  1. 使用 admin 帐户登录 KubeSphere Web 控制台,点击左上角的平台管理,选择集群管理

  2. 配置下面选择 配置。在 配置 页面上的下拉列表中选择 kubesphere-devops-worker ,然后点击 ks-devops-agent

  3. 在详情页面,点击下拉菜单更多操作中的编辑 YAML

  4. 在弹出的对话框中,向下滚动,找到 <servers> 代码片段,输入下列代码:

    <servers>
      <server>
        <id>nexus</id>
        <username>admin</username>
        <password>admin</password>
      </server>
    </servers>
    

说明

<id> 是在从 设置给 Nexus 的唯一标识符。 <username> 是您的 Nexus 用户名。 <password> 是您的 Nexus 的密码。您也可以在 Nexus 上面配置 NuGet API Key,以获得更高的安全性。

  1. 继续找到 <mirrors> 代码片段,然后输入一下代码:
<mirrors>
  <mirror>
    <id>nexus</id>
    <name>maven-public</name>
    <url>http://10.210.10.217:8081/repository/maven-public/</url>
    <mirrorOf>*</mirrorOf>
  </mirror>
</mirrors>

说明

<id> 为代码仓库pom.xml中设置给 Nexus 唯一标识符。 <name> 是 Nexus 仓库的名称。 <url> 是您 Nexus 仓库的 URL。 <mirrorOf> 是要镜像的 Maven 仓库,输入 * 镜像所有 Maven 仓库。有关更多信息请参考为仓库使用镜像

  1. 编辑完成,点击确定保存。

3. jenkinsfile内容如下

新建流水线,基于Jenkinsfile,内容如下。

说明

注意针对注释部分【jenksinfile注释语法://】的修改,Jenkins流水线对接内网的harbor和gitlab。

pipeline {
  agent {
    node {
      label 'maven'
    }

  }
  
  parameters {
        string(name:'TAG_NAME',defaultValue: '',description:'')
    }

    environment {
        HARBOR_CREDENTIAL_ID = 'harbor-id'
        KUBECONFIG_CREDENTIAL_ID = 'demo-kubeconfig'
        REGISTRY = '10.210.10.236:30002'
        // 需要更改为内网harbor的项目名称
        HARBOR_NAMESPACE = 'devops-sample-pro'
        APP_NAME = 'devops-maven-sample'
        BRANCH_NAME = 'dev'
        // 在 KubeSphere 创建的项目名称,不是 DevOps 项目名称。最终部署的应用运行在该命名空间下
        PROJECT_NAME = 'kubesphere-sample-dev'
    }
  
  stages {
    stage('checkout SCM') {
      steps {
        git branch: 'master', url: "http://gitlab.jdzx.local/kubesphere/devops-maven-sample.git"
      }
    }

    stage('Unit Test') {
      steps {
        container('maven') {
          sh 'mvn clean test'
        }

      }
    }

    stage('Build and Push') {
      steps {
        container('maven') {
          sh 'mvn -Dmaven.test.skip=true clean package'
          sh 'docker build -f Dockerfile-online -t $REGISTRY/$HARBOR_NAMESPACE/$APP_NAME:SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER .'
          withCredentials([usernamePassword(credentialsId: 'harbor-id', passwordVariable: 'DOCKER_PASSWORD', usernameVariable: 'DOCKER_USERNAME')]) {
            sh 'echo "$DOCKER_PASSWORD" | docker login $REGISTRY -u "$DOCKER_USERNAME" --password-stdin'
            sh 'docker push $REGISTRY/$HARBOR_NAMESPACE/$APP_NAME:SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER'
          }

        }

      }
    }

    stage('Deploy to Dev') {
      agent none
      steps {
         container ('maven') {
              withCredentials([
                  kubeconfigFile(
                  credentialsId: env.KUBECONFIG_CREDENTIAL_ID,
                  variable: 'KUBECONFIG')
                  ]) {
                  sh 'envsubst < deploy/all-in-one/devops-sample.yaml | kubectl apply -f -'
              }
      }
    }

  }
}
}

流水线包括如下阶段:

  1. 代码检出

  2. 单元测试

  3. 编译构建、推送

  4. 部署应用

图像界面查看流水线:

maven-pipeline

上述使用的相关凭证需要提前在凭证管理中进行创建:

auth

4. 创建部署应用的项目

使用项目管理员project-admin创建项目kubesphere-sample-dev,非devops项目。项目管理添加project-regular成员,并设置operator角色。

kubesphere-sample-dev-project

5. 运行流水线

maven-pipeline

流水线运行过程提供了详细的日志,可以结合运行日志进行排错。

6. 查看应用部署

后台查看:

root@kubesphere2-1:~# kubectl get pod -n kubesphere-sample-dev
NAME                             READY   STATUS    RESTARTS   AGE
ks-sample-dev-84cbbcc4f5-5vghp   1/1     Running   0          114s

root@kubesphere2-1:~# kubectl get svc -n kubesphere-sample-dev
NAME            TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
ks-sample-dev   NodePort   10.233.26.171   <none>        8080:30861/TCP   20d

root@kubesphere2-1:~# curl http://10.210.10.236:30861
Really appreciate your star, that's the power of our life.

前台查看部署的应用:

maven-project-demoapp

7. 参考资料

  1. kubesphere devops项目管理:https://www.kubesphere.io/zh/docs/v3.3/devops-user-guide/devops-overview/devops-project-management/
  2. 构建和部署 Maven 项目:https://www.kubesphere.io/zh/docs/v3.3/devops-user-guide/examples/a-maven-project/
  3. 在流水线中使用 Nexus: https://www.kubesphere.io/zh/docs/v3.3/devops-user-guide/examples/use-nexus-in-pipelines/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lldhsds

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值