此套方案可以帮助我们监测Github上传新的代码,并将代码打包成Docker Image上传到ECR,并把镜像部署到EKS去进行更版。
架构图如下:
1. 用户将新代码上传到Github
2. 触发CodePipeline
3. CodePipline调用Codebuild
4. Codebuild根据Github中的Buildspec.yml文件进行构造,并将构造好的镜像上传到ECR中
5. Codebuild使用自身的Role去assume 能操作EKS的Role,以此来获得权限。
6. Codebuild最后更新Deployment.yml中的镜像,并使用更新后的Deployment.yml去apply到EKS Cluster中
1. 创建IAM role
2. 创建CodeBuild
3. 创建ECR
4. 创建CodePipeline
5. 测试CICD流程
您需要提前创建好:
1. 自己的EKS集群,并添加Node group,
2. Github中的代码仓库,及buildspec.yml,可以参考此实验中的配置文件。
创建IAM role
此方案需要创建两个Role:
i. 在EKS Cluster中部署Deployment 时需要使用一个Role, 此方案中我们将其命名为EksWorkshopCodeBuildKubectlRole。
ii. 给CodeBuild使用,此方案中叫eks-cicd-codebuild,并且这个Role会去assume EksWorkshopCodeBuildKubectlRole
Note:可以使用如下命令创建Role(需要使用一台EC2,并安装AWSCLI,最好使用同一个admin user来操作):
1. 创建第一个Role,其中标黄的ACCOUNT_ID需要改为自己的AWS账号:
TRUST="{\"Version\": \"2012-10-17\", \"Statement\": [ {\"Effect\": \"Allow\", \"Principal\": {\"AWS\": \"arn:aws:iam:: ACCOUNT_ID:root\" }, \"Action\":\"sts:AssumeRole\" } ] }"
echo '{"Version": "2012-10-17", "Statement": [ {"Effect": "Allow", "Action": "eks:Describe*","Resource": "*" } ] }' > /tmp/iam-role-policy
aws iam create-role--role-name EksWorkshopCodeBuildKubectlRole --assume-role-policy-document"$TRUST" --output text --query 'Role.Arn'
aws iam put-role-policy--role-name EksWorkshopCodeBuildKubectlRole --policy-name eks-describe--policy-document file:///tmp/iam-role-policy
2. 接下来,我们需要将这个Role添加到EKS cluster的aws-auth ConfigMap中,让这个Role能有操作cluster的权限
ROLE=" - rolearn: arn:aws:iam:: ACCOUNT_ID:role/EksWorkshopCodeBuildKubectlRole\n username: build\n groups:\n - system:masters"
kubectl get -nkube-system configmap/aws-auth -o yaml | awk "/mapRoles: \|/{print;print\"$ROLE\";next}1" > /tmp/aws-auth-patch.yml
kubectl patchconfigmap/aws-auth -n kube-system --patch "$(cat/tmp/aws-auth-patch.yml)"
3. 查看下EKS kube-system中的aws-auth ConfigMap是否成功关联了IAM Role(此步骤是将IAM和K8S的用户关联,这样IAM Role就能对EKS进行操作)
4. 再为CodeBuild创建一个Role,这个Role需要有:
i. STS的权限, Codebuild会去assume EKS的Role,让自己有权限去执行EKS部署的命令
ii. S3的权限,Codebuild会将构造的结果保存在S3
iii. ECR的权限,Codebuild会将Docker image上传到ECR
1. 切换到ECR服务,创建镜像仓库
2. 创建完成后,记下来镜像库的URI
1. 切换到CodePipeline服务,创建新的Pipeline
2. 选择创建一个新的role
3. 连接到自己的Github账号,选择代码仓库和分支
4. 跳转到创建一个Codebuild项目
5. 角色选择我们事先创建好的Codebuild的eks-cicd-codebuild角色
6. 开启日志,方便后期追踪Error
7. Codebuild创建好后,切换回CodePipeline,并为Codebuild添加环境变量(这些变量是buildspec.yml中需要用到的)
需要添加参数到CodeBuild,具体如下:
REPOSITORY_NAME(ECR仓库的名称)
REPOSITORY_BRANCH (仓库分支)
REPOSITORY_URI(ECR仓库的链接)
EKS_KUBECTL_ROLE_ARN(EksWorkshopCodeBuildKubectlRole的ARN)
EKS_CLUSTER_NAME (EKS集群名称)
ENVIRONMENT_NAME(环境名称,用来区分docker镜像的Tag)
8. 本实验是使用CodeBuild直接部署镜像到EKS,所以可以直接跳过Pipeline中的Deploy stage
9. 可以看到,CodePipeline已经开始构建镜像了
那我们尝试访问一下Deployment,本次实验使用的是托管的ELB作为Service,所以直接访问ELB的域名即可。
可以看到,Github中的代码已经跑在了EKS集群中。
那我们去Github仓库上传一些新代码,看能否自动将之前的Deployment版本替换掉
代码上传成功后,查看Codepipeline状态,构建成功后再次访问ELBService,可以看到,新代码又自动跑在了EKS集群中
1. https://github.com/haozhiyu/eks-workshop-sample-api-service-go
2. https://www.youtube.com/watch?v=icgLCi7umWM
3. https://www.eksworkshop.com/intermediate/220_codepipeline/codepipeline/