Bootstrap

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

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

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. 构建和部署 Go 项目:https://www.kubesphere.io/zh/docs/v3.3/devops-user-guide/examples/go-project-pipeline/

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

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

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

2.1 dockerfile修改

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

# Build the manager binary
# FROM golang:1.15 as builder
# 下面的golang镜像替换为内网harbor上的url
FROM 10.210.10.236:30002/language/golang:1.15 as builder

WORKDIR /devops

COPY go.mod go.mod
COPY cmd/ cmd/

RUN go mod download

# Build
RUN CGO_ENABLED=0 GOOS=linux GO111MODULE=on go build -a -o devops-go-sample cmd/main.go

# Use distroless as minimal base image to package the manager binary
# Refer to https://github.com/GoogleContainerTools/distroless for more details
# FROM alpine:3.9
# # 下面的alpine镜像替换为内网harbor上的url
FROM 10.210.10.236:30002/os/alpine:3.9
WORKDIR /devops
COPY --from=builder /devops/devops-go-sample .

ENTRYPOINT ["./devops-go-sample"]

go项目的dockerfile采用多阶段构建,编译构建使用golang镜像完成,然后将编译构建的中间制品(二进制文件)打包到alpine镜像中作为最终部署的镜像。

2.2 部署YAML修改

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

              # image: $REGISTRY/$DOCKERHUB_USERNAME/$APP_NAME
              image: $REGISTRY/$HARBOR_NAMESPACE/$APP_NAME

说明

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

3. jenkinsfile内容如下

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

说明

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

pipeline {  
  agent {
    label 'go'
  }
  
  environment {
    // 镜像仓库地址,这里改为内网部署的harbor
	REGISTRY = '10.210.10.236:30002'
    // Harbor的项目名称,最终应用构建的镜像会推送到该项目下
    HARBOR_NAMESPACE = 'devops-sample-pro'
    // 最终构建的docker应用镜像名称
    APP_NAME = 'devops-go-sample'
	HARBOR_CREDENTIAL_ID = 'harbor-id'
    // 在 KubeSphere 创建的 kubeconfig 凭证 ID
	KUBECONFIG_CREDENTIAL_ID = 'demo-kubeconfig'
    // 在 KubeSphere 创建的项目名称,不是 DevOps 项目名称。最终部署的应用运行在该命名空间下
    PROJECT_NAME = 'go-project-demo'
  }
  
  stages {
    stage('docker login') {
      steps{
        container ('go') {
		  withCredentials([usernamePassword(passwordVariable : 'HARBOR_PASSWORD' ,usernameVariable : 'HABOR_USERNAME' ,credentialsId : "$HARBOR_CREDENTIAL_ID" ,)]) {
          sh 'echo "$HARBOR_PASSWORD" | docker login $REGISTRY -u "$HABOR_USERNAME" --password-stdin'		  
		  }
          // sh 'echo $HARBOR_CREDENTIAL_PSW | docker login -u $HARBOR_CREDENTIAL_USR --password-stdin'
        }
      }
    }
    stage('build & push') {
      steps {
        container ('go') {
          // 修改git代码仓库地址为内网gitlab仓库地址
          sh 'git clone http://gitlab.jdzx.local/root/devops-go-sample.git'
          sh 'cd devops-go-sample && docker build -t $REGISTRY/$HARBOR_NAMESPACE/$APP_NAME .'
          sh 'docker push $REGISTRY/$HARBOR_NAMESPACE/$APP_NAME'
        }
      }
    }
    stage ('deploy app') {
      steps {
         container ('go') {
            withCredentials([
              kubeconfigFile(
                credentialsId: env.KUBECONFIG_CREDENTIAL_ID,
                variable: 'KUBECONFIG')
              ]) {
              sh 'envsubst < devops-go-sample/manifest/deploy.yaml | kubectl apply -f -'
            }
         }
      }
    }
  }
}

流水线包括如下阶段:

1. 登录docker

2. 构建和推送(包括代码检出)

3. 部署应用

图像界面查看流水线:

go-devops-pipeline

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

auth

4. 创建部署应用的项目

使用项目管理员project-admin创建项目go-project-demo,非devops项目:

go-project-demo-app

项目管理添加project-regular成员,并设置operator角色:

go-project-demo-member

5. 运行流水线

go-devops-result

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

6. 查看应用部署

后台查看:

root@kubesphere2-1:~# kubectl get pod -n go-project-demo
NAME                                READY   STATUS    RESTARTS   AGE
devops-go-sample-59997797dc-ks9v8   1/1     Running   0          64s
devops-go-sample-59997797dc-qnqb8   1/1     Running   0          57s
devops-go-sample-59997797dc-rfjgj   1/1     Running   0          60s
root@kubesphere2-1:~# kubectl logs -n go-project-demo  devops-go-sample-59997797dc-ks9v8
devops-go-sample

前台查看部署的应用:

go-project-demo-app

7. 参考资料

1. kubesphere devops项目管理:

https://www.kubesphere.io/zh/docs/v3.3/devops-user-guide/devops-overview/devops-project-management/

2. go项目流水线:

https://www.kubesphere.io/zh/docs/v3.3/devops-user-guide/examples/go-project-pipeline/

;