강의

멘토링

로드맵

Inflearn Community Q&A

lkh559135217's profile image
lkh559135217

asked

CloudNet@ - Amazon EKS Extended Edition Course

[Lab] Lab Overview and Basic Infrastructure Deployment - 2

ch1 external-dns pod 관련 버전 오류와 해결 방법 후 추가 오류 사항

Resolved

Written on

·

23

·

Edited

1

[ 문제 식별 ]

테라폼 배포 후 pod 상태를 확인하니 external-dns pod 가 ImagePullBackOff 상태였습니다

(myeks:N/A) root@myeks-bastion-EC2:~# kubectl describe pod external-dns-7dc878c-jpd77 -n kube-system

...

Events:
  Type     Reason     Age                  From               Message
  ----     ------     ----                 ----               -------
  Normal   Scheduled  10m                  default-scheduler  Successfully assigned kube-system/external-dns-7dc878c-jpd77 to ip-192-168-3-186.ap-northeast-2.compute.internal
  Normal   Pulling    7m57s (x5 over 10m)  kubelet            Pulling image "docker.io/bitnami/external-dns:0.12.0-debian-11-r3"
  Warning  Failed     7m56s (x5 over 10m)  kubelet            Failed to pull image "docker.io/bitnami/external-dns:0.12.0-debian-11-r3": rpc error: code = NotFound desc = failed to pull and unpack image "docker.io/bitnami/external-dns:0.12.0-debian-11-r3": failed to resolve reference "docker.io/bitnami/external-dns:0.12.0-debian-11-r3": docker.io/bitnami/external-dns:0.12.0-debian-11-r3: not found
  Warning  Failed     7m56s (x5 over 10m)  kubelet            Error: ErrImagePull
  Normal   BackOff    38s (x43 over 10m)   kubelet            Back-off pulling image "docker.io/bitnami/external-dns:0.12.0-debian-11-r3"
  Warning  Failed     38s (x43 over 10m)   kubelet            Error: ImagePullBackOff

 

ch1 테라폼 코드에서 eks-external-dns 모듈 내 버전이 1.2.0 으로 지정되어있는데 해당 버전은 bitnami 레포에서 이미지를 사용합니다.

 

bitnami 레포에 들어가보니 더이상 해당 이미지를 무료로 제공하지 않는다고 나오네요 ㅜ

 

그래서 lablabs/eks-external-dns/aws1.2.1 버전에 merge 된 pr 내용을 보니

bitnami -> kubernetes-sig 로 변경되었다고 나오고 있어서 1.2.1 버전으로 변경했고 해결되었습니다.

 

[ 해결 방안 ]

eks.tf 내 eks-external-dns 모듈 내용을 아래처럼 수정하고 적용했습니다.

module "eks-external-dns" {
  source  = "lablabs/eks-external-dns/aws"
  version = "1.2.1"

  cluster_identity_oidc_issuer     = module.eks.cluster_oidc_issuer_url
  cluster_identity_oidc_issuer_arn = local.cluster_oidc_issuer_arn

  irsa_assume_role_arns = []

  depends_on = [helm_release.aws_load_balancer_controller]
}

irsa_assume_role_arns 는 1.2.1 부터 필요로해서 비워두고 생성했습니다.

 

그리고 pod 생성, running 상태 확인했습니다.

(myeks:N/A) root@myeks-bastion-EC2:~# kubectl get pods -A
NAMESPACE     NAME                                           READY   STATUS    RESTARTS   AGE
kube-system   aws-load-balancer-controller-9774b5bf9-fd6wb   1/1     Running   0          61m
kube-system   aws-load-balancer-controller-9774b5bf9-mltpg   1/1     Running   0          61m
kube-system   aws-node-6c6d5                                 2/2     Running   0          73m
kube-system   aws-node-mqxqd                                 2/2     Running   0          73m
kube-system   aws-node-p2hcg                                 2/2     Running   0          73m
kube-system   coredns-7bb47d475b-k9dfl                       1/1     Running   0          73m
kube-system   coredns-7bb47d475b-q5m9n                       1/1     Running   0          73m
kube-system   external-dns-745b66b8d6-vrhjk                  1/1     Running   0          11m
kube-system   kube-proxy-gbwf9                               1/1     Running   0          73m
kube-system   kube-proxy-rmdcd                               1/1     Running   0          73m
kube-system   kube-proxy-txm2x                               1/1     Running   0          73m

 

혹시나 pod 상태보다 궁금하신 분 있을까해서 Q&A 에 올립니다!

[ 추가 오류 ]

위 구성 후 실습 진행 중 2가지 오류가 발생했습니다.

  1. kubernetes-sig pod 내 bash shell 없음

     

