CICD- 自动部署应用到EKS

2021-07-02 16:37

此解决方案能帮我们做什么?

此套方案可以帮助我们监测Github上传新的代码,并将代码打包成Docker Image上传到ECR,并把镜像部署到EKS去进行更版。

架构图如下:

图片1.jpg

1.    用户将新代码上传到Github

2.    触发CodePipeline

3.    CodePipline调用Codebuild

4.    Codebuild根据Github中的Buildspec.yml文件进行构造,并将构造好的镜像上传到ECR

5.    Codebuild使用自身的Roleassume 能操作EKSRole,以此来获得权限。

6.    Codebuild最后更新Deployment.yml中的镜像,并使用更新后的Deployment.ymlapplyEKS 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 clusteraws-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(此步骤是将IAMK8S的用户关联,这样IAM Role就能对EKS进行操作)

图片2.png

4.    再为CodeBuild创建一个Role,这个Role需要有:

i.       STS的权限, Codebuild会去assume EKSRole,让自己有权限去执行EKS部署的命令

ii.     S3的权限,Codebuild会将构造的结果保存在S3

iii.   ECR的权限,Codebuild会将Docker image上传到ECR

创建ECR镜像仓库

1.    切换到ECR服务,创建镜像仓库

图片3.png

图片4.png

2.    创建完成后,记下来镜像库的URI

图片5.png

创建CodePipeline

1.    切换到CodePipeline服务,创建新的Pipeline

图片6.png

2.    选择创建一个新的role

图片7.png


3.    连接到自己的Github账号,选择代码仓库和分支

图片8.png

4.    跳转到创建一个Codebuild项目

图片9.png

图片10.png


5.    角色选择我们事先创建好的Codebuildeks-cicd-codebuild角色

图片11.png­


6.    开启日志,方便后期追踪Error

图片12.png


7.    Codebuild创建好后,切换回CodePipeline,并为Codebuild添加环境变量(这些变量是buildspec.yml中需要用到的)

图片13.png

需要添加参数到CodeBuild,具体如下:

REPOSITORY_NAMEECR仓库的名称)

REPOSITORY_BRANCH (仓库分支)

REPOSITORY_URIECR仓库的链接)

EKS_KUBECTL_ROLE_ARNEksWorkshopCodeBuildKubectlRoleARN

EKS_CLUSTER_NAME EKS集群名称)

ENVIRONMENT_NAME(环境名称,用来区分docker镜像的Tag

8.    本实验是使用CodeBuild直接部署镜像到EKS,所以可以直接跳过Pipeline中的Deploy stage

图片14.png

­图片15.png

9.    可以看到,CodePipeline已经开始构建镜像了

图片16.png


测试

测试CICD

那我们尝试访问一下Deployment,本次实验使用的是托管的ELB作为Service,所以直接访问ELB的域名即可。

图片17.png

可以看到,Github中的代码已经跑在了EKS集群中。

那我们去Github仓库上传一些新代码,看能否自动将之前的Deployment版本替换掉

图片18.png


代码上传成功后,查看Codepipeline状态,构建成功后再次访问ELBService,可以看到,新代码又自动跑在了EKS集群中图片19.png

参考资料

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/



云代理伙伴
扫描关注微信公众号
获取更多云端资讯
联系我们
——

模板表单-2(1)

  • 姓名*

  • 电话*

  • 邮箱*

  • 职称*

  • 公司*

  • 地址*

  • 需求*

  • * 点击提交,即表示您同意我们存储和处理您提交的个人信息,以向您提供所请求的内容,该信息仅供公司提供服务使用。您的信息受到相关法律的安全保护。