AWS CodePipeline 和部署到 EKS
AWS CodePipeline and deployingto EKS
我正在使用 AWS CodePipeline 构建容器并将其部署到 EKS 集群。
似乎 AWS CodePipeline 不支持对 EKS“仅 ECS”的部署操作。我尝试探索其他选项,例如使用 lambda 函数,我在 lambda
中找到了 运行 kubectl 命令的以下示例
https://github.com/tmuskal/lambda-kubectl
尽管如此,EKS 使用 aws-iam-authenticator 来为 kubeconfig 生成令牌。虽然不确定这将如何适合 lambda 上下文。
如有任何关于主题的建议,我们将不胜感激。
我正在使用 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个credentails并复制生成的id。
ENV_OVERRIDE_FILE_PATH:环境特定属性文件。
HELM_BUCKET: helm s3 bucket
NAME_OVERRIDE:要传递给 helm 的名称
AWS 不支持 EKS 的部署操作。但是,可以通过使用代码管道和代码构建来实现,使其持续构建和部署 EKS 集群。需要设置一些 IAM 角色和权限,以允许代码构建到 运行 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
确保在 codebuild 中使用的服务角色应该对 kubernetes_deployment 角色具有 sts:assume 权限,该角色有权管理 eks 集群
{
"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
我正在使用 AWS CodePipeline 构建容器并将其部署到 EKS 集群。
似乎 AWS CodePipeline 不支持对 EKS“仅 ECS”的部署操作。我尝试探索其他选项,例如使用 lambda 函数,我在 lambda
中找到了 运行 kubectl 命令的以下示例https://github.com/tmuskal/lambda-kubectl
尽管如此,EKS 使用 aws-iam-authenticator 来为 kubeconfig 生成令牌。虽然不确定这将如何适合 lambda 上下文。
如有任何关于主题的建议,我们将不胜感激。
我正在使用 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个credentails并复制生成的id。
ENV_OVERRIDE_FILE_PATH:环境特定属性文件。
HELM_BUCKET: helm s3 bucket
NAME_OVERRIDE:要传递给 helm 的名称
AWS 不支持 EKS 的部署操作。但是,可以通过使用代码管道和代码构建来实现,使其持续构建和部署 EKS 集群。需要设置一些 IAM 角色和权限,以允许代码构建到 运行 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
确保在 codebuild 中使用的服务角色应该对 kubernetes_deployment 角色具有 sts:assume 权限,该角色有权管理 eks 集群
{ "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