【问题标题】:AWS CodePipeline and deployingto EKSAWS CodePipeline 和部署到 EKS
【发布时间】:2019-08-06 15:08:38
【问题描述】:
我正在开发 AWS CodePipeline,用于构建容器并将其部署到 EKS 集群。
AWS CodePipeline 似乎不支持对 EKS“仅 ECS”的部署操作。我尝试探索其他选项,例如使用 lambda 函数,我找到了以下在 lambda 中运行 kubectl 命令的示例
https://github.com/tmuskal/lambda-kubectl
不过,EKS 使用 aws-iam-authenticator 来为 kubeconfig 生成令牌。不过,不确定这将如何适应 lambda 上下文。
任何关于主题的建议都将受到高度赞赏。
【问题讨论】:
标签:
aws-codepipeline
aws-codebuild
amazon-eks
【解决方案1】:
AWS 不支持 EKS 的部署操作。但是,可以通过使用代码管道和代码构建来实现 EKS 集群的持续构建和部署。需要设置一些 IAM 角色和权限,以允许 codebuild 运行 kubectl 并部署在 eks 集群上。
-
需要创建一个角色,比如说 (kubernetes_deployment),它有权允许 EKS 代表您管理集群。
-
附加到 kubernetes_deployment 角色的权限
AmazonEKSClusterPolicy
AmazonEKSServicePolicy
内联政策如下
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "eks:DescribeCluster",
"Resource": "*"
}
]
}
-
在您的 aws 中创建代码构建参考 Refer this for buildspec
-
确保代码构建中使用的服务角色应该具有 sts:assume 对有权管理 eks 集群的 kubernetes_deployment 角色的权限
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::
<accountno>:role/kubernetes_deployment"
}
]
}
-
更新 kubernetes_deployment 角色的信任关系以允许 codebuild 服务角色使用
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<account>:role/service-role/codebuild-service-role",
"Service": "eks.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
-
使 kubernetes_deployment 角色在 eks 集群中获得授权
- rolearn: arn:aws:iam::<account>:role/kubernetes_deployment
username: kubernetes_deployment
groups:
- system:masters
【解决方案2】:
我正在使用 Jenkins POD 进行部署。
流水线脚本:
pipeline {
agent {
kubernetes {
label 'helm-pod'
serviceAccount 'jenkins-helm'
containerTemplate {
name 'helm'
image 'wardviaene/helm-s3'
ttyEnabled true
command 'cat'
}
}
}
stages {
stage('Run helm') {
steps {
container('helm') {
dir('my-app'){
git url: 'git@github.com:myrepo/my-app.git', branch: 'master', credentialsId: 'CREDENTIAL_ID'
}
sh '''
HELM_BUCKET=helm-repo-dev.my-app.k8s.local
PACKAGE=myservichart
NAME_OVERRIDE=my-app
ENV_OVERRIDE_FILE_PATH=my-project/helm-service-override/app-app.prod.values.yaml
export AWS_REGION=eu-west-2
cp -r /home/helm/.helm ~
helm repo add metaservichart s3://${HELM_BUCKET}/charts
IS_DEPLOYED=$(helm list |grep -E "^${NAME_OVERRIDE}" |grep DEPLOYED |wc -l| tr -s " ")
if [ ${IS_DEPLOYED} == 0 ] ; then
helm install --name ${NAME_OVERRIDE} -f ${VALUE_OVERRIDE_FILE_PATH} metaservichart/${PACKAGE}
else
helm upgrade ${NAME_OVERRIDE} -f ${VALUE_OVERRIDE_FILE_PATH} metaservichart/${PACKAGE}
fi
echo "deployed!"
'''
}
}
}
}
}
CREDENTIAL_ID:在 Jenkins 中添加 github credendtails 并复制生成的 id。
ENV_OVERRIDE_FILE_PATH:环境特定的属性文件。
HELM_BUCKET:掌舵 s3 桶
NAME_OVERRIDE:要传递给 helm 的名称