목차
문제 개요
배포 환경
•
VPC 내 Public Subnet과 Private Subnet 구성
•
각 Subnet에 EKS Cluster에 대한 Node 배치 및 Taint 설정
•
Private Subnet에 RDS와 ElastiCache 구축
•
Private Subnet에 위치한 Node에 Spring-Boot 애플리케이션 배포
증상
•
애플리케이션 Pod의 상태가 CrashLoopBackOff 또는 Error 상태로 지속
•
로그에는 JDBC 연결 실패 메시지가 나타나며 RDS와의 통신 실패
초기 확인 사항
•
애플리케이션 설정: application.properties 파일 작성 오류 의심 → 확인 결과 이상 없음
•
보안 그룹: RDS와 Kubernetes 노드 간의 보안그룹 의심 → 보안 그룹 설정에 문제가 없으며, telnet 테스트도 정상적으로 통신됨
•
컨테이너 이미지: EC2에서 Docker 환경으로 애플리케이션이 정상 동작 → 보안그룹 및 애플리케이션 설정, 컨테이너 이미지 모두 이상 없음을 확인
문제 원인 분석
1.
CoreDNS Pod 스케줄링 실패
•
클러스터 내의 kube-system 네임스페이스에서 CoreDNS Pod가 Pending 상태로 남아있음
•
kubectl describe 명령어를 통해 확인한 결과, 모든 노드에 taint가 설정되어 있어 CoreDNS와 같은 시스템 파드가 스케줄링되지 못하고 있는 문제 발생
Warning FailedScheduling 86s (x225 over 21h) default-scheduler
0/6 nodes are available: 3 node(s) had untolerated taint {node-type: private},
3 node(s) had untolerated taint {node-type: public}.
SQL
복사
2.
클러스터 Taint 정책
•
클러스터 내에서 워크로드 taint를 부여하여, 특정 노드에만 특정 파드가 스케줄링되도록 설정함
•
이로 인해 시스템 파드인 CoreDNS가 toleration 없이 스케줄링되지 못함
해결 과정
1. 문제 진단 및 대안 검토
•
가능한 해결 방안:
1.
taint를 private 노드에만 유지
•
public과 private의 구분은 이뤄지지만, private 노드에 스케줄링이 불가능한 경우 private 파드가 다른 노드에 스케줄링되어 보안 문제가 발생할 수 있음 (참조:
2.
CoreDNS에 tolerations 적용
•
CoreDNS Deployment에 public, private 노드에 대한 tolerations를 추가하여 모든 노드에서 스케줄링이 가능하도록 변경
3.
taint가 없는 노드 추가 구성
•
추가 리소스가 필요하므로 비용 및 관리 측면에서 비효율적
•
선택한 해결 방법:
◦
CoreDNS에 tolerations를 추가하는 방법을 선택
2. CoreDNS Deployment 수정
a.
현재 상태 확인 및 YAML 파일 저장
kubectl -n kube-system get deployment coredns -o yaml > coredns-deployment.yaml
Bash
복사
b.
YAML 파일 수정
spec.template.spec 부분에 tolerations 항목 추가
spec:
template:
spec:
tolerations:
- key: "node-type"
operator: "Exists"
effect: "NoSchedule"
- key: "node-type"
operator: "Exists"
effect: "NoExecute"
YAML
복사
c.
수정된 YAML 파일 적용
kubectl -n kube-system apply -f coredns-deployment.yaml
Bash
복사
3. 확인 및 애플리케이션 재배포
•
CoreDNS의 Pod 상태가 Pending에서 Running으로 변경된 것을 확인
•
이후 애플리케이션을 재시작하여 DB 연결이 정상적으로 이뤄지는지 확인
kubectl rollout restart deployment cinebox-app -n dev
Bash
복사
•
애플리케이션 로그를 통해 RDS와의 연결이 정상적으로 이루어졌음을 확인
결론
•
Kubernetes 클러스터에서 모든 노드에 taint 설정이 되어있을 경우, 시스템 파드도 스케줄링 대상이 되므로 적절한 tolerations를 설정해야 한다.
•
시스템 파드가 스케줄링되지 않으면 클러스터 내부 DNS 문제 등으로 인해 애플리케이션이 정상 동작하지 않을 수 있다.