Kubernetes

kubectl은 어떻게 동작하나요?

hdoo 2025. 2. 28. 19:01

개요


Kubernetes를 운영하면서 가장 자주 사용하는 CLI 도구가 바로 kubectl입니다. 하지만 kubectl get pods와 같은 명령어를 실행했을 때, 실제로 어떤 과정이 일어나고, etcd에서 데이터가 어떻게 조회되는지에 대해 한번쯤은 궁금하게 되는데요. 본 글에서는 kubectl의 내부 동작을 탐구하며, 명령어가 실행되는 과정부터 etcd에서 데이터를 읽어오는 방식까지 자세히 알아보겠습니다.
 

Kubectl의 기본 동작


kubectl은 Kubernetes API 서버와 통신하여 클러스터의 상태를 조회하거나 리소스를 조작하는 역할을 합니다. 기본적인 동작 방식은 다음과 같습니다.
  1. 사용자가 kubectl 명령어를 입력합니다.
  2. kubectl은 ~/.kube/config 파일을 참고하여 API 서버의 주소 및 인증 정보를 확인합니다.
  3. REST API 요청을 API 서버(kube-apiserver)에 전송합니다.
  4. API 서버는 요청을 처리하고, 필요한 경우 etcd에서 데이터를 조회하거나 변경합니다.
  5. API 서버는 결과를 kubectl에 반환하고, kubectl은 이를 사용자에게 출력합니다.
이제 위 과정이 실제로 어떻게 동작하는지 더 자세히 살펴보겠습니다.
 

Kubectl의 명령어 실행 과정


사용자가 kubectl get pods 명령어를 실행하면 내부적으로 다음과 같은 과정이 진행됩니다.
 

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 서버는 다음 단계를 거쳐 요청을 처리합니다.

  1. 인증(Authentication): API 서버는 ~/.kube/config에 저장된 인증 정보(예: Bearer Token)를 확인하여 요청을 보낸 사용자가 유효한지 검증합니다.
  2. 인가(Authorization): RBAC(Role-Based Access Control) 정책을 확인하여 사용자가 해당 리소스를 조회할 권한이 있는지 확인합니다.
  3. 어드미션 컨트롤(Admission Control): 요청을 검증하고, 필요한 경우 정책(예: 리소스 제한, 네임스페이스 정책 등)을 적용합니다.
  4. 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로 반환됩니다.

 

응답을 사용자에게 출력

  1. kubectl은 API 서버에서 받은 JSON 데이터를 사용자가 보기 쉽게 가공합니다.
  2. 최종적으로 터미널에 보기 좋은 형태로 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이 어떻게 동작하는지 한눈에 정리하면 다음과 같습니다.

  1. 사용자가 kubectl 명령어를 실행하면 HTTP 요청이 Kubernetes API 서버로 전달됩니다.
  2. API 서버는 인증 및 인가를 확인한 후, 필요한 경우 etcd에서 데이터를 조회합니다.
  3. etcd는 Key-Value 저장소에서 데이터를 찾아 API 서버에 반환합니다.
  4. API 서버는 받은 데이터를 JSON으로 변환하여 kubectl에 반환합니다.
  5. kubectl은 데이터를 사용자 친화적으로 가공하여 출력합니다.

이제 kubectl이 단순한 CLI 도구가 아니라, Kubernetes API 서버 및 etcd와 긴밀하게 연동되어 동작하는 구조임을 이해할 수 있습니다. 이러한 내부 동작을 이해하면 Kubernetes를 더 효과적으로 운영하고 문제 발생 시 빠르게 원인을 파악할 수 있습니다.