概述
此篇文章演示一个完整的GitOps工作流程,使用Gitlab-CI+ArgoCD来实现,其中Gitlab-CI主要用于实现代码编译、镜像构建、修改部署的yaml文件。ArgoCD用于将修改后的部署yaml文件推送到各个集群中。
软件 |
版本 |
Gitlab |
13.7.0 |
ArgoCD |
1.8.1 |
Kubernetes |
1.17.4 |
整体流程
1、将应用代码和构建Docker镜像的Dockerfile文件放置到Gitlab对应项目中
2、在Gitlab中创建用于专门用于存放部署yaml的项目
3、配置Gitlab-CI用于代码编译镜像构建和业务yaml文件修改
4、配置ArgoCD检测存放部署yaml的项目,有更新后自动部署到对应环境中
Gitlab配置
以一个Go-server项目为例
代码文件
server.go文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| package main
import ( "fmt" "log" "net/http" )
func hello(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello world") }
func main() { http.HandleFunc("/", hello) if err := http.ListenAndServe(":8080", nil); err != nil { log.Fatal(err) } }
|
Dockerfile文件
1 2 3 4 5
| FROM golang:alpine WORKDIR /go ADD server /go CMD ["./server"]
|
在gitlab中创建proc-yaml的项目,用于集中存放到Kubernetes集群中的业务的yaml文件
在proc-yaml项目中创建go-server项目的文件夹,专门存放go-server项目的yaml文件
deployment.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| apiVersion: apps/v1 kind: Deployment metadata: name: go-demo labels: app: go-demo spec: replicas: 1 selector: matchLabels: app: go-demo template: metadata: labels: app: go-demo spec: containers: - name: go-demo image: 172.16.1.31/library/go-server-demo:63 ports: - containerPort: 8080 --- apiVersion: v1 kind: Service metadata: name: go-demo spec: type: NodePort selector: app: go-demo ports: - port: 8080 targetPort: 8080 nodePort: 30007
|
Gitlab-CI配置
Gitlab-CI配置和基本使用可以参考本博客的Gitlab-CI时用章节
这里体现的主要是和之前的差异性部分
Gitlab-CI环境变量配置
主要添加连接镜像仓库和代码仓库的凭证
创建.gitlab-ci.yml文件,用于配置gitlab-ci
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| stages: - package - docker_build - modify_yaml build_job: image: golang:alpine stage: package tags: - k8s-runner script: - go build server.go artifacts: paths: - /builds/root/go-server docker_build_job: image: docker:19.03.0 services: - name: docker:19.03.0-dind command: ["--insecure-registry=0.0.0.0/0","--registry-mirror=https://vqgjby9l.mirror.aliyuncs.com"] variables: DOCKER_HOST: tcp://127.0.0.1:2375 DOCKER_TLS_CERTDIR: "" stage: docker_build tags: - k8s-runner script: - docker info - docker login -u $REGISTRY_USERNAME -p $REGISTRY_PASSWORD 172.16.1.31 - docker build -t 172.16.1.31/library/go-server-demo:$CI_PIPELINE_ID . - docker push 172.16.1.31/library/go-server-demo:$CI_PIPELINE_ID modify_yaml: image: wanshaoyuan/git-client:v1.0 stage: modify_yaml tags: - k8s-runner script: - git clone http://$GIT_USERNAME:$GIT_PASSWORD@172.16.1.184/root/proc-yaml.git - git config --global user.email "root@example.com" - git config --global user.name "root" - git remote set-url origin http://$GIT_USERNAME:$GIT_PASSWORD@172.16.1.184/root/proc-yaml.git - sed -i "s/go-server-demo:.*/go-server-demo:$CI_PIPELINE_ID/g" proc-yaml/go-server/deployment.yaml - cd proc-yaml/ - git add * - git commit -m "update go-server" - git push origin master
|
主要包含3个阶段,代码编译阶段、镜像构建阶端、部署yaml文件修改阶段
代码编译阶段:启动一个编译容器,根据代码编译出对应的制品,这里为了能让下个镜像构建阶段直接使用编译好的制品,需要配置artifacts将目录共享给下个阶段。
镜像构建阶段:使用DinD的方式构建Docker镜像,然后镜像tag以我们Pipeline的ID为tag,这里好处在于可以根据对应的Pipeline的迅速定位到对应的镜像版本
部署yaml修改阶段: 通过git命令将对部署yaml项目的repo clone下来然后通过sed进行修改并commit回去,通过此步ArgoCD检测到变化后会拉取新的yaml进行部署
ArgoCD配置
在ArgoCD中配置对接pro-yaml的repo认证
创建App
选择自动同步模式
PATH这配置我们go-server这个项目的路径,就会检测这里面的yaml文件,并自动更新到集群中
最后创建完成
测试
修改server.go的Hello world为Hello Argo
等待git-ci执行
检查proc-yaml项目是否更新
可以看见对应的image的tag修改成了,我们实际上Pipeline的ID
等待片刻后ArgoCD检测到yaml变化,自动部署,此时Kubernetes中应用进行了自动更新
访问
1 2
| curl 192.168.0.6:30007 Hello argo
|
总结
通过GitlabCI与ArgoCD结合确实非常方便的将我们应用进行部署到Kubernetes中,并且后续也非常容易进行回滚,在之前通过Gitlab-CI中集成kubectl镜像,进行部署容易造成kubeconfig文件的泄漏,也不方便做权限的管理和应用状态控制,但结合ArgoCD后一切都美好了起来。