(myeks:default) root@myeks-bastion-EC2:~# kubectl exec -it deploy/external-dns -n kube-system -- bash
error: Internal error occurred: Internal error occurred: error executing command in container: failed to exec in container: failed to start exec "8270eecee52a2fc8d4f16a986c88cf9ecc8d852258d6f1a88ac680a6f95510d6": OCI runtime exec failed: exec failed: unable to start container process: exec: "bash": executable file not found in $PATH: unknown

 

  1. external-pod 로그를 보니 권한 관련 오류 발생 중

time="2025-10-10T11:55:27Z" level=error msg="Failed to do run once: soft error\nrecords retrieval failed: soft error\nfailed to list hosted zones: operation error Route 53: ListHostedZones, https response error StatusCode: 403, RequestID: 881c4bac-1a87-4454-b2c3-2657680fb2d0, api error AccessDenied: User: arn:aws:sts::{제거}:assumed-role/external-dns-irsa-external-dns/1760097326486557347 is not authorized to perform: route53:ListHostedZones because no identity-based policy allows the route53:ListHostedZones action"              
time="2025-10-10T11:56:27Z" level=error msg="Failed to do run once: soft error\nrecords retrieval failed: soft error\nfailed to list hosted zones: operation error Route 53: ListHostedZones, https response error StatusCode: 403, RequestID: 7d915626-3e26-4491-a53a-7ac3c5d4b024, api error AccessDenied: User: arn:aws:sts::{제거}:assumed-role/external-dns-irsa-external-dns/1760097326486557347 is not authorized to perform: route53:ListHostedZones because no identity-based policy allows the route53:ListHostedZones action"

kubernetes-sig 이미지를 사용해서 인지 2가지 문제가 있습니다.

 

eks-external-dns 모듈 내 irsa_assume_role_arns 에 값을 넣어봐도 로그는 동일하게 출력되네요.

 

ch1 실습의 파드 쉘은 다른 파드를 사용하면 될 것 같은데 이후 ch5 까지 과정에 external-dns 가 사용되는지 모르겠네요,,

 

다른 해결 방법이 있을까요??

 

[ 추가 오류 2 해결 방안 ]

IAM external-dns-irsa-external-dns role 을 확인하니 권한 부여가 안되어 있었습니다.

 

inline policy 로 route53 으로 권한 연결을 해줬고 이후 레코드 생성 가능한 것 확인했습니다.

 

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

테라폼에서 json 파일로 권한 생성이 안되는 것 같은데 이유를 모르겠어서 일단 요렇게하고 수동으로 하고 넘어갔습니다.

awskubernetessecurityobservabilityeks

Answer 2

1

ongja님의 프로필 이미지
ongja
Instructor

안녕하세요. CloudNet@ 팀입니다.

우선 감기로 인해 정신이 없어서.. 해당 질문 확인 시점이 늦어졌네요.

양해 말씀드립니다.

 

external-dns 관련해서 문제점과 해결법까지 제시해 주셔서 감사합니다.

저도 히스토리를 따라가 보니 terraform external-dns module 버전 변경이 불가피해 보이네요.

 

조치 사항으로 대체 모듈을 찾거나 최적화 작업을 수행하려고 했는데 생각해보니 external-dns가 eks add-on으로 편입되었습니다.

eks에서 add-on으로 지속 관리하니 환경적인 이슈나 호환성은 해소될 것으로 기대되네요.

 

참고로 external-dns가 eks add-on으로 공식 지원한 시점이 2025년 3월 31일부터 입니다.

현재 구성된 eks k8s 버전인 1.32에서도 정상적으로 지원합니다. (아래)

aws eks describe-addon-versions --addon-name external-dns --kubernetes-version 1.32 --query "addons[].addonVersions[].addonVersion" --output table

------------------------
| DescribeAddonVersions|
+----------------------+
|  v0.19.0-eksbuild.2  |
|  v0.19.0-eksbuild.1  |
|  v0.18.0-eksbuild.2  |
|  v0.18.0-eksbuild.1  |
|  v0.17.0-eksbuild.2  |
|  v0.17.0-eksbuild.1  |
|  v0.16.1-eksbuild.2  |
|  v0.15.1-eksbuild.1  |
+----------------------+

 

[조치 사항]

1. 기존 terraform module로 external-dns를 설치하는 부분을 제거

2. terraform eks module에서 cluster_addons로 external-dns 설치

...
module "eks" {
  source  = "terraform-aws-modules/eks/aws"
  version = "~>20.0"

  cluster_name = var.ClusterBaseName
  cluster_version = var.KubernetesVersion
  cluster_endpoint_private_access = false
  cluster_endpoint_public_access  = true

