Kubernetes 애플리케이션 탐색 및 디버깅

KubernetesBeginner
지금 연습하기

소개

이 랩에서는 Kubernetes 애플리케이션을 탐색하고 디버깅합니다. Minikube 를 사용하여 로컬 Kubernetes 클러스터를 시작하고, 샘플 애플리케이션을 배포하며, 애플리케이션 구성 검사, 로그 보기, 파드 내부에서 명령 실행, 클러스터 이벤트 검사 등 다양한 디버깅 기술을 배웁니다. 이러한 기술은 Kubernetes 기반 애플리케이션을 개발하고 문제 해결하는 데 필수적입니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 92%입니다.학습자들로부터 98%의 긍정적인 리뷰율을 받았습니다.

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

이러한 명령은 다음을 확인합니다:

  1. Minikube 가 성공적으로 실행되고 있습니다.
  2. 로컬 Kubernetes 클러스터가 생성되었습니다.
  3. 클러스터가 사용할 준비가 되었습니다.
  4. 제어 평면 (control plane) 기능을 갖춘 단일 노드 클러스터가 있습니다.

올바른 클러스터에 연결되었는지 확인하기 위해 클러스터의 컨텍스트를 확인해 보겠습니다:

kubectl config current-context

예시 출력:

minikube

이는 kubectl 이 Minikube 클러스터를 사용하도록 구성되었음을 확인합니다.

Kubernetes 클러스터 설정에 대한 그림

샘플 애플리케이션 배포

이 단계에서는 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 의 주요 차이점:

  • Pod: 애플리케이션의 단일 인스턴스
  • Deployment: 여러 레플리카를 관리하고 자체 복구를 제공
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

구성을 검사할 때 주의해야 할 주요 사항:

  • 리소스 메타데이터 (이름, 레이블, 네임스페이스)
  • 컨테이너 이미지 및 포트
  • 레플리카 수 (Deployment 의 경우)
  • 리소스 상태 및 조건

애플리케이션 로그 보기

이 단계에서는 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

주요 로그 보기 기술:

  • 전체 로그 기록 보기
  • 로그 줄 제한
  • 실시간으로 로그 따라가기
  • 다중 컨테이너 Pod 에서 컨테이너 지정

kubectl exec 를 사용한 디버깅

이 단계에서는 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 기술:

  • 대화형 셸 실행
  • 특정 명령 실행
  • Pod 내부 조사
  • 컨테이너 구성 디버깅

문제 해결을 위한 kubectl describe 사용법

이 단계에서는 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

주요 문제 해결 기술:

  • Deployment 및 Pod 상태 식별
  • 자세한 오류 메시지 보기
  • 리소스가 실행되지 않는 이유 이해
  • 노드 및 클러스터 상태 확인

문제 해결 팁: Kubernetes 클러스터 이벤트 (kubectl get events) 분석

이 단계에서는 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 애플리케이션을 관리하고 모니터링하는 방법에 대한 더 나은 이해를 얻었습니다.