2

我正在使用 AWS CodePipeline 构建容器并将其部署到 EKS 集群。

似乎 AWS CodePipeline 不支持对 EKS“仅 ECS”的部署操作。我尝试探索其他选项,例如使用 lambda 函数,我找到了以下在 lambda 中运行 kubectl 命令的示例

https://github.com/tmuskal/lambda-kubectl

尽管如此,EKS 使用 aws-iam-authenticator 来为 kubeconfig 生成令牌。不过,不确定这将如何适应 lambda 上下文。

任何有关主题的建议将不胜感激。

4

2 回答 2

4

AWS 不支持 EKS 的部署操作。但是,可以通过使用代码管道和代码构建来实现 EKS 集群的持续构建和部署。需要设置一些 IAM 角色和权限,以允许 codebuild 运行 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 中创建代码构建,请参考此构建规范

    • 确保在 codebuild 中使用的服务角色应该具有 sts:assume 对 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 角色的信任关系以允许由 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"
        }
     ]
    }
    
  4. 使 kubernetes_deployment 角色在 eks 集群中获得授权

    - rolearn: arn:aws:iam::<account>:role/kubernetes_deployment
      username: kubernetes_deployment
      groups:
       - system:masters
    
于 2019-08-06T07:08:38.830 回答
0

我正在使用 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 的名称

于 2018-10-28T17:41:20.820 回答