본문 바로가기

Kubernetes(k8s)/TroubleShooting

트러블슈팅

1.        Trouble Shooting

 

Kubernetes에 배치된 CoreDNS Pod가 루프를 감지하면 CoreDNS Pod는 "CrashLoopBackOff"로 시작한다. Kubernetes는 CoreDNS가 루프를 감지하고 나올 때마다 Pod를 다시 시작하려고 하기 때문이다.

 

[admin@ubu22-01 ~ (kubernetes-admin@cluster.local:kube-system)]$ kgp
NAME                                      READY        STATUS      RESTARTS        AGE   IP               NODE       NOMINATED NODE   READINESS GATES
...

nodelocaldns-gbbh4                        1/1     CrachLoopBackOff   0             14s   192.168.100.40   ubu22-02   <none>           <none>
nodelocaldns-m8pwg                        1/1    
CrachLoopBackOff   0             21s   192.168.100.50   ubu22-03   <none>           <none>
nodelocaldns-rx5pf                        1/1    
CrachLoopBackOff   0             17s   192.168.100.30   ubu22-01   <none>           <none>

 

쿠버네티스 클러스터에서 루프를 포워딩하는 일반적인 원인은 호스트 노드의 로컬 DNS 캐시(예: systemd-resolved)와의 상호작용이다.

예를 들어, 특정 구성에서 systemd-resolved는 루프백 주소 127.0.0.53을 네임 서버로 /etc/resolv.conf에 넣는다.

 

admin@ubu22-02:~/Desktop$ cat /etc/resolv.conf
---

...
nameserver 127.0.0.53
options edns0 trust-ad
search .

...

 

기본적으로 쿠버네티스는 기본적으로 이 /etc/resolv.conf 파일을 기본 DNS 정책을

사용하여 모든 포드에 전달하여 DNS 검색을 수행할 수 없게 한다. (여기에는 CoreDNS

Pods도 포함된다.) CoreDNS는 요청을 포워딩할 업스트림 목록으로 이 /etc/resolv.conf를

사용한다. 루프백 주소를 포함하므로 CoreDNS는 결국 자신에게 요청을 포워딩한다.

 

이 문제를 해결하는 데는 여러 가지 방법이 있으며, 다음과 같은 몇 가지 방법이 나열되어

있다.

다음을 kubelet 구성 yaml: resolvConf: <path-to-your-real-resolv-conf-file>(또는 명령줄

플래그 --resolv-conf는 1.10에서 사용되지 않음)에 추가한다. "진짜" resolv.conf는

업스트림 서버의 실제 IP가 포함된 주소이며 로컬/루프백 주소는 없다.

 

[admin@ubu22-01 ~/Documents (kubernetes-admin@cluster.local:kube-system)]$ cat /etc/systemd/resolved.conf
---
[Resolve]
DNS=169.254.25.10

DNS=8.8.8.8  # DNS를 추가해주면 loop를 빠져 나올 수 있다.
FallbackDNS=
Domains=
#LLMNR=no
#MulticastDNS=no
DNSSEC=no
Cache=no-negative
#DNSStubListener=yes

...

 

이 플래그는 kubelet이 대체 resolv.conf를 Pods에 전달하도록 알려준다.

systemd-resolved를 사용하는 시스템의 경우 일반적으로

/run/systemd/resolv/resolv.conf 경로가 "real" resolv.conf의 위치이지만 분포에 따라 다를

수 있다.

 

[admin@ubu22-01 ~/Documents (kubernetes-admin@cluster.local:kube-system)]$ cat /run/systemd/resolve/resolv.conf
---

...
nameserver 169.254.25.10
nameserver 8.8.8.8

# 시스템 데몬의 설정이다. 리부트 시 값이 기본 설정으로 돌아올 수 있다.
search .

...

 

