아주 기본적일 수 있지만, Kubernetes의 잘못된 설정이 큰 장애로 이어질 수도 있습니다.
설정 목록
generateName
generateName은 Kubernetes Object의 metadata 필드 속성입니다.
metadata.name을 직접 지정하지 않았을 때, API Server가 generateName 값을 Prefix로 사용해 고유한 이름을 생성합니다.
반복 실행되어도 같은 리소스를 갱신해야 한다면 metadata.name을, Job/Pod 등을 생성할 때마다 매번 고유한 이름이 필요하다면 generateName을 사용합니다.
Health check
Kubernetes Pod와 이를 기반으로 한 리소스에서는 주기적으로 리소스 상태를 확인할 수 있도록 Probe 등의 옵션을 제공합니다.
보통 웹의 경우 이를 위한 API 엔드포인트를 설정해 두는데,
이 주소를 잘못 설정하게 될 경우 Pod가 Running 상태가 되지 않아 장애로 이어질 수도 있습니다.
Label과 Selector
Label이란, Kubernetes의 리소스들을 식별하기 위한 key-value 형태의 정보를 말합니다.
Kubernetes 자체 또는 Kubernetes 기반 도구에서 라벨을 설정하는 경우도 있고, 사용자가 직접 설정할 수도 있습니다.
Selector란, 위에서 설정한 Label을 이용해 리소스를 필터링하는 개념입니다.
가장 대표적으로 Service에서 통신할 Pod를 설정하거나, 리소스가 배치될 노드/클러스터를 지정할 때 사용하고, 그 외에도 다양하게 활용할 수 있습니다.
Label과 Selector를 잘못 설정할 경우, 의도치 않은 결과를 가져올 수도 있습니다. 아래는 Label과 Selector를 사용할 때 기본적으로 확인해야 할 사항입니다.
- Label의 글자 수는 63자를 넘을 수 없습니다.
실제 장애 사례
- Argo CD에서 생성하는 리소스 2개의
metadata.name이 같아 충돌 문제가 발생하여 이를generateName으로 조치한 적이 있습니다. - Health check URL을 변경한 뒤 Probe 설정을 일부 변경하지 않아 장애가 발생한 적이 있습니다.
- 2개 이상의 Pod가 Label을 공유하고, 한 쪽이 일회성 작업만 하고 종료되는 Pod여서 이로 인해 네트워크 순단이 발생한 적이 있습니다.
nodeSelector를 잘못 설정하여 발생하는 문제가 많습니다. 대표적으로 방화벽이 개방되어 있는 노드가 정해져 있는데, Pod가 적절한 노드에 배치되지 않아 통신 장애가 발생하는 경우가 있습니다.- 사용자 입력값에 길이 제한이 없어, 이를 바탕으로 Label을 생성할 때 오류가 생기는 경우가 있었습니다.