AWS CodePipeline и развертывание на EKS
Я работаю над AWS CodePipeline для сборки и развертывания контейнеров в кластере EKS.
Похоже, что AWS CodePipeline не поддерживает действие по развертыванию EKS "только ECS". Я попытался изучить другие варианты, такие как использование лямбда-функции, я нашел приведенный ниже пример для запуска команд kubectl в лямбду
https://github.com/tmuskal/lambda-kubectl
Тем не менее, EKS использует aws-iam-authenticator для генерации токенов для kubeconfig. Не уверен, как это вписывается в лямбда-контекст, хотя.
Любые советы по теме будет принята с благодарностью.
1 ответ
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. Обратитесь к этому для buildspec.
убедитесь, что роль службы, используемая в сборке кода, должна иметь разрешение sts:accept для роли kubernetes_deployment, которая имеет доступ для управления кластером eks.
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam:: <accountno>:role/kubernetes_deployment" } ] }
Обновите доверительные отношения для роли kubernetes_deployment, чтобы разрешить использование роли службы сборки кода.
{ "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
Я использую 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: добавьте учетные данные github в Jenkins и скопируйте сгенерированный идентификатор.
ENV_OVERRIDE_FILE_PATH: файл свойств среды.
HELM_BUCKET: ведро s3 ведро
NAME_OVERRIDE: имя, которое будет передано руководителю