목차

 

1. 전제 조건

2. fargate 배포 시 고려 사항

3. 샘플 사용하기


1. 전제 조건

아래 내용들을 고려하여 작성한다.

  • private endpoint 사용
  • private ecr 사용
  • private 환경에 접근하여 작업할 수 있는 작업 인스턴스 생성 (기본 세팅 완)
  • vpc endpoint 생성
  • NAT gw 사용
  • namespace와 접근할 iam 을 한번에 관리
  • AWS LBC를 위한 서브넷 태그

2. fargate only 배포 시 고려 사항

2-1. VPC

VPC의 아래 두 옵션은 활성화를 확인해야 한다.

  # Enable DNS resolution
  enable_dns_support   = true

  # Enable DNS hostnames 
  enable_dns_hostnames = true

 

두 옵션은 프라이빗 호스팅 영역에서 DNS 쿼리를 위해 설정하는 값이다. DNS hostname 은 인스턴스에 DNS name 을 부여한다. 이를 통해 인스턴스를 쉽게 찾고 통신할 수 있다. 도메인 이름을 사용하여 VPC 내 리소스를 참조할 수도 있다. DNS resolution은 managed service의 엔드포인트 도메인의 프라이빗 ip 주소를 확인할 때 사용된다.

2-2. fargate profile 과 namespace

Fargate 프로파일은 EKS 클러스터에서 Fargate를 사용하여 파드를 실행하기 위해 필요한 것으로, 파드가 Fargate에서 실행될 수 있게 지정하는 네임스페이스(namespace)와 선택기(selector)를 정의한다.

한마디로, fargate only 환경에서는 생성하고자 하는 namespace의 fargate profile 이 먼저 존재해야 pod 가 올라간다는 의미다.

만약 구성이 되어 있지 않은 상황에서 pod 를 올리게 된다면, fargate 스케쥴러가 fargate profile 확인을 실패하고, 노드 스케쥴러가 재시도하지만, 일반 노드그룹이 없어 계속 pending 상태로 대기한다.

 

2-3. vpc endpoint

일반적으로 private endpoint cluster 를 생성하면, 아래의 vpc endpoint 들을 생성해야 한다.

  • com.amazonaws.ap-northeast-2.s3 (gw)
  • com.amazonaws.ap-northeast-2.ecr.api
  • com.amazonaws.ap-northeast-2.ec2
  • com.amazonaws.ap-northeast-2.ecr.dkr

fargate의 경우 한가지를 더 추가해 주어야 한다. 

  • com.amazonaws.ap-northeast-2.sts

단, ap-northeast-2b에는 vpc endpoint 가 지원되지 않는 경우가 있어, 에러가 날 수 있다. 이 점을 고려해서 코드를 짜야한다.

 

2-4. coreDNS

기본적으로 coreDNS는 워커 노드에 생성된다. eks 를 배포하고 나면 coreDNS의 deployment 는 존재하지만, fargate 위에 생성되지 않는다. 따라서 클러스터에 접근해, deployment 의 설정을 조금 변경해 주어야 한다.

kubectl patch deployment coredns \
    -n kube-system \
    --type json \
    -p='[{"op": "remove", "path": "/spec/template/metadata/annotations/eks.amazonaws.com~1compute-type"}]'

 

그러나 테라폼으로 배포하기 때문에 아래 코드로 바로 적용 시킬 수 있다.

module "eks_cluster" {
  source  = "terraform-aws-modules/eks/aws"
  version = "20.5.1"

  cluster_addons = {
    kube-proxy = {}
    vpc-cni = {
      resolve_conflicts = "OVERWRITE"
    }
    # coreDNS 는 fargate 위에 올라가지 않으므로 설정이 필요함
    coredns = {
      configuration_values = jsonencode({
        computeType = "Fargate"
      })
    }
  }
  
  ... #생략
  
}

2-5. kube-proxy

당연하게도, fargate 에는 daemonset이 올라가지 않는다. (올라가게 된다면 미친듯이 생성되는 roof에 걸릴지도..)

kube-proxy는 daemonset이기 때문에 해당 환경에서는 올라가지 않는다. 그럼 fargate의 네트워크는 어떻게 통신될까? kube-proxy가 아닌 컨트롤 플레인의 fargate 컨트롤러가 맞춰준다고 한다.

3. 샘플 사용하기

위 내용의 샘플 코드를 작성해서 올려두었다.

git clone https://github.com/o-dev-lab/eks-terraform-sample.git

 

권한이 있는 iam 을 가지고 아래 경로에서 배포할 수 있다.

cd samples/private_fargate

aws configure

terraform init 
terraform plan 
terraform apply

 

배포 전, samples/private_fargate/terraform.auto.tfvars 내용을 변경하여 배포 해야 한다.

+ Recent posts