如果有說的不對的地方歡迎指正派草。
1.搭建gitlab-runner(以新版本為例-用authentication token)
初始化環(huán)境
如果你申請的ec2實(shí)例是aws linux instance,配置國內(nèi)的景象會(huì)有奇怪問題蓉坎。所以不必配置澳眷。
yum update后分別安裝docker openjdk python3 aws-cli
sudo yum install docker
sudo yum list | grep java
sudo yum install -y java-1.8.0-openjdk
安裝gradle in linux:
wget ?https://services.gradle.org/distributions/gradle-8.3-bin.zip
unzip gradle-8.3-bin.zip? -d ?/path/to/extracted/folder
如果是在docker容器中胡嘿,需要先安裝unzip命令
apt-get update?
apt-get install -y unzip
安裝gitlab-runner
https://docs.gitlab.com/runner/install/osx.html
管理gitlab-runner服務(wù)的命令需要以sudo身份運(yùn)行蛉艾,比如:
gitlab-runner install/start/stop/status
注冊runner時(shí)要以普通user身份:gitlab-runner register.
注冊完成后要運(yùn)行gitlab-runner run, 否則gitlab控制臺(tái)顯示感嘆號(hào)。
刪除掉所有已注冊的runner命令:sudo gitlab-runner unregister --all-runners
2.用terraform來創(chuàng)建一個(gè)aws ecs cluster服務(wù)網(wǎng)絡(luò)衷敌,提供hello world請求處理勿侯。
參考文章:Create and manage an AWS ECS cluster with Terraform - Architect.io2
需要?jiǎng)?chuàng)建以下tf文件:
詳細(xì)內(nèi)容見我的gitlab:?gitlab-zhaoheting
下面對main.tf的內(nèi)容做詳細(xì)解釋。首先我先畫了個(gè)網(wǎng)絡(luò)架構(gòu)圖缴罗。
1.對LB的域名發(fā)起請求。我們先對LB的域名地址做一個(gè)查詢面氓,發(fā)現(xiàn)當(dāng)前其public IP如圖兵钮。AWS官網(wǎng)的文檔說,不要直接使用LB的public IP舌界,因?yàn)闀?huì)隨著時(shí)間變化掘譬。可以在route53申請一個(gè)你喜歡的域名指向LB的域名呻拌。從我本機(jī)的域名解析截圖來看葱轩,第一次解析了1個(gè)IP,第二次解析了兩個(gè)IP。我猜測Lb背后也是一個(gè)集群靴拱,會(huì)隨訪問流量動(dòng)態(tài)變化垃喊。
2.DNS解析出來的IP交給main route table
3.顯然對該IP的請求會(huì)轉(zhuǎn)交給Internet gateway。接下來由其來做public IP到private IP的轉(zhuǎn)換袜炕。
4.private IP(10.32.****)經(jīng)過路由表查詢規(guī)則
5. 請求可直接交給load balance.
5.LB將請求轉(zhuǎn)發(fā)到private subnet的ecs cluster本谜。(到此位置為處理來自互聯(lián)網(wǎng)請求的全部過程,解下來介紹從ecs內(nèi)發(fā)起對internet資源的請求解析過程)
6.請求的IP交給private route table。
7.到RT種查詢r(jià)ule
8.如果是訪問10.32**偎窘,則直接訪問耕突。
9.其他的交給nat gateway。
private subnet內(nèi)的服務(wù)如果需要訪問internet 需要借助nat IGW评架。所以創(chuàng)建Nat IGW并分配elastic IP眷茁。
EIP detail
10.已經(jīng)申請了EIP的nat gateway將請求轉(zhuǎn)發(fā)給IGW
IGW提供以下兩項(xiàng)功能:Subnet中的流量通過IGW訪問Internet纵诞;public IP到private IP的地址轉(zhuǎn)換上祈。
3.編寫gitlab-ci.yml, 在pipeline中通過terraform控制aws上的資源
gitlab的pipeline中需要到rf的文件路徑下,運(yùn)行以下命令浙芙。注意不能直接terraform apply登刺。因?yàn)樵撁钚枰脩糨斎難es來交互,會(huì)導(dǎo)致pipeline失敗嗡呼。除此之外也建議用plan命令預(yù)覽資源創(chuàng)建情況纸俭。
- terraform init
- terraform validate
- terraform plan -out="tfplan"
- terraform apply "tfplan"
坑:
1.執(zhí)行terraform HCL 來創(chuàng)建ECS時(shí),從ECR種拉取自己賬號(hào)下的image會(huì)報(bào)錯(cuò):
“Fargate requires task definition to have execution role ARN to support ECR images.”
解決方案:
stack overflow:?terraform-fargate-task-definition-requesting-execution-role
AWS official doc:?task_execution_IAM_role
2.每次運(yùn)行g(shù)radle publish時(shí)南窗,通過build.gradle內(nèi)的groovy腳本獲取token揍很,結(jié)果在push 包到code artifact時(shí)經(jīng)常無理由的報(bào)401⊥蛏耍可以修改獲取token的方法窒悔,在pipeline中先將token在runner主機(jī)上設(shè)置成環(huán)境變量,不要每次publish的時(shí)候通過groovy獲取新的token敌买,能解決掉這個(gè)問題简珠。
3. install runner時(shí),以root身份安裝gitlab-runner服務(wù)"sudo gitlab-runner install --user=root",否則如果pipeline中有docker命令會(huì)沒有執(zhí)行權(quán)限(docker好像必須以管理員身份安裝)