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.

  1. Необходимо создать роль, скажем (kubernetes_deployment), которая имеет разрешение, позволяющее EKS управлять кластерами от вашего имени.

    • Разрешение, привязанное к роли kubernetes_deployment

      AmazonEKSClusterPolicy

      AmazonEKSServicePolicy

      встроенная политика, как показано ниже

      {
        "Version": "2012-10-17",
        "Statement": [
         {
           "Sid": "VisualEditor0",
           "Effect": "Allow",
           "Action": "eks:DescribeCluster",
           "Resource": "*"
         }
       ]
      }
      
  2. Создайте кодовую сборку в своем 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"
               }
             ]
            }
      
  3. Обновите доверительные отношения для роли 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"
        }
     ]
    }
    
  4. Сделайте роль 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: имя, которое будет передано руководителю

Другие вопросы по тегам