如何使用GitLab部署asp.Net Core到 Kubernetes Engine 以实现 CI/CD

之前的文章有介绍过DevOps的概念与方法(什么是DevOps?谷歌开展DevOps的SRE方法介绍!),接下来我们开始介绍实操的工具。巿面上有很多受欢迎的版本控制工具(其实 Google 也有),本文就介绍一下知名的GitLab,以及如何使用GitLab部署 Kubernetes Engine 达成CI/CD的效果,整个流程如下:

GitLab CICD deploy DotNetCore to GKE

  1. 建立GitLab Server
  2. 设定环境
  3. 建立一个Gitlab Project
  4. 使用范例 .Net Core 程序码 Commit 到GitLab
  5. 触发 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,需要两个权限:

  1. Storage Admin
  2. 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并不知道,这算是一个大坑啊!!

好在,后来找到这篇文章可以解决:

Modify the GitLab host name

要去 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值