Search
✏️

[TroubleShooting] Taint w.CoreDNS

Date
2025/03/14
Category
Devops
Tag
Kubernetes
AWS
목차

문제 개요

배포 환경

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 문제 등으로 인해 애플리케이션이 정상 동작하지 않을 수 있다.

참고