인프라/시스템 구축

[ EKS ] External-DNS

김붕어87 2023. 3. 31. 15:56
반응형
개요
External-DNS 이란?
외부 도메인서버(AWS, Route53, 기타 DNS 등)를 사용해서 쿠버네티스의 리소스 쿼리를 할 수 있게 도와주는 솔루션이다.
외부 도메인서버에 Record를 등록, 삭제 할 수 있게 도와준다.
쿠버네티스가 ALB를 생성하면서 Route53에 Record도 자동으로 등록해준다.

 

 

 

 

 

 

[ IAM 권한 설정 3가지 방법 ]

external-dns가 route53에 Record를 등록하려면 IAM 권한 설정이 필요하다.

권한 설정 방법은 3가지로 나뉜다.

 

[ External-DNS Install ]

  • AWS IAM (policy, role) 부터 설치해야합니다. 
  • policy, role yaml 파일 위치 :

 

 

1. policy 생성 (terraform code으로 생성)

 
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "route53:ChangeResourceRecordSets"
      ],
      "Resource": [
        "arn:aws:route53:::hostedzone/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "route53:ListHostedZones",
        "route53:ListResourceRecordSets"
      ],
      "Resource": [
        "*"
      ]
    }
  ]
}

 

2. Role 생성 (terraform code으로 생성)

변수로 되어있는 부분을 내용으로 변경해서 넣어야합니다.
$ACCOUNT : AWS Account ID 값으로 변경해서 넣어야합니다.
$OIDC_PROVIDER : EKS OIDC 값으로 변경해서 넣어야합니다.

-----------------------------------------------

ACCOUNT_ID=$(aws sts get-caller-identity \
  --query "Account" --output text)
  
OIDC_PROVIDER=$(aws eks describe-cluster --name $EKS_CLUSTER_NAME \
  --query "cluster.identity.oidc.issuer" --output text | sed -e 's|^https://||')
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::$ACCOUNT:oidc-provider/$OIDC_PROVIDER"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringEquals": {
                    "$OIDC_PROVIDER:aud": "sts.amazonaws.com",
                    "$OIDC_PROVIDER:sub": "system:serviceaccount:kube-system:external-dns"
                }
            }
        }
    ]
}

 

 

 

3. external-dns repository 정보

helm repo add bitnami https://charts.bitnami.com/bitnami
helm pull bitnami/external-dns
  • GitHub 위치 :

 

4. external-dns - values.yaml 수정

txtOwnerId: "xxx" # route53 Domain ID 값

serviceAccount:

    annotations: {eks.amazonaws.com/role-arn: arn:aws:iam::xxx:role/external-dns-role}

     # external-dns role ARN 주소 값

 

 

5. external-dns 배포

helm upgrade --install external-dns . -f values.yaml -n kube-system

 


[ external-dns 설치 후 확인 ]

  • ServiceAccount external-dns 내용 확인
    • annotations: 
            eks.amazonaws.com/role-arn: arn:aws:iam::xxx:role/external-dns-role 값 확인
# 확인 명령어
kubectl get sa -n kube-system  external-dns -o yaml

 

  • POD 확인
kubectl get pod -l app.kubernetes.io/name=external-dns -n kube-system

 

 

 


[ external-dns 옵션 설명 ]

  • policy : route53에 record 권한 설정 부분
    upsert-only : 레코드셋 생성,업데이트 (삭제 불가능)
    sync : 레코듯셋 생성,업데이트,삭제
    create-only: 레코드셋 생성 (삭제, 업데이트 불가능)
  • txt-owner-id
    > AWS Route53에서 Hostzon ID 값 넣는 곳
    > AWS Route53에서 관리할 도메인 설정 부분

  • sources
    • service
    • ingress
    • istio-gateway
    • istio-virtualservice

 

 

반응형

'인프라 > 시스템 구축' 카테고리의 다른 글

[ EKS ] aws-efs-csi-driver  (0) 2023.03.31
[ EKS ] metrics-server  (0) 2023.03.31
[ EKS ] Aws LoadBalancer Controller  (0) 2023.03.31
[ AWS ] VPN + TGW  (0) 2023.02.14
[ AWS ] NTH(Node Termination Handler)  (0) 2023.02.13