乐趣区

关于kubernetes:下篇使用jenkins发布go项目到k8s接上篇的手工体验改造为自动化发布

写在开篇

对于上篇

本篇在《上篇:带你手工体验从写代码、编译、打包镜像、部署到 K8S 的全过程》的根底上,将手动的过程通过 jenkins 工具将其革新成自动化。

环境筹备

我的环境阐明:

组件 装置形式 拜访 IP 拜访端口
jenkins docker 192.168.11.254 8086
gitlab docker 192.168.11.254 8088
harbor docker 192.168.11.254 8081

下面的 3 个组件均以 docker 的形式装置在同一台宿主机上,且是在 k8s 集群内部。即便 Jenkins、GitLab、Harbor 都部署在 K8S 集群内部,也是能够将 Go web 我的项目公布到 K8S 集群中的。那么,对于如何装置下面的组件,可参考我之前公布过的文章《云原生下的 CICD- 3 件套疾速搭建合集:jenkins+harbor+gitlab》。

当然也能够将 CICD 的相干组件部署在 K8S 集群外部,这些内容前面有工夫的时候再作分享。

制作 jenkins 镜像

因 jenkinsci/blueocean 镜像中没有装置 go 和 kubectl,因而基于它来从新制作一个新的镜像,把 go 和 kubectl 装置好。

  1. 从 jenkinsci/blueocean 镜像启动 jenkins 容器
[root@workhost jenkins]# docker run -d -u root --name jenkins-ser01 --restart=always -p 8086:8080 -p 50000:50000 -v /data/jenkins/data:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock jenkinsci/blueocean
  1. 将筹备好的 kubectl 工具拷贝到容器外面
# 我的宿主机曾经有 kubectl 二进制包
[root@workhost jenkins]# docker cp /usr/local/bin/kubectl jenkins-ser01:/bin/kubectl

# 拷贝后进入容器查看是否失常执行
bash-5.1# kubectl version
WARNING: This version information is deprecated and will be replaced with the output from kubectl version --short.  Use --output=yaml|json to get the full version.
Client Version: version.Info{Major:"1", Minor:"25", GitVersion:"v1.25.4", GitCommit:"872a965c6c6526caa949f0c6ac028ef7aff3fb78", GitTreeState:"clean", BuildDate:"2022-11-09T13:36:36Z", GoVersion:"go1.19.3", Compiler:"gc", Platform:"linux/amd64"}
Kustomize Version: v4.5.7
  1. 进入容器编译装置 golang

因为 jenkins 镜像是基于 Alpine Linux 的,须要从源代码编译装置 go,不然其它发行版的二进制包是不能间接应用的

# 进入容器
[root@workhost jenkins]# docker exec -it jenkins-ser01 bash

# 编译装置 golang
bash-5.1# export GOARCH=amd64
bash-5.1# export GOOS=linux
bash-5.1# wget https://go.dev/dl/go1.20.4.src.tar.gz
bash-5.1# tar -zxf go1.20.4.src.tar.gz
bash-5.1# apk add --no-cache --virtual .build-deps bash gcc go musl-dev
bash-5.1# export GOROOT_BOOTSTRAP="$(go env GOROOT)" GOHOSTOS="$GOOS" GOHOSTARCH="$GOARCH"
bash-5.1# cd ./go/src
bash-5.1# ./make.bash
bash-5.1# go install std

# 查看版本
bash-5.1# which go
/usr/bin/go
bash-5.1# 
bash-5.1# go version
go version go1.18.7 linux/amd64

# 清理现场和退出容器
bash-5.1# cd /
bash-5.1# rm -rf go go1.20.4.src.tar.gz 
bash-5.1# exit
exit
  1. 从容器提交镜像并推送到 harbor
