본문 바로가기
공부/Kubernetes

[external-dns/ingress-nginx] NodePort 타입 external LB를 external dns CNAME으로 등록되게 하기

by haejang 2024. 4. 18.
728x90
728x90

 

# 상황

- ingress-nginx 를 LB타입으로 만들어 사용하다가, 일부 필수 옵션이 예상과 다르게 동작한 경우가 발생 > 하필 production이라 장애가 발생

- ingress-nginx chart의 service annotation만으로 중요 production LB들을 관리하기는 무리라고 판단.

- stage / prod 인프라의 동일성을 보장하기 위해서라도 ingress-nginx 앞단의 LB를 별도 IaC로 관리하기로 결정.

- IaC로 관리하는 별도 LB 를 사용하기 위해서는, ingress-nginx controller 자체는 NodePort로 오픈되어야만 한다. (ClusterIP는 클러스터 내부에서만 찌를 수 있고, LB는 별도 lb를 만들어버리고, ExternalName은..아예 다른 서비스이므로 패스)

- 따라서 IaC(Terraform)으로 관리하는 LB 구성 후 ingress-nginx를 nodeport로 expose함으로써 구성은 끝.

- 마지막 남은 문제 하나가... external dns였다.

 

# external dns가 왜 문제인가

external-dns는 ingress의 host들을 각 ingress controller에 연결된 lb로 dns record를 만들어준다. (나는 route53 사용)

그러나 ingress controller가 노드포트인 경우, external-dns 입장에서는 해당 ingress controller에 관해 내가 외부에서 연결해둔 lb의 주소를 알 수 있을리가 없다. (실제로 노드의 ip로 a record가 등록됨)

물론 ingress 단위에서 아래 어노테이션으로도 external-dns의 레코드 등록을 제어할 수 있다.

external-dns.alpha.kubernetes.io/target: ${external LB DNS}

 

그러나 한 클러스터 내에서도 여러 ingress controller가 혼재중인 내 상황에서는 저렇게 하나하나 lb 주소를 달아주고 있을 수 없었다.

내가 원한건 controller단위 또는 ingressClass단위로 lb dns를 등록해두면 될것같은데,,,, 막상 찾아보니 레퍼가 너무 없었다.

 

나처럼 nodeport를 써야하는데 external-dns를 사용하지 못해 고통받고 있는 사람들이 전세계에 꽤나 있었는데,

대부분 이슈의 경우 "그냥 LB타입으로 쓰셈. NodePort 왜씀?" 으로 종결되고 있었다.

그리고 해결했다는 사람들도 종종 있었지만, 자세하게 설명해준 사람은 정말 한명도 없었다....

 

# 해결

그나마 아래 이슈에서 힌트를 찾았다.

https://github.com/kubernetes-sigs/external-dns/issues/2717

 

Support setting external-dns.alpha.kubernetes.io/target on IngressClass · Issue #2717 · kubernetes-sigs/external-dns

What would you like to be added: Currently, this is how external-dns determines what hostname/IP to put in the DNS record that it creates for ingresses: external-dns/source/ingress.go Lines 175 to ...

github.com

 

결론적으로는, --publish-status-address 라는 옵션을 통해 ingress-nginx controller 단위에서 publish될 lb 주소를 지정할 수 있다.

helm chart에선 아래 값들을 설정해주면 된다.

controller:
  publishService:
    enabled: false
  extraArgs:
    publish-status-address: ${external LB DNS}

 

 

https://github.com/kubernetes-sigs/external-dns/issues/1899#issuecomment-2062714467

고통받는 사람들에게 댓글로 알려주기도 했다.

 

끝.

 

 

728x90
728x90

댓글