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镜像:

bash 复制代码
# 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 路径:

yml 复制代码
              # image: $REGISTRY/$DOCKERHUB_USERNAME/$APP_NAME
              image: $REGISTRY/$HARBOR_NAMESPACE/$APP_NAME

说明

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

3. jenkinsfile内容如下

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

说明

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

bash 复制代码
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. 查看应用部署

后台查看:

bash 复制代码
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/

相关推荐
2401_8401922716 小时前
git的作用,以及和github的区别
开发语言·经验分享·git·python·devops
努力向上的年轻人2 天前
2025年新手入门DevOps工具选型指南
运维·gitee·团队开发·敏捷开发·devops·源代码管理
是垚不是土3 天前
何为DevOps理念?
运维·devops
极小狐4 天前
GitLab 中文版17.10正式发布,27项重点功能解读【三】
安全·gitlab·devsecops·devops
初级代码游戏6 天前
管理Visual Studio配置文件(使用Azure DevOps开发,免费GIT托管)
git·azure·devops·visual studio
demonlg01126 天前
Jenkins 共享库(Shared Libraries)使用说明文档
java·运维·python·jenkins·运维开发·devops
demonlg01127 天前
Jenkins CustomTools 插件使用说明文档
运维·jenkins·运维开发·devops
demonlg01127 天前
Jenkins集成Trivy安全漏洞检查指南
java·运维·python·jenkins·运维开发·devops
长安er7 天前
异步编程与流水线架构:从理论到高并发
数学建模·架构·gui·多线程·异步·流水线·全息
YAMLMaster8 天前
K8s 跨集群通信的“量子纠缠”:当 DNS 黑洞吞没你的服务请求
网络·云原生·容器·kubernetes·devops