[root@workhost jenkins]# docker commit jenkins-ser01 192.168.11.254:8081/jenkins/jenkins:20230505v1
sha256:34685da4c262a14229d4aee5de9a294a877f4974c68f2bcff5e57d3f1420f101
[root@workhost jenkins]# docker push 192.168.11.254:8081/jenkins/jenkins:20230505v1
The push refers to repository [192.168.11.254:8081/jenkins/jenkins]
334b6fe88500: Pushing [====>]  78.86MB/838.3MB
18df88a5f0e3: Pushed 
704921b7ee47: Pushing [====================>]  94.57MB/235MB
...
...
  1. 最初就能够删掉这个容器
[root@workhost jenkins]# docker stop jenkins-ser01
jenkins-ser01
[root@workhost jenkins]# docker rm jenkins-ser01
jenkins-ser01
  1. 从制作好的镜像启动 jenkins 容器
[root@workhost jenkins]# docker run -d -u root --name jenkins-ser01 --restart=always -p 8086:8080 -p 50000:50000 -v /data/jenkins/data:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock 192.168.11.254:8081/jenkins/jenkins:20230505v1
a052d6f503d6ef9a90d8cc99bf606daa92b5c890a8bff885d2b189fa1174492a
[root@workhost jenkins]# 
[root@workhost jenkins]# docker ps -a | grep jenk
a052d6f503d6   192.168.11.254:8081/jenkins/jenkins:20230505v1   "/sbin/tini -- /usr/…"   7 seconds ago   Up 6 seconds              0.0.0.0:50000->50000/tcp, :::50000->50000/tcp, 0.0.0.0:8086->8080/tcp, :::8086->8080/tcp                              jenkins-ser01
[root@workhost jenkins]# 
[root@workhost jenkins]# docker exec -it jenkins-ser01 bash
bash-5.1# go version
go version go1.18.7 linux/amd64
bash-5.1# kubectl version
WARNING: This version information is deprecated and will be replaced with the output from kubectl version --short.  Use --output=yaml|json to get the full version.
Client Version: version.Info{Major:"1", Minor:"25", GitVersion:"v1.25.4", GitCommit:"872a965c6c6526caa949f0c6ac028ef7aff3fb78", GitTreeState:"clean", BuildDate:"2022-11-09T13:36:36Z", GoVersion:"go1.19.3", Compiler:"gc", Platform:"linux/amd64"}
Kustomize Version: v4.5.7

构建形式的抉择

在 Jenkins 中,Freestyle Project 和 Pipeline 都是罕用的构建作业类型,它们都能够用来实现自动化构建和继续集成,但它们的利用场景略有不同,还是得提前理解一下:

  • 如果我的项目比较简单,例如只须要执行一些 Shell 命令、构建 Maven 我的项目、执行 Ant 构建等简略操作,那么应用 Freestyle Project 就能够满足需要,因为 Freestyle Project 的配置界面非常简单,能够疾速地实现配置和构建。
  • 如果我的项目比较复杂,例如须要解决多个 Git 仓库、执行多个步骤、分支流程等,那么应用 Pipeline 可能更加适宜,因为 Pipeline 具备灵便的流程控制能力,能够反对简单的我的项目构建过程。同时,Pipeline 也反对以代码的模式进行定义,具备更好的可维护性和可重用性。

倡议依据我的项目的具体需要,抉择应用适宜的构建形式。通过对这两种构建形式的理解,置信你曾经晓得了哪种适合本人了。当然,还有其它的构建形式,比方“多分支流水线”等等,这些当前用到了再去理解吧。

波及到的插件

上面的插件是我当前要用到的,先提前装置好。本次打算先用“自由软件格调我的项目”来公布 goweb 利用,有些插件在本篇还未用到,比方 Pipeline,不过装上也不妨。因篇幅无限,本篇不讲如何装置插件,请自行装置好即可。

  • Kubernetes:提供了在 Jenkins 中治理和部署应用程序到 Kubernetes 集群的能力。
  • Kubernetes CLI:提供了在 Jenkins 中应用 kubectl 命令行工具与 Kubernetes 集群交互的能力。
  • Git:用于在 Jenkins 中集成 Git 版本控制系统。
  • Docker:用于在 Jenkins 中构建和推送 Docker 镜像。
  • Credentials:用于在 Jenkins 中配置和治理 GitLab 和 Harbor 的认证凭据。
  • Config File Provider
  • Pipeline:用于在 Jenkins 中创立和治理流水线(Pipeline)作业。
  • Go:是一个官网反对的 Jenkins 插件,它提供了构建和部署 Go 应用程序的能力。

