KubeSphere内网环境实践GO项目流水线
kubesphere官方给出的流水线都是在公网环境下,并对接github、dockerhub等环境。本文在内网实践部署,代码库使用内网部署的gitlab,镜像仓库使用harbor。
1. 环境准备
1.1 部署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官方文档:
- Devops用户指南:https://www.kubesphere.io/zh/docs/v4.1/11-use-extensions/01-devops/
- 构建和部署 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. 部署应用
图像界面查看流水线:
上述使用的相关CREDENTIAL_ID
需要提前在凭证中进行创建:
4. 创建部署应用的项目
使用项目管理员project-admin
创建项目go-project-demo,非devops项目:
项目管理添加project-regular
成员,并设置operator角色:
5. 运行流水线
流水线运行过程提供了详细的日志,可以结合运行日志进行排错。
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
前台查看部署的应用:
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/