소개
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 개념을 익혔습니다.