호스트 노드에서 로컬 DNS 캐시를 사용하지 않도록 설정하고 /etc/resolv.conf 파일을 원상태로 복원한다. 수정은 코어 파일을 편집하여 forward . /etc/resolv.conf를 업스트림 DNS의 IP 주소(예: forward .8.8.8)로 바꾸는 것이다. 그로인해 CoreDNS의 문제만 해결되고, kubelet은 잘못된 resolv.conf 파일을 모든 기본 DNS 정책 포드에 계속 전달하므로 DNS를 확인할 수 없다.

 

[admin@ubu22-01 Documents (kubernetes-admin@cluster.local:kube-system)]$ kgp
NAME                                          READY   STATUS    RESTARTS        AGE     IP               
.........
ubu22-01   <none>           <none>
kube-proxy-r7wfm                              1/1     Running   4 (3h19m ago)   2d23h   192.168.100.130   ubu22-03   <none>           <none>
kube-scheduler-ubu22-01                       1/1     Running   6 (3h19m ago)   2d23h   192.168.100.128   ubu22-01   <none>           <none>
kubernetes-dashboard-7bd65c8b9d-d2wsk         1/1     Running   7 (3h19m ago)   2d23h   10.233.109.34     ubu22-03   <none>           <none>
kubernetes-metrics-scraper-7588fd8cb8-l98gr   1/1     Running   0               90m     10.233.84.78      ubu22-01   <none>           <none>
nginx-proxy-ubu22-02                          1/1     Running   5 (82m ago)     2d23h   192.168.100.129   ubu22-02   <none>           <none>
nginx-proxy-ubu22-03                          1/1     Running   4 (3h19m ago)   2d23h   192.168.100.130   ubu22-03   <none>           <none>
nodelocaldns-bfwr4                            1/1     Running   6 (3h19m ago)   18h     192.168.100.128   ubu22-01   <none>           <none>
nodelocaldns-gchb7                            1/1     Running   3 (82m ago)     18h     192.168.100.129   ubu22-02   <none>           <none>
nodelocaldns-pvfxc                            1/1    
crashloopbackoff   2 (3h19m ago)   18h     192.168.100.130   ubu22-03   <none>           <none>

 

[admin@ubu22-01 Documents (kubernetes-admin@cluster.local:kube-system)]$ k delete pod nodelocaldns-pvfxc
pod "nodelocaldns-pvfxc" deleted

# 위 설정 후 crashloopbackoff 상태의 노드 pod를 삭제한다.

 

[admin@ubu22-01 Documents (kubernetes-admin@cluster.local:kube-system)]$ kgp
NAME                                          READY   STATUS    RESTARTS        AGE     IP                NODE       NOMINATED NODE   READINESS GATES
...............
   ubu22-01   <none>           <none>
kube-proxy-r7wfm                              1/1     Running   4 (3h25m ago)   2d23h   192.168.100.130   ubu22-03   <none>           <none>
kube-scheduler-ubu22-01                       1/1     Running   6 (3h25m ago)   2d23h   192.168.100.128   ubu22-01   <none>           <none>
kubernetes-dashboard-7bd65c8b9d-d2wsk         1/1     Running   7 (3h25m ago)   2d23h   10.233.109.34     ubu22-03   <none>           <none>
kubernetes-metrics-scraper-7588fd8cb8-l98gr   1/1     Running   0               96m     10.233.84.78      ubu22-01   <none>           <none>
nginx-proxy-ubu22-02                          1/1     Running   5 (88m ago)     2d23h   192.168.100.129   ubu22-02   <none>           <none>
nginx-proxy-ubu22-03                          1/1     Running   4 (3h25m ago)   2d23h   192.168.100.130   ubu22-03   <none>           <none>
nodelocaldns-bfwr4                            1/1     Running   6 (3h25m ago)   18h     192.168.100.128   ubu22-01   <none>           <none>
nodelocaldns-gchb7                            1/1     Running   3 (88m ago)     18h     192.168.100.129   ubu22-02   <none>           <none>
nodelocaldns-5z96g                            1/1    
Running   0                4s     192.168.100.130   ubu22-03   <none>           <none>