kubectl은 어떻게 동작하나요?
개요
Kubectl의 기본 동작
-
사용자가 kubectl 명령어를 입력합니다.
-
kubectl은 ~/.kube/config 파일을 참고하여 API 서버의 주소 및 인증 정보를 확인합니다.
-
REST API 요청을 API 서버(kube-apiserver)에 전송합니다.
-
API 서버는 요청을 처리하고, 필요한 경우 etcd에서 데이터를 조회하거나 변경합니다.
-
API 서버는 결과를 kubectl에 반환하고, kubectl은 이를 사용자에게 출력합니다.
Kubectl의 명령어 실행 과정
kubectl이 API 요청을 생성
1. kubectl은 ~/.kube/config 파일을 읽고, 클러스터의 API 서버 주소와 인증 정보를 확인합니다.
2. kubectl은 Kubernetes API에 대한 HTTP 요청을 생성합니다. 예를 들어, kubectl get pods를 실행하면 다음과 같은 요청이 생성됩니다.
GET /api/v1/namespaces/default/pods HTTP/1.1
Host: <API_SERVER>
Authorization: Bearer <TOKEN>
3. 요청은 RESTful API를 통해 Kubernetes API 서버로 전달됩니다.
API 서버가 요청을 처리
API 서버는 다음 단계를 거쳐 요청을 처리합니다.
- 인증(Authentication): API 서버는 ~/.kube/config에 저장된 인증 정보(예: Bearer Token)를 확인하여 요청을 보낸 사용자가 유효한지 검증합니다.
- 인가(Authorization): RBAC(Role-Based Access Control) 정책을 확인하여 사용자가 해당 리소스를 조회할 권한이 있는지 확인합니다.
- 어드미션 컨트롤(Admission Control): 요청을 검증하고, 필요한 경우 정책(예: 리소스 제한, 네임스페이스 정책 등)을 적용합니다.
- etcd에서 데이터 조회: 요청이 유효하면, API 서버는 etcd에서 해당 데이터를 조회하여 응답을 생성합니다.
etcd에서 Pod 정보 조회
etcd는 Kubernetes의 핵심 데이터 저장소로, 모든 클러스터 상태 정보를 Key-Value 형식으로 저장하고 있습니다. kubectl get pods를 실행하면 API 서버는 etcd에서 pod 정보를 조회하는데, 이 과정은 다음과 같습니다.
1. API 서버는 etcd 클라이언트를 통해 특정 key를 검색합니다. 예를 들어, default 네임스페이스의 pod 목록을 가져오는 경우, etcd에서 다음 key를 조회합니다.
/registry/pods/default/
2. etcd는 요청을 처리하고, 해당 key에 저장된 데이터를 JSON 형식으로 반환합니다.
3. API 서버는 etcd에서 받은 데이터를 Kubernetes API 응답 형식으로 변환합니다.
4. 변환된 데이터는 kubectl로 반환됩니다.
응답을 사용자에게 출력
- kubectl은 API 서버에서 받은 JSON 데이터를 사용자가 보기 쉽게 가공합니다.
- 최종적으로 터미널에 보기 좋은 형태로 pod 목록이 출력됩니다.
NAME READY STATUS RESTARTS AGE
my-pod 1/1 Running 0 5m
etcd의 데이터 저장 방식
etcd는 Kubernetes의 상태를 Key-Value 형태로 저장하는 분산 저장소입니다. pod 정보는 다음과 같은 형식으로 저장됩니다.
- Key: /registry/pods/{namespace}/{pod_name}
- Value: Pod 객체의 JSON 데이터
예를 들어, default 네임스페이스의 my-pod의 데이터를 조회하면 etcd 내부에서는 다음과 같은 JSON 값이 저장되어 있습니다.
{
"metadata": {
"name": "my-pod",
"namespace": "default",
"uid": "12345",
"creationTimestamp": "2025-02-28T12:00:00Z"
},
"status": {
"phase": "Running"
},
"spec": {
"containers": [
{
"name": "app-container",
"image": "nginx:latest"
}
]
}
}
이 데이터를 API 서버가 조회하여 kubectl에 반환하는 것입니다.
정리
kubectl이 어떻게 동작하는지 한눈에 정리하면 다음과 같습니다.
- 사용자가 kubectl 명령어를 실행하면 HTTP 요청이 Kubernetes API 서버로 전달됩니다.
- API 서버는 인증 및 인가를 확인한 후, 필요한 경우 etcd에서 데이터를 조회합니다.
- etcd는 Key-Value 저장소에서 데이터를 찾아 API 서버에 반환합니다.
- API 서버는 받은 데이터를 JSON으로 변환하여 kubectl에 반환합니다.
- kubectl은 데이터를 사용자 친화적으로 가공하여 출력합니다.
이제 kubectl이 단순한 CLI 도구가 아니라, Kubernetes API 서버 및 etcd와 긴밀하게 연동되어 동작하는 구조임을 이해할 수 있습니다. 이러한 내부 동작을 이해하면 Kubernetes를 더 효과적으로 운영하고 문제 발생 시 빠르게 원인을 파악할 수 있습니다.