如何使用GitLab部署asp.Net Core到 Kubernetes Engine 以实现 CI/CD
之前的文章有介绍过DevOps的概念与方法(什么是DevOps?谷歌开展DevOps的SRE方法介绍!),接下来我们开始介绍实操的工具。巿面上有很多受欢迎的版本控制工具(其实 Google 也有),本文就介绍一下知名的GitLab,以及如何使用GitLab部署 Kubernetes Engine 达成CI/CD的效果,整个流程如下:GitLab CICD deploy DotNetCore to
之前的文章有介绍过DevOps的概念与方法(什么是DevOps?谷歌开展DevOps的SRE方法介绍!),接下来我们开始介绍实操的工具。巿面上有很多受欢迎的版本控制工具(其实 Google 也有),本文就介绍一下知名的GitLab,以及如何使用GitLab部署 Kubernetes Engine 达成CI/CD的效果,整个流程如下:
GitLab CICD deploy DotNetCore to GKE
- 建立GitLab Server
- 设定环境
- 建立一个Gitlab Project
- 使用范例 .Net Core 程序码 Commit 到GitLab
- 触发 CI/CD 流程来建立 Docker Image,存放在 GCR 并且部署到 GKE
本文流程较长,使用工具很多,需要您先有的知识如下:
- 对 GCP 有初步了解,会建VM并操作SSH
- 对GitLab和Git有初步了解,会Commit程序码
- 对 Kubernetes 了解一点点即可
为什么要提这么多呢?因为实操过程中有很多坑,每个坑掉进去要花好几个小时才能爬出来,我尽可能把陷阱都提示了,但实在太多太琐碎所以不会 step-by-step来详细说明。
Gitlab 安装方式可以参考这篇文章:https://docs.gitlab.com/ee/install/google_cloud_platform/
建立GitLab Server
首先建立一台机器,如果只是测试不用开太大的机器:
建立VM机器
指定作业系统为 Ubuntu 18.04 LTS,Disk 大小建议最少30GB以上,下图10GB是自己当初没想到,给自己埋的雷……(你看到后面就知道了)
使用Ubuntu 18.04作为GitLab VM
查看下防火墙有没有凭证,如果没有只要开放HTTP就好:
防火墙开放HTTP(s)
等机器建好会拿到一个IP,强烈建议使用固定IP,本人不在知情的状况下使用临时IP,埋了第二个雷……
安裝GitLab
现在我们直接从GCP的SSH按钮连接去这台主机,直接看这文件安裝就对了: https://about.gitlab.com/install/#ubuntu
先装一些相依性的東西:
sudo apt-get update
sudo apt-get install -y curl openssh-server ca-certificates tzdata
接下來裝 postfix
sudo apt-get install -y postfix
它会引导到另一个页面,询问邮件设定的问题:
选择Internet Site
设定GitLab的postfix
这里确认主机名称,如果您是在GCP建的,它应该会自己带资料出来,按OK即可。
确认VM的主机名称
终于要开始装GitLab了。用以下指令下载 Gitlab:
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.deb.sh | sudo bash
下载GitLab安装档
接下来文件上是这样写的,记得要改成你的domain或是IP位址:
sudo EXTERNAL_URL=”https://gitlab.example.com” apt-get install gitlab-ee
像我就是输入这样:
sudo EXTERNAL_URL=”http://35.185.135.182” apt-get install gitlab-ee
不用想入侵我的主机,该IP已不存在~嘿嘿~
接下来看它表演,我是说它会开始执行安装流程:
安装GitLab
大概5分钟后会有欢迎页面
安装成功
接下来点击VM 的 IP, 用 HTTP 就好。
GitLab欢迎页面
相关环境设定,按照一般流程注册自己的帐号:
因为GitLab 会Build 一个 Docker Image,存在 Cloud Storage,之后也要拉 Image出來,并且部署到 Google Kubernetes Engine,需要两个权限:
- Storage Admin
- Kubernetes Enginer Developer
所以我们必需要建立一个Service Account:
建立service account
赋予权限:
授权 Service Account 让 GitLab 存取 GCR 并部署 GKE
不需要增加其他权限,直接按 Done:
另外也要给它一个key
下载service account key
把key用Json格式下载下來:
下载service account key用来跑CI/CD
重新命名service account key
接下来要设定 CI/CD 环境变数,我们先回到GitLab主画面,建立第一个 GitLab Project:
命名,並且把project 设定为 Private,按下Create Project:
(后面我的Project Name有更改,因为反复联系了很多次)
GitLab Project 命名
它会显示你现在不能 Push 程序码,因为还没有 SSH Key
那我们就回到本机 (等等写程序要Push Code的那台电脑),像我是Mac电脑的话,就输入以下指令:
- cd .ssh #去放有 ssh key的.ssh目录 (这里我假设你已经有了)
- cat id_rsa.pub #查看ssh key 的内容
查看ssh key的内容
然后复制从 “ssh-rsa”一直到你的 “email@xxx.com” 为止,黏贴到GitLab project 的 User Setting => SSH Keys
接下来回到首页,可以看到第一次push code的教学:
在本机照着做看看,设定使用者:
在本机设定使用者
把Project拉下來
把 Project 从 GitLab 拉下来
这里要补充一下,为了安全,我有设GCP的防火墙只允许公司的IP去连,所以就不能直接点 GCP Console 的SSH,而是要从我本机电脑去SSH,所以我要把SSH Key放在VM上。
把本机电脑的SSH Key放在VM上
接下来就用基本指令來 push 看看:
push成功
确认 code push上去之后,回到GitLab页面重新整理,看到 README.md 出现了。
确认 Push GitLab 结果
到此 GitLab的环境设定完成。
CI/CD 环境设定
接下来就是重头戏了,CI/CD环境设定,我们先到 Project 的Setting=>CI/CD页面,新增一些环境变数,因为我们要做自动化,所以为了让它真正做到全自动,就必须把环境变数设定好,不要嫌麻烦,之后就很轻松了
首先是 GCP_SERVICE_KEY,相关的选项照以下的方式设定:
注意:Protect variable 要取消,不要打勾!!
GCP_PROJECT
GCP_ZONE
GCP_CLUSTER_NAME
我们先把 GKE Cluster的名字预先想好,设为环境变数。当然你要先建也沒问题。
gcloud container clusters create cluster-1 –num-nodes 2 –machine-type n1-standard-1 –zone asia-east1-a
如果您只是要测试,就不用先急著先建 Cluster,会浪费钱
GCP_GCR
最后是这样
做 docker build的设定档 .gitlab-ci.yml (注意这是第一版)
注意:环境变数还要要补上这两行,以免 Runner 出错 (坑出现了,后面会解释)
另外的 service account key 要放在home目录,您的Mac电脑本身的home目录
而且要改名为 service_account.json
接下来把 http://asp.Net的范例程式码抓下来,来源网址为:dotnet-docker/samples/aspnetapp at main · dotnet/dotnet-docker
因为等等要 Push Code之后会触发 CI/CD 流程,就先做到这里,我们还有另一个重要的东西要做。
注册GitLab Runner
在GitLab的说明上会教你如何安装并注册Runner,我后来依照指引到这个网址来安装 Ubuntu 的 Runner:
Install GitLab Runner using the official GitLab repositories | GitLab
我先登入到 GitLab 这台 VM,使用以下指令:
https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash
下载完执行安装指令:
sudo apt-get install gitlab-runner
GitLab Runner 安装之后,还需要向 GitLab Server 完成注册,才算是真正的架设完毕。注册的方式即是执行下面的 Command:
sudo gitlab-runner register
接下来回有一连串的问答
接下来是 Enter the registration token ,这个 token 会在 GitLab project的 setting => CI/CD页面会看得到。
然后名字就任意输入即可:
过程中我有碰到网络问题让我注册失败,后来发现是GitLab要允许它自己的IP连线,所以我后来去改了防火墙规则:
整个注册过程如下,还包括一些额外的问题:
注意:如果你中间有重开机的话,Token 会重新产生,所以要用新的Token重新注册一次喔!(坑又来了)
整个注册过程也可以用指令一口气先写好如下(后面注解要去掉):
sudo gitlab-runner register -n \
–url http://你的VM的IP或网址/ \
–registration-token “FR7pk-GQwBavt7zysFYs” \ 注意token重开机会换掉,要重新注册
–executor docker \
–description “you can write anything” \
–docker-image “docker:19.03.12” \ 用这个版本比较好
–docker-privilege true 有指定这个,就不用改 config.toml 的 value 为 true (后面再说明)
Push Code以触发CI/CD 流程
环境已经设定得差不多了,真的是差不多而已,开始run会发现还差很多。
一跑马上错,它说沒有 Runner ,但我明明明明刚才注册好可能沒有?
后来发现是没有装 Docker,原来最基本的Docker都还没装~
可参考这个网址,回到GitLab的SSH,一直复制贴上就对了:
Install Docker Engine on Ubuntu
接下来就再跑一次,然后又看到另一个错误~
它连到我旧的IP (已经释放掉了),所以一直出错:
为什麽会这样呢?因为我当初建VM的时候,使用的是 Ephermeral (临时) 的IP,每次重开机它都会换一个新的IP,而我在做初始化设定时,GitLab会记录那个IP到它的设定档裡面,但我每次重开机换新IP的时候,GitLab并不知道,这算是一个大坑啊!!
好在,后来找到这篇文章可以解决:
要去 vim /etc/gitlab/gitlab.rb
找到 external_url “https://gitlab.example.com”
改成
然后输入 sudo gitlab-ctl reconfigure 让它重新跑一次设定:
大概跑了两分钟
GitLab网页会出错,不用担心,它需要整个重启,等它开好:
等它重启完成,我们再按一次 Retry 的按钮:
又看到另一个错误:
这个前面有提过,它是和Docker版本的问题有关,要回去改 .gitlab-ci.yaml
加这2行:
然后再push上去
另外还有一个地方,
/etc/gitlab-runner/config.toml 要把 runner 的 privileged 改成 true
你也可以在注册 runner 时指定 –docker-privilege true (前面有提过)
还有环境变数要取消 Protect Variable 的勾勾,不然还是会出错!
后来再 retry ,有看到错误,但它的状态还是在 running,此时不要紧张,等它全部跑完……
因为目前VM只有1core,大概等了半个小时
有上GCR耶??
但我的cluster其实还没建,所以它只做好 build 好image,还没deploy到GKE,这是正常的。
你想想看,前面错误一堆,都花时间在troubleshooting,根本都用不到GKE,如果当时就开好Cluster,看看现在帐单多少钱??(这叫做坑钱)
现在可以建Cluster了。
gcloud container clusters create cluster-1 –machine-type n1-standard-1 –num-nodes 2 –zone asia-east1-b
然后啊……
所以我才说VM在建的时候,Disk调大一点,后来我改成30GB。
你可以在不关机器的情况下加大!
但你还是要在机器裡面做 resize才算(其实步骤很多),参考这个: Creating and attaching a disk | Compute Engine Documentation
我顺便把GitLabe调成 n1-standard2 (2core 7.5GB),不然每次跑好久最后才看到错误,太浪费时间了!对了,重开机要再重新注册Runner喔!
好了,再retry一次吧!
它的页面refresh很慢,不要急。
看到这个,好感动!!
真的部署好了!
这里我总结一下五大巨坑:
建GitLab要用固定IP,否则每次重开机又换新IP。
每次建新GitLab project要重新设定环境变数和Runner。
每次重开机都要重新注册Runner,参数要跟着调整。
要确保内存够大,避免事后调整浪费时间。
GKE Cluster等到 Image 部署到GCR再建就好,不用晾在那边累积帐单。
详细的设定可以来这里看:
https://gitlab.com/kevin354/gitlab-iis-k8s-deploy-sample
作者:Aaron Le'e
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)