如果有说的不对的地方欢迎指正。
1.搭建gitlab-runner(以新版本为例-用authentication token)
初始化环境
如果你申请的ec2实例是aws linux instance,配置国内的景象会有奇怪问题。所以不必配置。
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服务的命令需要以sudo身份运行,比如:
gitlab-runner install/start/stop/status
注册runner时要以普通user身份:gitlab-runner register.
注册完成后要运行gitlab-runner run, 否则gitlab控制台显示感叹号。
删除掉所有已注册的runner命令:sudo gitlab-runner unregister --all-runners
2.用terraform来创建一个aws ecs cluster服务网络,提供hello world请求处理。
参考文章:Create and manage an AWS ECS cluster with Terraform - Architect.io2
需要创建以下tf文件:
详细内容见我的gitlab: gitlab-zhaoheting
下面对main.tf的内容做详细解释。首先我先画了个网络架构图。
1.对LB的域名发起请求。我们先对LB的域名地址做一个查询,发现当前其public IP如图。AWS官网的文档说,不要直接使用LB的public IP,因为会随着时间变化。可以在route53申请一个你喜欢的域名指向LB的域名。从我本机的域名解析截图来看,第一次解析了1个IP,第二次解析了两个IP。我猜测Lb背后也是一个集群,会随访问流量动态变化。
2.DNS解析出来的IP交给main route table
3.显然对该IP的请求会转交给Internet gateway。接下来由其来做public IP到private IP的转换。
4.private IP(10.32.****)经过路由表查询规则
5. 请求可直接交给load balance.
5.LB将请求转发到private subnet的ecs cluster。(到此位置为处理来自互联网请求的全部过程,解下来介绍从ecs内发起对internet资源的请求解析过程)
6.请求的IP交给private route table。
7.到RT种查询rule
8.如果是访问10.32**,则直接访问。
9.其他的交给nat gateway。
private subnet内的服务如果需要访问internet 需要借助nat IGW。所以创建Nat IGW并分配elastic IP。
EIP detail
10.已经申请了EIP的nat gateway将请求转发给IGW
IGW提供以下两项功能:Subnet中的流量通过IGW访问Internet;public IP到private IP的地址转换。
3.编写gitlab-ci.yml, 在pipeline中通过terraform控制aws上的资源
gitlab的pipeline中需要到rf的文件路径下,运行以下命令。注意不能直接terraform apply。因为该命令需要用户输入yes来交互,会导致pipeline失败。除此之外也建议用plan命令预览资源创建情况。
- terraform init
- terraform validate
- terraform plan -out="tfplan"
- terraform apply "tfplan"
坑:
1.执行terraform HCL 来创建ECS时,从ECR种拉取自己账号下的image会报错:
“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.每次运行gradle publish时,通过build.gradle内的groovy脚本获取token,结果在push 包到code artifact时经常无理由的报401。可以修改获取token的方法,在pipeline中先将token在runner主机上设置成环境变量,不要每次publish的时候通过groovy获取新的token,能解决掉这个问题。
3. install runner时,以root身份安装gitlab-runner服务"sudo gitlab-runner install --user=root",否则如果pipeline中有docker命令会没有执行权限(docker好像必须以管理员身份安装)