OpenStack에서 구축한 클러스터에 React 및 Express로 구현한 웹 서비스를 배포했다.
NodePort로 접속 시, 접속이 되지 않고 무한 로딩이 걸렸다.
Nginx Log를 확인해보니, 110 connection timed out 오류 였다.
cat /var/log/nginx/error.log
upstream timed out (110: Connection timed out) while reading response header from upstream ...
노드의 DNS 설정 문제였다.
노드의 /etc/resolv.conf 파일이 systemd-resolved를 사용하고 있었다.
하지만, 클러스터의 DNS (10.96.0.10)를 사용하지 않고 있었다.
이로 인해 클러스터 내부 도메인 처리가 되지 않았다.
kubectl run -it --rm --restart=Never --image=busybox:1.28 dns-test -- nslookup kubernetes.default.svc.cluster.local
모든 노드에 직접 resolved.conf 설정에 클러스터 DNS를 추가해주어야 한다.
sudo vi /etc/systemd/resolved.conf
DNS=10.96.0.10
Domains=cluster.local
sudo systemctl restart systemd-resolved
resolvectl status
sudo systemctl restart kubelet
sudo reboot
ubuntu@control-plane:~$ kubectl run -it --rm --restart=Never --image=busybox:1.28 dns-test -- nslookup kubernetes.default.svc.cluster.local
If you don't see a command prompt, try pressing enter.
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
Name: kubernetes.default.svc.cluster.local
Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local
pod "dns-test" deleted
해결!
Front로 접속하기 위한 파드가 8개 떠 있었다.
접속이 되다가 어느 순간 접속이 되지 않고 무한 로딩 문제가 생겼다.
OpenStack으로 가상화된 서버들 중 통신이 되지 않는 서버가 있던 것 같다.
모든 Pod의 IP로 curl을 통해 통신이 되지 않는 노드들을 찾아냈다.
통신이 되지 않는 노드에 파드를 뜨지 않도록 했다.
kubectl label node <노드 이름> avoid=true
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: avoid
operator: NotIn
values:
- "true"
→ spec.template.spec에 추가