  cluster_addons = {
    coredns = {
      most_recent = true
    }
    kube-proxy = {
      most_recent = true
    }
    vpc-cni = {
      most_recent = true
    }
    external-dns = {
      most_recent = true
    }
  }
...

 

3. 변경 사항으로 external-dns 파드의 네임 스페이스 위치가 kube-system에서 external-dns으로 변경

=> 네임 스페이스를 기존 kube-system으로 변경하려 했지만 별도의 인자가 존재하지 않네요. 그래서 기본 값으로 유지했습니다.

(myeks:default) root@myeks-bastion-EC2:~# k get pod -A
NAMESPACE      NAME                                           READY   STATUS    RESTARTS   AGE
external-dns   external-dns-577b6488b-46sgn                   1/1     Running   0          44m
kube-system    aws-load-balancer-controller-9774b5bf9-sqm69   1/1     Running   0          44m
kube-system    aws-load-balancer-controller-9774b5bf9-wkpjl   1/1     Running   0          44m
kube-system    aws-node-lbtm5                                 2/2     Running   0          44m
kube-system    aws-node-q62nr                                 2/2     Running   0          44m
kube-system    aws-node-tg5cg                                 2/2     Running   0          44m
kube-system    coredns-7bb47d475b-8f55v                       1/1     Running   0          44m
kube-system    coredns-7bb47d475b-ls4q6                       1/1     Running   0          44m
kube-system    kube-proxy-5gmlz                               1/1     Running   0          44m
kube-system    kube-proxy-cv694                               1/1     Running   0          44m
kube-system    kube-proxy-cxgt7                               1/1     Running   0          44m

 

4. 말씀주신대로 변경된 컨테이너 빌드는 최소화된 형태로 별도의 셸이 포함하지 않습니다.

=> 꼭 external-dns가 아니라 파드에 kubectl exec로 접근할 때 세션 정보를 보는 것이라 별도의 테스트 파드로 확인하도록 변경했습니다. (EKS Hands-On 반영)

 

5. 현재 add-on을 통해 구성된 external-dns 파드의 로그 상 에러가 발생하지 않습니다.

=> 보내주신 로그는 권한 이슈로 irsa 구성 이슈 같은데, 어떤 환경 때문인지 알긴 어렵네요. 현재 add-on을 통한 구성은 알아서 권한을 정의해서 정상 동작합니다.

 

6. 변경 사항에 대한 terraform 코드는 git에 반영했고, EKS Hands-On 페이지도 적절한 문구를 삽입했습니다.

 

이슈 사항 제보 및 해결 점까지 제시해 주시점 다시 한 번 감사합니다.

lkh559135217님의 프로필 이미지
lkh559135217
Questioner

오 add on 으로 추가되어 이를 사용할 수 있었군요!

주말에 몸 상태 안좋으신데도 확인해주셔서 감사드립니다
얼른 쾌유하시기 바래요!

확인 감사드립니다!! 😄

0

안녕하세요, 인프런 AI 인턴입니다. 이강훈님께서 External DNS Pod의 ImagePullBackOff 오류와 관련하여 문의를 주셨네요. Terraform 모듈 내 버전 관리와 관련하여 이미지 pull에서 발생한 문제 원인과 해결 방안을 알려주셔서 감사합니다. 동일한 문제를 겪으시는 다른 수강생분들에게 큰 도움이 될 것 같습니다.

문제 원인

이 오류는 bitnami 레포지토리에서 더 이상 해당 이미지를 무료 제공하지 않기 때문에 발생한 것입니다. 이로 인해 Terraform 모듈 설정에서 구 버전을 사용하면서 생긴 문제로 볼 수 있습니다.

해결 방안

  • 모듈 버전 업데이트: 모듈 내 eks-external-dns 버전을 1.2.0에서 1.2.1로 변경하여 문제를 해결할 수 있습니다. 이를 통해 bitnami 레포지토리에서 kubernetes-sig로 이미지 소스를 변경할 수 있습니다.

  • Terraform 코드 수정: 아래와 같이 eks.tf 에 설정을 변경하셨습니다.

  module "eks-external-dns" {
    source  = "lablabs/eks-external-dns/aws"
    version = "1.2.1"

    cluster_identity_oidc_issuer     = module.eks.cluster_oidc_issuer_url
    cluster_identity_oidc_issuer_arn = local.cluster_oidc_issuer_arn

    irsa_assume_role_arns = []

    depends_on = [helm_release.aws_load_balancer_controller]
  }
  • Pod 상태 확인: 위 변경 사항을 반영한 후 kubectl get pods -A 명령어를 실행해서, Pod가 성공적으로 실행되고 있음을 확인하였습니다.

관련 내용은 lablabs/eks-external-dns 모듈의 1.2.1 버전에 merge된 PR 내용을 참조하시면 도움이 됩니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 해결 방법을 제시하였습니다. 새로운 버전을 적용하여 이미지를 불러오는 데 성공하셨다니 다행입니다.

현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

lkh559135217's profile image
lkh559135217

asked

Ask a question