소개
이 랩에서는 Kubernetes 애플리케이션을 탐색하고 디버깅합니다. Minikube 를 사용하여 로컬 Kubernetes 클러스터를 시작하고, 샘플 애플리케이션을 배포하며, 애플리케이션 구성 검사, 로그 보기, 파드 내부에서 명령 실행, 클러스터 이벤트 검사 등 다양한 디버깅 기술을 배웁니다. 이러한 기술은 Kubernetes 기반 애플리케이션을 개발하고 문제 해결하는 데 필수적입니다.
이 랩에서는 Kubernetes 애플리케이션을 탐색하고 디버깅합니다. Minikube 를 사용하여 로컬 Kubernetes 클러스터를 시작하고, 샘플 애플리케이션을 배포하며, 애플리케이션 구성 검사, 로그 보기, 파드 내부에서 명령 실행, 클러스터 이벤트 검사 등 다양한 디버깅 기술을 배웁니다. 이러한 기술은 Kubernetes 기반 애플리케이션을 개발하고 문제 해결하는 데 필수적입니다.
이 단계에서는 Minikube 를 사용하여 로컬 Kubernetes 클러스터를 시작하고 확인하는 방법을 배웁니다. 이는 로컬 머신에서 Kubernetes 애플리케이션을 개발하고 테스트하기 위한 필수 첫 번째 단계입니다.
먼저, Minikube 클러스터를 시작합니다:
minikube start
예시 출력:
😄 minikube v1.29.0 on Ubuntu 22.04
✨ Automatically selected the docker driver
📌 Using Docker driver with root permissions
🔥 Creating kubernetes in kubernetes cluster
🔄 Restarting existing kubernetes cluster
🐳 Preparing Kubernetes v1.26.1 on Docker 20.10.23 ...
🚀 Launching Kubernetes ...
🌟 Enabling addons: storage-provisioner, default-storageclass
🏄 Done! kubectl is now configured to use "minikube" cluster and "default" namespace
이제 여러 명령을 사용하여 클러스터 상태를 확인합니다:
minikube status
kubectl get nodes
예시 출력:
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane 1m v1.26.1
이러한 명령은 다음을 확인합니다:
올바른 클러스터에 연결되었는지 확인하기 위해 클러스터의 컨텍스트를 확인해 보겠습니다:
kubectl config current-context
예시 출력:
minikube
이는 kubectl 이 Minikube 클러스터를 사용하도록 구성되었음을 확인합니다.

이 단계에서는 YAML 매니페스트를 사용하여 간단한 Kubernetes 애플리케이션을 생성하고 배포하는 방법을 배웁니다. 애플리케이션을 배포하는 다양한 방법을 보여주기 위해 Pod 와 Deployment 를 모두 생성합니다.
먼저, Kubernetes 매니페스트를 위한 디렉토리를 생성합니다:
mkdir -p ~/project/k8s-manifests
cd ~/project/k8s-manifests
간단한 NGINX Pod 매니페스트를 생성합니다:
nano nginx-pod.yaml
다음 내용을 추가합니다:
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
Ctrl+X, Y, Enter를 눌러 저장하고 종료합니다.
이제, Deployment 매니페스트를 생성합니다:
nano nginx-deployment.yaml
다음 내용을 추가합니다:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
매니페스트를 적용하여 리소스를 생성합니다:
kubectl apply -f nginx-pod.yaml
kubectl apply -f nginx-deployment.yaml
예시 출력:
pod/nginx-pod created
deployment.apps/nginx-deployment created
생성된 리소스를 확인합니다:
kubectl get pods
kubectl get deployments
예시 출력:
NAME READY STATUS RESTARTS AGE
nginx-pod 1/1 Running 0 1m
nginx-deployment-xxx-yyy 1/1 Running 0 1m
nginx-deployment-xxx-zzz 1/1 Running 0 1m
nginx-deployment-xxx-www 1/1 Running 0 1m
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 1m
Deployment 가 레플리카를 생성할 때까지 기다립니다. 모든 레플리카가 준비되면 READY 열에 3/3이 표시됩니다.
Pod 와 Deployment 의 주요 차이점:

이 단계에서는 다양한 kubectl 명령을 사용하여 Kubernetes Deployment 및 Pod 의 구성 세부 정보를 검사하고 검색하는 방법을 배웁니다. 리소스 구성을 검사하는 방법을 이해하는 것은 애플리케이션 설정을 문제 해결하고 이해하는 데 매우 중요합니다.
먼저, 이전 단계에서 생성한 Pod 의 YAML 구성을 검색해 보겠습니다:
kubectl get pod nginx-pod -o yaml
예시 출력 (부분):
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
namespace: default
labels:
app: nginx
spec:
containers:
- image: nginx:latest
imagePullPolicy: Always
name: nginx
ports:
- containerPort: 80
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
이제, Deployment 구성을 검사해 보겠습니다:
kubectl get deployment nginx-deployment -o yaml
예시 출력 (부분):
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: default
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
kubectl describe를 사용하여 리소스에 대한 자세한 정보를 얻습니다:
kubectl describe pod nginx-pod
kubectl describe deployment nginx-deployment
describe pod의 예시 출력 (부분):
Name: nginx-pod
Namespace: default
Priority: 0
Node: minikube/172.17.0.2
Start Time: [timestamp]
Labels: app=nginx
Annotations: <none>
Status: Running
IP: 172.17.0.5
Containers:
nginx:
Container ID: docker://[container-id]
Image: nginx:latest
Image ID: docker-pullable://nginx@[image-digest]
Port: 80/TCP
Host Port: 0/TCP
State: Running
Ready: True
Restart Count: 0
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
머신에서 읽을 수 있는 형식으로 JSON 출력을 사용할 수도 있습니다:
kubectl get pod nginx-pod -o json
구성을 검사할 때 주의해야 할 주요 사항:
이 단계에서는 kubectl logs를 사용하여 Kubernetes Pod 의 로그를 보고 검사하는 방법을 배웁니다. 로그를 보는 것은 애플리케이션 동작을 이해하고, 문제를 디버깅하며, 애플리케이션 성능을 모니터링하는 데 매우 중요합니다.
먼저, 사용 가능한 Pod 를 나열하여 올바른 리소스로 작업하고 있는지 확인합니다:
kubectl get pods
예시 출력:
NAME READY STATUS RESTARTS AGE
nginx-pod 1/1 Running 0 20m
nginx-deployment-xxx-yyy 1/1 Running 0 20m
nginx-deployment-xxx-zzz 1/1 Running 0 20m
nginx-deployment-xxx-www 1/1 Running 0 20m
특정 Pod 의 로그를 봅니다:
## nginx-pod의 로그 보기
kubectl logs nginx-pod
예시 출력:
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
...
2023/xx/xx [notice] xxxx#x: signal process started
Deployment 의 Pod 로그를 봅니다:
## Deployment의 특정 Pod의 로그 보기
POD_NAME=$(kubectl get pods -l app=nginx | grep nginx-deployment | head -n 1 | awk '{print $1}')
kubectl logs $POD_NAME
추가 로그 보기 옵션을 살펴봅니다:
## 로그의 마지막 50줄 보기
kubectl logs nginx-pod --tail=50
## 실시간으로 로그 따라가기
kubectl logs -f nginx-pod
로그 따라가기 예시:
[real-time log output will be displayed]
Ctrl + C를 눌러 실시간 로그 보기를 종료합니다.
다중 컨테이너 Pod 의 경우, 컨테이너 이름을 지정합니다:
## Pod에 여러 컨테이너가 있는 경우
kubectl logs nginx-pod -c nginx
주요 로그 보기 기술:
이 단계에서는 Kubernetes Pod 내에서 명령을 실행하기 위해 kubectl exec를 사용하는 방법을 배웁니다. 이는 컨테이너 환경을 디버깅하고 조사하는 데 필수적입니다.
먼저, 사용 가능한 Pod 를 확인합니다:
kubectl get pods
예시 출력:
NAME READY STATUS RESTARTS AGE
nginx-pod 1/1 Running 0 30m
nginx-deployment-xxx-yyy 1/1 Running 0 30m
nginx-deployment-xxx-zzz 1/1 Running 0 30m
nginx-deployment-xxx-www 1/1 Running 0 30m
nginx-pod 에서 대화형 셸을 실행합니다:
kubectl exec -it nginx-pod -- /bin/bash
Pod 내부의 예시 상호 작용:
## nginx 설정 확인
cat /etc/nginx/nginx.conf
## 설치된 패키지 확인
apt update && apt list --installed
## pod 셸 종료
exit
셸 프롬프트로 돌아가려면 대화형 셸을 exit해야 합니다.
대화형 셸에 들어가지 않고 특정 명령을 실행합니다:
## nginx 버전 확인
kubectl exec nginx-pod -- nginx -v
## 웹 루트의 파일 목록
kubectl exec nginx-pod -- ls /usr/share/nginx/html
Deployment Pod 의 경우, 특정 Pod 를 선택합니다:
## deployment에서 Pod 이름 가져오기
POD_NAME=$(kubectl get pods -l app=nginx | grep nginx-deployment | head -n 1 | awk '{print $1}')
## deployment의 Pod에서 명령 실행
kubectl exec -it $POD_NAME -- /bin/bash
주요 kubectl exec 기술:
이 단계에서는 kubectl describe를 사용하여 Kubernetes 리소스를 진단하고 문제 해결하는 방법을 배웁니다. Pod, Deployment 및 클러스터 구성 요소 상태에 대한 자세한 정보를 제공합니다.
먼저, 디버깅을 시연하기 위해 문제가 있는 Deployment 를 생성해 보겠습니다:
cd ~/project/k8s-manifests
nano problematic-deployment.yaml
다음 내용을 추가합니다:
apiVersion: apps/v1
kind: Deployment
metadata:
name: debug-deployment
spec:
replicas: 2
selector:
matchLabels:
app: debug
template:
metadata:
labels:
app: debug
spec:
containers:
- name: debug-container
image: non-existent-image:latest
ports:
- containerPort: 80
Deployment 를 적용합니다:
kubectl apply -f problematic-deployment.yaml
이제, kubectl describe를 사용하여 Deployment 를 조사합니다:
kubectl describe deployment debug-deployment
예시 출력:
Name: debug-deployment
Namespace: default
CreationTimestamp: [timestamp]
Labels: <none>
Annotations: deployment.kubernetes.io/revision: 1
Selector: app=debug
Replicas: 2 desired | 0 available | 2 total | 2 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Conditions:
Type Status Reason
---- ------ ------
Available False MinimumReplicasUnavailable
Progressing False ProgressDeadlineExceeded
OldReplicaSets: <none>
NewReplicaSet: debug-deployment-xxx (2/2 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedCreate 1m deployment-controller Failed to create pod
Normal ScalingReplicaSet 1m deployment-controller Scaled up replica set
Pod 에 대한 자세한 정보를 얻으려면 Pod 를 설명합니다:
kubectl describe pods -l app=debug
예시 출력:
Name: debug-deployment-xxx-yyy
Namespace: default
Priority: 0
Node: minikube/172.17.0.2
Start Time: [timestamp]
Labels: app=debug
Annotations: <none>
Status: Pending
Conditions:
Type Status
Initialized True
Ready False
PodScheduled True
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedCreatePodSandBox 1m kubelet Failed to create pod sandbox
Warning Failed 1m kubelet Failed to pull image
노드 리소스를 설명합니다:
kubectl describe nodes minikube
주요 문제 해결 기술:
이 단계에서는 kubectl get events를 사용하여 클러스터 전체 이벤트를 조사하고, 시스템 활동을 이해하며, Kubernetes 환경 전반의 문제를 진단하는 방법을 배웁니다.
먼저, 모든 클러스터 이벤트를 봅니다:
kubectl get events
예시 출력:
LAST SEEN TYPE REASON OBJECT MESSAGE
10m Warning FailedCreate deployment/debug-deployment Failed to create pod
5m Normal Scheduled pod/nginx-pod Successfully assigned default/nginx-pod to minikube
3m Normal Pulled pod/nginx-deployment-xxx-yyy Container image "nginx:latest" already present on machine
네임스페이스별로 이벤트를 필터링합니다:
kubectl get events -n default
더 자세한 이벤트 보기 옵션을 사용합니다:
## 실시간으로 이벤트 감시
kubectl get events -w
## 타임스탬프별로 정렬된 이벤트 가져오기
kubectl get events --sort-by='.metadata.creationTimestamp'
사용자 정의 이벤트 생성 시나리오를 생성합니다:
cd ~/project/k8s-manifests
nano event-test-deployment.yaml
다음 내용을 추가합니다:
apiVersion: apps/v1
kind: Deployment
metadata:
name: event-test
spec:
replicas: 3
selector:
matchLabels:
app: event-test
template:
metadata:
labels:
app: event-test
spec:
containers:
- name: nginx
image: nginx:latest
resources:
limits:
cpu: "100m"
memory: "50Mi"
Deployment 를 적용하고 이벤트를 검토합니다:
kubectl apply -f event-test-deployment.yaml
kubectl get events
고급 이벤트 필터링:
## 이벤트 유형별로 필터링
kubectl get events --field-selector type=Warning
## 특정 리소스별로 필터링
kubectl get events --field-selector involvedObject.kind=Deployment
주요 이벤트 검토 기술:
이 랩에서는 로컬 머신에서 Kubernetes 애플리케이션을 개발하고 테스트하기 위한 필수 첫 번째 단계인 Minikube 를 사용하여 로컬 Kubernetes 클러스터를 시작하고 확인하는 방법을 배웠습니다. 또한 Pod 와 Deployment 를 포함하여 YAML 매니페스트를 사용하여 간단한 Kubernetes 애플리케이션을 생성하고 배포하는 방법을 배웠습니다. 또한, 애플리케이션의 구성 검사, 로그 보기, 디버깅 및 문제 해결을 위한 다양한 명령을 탐색하여 Kubernetes 애플리케이션을 관리하고 모니터링하는 방법에 대한 더 나은 이해를 얻었습니다.