提醒:如果只须要应用 kubectl 命令行工具与 Kubernetes 集群交互,那么只须要装置 Kubernetes CLI 插件即可。如果须要在 Jenkins 构建管道中应用 Kubernetes 插件提供的更丰盛的性能和 Jenkins 语法来治理 Kubernetes 资源,那么须要装置 Kubernetes 插件。在这里,我先把两个都装置上。

goweb 我的项目构造

[root@workhost goweb]# tree
.
├── Dockerfile
├── go.mod
├── main.go
├── README.md
└── static
    └── login.html
[root@workhost goweb]# 

Dockerfile 代码:

FROM alpine:latest
WORKDIR /app
COPY static /app/static
COPY main /app
EXPOSE 80
CMD ["./main"]

将 dockerfile 和我的项目代码一并提交到 gitlab:

git add .
git commit -m "add code"
git push

提交后:

在 jenkins 公布 goweb

  1. 凭据筹备

配备好 k8s、gitlab、harbor 的凭据

![图片]()

连贯 k8s 的凭据,我间接上传了 kubeconfig 文件:

![图片]()

  1. 创立自在格调的软件我的项目

![图片]()

  1. 在参数化构建选项中筹备好要用到的参数
  • VERSION:这个变量我打算用来作为公布版本的用处,当构建镜像时,会作为镜像的标签
  • HARORB_ADMIN_PASSWD:因为推送镜像时我用到是 shell 命令的形式,登录 harbor 的时候援用这个明码变量
  1. 源码治理,配置 git

这里要留神指定分支,我的是“/main”,在 gitlab 上进入代码仓库里可看到。

  1. 在构建环境中配置连贯 k8s
  1. 构建步骤中配置编译 go 代码

![图片]()

  1. 构建步骤中配置构建镜像和推送镜像

![图片]()

  1. 构建步骤中,配置创立 deployment 和 service
cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: goweb
  name: goweb
spec:
  replicas: 6
  selector:
    matchLabels:
      app: goweb
  template:
    metadata:
      labels:
        app: goweb
    spec:
      containers:
      - image: 192.168.11.254:8081/webdemo/goweb:${VERSION}
        imagePullPolicy: Always
        name: goweb
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: goweb
  name: goweb
spec:
  ports:
  - name: http-port
    port: 5678
    protocol: TCP
    targetPort: 80
    nodePort: 30080
  selector:
    app: goweb
  type: NodePort
  1. 开始运行构建工作

![图片]()

  1. 到 k8s 上查看
[root@k8s-b-master ~]#  kubectl get deployment,pod,svc
NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/goweb   6/6     6            6           73m

NAME                        READY   STATUS    RESTARTS   AGE
pod/goweb-d59b979bb-2xrxm   1/1     Running   0          58s
pod/goweb-d59b979bb-jllgt   1/1     Running   0          56s
pod/goweb-d59b979bb-nd8dl   1/1     Running   0          56s
pod/goweb-d59b979bb-prl7m   1/1     Running   0          55s
pod/goweb-d59b979bb-r5csh   1/1     Running   0          58s
pod/goweb-d59b979bb-t2v5n   1/1     Running   0          58s

NAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)          AGE
service/goweb        NodePort    10.96.6.121   <none>        5678:30080/TCP   55m
service/kubernetes   ClusterIP   10.96.0.1     <none>        443/TCP          8d
[root@k8s-b-master ~]# 
  1. 拜访

最初

本次采纳的是 Freestyle Project 的构建形式,这是最常见,也是比拟传统的形式。下次在 k8s 部署 jenkins 主从架构,并以 Pipeline 的形式来构建公布。

本文转载于 WX 公众号:不背锅运维(喜爱的盆友关注咱们):https://mp.weixin.qq.com/s/yJ6rkYrwn8RAMLt5uCF9mw

退出移动版