2023. 9. 13. 14:20ㆍDev/EKS
nslookup kubernetes.default 10.100.0.10
server can't find kubernetes.default: NXDOMAIN
개발팀에서 새로운 기능을 추가해서 배포를 했는데
I/O error on POST request for “https://messages.dev.example.com/email/v2/messages”: No subject alternative DNS name matching messages.dev.example.com found.
이런 에러가 발생한다고 문의가 왔습니다.
로그를 상세히 찍어봐도 에러 메시지는 비슷했습니다.
No subject alternative DNS name matching messages.dev.example.com found
해당 도메인을 관리하는 Route53에 들어가 봐도 설정 잘 되어있었습니다.
도메인이 가르키는 곳은 다른 AWS 계정의 API GW 서비스의 주소였습니다.
로컬에서 curl 날려봐도 권한에러를 내면서 통신은 되는 것을 확인했습니다.
messages.dev.example.com canonical name = d-1234567890.execute-api.ap-northeast-2.amazonaws.com.
Name: d-1234567890.execute-api.ap-northeast-2.amazonaws.com
Address: 15.164.--.--
Name: d-1234567890.execute-api.ap-northeast-2.amazonaws.com
Address: 15.165.--.--
nslookup messages.dev.example.com
Server: 10.100.0.10
Address: 10.100.0.10#53
Non-authoritative answer:
messages.dev.example.com canonical name = d-1234567890.execute-api.ap-northeast-2.amazonaws.com.
Name: d-1234567890.execute-api.ap-northeast-2.amazonaws.com
Address: 192.168.150.--
Name: d-1234567890.execute-api.ap-northeast-2.amazonaws.com
Address: 192.168.119.--
Name: d-1234567890.execute-api.ap-northeast-2.amazonaws.com
Address: 192.168.139.--
---
aws 지식센터 문서를 보고 해결을 시도했다.
https://repost.aws/ko/knowledge-center/eks-dns-failure
1. CoreDNS 확인
kubectl get service kube-dns -n kube-system
kubectl -n kube-system get endpoints kube-dns
NAME ENDPOINTS AGE
kube-dns 192.168.2.218:53,192.168.3.117:53,192.168.2.218:53 + 1 more... 90d
참고: 엔드포인트 목록이 비어 있는 경우 CoreDNS 포드의 포드 상태를 확인하세요.
-> CoreDNS는 문제 없는것같다.
3. CoreDNS와 통신할 때 보안 그룹 또는 네트워크 액세스 제어 목록(네트워크 ACL)이 포드를 차단하고 있지 않은지 확인합니다.
자세한 내용은 Amazon EKS에서 다른 포드에 내 포드가 연결되지 않는 이유는 무엇입니까?를 참조하세요.
-> 보안그룹을 올오픈으로 변경하고 테스트했지만 문제는 그대로였다.
1. 애플리케이션 포드 내에서 명령을 실행하려면 다음 명령을 실행하여 실행 중인 포드 내의 셸에 액세스 합니다.
$ kubectl exec -it your-pod-name -- sh
애플리케이션 포드에 사용 가능한 셸 바이너리가 없는 경우, 다음과 유사한 오류가 발생합니다.
OCI runtime exec failed: exec failed: container_linux.go:348: starting container process caused "exec: \"sh\": executable file not found in $PATH": unknown
command terminated with exit code 126
디버깅하려면 매니페스트 파일에 사용된 이미지를 busybox 이미지(Docker 웹 사이트)와 같은 다른 이미지로 업데이트합니다.
-> https://github.com/kubernetes/kubernetes/issues/66924
busybox 특정 버전에서 비슷한 에러가 발생한다는 이슈를 확인했다. (나랑 상관없음)
k debug <pod-name> -n <namespace> -it --image=arunvelsriram/utils
나는 이 이미지를 사용해서 테스트했다.
2. kube-dns 서비스의 클러스터 IP가 포드의 /etc/resolv.conf에 있는지 확인하려면 포드 내부의 셸에서 다음 명령을 실행합니다.
cat /etc/resolv.conf
다음 예시 resolv.conf는 DNS 요청에 대해 10.100.0.10을 향하도록 구성된 포드를 보여 줍니다. IP는 kube-dns 서비스의 ClusterIP와 일치해야 합니다.
nameserver 10.100.0.10
search default.svc.cluster.local svc.cluster.local cluster.local ec2.internal
options ndots:5
-> 이 부분은 비슷하게 잘 나왔다.
3. 포드가 기본 ClusterIP를 사용하여 내부 도메인을 확인할 수 있는지 확인하려면 포드 내부의 셸에서 다음 명령을 실행합니다.
nslookup kubernetes.default 10.100.0.10
출력:
Server: 10.100.0.10
Address: 10.100.0.10#53
Name: kubernetes.default.svc.cluster.local
Address: 10.100.0.1
-> 이 부분이 문서와 달라서 스샷을 찍어 커뮤니티에 질문했다.
서비스 생성 전에 생성된 파드는 호스트를 못 찾을 수 있다고 하셔서
디플로이먼트 자체를 새로 배포해 봤지만 문제는 그대로였다.
tcpdump나 ndots 변경, telnet으로 포트 확인, outbound정책 확인 등 방법을 주셨지만 해결이 안 되었다.
그러다가 팀원분께서 비슷한 에러를 겪고 해결한 적이 있다고 하셔서 (이유는 알 수 없고) 해보았는데 해결되었다.
해결 방법은 Coredns의 forward 설정을 변경하는 것이었다.
coredns의 configmap을 확인하고
/etc/resolv.conf 를 1.1.1.1로 수정하였다.
k describe cm coredns -n kube-system
Name: coredns
Namespace: kube-system
Labels: eks.amazonaws.com/component=coredns
k8s-app=kube-dns
Annotations: <none>
Data
====
Corefile:
----
.:53 {
log
errors
health
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
}
prometheus :9153
# forward . /etc/resolv.conf
forward . 1.1.1.1
cache 30
loop
reload
loadbalance
}
이 해결법은 아래 레딧에서 발견하셨다고 했다. (어떻게 찾으신걸까...)
대충 읽어보면 이유는 알 수 없지만
원인은 서로 다른 파드들이 서로 통신하려고 하는 게 아니냐는 추측 정도?
kubectl rollout restart deploy coredns -n kube-system 를 하고
외부로 호출이 안되던 문제는 해결이 됩니다.
그런데 다 끝난 줄 알았지만 멀쩡하던 다른 애플리케이션에서 에러가 발생합니다.
CoreDNS의 forward 설정을 바꾸는 것은 외부 DNS 서버를 이용하는 것이므로
AWS 리소스 내부 호출에서 문제가 생긴 것입니다.
진짜 문제의 원인과 해결 방법은 다음 편에서...
'Dev > EKS' 카테고리의 다른 글
Why EKS ALB Controller fails to create due to lack of AddTag permissions (1) | 2023.09.19 |
---|---|
AWS EKS POD DNS 문제 해결 - Route53 CNAME/A record (0) | 2023.09.13 |
aws eks ALB, NLB error: service Failed build model due to unable to resolve at least one subnet (0) | 2023.08.10 |
ebs-csi-driver volumesnapshot spam log (0) | 2023.07.28 |
Karmada 설치하기 (0) | 2023.06.20 |