Kubernetes 리드·아키텍트 트러블슈팅 면접
새 면접Q. 프로덕션 클러스터의 특정 노드들에서 컨테이너가 CrashLoopBackOff 상태로 반복 재시작되고 있습니다. 동일한 이미지가 다른 노드에서는 정상 작동하며, kubectl logs에서는 'exec format error' 또는 segmentation fault가 간헐적으로 발생합니다. 컨테이너 런타임 레벨의 문제를 진단하고 해결하는 체계적인 접근 방법을 설명해주세요.
노드별 차이점(커널 버전, 런타임 버전, CPU 아키텍처)과 컨테이너 런타임 로그를 먼저 확인해보세요.
먼저 문제가 발생하는 노드와 정상 노드의 환경 차이를 비교합니다. uname -a로 커널 버전, crictl version으로 컨테이너 런타임 버전, lscpu로 CPU 아키텍처(amd64/arm64)를 확인합니다. exec format error는 주로 멀티아키텍처 이미지 문제나 잘못된 shebang을 의미하므로 docker manifest inspect로 이미지 매니페스트를 검증합니다. journalctl -u containerd 또는 kubelet 로그에서 런타임 에러를 확인하고, 필요시 strace로 시스템 콜 레벨 디버깅을 수행합니다. seccomp 프로파일이나 AppArmor 정책 차이도 확인하며, 런타임 버전 불일치 시 클러스터 전체의 런타임 표준화 전략을 수립합니다. 재발 방지를 위해 admission webhook으로 이미지 아키텍처 검증과 노드 라벨 기반 스케줄링 정책을 적용합니다.
- • 노드 간 환경 차이 비교 (커널, 런타임, CPU 아키텍처)
- • 컨테이너 런타임 로그 및 시스템 콜 레벨 디버깅
- • 이미지 매니페스트 검증 및 멀티아키텍처 지원 확인
- • 보안 정책(seccomp, AppArmor) 차이 분석
- • 런타임 표준화 및 admission webhook 기반 예방책 수립
멀티클라우드 환경에서 ARM 기반 인스턴스 도입 시 아키텍처 불일치로 인한 런타임 오류가 자주 발생합니다.
컨테이너 런타임을 Docker에서 containerd로 마이그레이션할 때 발생할 수 있는 호환성 문제와 사전 검증 전략은 무엇인가요?
Q. 클러스터 내부에서 서비스 간 통신 시 DNS 해석 실패로 인한 타임아웃이 간헐적으로 발생합니다. 특히 트래픽이 높은 시간대에 nslookup 실패율이 20%까지 증가하며, CoreDNS Pod는 정상 상태입니다. DNS 병목을 진단하고 해결하기 위한 단계별 접근 방법과 장기적인 아키텍처 개선 방안을 제시해주세요.
conntrack 테이블 고갈, CoreDNS 리소스 한계, ndots 설정 등 여러 레이어에서 원인을 찾아야 합니다.
먼저 CoreDNS 메트릭을 확인하여 요청 레이턴시, 에러율, 캐시 히트율을 분석합니다. kubectl logs로 CoreDNS의 timeout 또는 truncated 응답을 확인하고, 리소스 사용률(CPU/메모리)이 제한에 도달했는지 검증합니다. 노드 레벨에서 conntrack 테이블 고갈 여부를 sysctl net.netfilter.nf_conntrack_count로 확인하고, 필요시 nf_conntrack_max를 증가시킵니다. resolv.conf의 ndots 설정이 5로 높아 불필요한 쿼리가 발생하는지 확인하고, dnsConfig로 ndots를 1-2로 조정합니다. CoreDNS의 HPA 설정과 cache 플러그인 TTL을 최적화하며, NodeLocal DNSCache를 도입하여 DNS 쿼리를 노드 로컬에서 처리하도록 개선합니다. 장기적으로는 DNS 쿼리 패턴을 모니터링하여 불필요한 FQDN 조회를 줄이고, 외부 DNS 의존성을 최소화하는 아키텍처를 설계합니다.
- • CoreDNS 메트릭 및 로그 분석 (레이턴시, 에러율, 캐시 히트율)
- • conntrack 테이블 고갈 및 커널 파라미터 튜닝
- • ndots 설정 최적화로 불필요한 DNS 쿼리 감소
- • NodeLocal DNSCache 도입으로 로컬 캐싱 강화
- • DNS 쿼리 패턴 모니터링 및 아키텍처 개선
마이크로서비스가 수백 개인 환경에서 DNS 쿼리 폭증으로 인한 해석 지연은 전체 시스템 안정성에 직접적인 영향을 미칩니다.
외부 DNS 서비스(Route53, Cloud DNS)와의 통합 시 발생할 수 있는 레이턴시 문제를 어떻게 최소화하시겠습니까?
Q. 새로운 배포 시 ImagePullBackOff 에러로 인해 Pod가 시작되지 않습니다. 프라이빗 레지스트리를 사용 중이며, 일부 노드에서만 문제가 발생하고 imagePullSecrets는 정상적으로 설정되어 있습니다. 네트워크, 인증, 레지스트리 용량 등 다각도로 원인을 진단하는 방법을 설명해주세요.
노드별 네트워크 정책, 레지스트리 접근성, Secret 전파, 레지스트리 레이트 리미트를 순차적으로 확인하세요.
먼저 kubectl describe pod로 정확한 에러 메시지를 확인합니다. 인증 실패인 경우 imagePullSecrets가 올바른 네임스페이스에 존재하는지, Secret 데이터가 base64로 정확히 인코딩되었는지 검증합니다. 문제가 발생하는 노드에서 직접 docker pull 또는 crictl pull로 레지스트리 접근성을 테스트하고, 네트워크 정책이나 방화벽 규칙이 특정 노드만 차단하는지 확인합니다. 레지스트리의 레이트 리미트 또는 동시 연결 제한에 도달했는지 모니터링하며, 대규모 배포 시 이미지 풀 병목을 완화하기 위해 이미지 캐싱 프록시(Harbor, Dragonfly)나 노드별 이미지 사전 배포 전략을 고려합니다. 레지스트리 자체의 스토리지 용량과 성능도 확인하고, 멀티 레지스트리 페일오버 구성을 검토합니다.
- • imagePullSecrets 설정 및 Secret 데이터 검증
- • 노드별 레지스트리 접근성 및 네트워크 정책 확인
- • 레지스트리 레이트 리미트 및 동시 연결 제한 분석
- • 이미지 캐싱 프록시 또는 사전 배포 전략 도입
- • 레지스트리 용량 및 페일오버 구성 검토
글로벌 서비스에서 리전별 레지스트리 미러링 없이 중앙 레지스트리만 사용하면 배포 시간이 수 분까지 증가할 수 있습니다.
멀티 리전 클러스터에서 이미지 풀 레이턴시를 최소화하기 위한 레지스트리 배포 전략은 무엇인가요?
Q. NetworkPolicy 적용 후 특정 마이크로서비스 간 통신이 차단되어 500 에러가 발생하고 있습니다. Calico 또는 Cilium 같은 CNI를 사용 중이며, 정책은 여러 팀에서 독립적으로 관리합니다. 복잡한 네트워크 정책 간 충돌을 진단하고, 의도하지 않은 트래픽 차단을 식별하는 체계적인 방법을 설명해주세요.
네트워크 정책의 AND 로직, 라벨 셀렉터 오류, CNI 로그를 확인하고 정책 시뮬레이션 도구를 활용하세요.
먼저 kubectl get networkpolicy --all-namespaces로 적용된 모든 정책을 수집하고, 문제가 발생하는 Pod의 라벨과 일치하는 정책을 필터링합니다. NetworkPolicy는 기본적으로 화이트리스트 방식이므로, Ingress/Egress 규칙이 모두 충족되어야 통신이 허용됩니다. 라벨 셀렉터의 오타나 네임스페이스 불일치를 확인하고, kubectl describe networkpolicy로 정책 상세를 검토합니다. CNI별 진단 도구를 사용하여 실제 적용된 규칙을 확인합니다(Calico는 calicoctl get policy, Cilium은 cilium endpoint list). 패킷 레벨 디버깅을 위해 tcpdump나 Cilium의 Hubble을 사용하여 드롭된 패킷을 추적합니다. 정책 시뮬레이션 도구(Inspektor Gadget, Cilium Policy Editor)로 사전 검증하고, GitOps 기반 정책 관리와 자동화된 정책 테스트를 도입하여 재발을 방지합니다.
- • 적용된 모든 NetworkPolicy 수집 및 라벨 매칭 검증
- • Ingress/Egress 규칙의 AND 로직 이해 및 충돌 분석
- • CNI별 진단 도구로 실제 적용된 규칙 확인
- • 패킷 레벨 디버깅(tcpdump, Hubble)으로 드롭 추적
- • 정책 시뮬레이션 및 GitOps 기반 관리 체계 구축
마이크로서비스 수가 증가하면서 수백 개의 NetworkPolicy가 중첩되면 의도하지 않은 통신 차단이 빈번히 발생합니다.
제로 트러스트 네트워크 모델을 Kubernetes에 구현할 때 NetworkPolicy만으로 충분한지, 추가로 필요한 보안 계층은 무엇인가요?
Q. StatefulSet으로 배포된 데이터베이스 Pod가 PersistentVolumeClaim을 마운트하지 못하고 ContainerCreating 상태에서 멈춰 있습니다. Events에서 'FailedAttachVolume' 또는 'FailedMount' 에러가 발생하며, 일부 노드에서만 문제가 재현됩니다. 스토리지 프로비저너, CSI 드라이버, 노드 권한 등을 포함한 종합적인 진단 방법을 설명해주세요.
볼륨 어태치 상태, CSI 드라이버 로그, 노드의 디바이스 마운트 가능 여부, 스토리지 백엔드 상태를 순서대로 확인하세요.
kubectl describe pod와 kubectl get events로 정확한 에러 메시지를 확인합니다. VolumeAttachment 오브젝트를 조회하여 볼륨이 노드에 어태치되었는지 상태를 검증하고, kubectl get pv로 PersistentVolume의 상태가 Bound인지 확인합니다. CSI 드라이버의 controller와 node 컴포넌트 로그를 확인하여 프로비저닝 또는 어태치 실패 원인을 파악합니다(kubectl logs -n kube-system). 노드에서 lsblk, mount 명령으로 디바이스가 실제 마운트되었는지, /var/lib/kubelet/pods 아래 볼륨 경로를 확인합니다. 클라우드 프로바이더의 스토리지 백엔드(EBS, Persistent Disk)에서 볼륨 상태와 IOPS 한계, 어태치 제한을 검증합니다. 노드의 IAM 역할이나 서비스 어카운트 권한이 스토리지 조작에 충분한지 확인하고, 필요시 StorageClass 파라미터를 조정하거나 CSI 드라이버를 업그레이드합니다.
- • VolumeAttachment 상태 및 PV/PVC 바인딩 검증
- • CSI 드라이버 컨트롤러 및 노드 컴포넌트 로그 분석
- • 노드 레벨 디바이스 마운트 상태 확인
- • 클라우드 스토리지 백엔드의 볼륨 상태 및 제한 검증
- • 노드 권한(IAM, 서비스 어카운트) 및 StorageClass 파라미터 점검
클라우드에서 노드당 어태치 가능한 볼륨 수 제한으로 인해 대규모 StatefulSet 배포 시 마운트 실패가 자주 발생합니다.
멀티 AZ 환경에서 StatefulSet의 Pod와 PV가 서로 다른 가용영역에 배치되어 어태치 실패가 발생할 때 어떻게 해결하시겠습니까?
Q. 프로덕션 환경에서 특정 애플리케이션 Pod가 OOMKilled 상태로 반복 재시작되고 있습니다. 메모리 limit은 2Gi로 설정되어 있으며, request는 1Gi입니다. 메모리 누수 여부를 판단하고, 적절한 리소스 한계를 재설정하기 위한 진단 및 최적화 프로세스를 설명해주세요.
컨테이너 내부 메모리 프로파일링, 힙 덤프 분석, 메트릭 기반 사용 패턴 분석을 통해 실제 필요량을 산정하세요.
먼저 kubectl describe pod로 OOMKilled 이벤트를 확인하고, 종료 직전 메모리 사용량을 Prometheus/Grafana 메트릭에서 조회합니다. 컨테이너 내부에서 메모리 프로파일링 도구(Java는 jmap/jstat, Node.js는 heapdump, Go는 pprof)를 사용하여 힙 메모리 사용 패턴과 누수 여부를 분석합니다. kubectl top pod로 실시간 메모리 사용량을 모니터링하고, VPA의 추천값을 참고하여 실제 필요한 메모리 양을 산정합니다. 메모리 누수가 확인되면 애플리케이션 코드를 수정하고, 누수가 아닌 경우 limit을 단계적으로 증가시키며 테스트합니다. cgroup 메모리 통계(/sys/fs/cgroup/memory)를 확인하여 캐시/버퍼 사용량을 분석하고, 애플리케이션의 메모리 설정(JVM heap size 등)이 컨테이너 limit과 정합성 있게 구성되었는지 검증합니다. 장기적으로는 VerticalPodAutoscaler를 도입하여 자동으로 적절한 리소스를 설정하도록 합니다.
- • OOMKilled 이벤트 및 메트릭 기반 메모리 사용 패턴 분석
- • 언어별 메모리 프로파일링 도구로 힙 덤프 및 누수 확인
- • VPA 추천값 및 실시간 모니터링으로 적정 limit 산정
- • cgroup 통계로 캐시/버퍼 사용량 분석
- • 애플리케이션 메모리 설정과 컨테이너 limit 정합성 검증
메모리 limit을 너무 낮게 설정하면 OOMKill이 빈번하고, 너무 높게 설정하면 노드 리소스가 낭비되어 비용이 증가합니다.
JVM 기반 애플리케이션에서 컨테이너 메모리 limit과 heap size를 어떤 비율로 설정하는 것이 최적인가요?
Q. Ingress를 통해 HTTPS 트래픽을 서비스하는 중 특정 도메인에서 'SSL certificate problem' 에러가 발생합니다. cert-manager를 사용하여 Let's Encrypt 인증서를 자동 발급 중이며, 일부 인증서는 정상 갱신되지만 다른 것들은 실패합니다. TLS 인증서 발급 및 갱신 실패를 진단하고 해결하는 방법을 설명해주세요.
Certificate 리소스 상태, cert-manager 로그, ACME challenge 검증 실패 원인을 순차적으로 확인하세요.
먼저 kubectl get certificate로 Certificate 리소스의 Ready 상태를 확인하고, kubectl describe certificate로 이벤트와 에러 메시지를 조회합니다. CertificateRequest와 Order, Challenge 리소스를 순차적으로 확인하여 ACME 프로토콜의 어느 단계에서 실패했는지 파악합니다. cert-manager의 controller 로그를 확인하여 Let's Encrypt API 호출 실패나 레이트 리미트 도달 여부를 검증합니다. HTTP-01 challenge의 경우 Ingress 규칙이 .well-known/acme-challenge 경로를 올바르게 라우팅하는지, DNS-01 challenge의 경우 DNS 프로바이더 자격증명과 TXT 레코드 생성 권한을 확인합니다. Secret에 저장된 TLS 인증서의 만료일을 확인하고, 갱신 실패 시 ClusterIssuer 설정의 이메일과 ACME 서버 URL이 올바른지 검증합니다. 레이트 리미트 문제는 스테이징 환경으로 테스트하고, 인증서 갱신 주기를 조정하여 해결합니다.
- • Certificate, CertificateRequest, Order, Challenge 리소스 상태 확인
- • cert-manager 로그에서 ACME 프로토콜 실패 단계 파악
- • HTTP-01/DNS-01 challenge 검증 경로 및 권한 확인
- • Let's Encrypt 레이트 리미트 및 스테이징 환경 활용
- • ClusterIssuer 설정 및 인증서 갱신 주기 최적화
DNS 프로바이더 자격증명 권한이 과도하면 DNS 하이재킹 위험이 있으므로 최소 권한 원칙을 적용해야 합니다.
와일드카드 인증서를 발급받기 위해 DNS-01 challenge를 사용할 때 보안상 주의해야 할 점은 무엇인가요?
Q. 클러스터의 여러 노드가 갑자기 NotReady 상태로 전환되어 해당 노드의 Pod들이 다른 노드로 재스케줄링되고 있습니다. kubelet이 API 서버와 통신할 수 없거나, 노드의 디스크/메모리 압박이 원인일 수 있습니다. 노드 NotReady 상태의 근본 원인을 신속히 파악하고 복구하는 전략을 설명해주세요.
노드 컨디션, kubelet 로그, 시스템 리소스 압박, 네트워크 파티션을 체크하세요.
먼저 kubectl describe node로 노드 컨디션(MemoryPressure, DiskPressure, PIDPressure, NetworkUnavailable)을 확인하여 리소스 압박 여부를 파악합니다. kubelet 로그(journalctl -u kubelet)에서 API 서버 통신 실패, 인증서 만료, PLEG(Pod Lifecycle Event Generator) 타임아웃 등의 에러를 조회합니다. 노드에 SSH 접속하여 df -h로 디스크 사용률, free -m으로 메모리, top으로 CPU 사용률을 확인하고, 디스크 압박 시 불필요한 컨테이너 이미지와 로그를 정리합니다. 네트워크 파티션 가능성을 확인하기 위해 노드에서 API 서버로 ping과 curl 테스트를 수행하고, iptables 규칙이나 보안 그룹 변경 여부를 점검합니다. kubelet 인증서가 만료되었다면 갱신하고, PLEG 타임아웃은 컨테이너 런타임 응답 지연이 원인이므로 런타임 재시작을 고려합니다. 장기적으로는 노드 모니터링 알람을 강화하고, 디스크 자동 정리 정책과 노드 자동 복구 메커니즘을 구축합니다.
- • 노드 컨디션으로 리소스 압박 유형 식별
- • kubelet 로그에서 API 통신, 인증서, PLEG 에러 확인
- • 디스크/메모리/CPU 사용률 점검 및 정리
- • 네트워크 파티션 및 보안 그룹 변경 확인
- • 모니터링 알람 및 자동 복구 메커니즘 구축
대규모 클러스터에서 디스크 정리 정책 없이 운영하면 로그와 이미지 누적으로 노드가 NotReady 상태로 빠지는 경우가 빈번합니다.
노드의 PLEG unhealthy 상태가 지속될 때 컨테이너 런타임을 재시작하지 않고 해결할 수 있는 방법이 있나요?
Q. 커스텀 Admission Webhook을 배포한 후 모든 Pod 생성 요청이 실패하고 'failed calling webhook' 에러가 발생합니다. Webhook 서비스는 Running 상태이지만 API 서버가 Webhook에 도달하지 못하는 것으로 보입니다. Admission Webhook의 연결 실패를 진단하고 클러스터 전체 장애로 확산되는 것을 방지하는 방법을 설명해주세요.
Webhook 설정의 failurePolicy, 네트워크 정책, CA 인증서, 서비스 엔드포인트를 확인하세요.
먼저 kubectl get validatingwebhookconfiguration 또는 mutatingwebhookconfiguration으로 Webhook 설정을 확인하고, failurePolicy가 Fail로 설정되어 있어 Webhook 실패 시 모든 요청을 차단하는지 검증합니다. 긴급 복구를 위해 failurePolicy를 Ignore로 변경하거나 Webhook 설정을 삭제하여 클러스터 기능을 우선 복구합니다. Webhook 서비스의 엔드포인트가 정상인지 kubectl get endpoints로 확인하고, Webhook Pod의 로그에서 요청을 받지 못하는지 검증합니다. API 서버에서 Webhook 서비스로의 네트워크 연결을 테스트하고, NetworkPolicy가 kube-system 네임스페이스에서의 접근을 차단하는지 확인합니다. Webhook의 TLS 인증서가 올바르게 설정되었는지, caBundle이 정확한지 검증하고, API 서버 로그에서 TLS handshake 실패를 확인합니다. 재발 방지를 위해 Webhook의 타임아웃을 짧게 설정하고, namespaceSelector로 중요하지 않은 네임스페이스에서 먼저 테스트하며, 모니터링과 알람을 구축합니다.
- • failurePolicy 설정 확인 및 긴급 시 Ignore로 변경
- • Webhook 서비스 엔드포인트 및 Pod 로그 검증
- • API 서버와 Webhook 간 네트워크 연결 및 NetworkPolicy 확인
- • TLS 인증서 및 caBundle 설정 검증
- • 타임아웃, namespaceSelector 설정으로 영향 범위 제한
Webhook의 failurePolicy를 Fail로 설정한 상태에서 Webhook 서비스가 다운되면 모든 리소스 생성이 차단되어 클러스터가 마비될 수 있습니다.
Admission Webhook이 클러스터 전체 장애를 일으키지 않도록 설계 단계에서 고려해야 할 베스트 프랙티스는 무엇인가요?
Q. CI/CD 파이프라인에서 ServiceAccount를 사용하여 배포 중 'forbidden: User system:serviceaccount:ci:deployer cannot create resource deployments' 에러가 발생합니다. 이전에는 정상 작동했으나 최근 RBAC 정책 변경 후 문제가 발생했습니다. RBAC 권한 문제를 신속히 진단하고 최소 권한 원칙에 따라 수정하는 방법을 설명해주세요.
kubectl auth can-i로 권한을 테스트하고, Role/RoleBinding 변경 이력을 확인하세요.
먼저 kubectl auth can-i create deployments --as=system:serviceaccount:ci:deployer -n target-namespace 명령으로 해당 ServiceAccount의 권한을 직접 테스트합니다. kubectl get rolebinding,clusterrolebinding --all-namespaces로 deployer ServiceAccount에 바인딩된 Role을 찾고, kubectl describe role/clusterrole로 실제 권한 내용을 확인합니다. 최근 변경된 RBAC 리소스를 kubectl get role,rolebinding -o yaml과 Git 이력으로 비교하여 삭제되거나 수정된 권한을 식별합니다. 필요한 최소 권한(deployments, replicasets, pods에 대한 create, update, patch)을 정의하고, 네임스페이스별 Role을 생성하여 RoleBinding으로 연결합니다. ClusterRole을 사용하는 경우 aggregation label을 활용하여 권한을 모듈화하고, 감사 로그를 활성화하여 향후 권한 변경을 추적합니다. 정책 변경 전 테스트 환경에서 검증하고, IaC(Terraform, Helm)로 RBAC 리소스를 관리하여 변경 이력을 명확히 합니다.
- • kubectl auth can-i로 ServiceAccount 권한 직접 테스트
- • RoleBinding/ClusterRoleBinding으로 바인딩된 Role 추적
- • 최근 RBAC 변경 이력 비교 및 삭제/수정 권한 식별
- • 최소 권한 원칙에 따라 필요한 권한만 부여
- • IaC 기반 RBAC 관리 및 감사 로그 활성화
RBAC 정책을 수동으로 관리하면 권한 변경 시 의도하지 않은 권한 회수로 CI/CD 파이프라인이 중단될 수 있습니다.
여러 팀이 하나의 클러스터를 공유할 때 네임스페이스별 RBAC 격리 전략과 ClusterRole 사용 시 주의사항은 무엇인가요?
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!