EKS로 ArgoCD 구성하기까지

해당 문서는 EKS를 구성하기까지를 문서화하여 저장한다.

EKS Cluster 생성

0. 사전에 필요한 패키지

  • awscli
  • kubectl
  • eksctl
  • helm

1. EKS Cluster 역할 생성

Cluster를 생성할 때 EKS Cluster에 대한 Role이 필요하다. Amazon EKS에서 관리하는 Kubernetes 클러스터는 이 역할을 사용하여 노드를 관리 및 로드밸런서를 생성할 수 있다.

아래와 같이 json으로 생성 가능하며 다른 방향으로는 Console에서 직접 생성 가능

# cluster-trust-policy.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "eks.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
# Role을 생성하는 부분이며 필수적인 신뢰관계를 삽입하는 부분이다.
aws iam create-role
\ --role-name [Cluster_Role_Name_You_Want]
\ --assume-role-policy-document file://"[Name_You_Want].json"
# 생성한 Cluster Role에 AWS 관리형 IAM 정책 연결
aws iam attach-role-policy
\ --role-name [Cluster_Role_Name_You_Created]
\ --policy-arn arn:aws:iam::aws:policy/AmazonEKSClusterPolicy
 
# 실제 예시
aws iam attach-role-policy
\ --role-name eksClusterRole
\ --policy-arn arn:aws:iam::aws:policy/AmazonEKSClusterPolicy

2. Cluster 생성

CLI를 이용하여 Cluster를 생성한다.

# AWSCLI를 이용하여 생성
aws eks create-cluster
\ --name {CLUSTER_NAME}
\ --region ap-northeast-2
\ --kubernetes-version {KUBERNETES_VERSION}
\ --role-arn arn:aws:iam::{ACCOUNT_ID}:role/{CLUSTER_ROLE_NAME}
\ --resources-vpc-config subnetids={SUBNET_ID1},{SUBNET_ID2}, endpointPublicAccess=true, endpointPublicAccess=true
\ --profile {YOUR_PROFILE}
 
# Cluster 생성 내용 확인
aws eks describe-cluster
\ --name {CLUSTER_NAME}
\ --region ap-northeast-2
\ --query "cluster.status" --profile ""
 
# 생성 후 Cluster 등록
aws eks update-kubeconfig
\ --name 
\ --region
\ --profile

3. 환경별 Pod 관리

(1) Fargate

  1. Pod Role 생성

    Pod 인프라에서 Pods를 실행하려면 Amazon EKS AWS Fargate 실행 역할이 필요

    // pod-execution-role-trust-policy.json
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Condition": {
             "ArnLike": {
                "aws:SourceArn": "arn:aws:eks:<EKS-REGION>:{ACCOUNT_ID}:fargateprofile/{CLUSTER_NAME}/*"
             }
          },
          "Principal": {
            "Service": "eks-fargate-pods.amazonaws.com"
          },
          "Action": "sts:AssumeRole"
        }
      ]
    }
    # 생성한 신뢰관계 json 파일을 이용하여 IAM Role 생성 이후 권한 부여
    aws iam create-role
    \ --role-name {CLUSTER_FARGATE_ROLE}
    \ --assume-role-policy-document file://"pod-execution-role-trust-policy.json"
     
    aws iam attach-role-policy
    \ --role-name {CLUSTER_FARGATE_ROLE}
    \ --policy-arn arn:aws:iam::aws:policy/AmazonEKSFargatePodExecutionRolePolicy
  2. Fargate Profile 생성

    Fargate를 이용하여 Pod를 생성하기 위해서는 Fargate Profile을 생성해야 한다. Cluster가 생성될 때 Core-DNS 외 Add-on들이 설치되므로 kube-system에 Pod가 생성될 수 있도록 kube-system 관련 Fargate-Profile이 필요.

    # Fargate를 생성할 Profile을 생성하는 기본 명령어
    aws eks create-fargate-profile --cluster-name {CLUSTER_NAME} --fargate-profile-name {FARGATE_PROFILE_NAME}
    \ --pod-execution-role-arn {CLUSTER_FARGATE_ROLE}
    \ --subnets <SUBNET1>, <SUBNET2>
    \ --selectors 
     
    aws eks create-fargate-profile --cluster-name {CLUSTER_NAME} --fargate-profile-name kube-system
    \ --pod-execution-role-arn {CLUSTER_FARGATE_ROLE}
    \ --subnets {SUBNET_ID1},{SUBNET_ID2}
    \ --selectors kube-system
  3. CoreDNS 재시작 (특정 버전 이후 할 필요 없음)

    # CoreDNS가 생성되는지 확인
    kubectl rollout restart deployment/coredns -n kube-system

(2) Node - 추후 설정

4. Ingress 생성

(1) LB Controller 생성을 위한 사전 작업

# 지정한 iam_policy.json을 현재 폴더에 저장
curl -O <https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.5.4/docs/install/iam_policy.json>
 
# 폴더에 저장한 iam_policy.json을 이용하여 policy 생성
aws iam create-policy --policy-name {LB_POLICY_NAME} --policy-document file://iam_policy.json
 
# OIDC Provider 생성
eksctl utils associate-iam-oidc-provider --region={REGION} --cluster={CLUSTER_NAME} --approve
 
# Cluster Service Account 생성
eksctl create iamserviceaccount --cluster={CLUSTER_NAME} --namespace=kube-system --name=aws-load-balancer-controller --role-name {AWS_LB_CONTROLLER_ROLE} --attach-policy-arn=arn:aws:iam::{ACCOUNT_ID}:policy/{LB_POLICY_NAME} --approve --region {REGION}

OIDC Provider란?

(2) Helm을 이용하여 lb-controller-pod 배포

# 로컬에 eks 라는 repo를 캐싱하여 eks-charts를 pull
# helm repo add <LOCAL-REPO-NAME> <HELM-URI>
helm repo add eks <https://aws.github.io/eks-charts>
 
# pull한 repo를 최신으로 update
# helm repo update <LOCAL-URI>
helm repo update eks
 
# pull한 repo를 이용하여 lb-controller 배포
# helm install <CHART-RELEASE-NAME> <TARGET-CHART> <OPTION>
helm install aws-load-balancer-controller eks/aws-load-balancer-controller -n kube-system --set serviceAccount.create=false --set serviceAccount.name=aws-load-balancer-controller --set vpcId={VPC_ID}
 
# install된 lb-controller 확인
# helm status <CHART-RELEASE-NAME> -n <NAME-SPACE>
helm status aws-load-balancer-controller -n kube-system