Pod 생성 및 검사

KubernetesBeginner
지금 연습하기

소개

Pod 는 Kubernetes 에서 일반적으로 생성하는 가장 작은 작업 단위 객체입니다. 하나 이상의 컨테이너를 감싸고, 공유 네트워크 ID 를 부여하며, Kubernetes 가 이를 노드에 스케줄링할 수 있도록 합니다.

이 실습에서는 미리 로드된 작은 컨테이너 이미지를 사용하여 단일 Pod 를 생성하고, Kubernetes 가 이를 준비 (Ready) 상태로 만들 때까지 기다린 후 여러 관점에서 객체를 검사합니다. kubectl get, kubectl describe, kubectl get -o yaml 명령어를 사용하여, 향후 매니페스트 작성 실습 시 단순히 YAML 을 암기하는 것이 아니라 실제 객체 상태를 기반으로 이해할 수 있도록 합니다.

Pod 작업 공간 준비

이 단계에서는 첫 번째 Pod 를 위한 전용 네임스페이스를 준비하고, 해당 네임스페이스를 명령어의 기본 대상으로 설정합니다.

CKAD 준비 과정 전반에서 사용하는 공유 작업 공간인 /home/labex/project에서 시작합니다.

mkdir -p /home/labex/project
cd /home/labex/project

VM 이 시작된 후 Kubernetes API 서버에 연결할 수 있게 되기까지 잠시 시간이 걸릴 수 있습니다. 먼저 다음 명령어를 실행하세요. 서버가 아직 준비되지 않았다는 메시지가 나오면 몇 초 기다린 후 노드가 Ready 상태가 될 때까지 다시 실행합니다.

kubectl get nodes --request-timeout=5s

예상 출력에는 준비된 하나의 컨트롤 플레인 노드가 포함되어야 합니다:

NAME         STATUS   ROLES           AGE   VERSION
labex-v135   Ready    control-plane   ...   v1.35...

ckad-prep-pod라는 이름의 네임스페이스를 생성합니다. 네임스페이스를 사용하면 이 실습만의 객체 범위를 가질 수 있으므로, 생성하는 Pod 가 다른 실습의 객체와 섞이지 않습니다.

kubectl create namespace ckad-prep-pod

명령어는 네임스페이스 생성을 확인해 줄 것입니다:

namespace/ckad-prep-pod created

현재 컨텍스트의 네임스페이스를 ckad-prep-pod로 설정합니다. 이후 kubectl get pods와 같은 네임스페이스 관련 명령어는 기본적으로 이 네임스페이스를 참조하게 됩니다.

kubectl config set-context --current --namespace=ckad-prep-pod

출력은 현재 컨텍스트가 수정되었음을 확인해 줍니다:

Context "labex-v135" modified.

현재 네임스페이스가 변경되었는지 확인합니다:

kubectl config view --minify --output 'jsonpath={..namespace}'; echo

예상 출력:

ckad-prep-pod

Pod 생성

이 단계에서는 kubectl run을 사용하여 단일 Pod 를 생성하고 준비 상태가 될 때까지 기다립니다.

kubectl run은 명령줄에서 직접 기본적인 Pod 를 생성할 수 있습니다. --image 옵션은 컨테이너 이미지를 선택하며, --restart=Never는 상위 수준의 컨트롤러를 생성하는 대신 독립형 Pod 로 유지하도록 합니다.

이 실습에서는 이미 준비된 Kubernetes 환경에 존재하는 작은 이미지인 registry.k8s.io/pause:3.10.1을 사용합니다. 이 이미지는 별도의 애플리케이션 설정 없이도 실행 상태를 유지하므로, 이미지 풀링이나 애플리케이션 동작 대신 Pod 의 생명 주기에 집중할 수 있습니다.

kubectl run sample-pod --image=registry.k8s.io/pause:3.10.1 --restart=Never

명령어는 Kubernetes 가 Pod 객체를 수락했음을 알려줍니다:

pod/sample-pod created

생성이 곧 준비 완료를 의미하지는 않습니다. Kubernetes 는 여전히 Pod 를 스케줄링하고, 컨테이너를 시작하며, Pod 를 '준비 (Ready)' 상태로 표시해야 합니다. kubectl wait를 사용하여 Pod 의 Ready 조건을 기다립니다.

kubectl wait --for=condition=Ready pod/sample-pod --timeout=60s

예상 출력:

pod/sample-pod condition met

이제 현재 네임스페이스의 Pod 목록을 확인합니다:

kubectl get pods

1/1개의 컨테이너가 준비되었고 Running 상태인 sample-pod를 확인할 수 있습니다:

NAME      READY   STATUS    RESTARTS   AGE
sample-pod   1/1     Running   0          ...

Pod 배치 및 이벤트 검사

이 단계에서는 Pod 가 어디에서 실행 중인지 확인하고, 시작 과정에서 Kubernetes 가 기록한 이벤트 기록을 읽어봅니다.

일반적인 kubectl get pods 뷰는 간결합니다. -o wide를 추가하면 노드 이름 및 Pod IP 주소와 같은 스케줄링 세부 정보를 볼 수 있습니다.

kubectl get pod sample-pod -o wide

예상 출력에는 노드와 내부 Pod IP 가 포함됩니다:

NAME      READY   STATUS    RESTARTS   AGE   IP           NODE
sample-pod   1/1     Running   0          ...   ...        labex-v135

kubectl describe는 사람이 읽기 쉬운 형태로 객체 정보를 제공합니다. 여기에는 메타데이터, 컨테이너 세부 정보, 조건 및 최근 이벤트가 포함됩니다. 초보자에게는 Events 섹션이 특히 유용한데, Pod 생성 후 Kubernetes 가 수행한 작업을 보여주기 때문입니다.

kubectl describe pod sample-pod

출력에서 다음과 같은 줄을 찾아보세요:

Name:             sample-pod
Namespace:        ckad-prep-pod
Status:           Running
Containers:
  sample-pod:
    Image:        registry.k8s.io/pause:3.10.1
Conditions:
  Type                        Status
  Ready                       True
Events:
  Type    Reason     Age   From               Message
  Normal  Scheduled  ...   default-scheduler  Successfully assigned ...
  Normal  Pulled     ...   kubelet            Container image "registry.k8s.io/pause:3.10.1" already present ...
  Normal  Created    ...   kubelet            Created container ...
  Normal  Started    ...   kubelet            Started container ...

정확한 이벤트 발생 시간과 메시지는 다를 수 있지만, 중요한 개념은 변함없습니다. Kubernetes 는 Pod 를 스케줄링하고, 이미지를 준비하며, 컨테이너를 생성하고 시작합니다.

Pod 객체 필드 읽기

이 단계에서는 YAML 형식으로 선택된 Pod 필드를 검사하고, 이전 실습에서 본 객체 개념과 연결해 봅니다.

kubectl get은 -o yaml을 사용하여 객체를 YAML 로 출력할 수 있습니다. 이는 API 서버가 반환하는 실제 객체 표현이며, 생성 후 Kubernetes 가 추가한 필드들도 포함됩니다. 아래 명령어는 sed -n '1,80p'를 사용하여 처음 80 줄만 표시함으로써 출력을 읽기 쉽게 유지합니다.

kubectl get pod sample-pod -o yaml | sed -n '1,80p'

출력에서 최상위 필드와 컨테이너 이미지를 찾아보세요:

apiVersion: v1
kind: Pod
metadata:
  name: sample-pod
  namespace: ckad-prep-pod
spec:
  containers:
  - image: registry.k8s.io/pause:3.10.1
    name: sample-pod
...
status:
...

생성된 모든 필드를 암기할 필요는 없습니다. 지금은 apiVersion, kind, metadata, spec, status와 같은 기본적인 구조에 집중하세요. 다음 실습에서는 중요한 부분들을 직접 작성하게 될 것입니다.

대상 JSONPath 쿼리를 사용하여 이미지 필드만 출력해 봅니다. JSONPath 표현식은 거대한 객체에서 정확한 값 하나가 필요할 때 유용합니다.

kubectl get pod sample-pod -o jsonpath='{.spec.containers[0].image}'; echo

예상 출력:

registry.k8s.io/pause:3.10.1

요약

독립형 Pod 를 생성하고, Kubernetes 가 이를 준비 상태로 표시할 때까지 기다렸으며, 스케줄링 및 이벤트 세부 정보를 검사하고, YAML 및 JSONPath 출력에서 주요 객체 필드를 읽어보았습니다. 이를 통해 다음 실습에서 kubectl run으로 객체를 직접 생성하는 대신 Pod 매니페스트를 직접 작성할 때 필요한 구체적인 Pod 개념을 익혔습니다.