Kubernetes 작업 상태 및 로그 모니터링 방법

KubernetesBeginner
지금 연습하기

소개

Kubernetes 는 여러 호스트에서 컨테이너화된 애플리케이션을 관리하는 데 도움이 되는 강력한 컨테이너 오케스트레이션 플랫폼입니다. Kubernetes 의 중요한 기능 중 하나는 작업 관리 시스템으로, 배치 지향 워크로드를 완료될 때까지 실행할 수 있도록 해줍니다. 이 튜토리얼에서는 컨테이너화된 애플리케이션이 원활하게 실행되도록 보장하는 데 필수적인 기술인 Kubernetes 작업의 상태를 모니터링하고 로그를 분석하는 방법을 배우게 됩니다.

이 튜토리얼을 마치면 Kubernetes 작업을 생성하고, 상태를 확인하며, 문제를 효과적으로 해결하기 위해 로그를 검사할 수 있게 됩니다.

Kubernetes 환경 설정

Kubernetes 작업을 모니터링하기 전에, 먼저 작동하는 Kubernetes 환경을 설정해야 합니다. 로컬 머신에 단일 노드 Kubernetes 클러스터를 생성하는 도구인 Minikube 를 사용합니다.

Minikube 설치

Minikube 는 이미 VM 에 설치되어 있습니다. 버전을 확인하여 설치를 확인해 보겠습니다.

minikube version

다음과 유사한 출력을 볼 수 있습니다.

minikube version: v1.29.0
commit: ddac20b4b34a9c8c857fc602203b6ba2679794d3

Minikube 시작

이제 Minikube 를 시작하여 로컬 Kubernetes 클러스터를 생성해 보겠습니다.

minikube start --driver=docker

이 명령은 완료하는 데 몇 분 정도 걸립니다. Minikube 가 필요한 구성 요소를 다운로드하고 클러스터를 시작하는 일련의 메시지를 보게 됩니다.

완료되면 다음과 같은 메시지가 표시됩니다.

🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

Kubernetes 설치 확인

노드 상태를 확인하여 Kubernetes 클러스터가 올바르게 실행되고 있는지 확인해 보겠습니다.

kubectl get nodes

다음과 유사한 출력을 볼 수 있습니다.

NAME       STATUS   ROLES           AGE     VERSION
minikube   Ready    control-plane   1m      v1.26.3

또한 핵심 Kubernetes 구성 요소가 실행 중인지 확인합니다.

kubectl get pods -n kube-system

kube-apiserver, kube-controller-manager 등과 같은 구성 요소를 포함하여 여러 Pod 가 실행 중인 것을 볼 수 있습니다.

이제 Kubernetes 클러스터가 실행 중이므로 작업을 생성하고 모니터링할 준비가 되었습니다.

첫 번째 Kubernetes 작업 생성

이 단계에서는 컨테이너를 실행하고, 작업을 수행한 다음 완료되는 간단한 Kubernetes 작업을 생성합니다. 이를 통해 다음 단계에서 모니터링할 대상을 얻을 수 있습니다.

Kubernetes 작업 이해

Kubernetes Job 은 하나 이상의 Pod 를 생성하고 성공적으로 종료되도록 보장하는 컨트롤러입니다. 작업은 배치 프로세스, 일회성 작업 또는 무기한이 아닌 완료될 때까지 실행되어야 하는 모든 작업에 유용합니다.

작업 구성 파일 생성

간단한 작업 구성 파일을 만들어 보겠습니다. 터미널을 열고 프로젝트 디렉터리에 hello-job.yaml이라는 새 파일을 만듭니다.

cd ~/project
nano hello-job.yaml

다음 YAML 내용을 파일에 복사하여 붙여넣습니다.

apiVersion: batch/v1
kind: Job
metadata:
  name: hello-job
spec:
  template:
    spec:
      containers:
        - name: hello
          image: busybox:1.28
          command: ["sh", "-c", 'echo "Hello, Kubernetes!" && sleep 5']
      restartPolicy: Never
  backoffLimit: 4

이 구성은 다음과 같은 hello-job이라는 작업을 정의합니다.

  • busybox:1.28 컨테이너 이미지를 사용합니다.
  • "Hello, Kubernetes!"를 출력한 다음 5 초 동안 대기하는 명령을 실행합니다.
  • Never의 재시작 정책을 가지므로 완료 후 다시 시작하지 않습니다.
  • backoffLimit가 4 이므로 실패할 경우 최대 4 번 재시도합니다.

Ctrl+O를 누르고 Enter를 누른 다음 Ctrl+X로 nano 를 종료하여 파일을 저장합니다.

작업 생성

이제 Kubernetes 클러스터에서 작업을 생성해 보겠습니다.

kubectl apply -f hello-job.yaml

다음 출력을 볼 수 있습니다.

job.batch/hello-job created

축하합니다! 첫 번째 Kubernetes 작업을 방금 생성했습니다. 다음 단계에서는 상태를 모니터링하는 방법을 배우겠습니다.

Kubernetes 작업 상태 모니터링

이제 Kubernetes 클러스터에서 작업이 실행 중이므로 상태를 모니터링하는 방법을 알아보겠습니다. 작업 상태를 모니터링하는 것은 작업이 성공적으로 완료되었는지 또는 오류가 발생하는지 이해하는 데 매우 중요합니다.

kubectl 을 사용하여 작업 상태 확인

Kubernetes 리소스를 모니터링하기 위한 기본 도구는 kubectl입니다. 이를 사용하여 작업의 상태를 확인해 보겠습니다.

kubectl get jobs

다음과 유사한 출력을 볼 수 있습니다.

NAME        COMPLETIONS   DURATION   AGE
hello-job   1/1           10s        30s

이 출력은 다음을 보여줍니다.

  • NAME: 작업의 이름
  • COMPLETIONS: 완료된 Pod 수 / 원하는 완료 수
  • DURATION: 작업 실행 시간
  • AGE: 작업 생성 후 경과 시간

작업의 COMPLETIONS 에 0/1이 표시되면 아직 실행 중이거나 실패했을 수 있습니다. 몇 초 동안 기다린 후 명령을 다시 실행하십시오.

자세한 작업 정보 가져오기

작업에 대한 자세한 정보를 얻으려면 describe 명령을 사용합니다.

kubectl describe job hello-job

이 명령은 다음을 포함하여 작업에 대한 광범위한 정보를 제공합니다.

  • 레이블 및 주석
  • 선택기 세부 정보
  • 병렬 처리 및 완료 요구 사항
  • Pod 상태
  • 작업과 관련된 이벤트

Pod 생성 및 완료와 같은 중요한 이벤트를 보여주는 하단의 Events 섹션을 확인하십시오.

작업 상태 이해

작업은 여러 상태를 가질 수 있습니다.

  • Active: 작업이 아직 실행 중입니다.
  • Completed: 작업이 성공적으로 완료되었습니다.
  • Failed: 작업이 백오프 제한에 도달한 후 실패했습니다.

작업의 Pod 가 완료되었는지 확인해 보겠습니다.

kubectl get pods

다음과 같은 내용을 볼 수 있습니다.

NAME              READY   STATUS      RESTARTS   AGE
hello-job-abcd1   0/1     Completed   0          1m

STATUS 열은 Completed를 표시하여 작업이 성공적으로 실행되었음을 나타냅니다.

더 오래 걸리는 작업 생성

Active 상태에서 관찰할 수 있도록 완료하는 데 더 오래 걸리는 다른 작업을 만들어 보겠습니다.

cd ~/project
nano long-job.yaml

다음 YAML 내용을 복사하여 붙여넣습니다.

apiVersion: batch/v1
kind: Job
metadata:
  name: long-job
spec:
  template:
    spec:
      containers:
        - name: long
          image: busybox:1.28
          command:
            [
              "sh",
              "-c",
              'echo "Starting long job..." && sleep 30 && echo "Long job completed!"'
            ]
      restartPolicy: Never
  backoffLimit: 4

파일을 저장하고 nano 를 종료합니다. 그런 다음 작업을 생성합니다.

kubectl apply -f long-job.yaml

이제 즉시 상태를 확인해 보겠습니다.

kubectl get jobs

long-job이 아직 실행 중이므로 0/1 완료를 표시하는 것을 볼 수 있습니다. 몇 초마다 계속 확인하면 약 30 초 후에 1/1로 변경되는 것을 볼 수 있습니다.

이는 kubectl을 사용하여 작업의 진행 상황을 실시간으로 모니터링하는 방법을 보여줍니다.

Kubernetes 작업 로그 분석

Kubernetes 작업에서 로그를 보고 분석할 수 있는 것은 디버깅 및 작업 동작 이해에 필수적입니다. 이 단계에서는 생성한 작업에서 로그에 액세스하고 분석하는 방법을 살펴보겠습니다.

작업에 대한 Pod 이름 가져오기

로그를 보기 전에 작업에서 생성된 Pod 의 이름을 알아야 합니다. 각 작업은 작업 이름과 임의의 접미사를 포함하는 이름을 가진 하나 이상의 Pod 를 생성합니다.

작업과 관련된 모든 Pod 를 나열해 보겠습니다.

kubectl get pods --show-labels

이렇게 하면 모든 Pod 와 해당 레이블이 표시됩니다. job-name=hello-job 또는 job-name=long-job과 같은 레이블이 있는 Pod 를 찾습니다.

또는 작업 이름으로 Pod 를 필터링할 수 있습니다.

kubectl get pods -l job-name=hello-job

이렇게 하면 hello-job 작업에 속하는 Pod 만 표시됩니다.

작업 로그 보기

이제 Pod 이름을 알았으므로 작업에 대한 로그를 볼 수 있습니다. 다음 명령을 사용하고 <pod-name>을 Pod 의 실제 이름으로 바꿉니다.

kubectl logs <pod-name>

예를 들어 Pod 의 이름이 hello-job-abcd1인 경우 다음을 실행합니다.

kubectl logs hello-job-abcd1

다음 출력을 볼 수 있습니다.

Hello, Kubernetes!

이것은 작업이 출력하도록 프로그래밍된 메시지입니다.

더 긴 작업의 로그도 확인해 보겠습니다. 먼저 Pod 이름을 찾습니다.

kubectl get pods -l job-name=long-job

그런 다음 로그를 봅니다.

kubectl logs <long-job-pod-name>

다음과 같은 내용을 볼 수 있습니다.

Starting long job...
Long job completed!

완료된 작업의 로그 보기

Kubernetes 작업의 장점 중 하나는 작업이 완료된 후에도 로그를 볼 수 있다는 것입니다. 이는 디버깅 및 감사 목적으로 매우 유용합니다.

실패할 작업을 만들어 디버깅하는 방법을 살펴보겠습니다.

cd ~/project
nano failed-job.yaml

다음 YAML 내용을 복사하여 붙여넣습니다.

apiVersion: batch/v1
kind: Job
metadata:
  name: failed-job
spec:
  template:
    spec:
      containers:
        - name: failed
          image: busybox:1.28
          command: ["sh", "-c", 'echo "Attempting task..." && exit 1']
      restartPolicy: Never
  backoffLimit: 2

이 작업은 항상 상태 코드 1 로 종료되며 이는 실패를 나타냅니다. 파일을 저장하고 nano 를 종료한 다음 작업을 생성합니다.

kubectl apply -f failed-job.yaml

작업이 몇 번 시도하고 실패할 때까지 잠시 기다립니다 (백오프 제한까지). 그런 다음 상태를 확인합니다.

kubectl get jobs failed-job

0/1 완료를 표시하고 완료 기한에 도달했음을 볼 수 있습니다.

이제 실패한 Pod 의 로그를 확인하여 무엇이 잘못되었는지 살펴보겠습니다.

kubectl get pods -l job-name=failed-job

Error 상태의 여러 Pod 가 표시됩니다. 하나를 선택하고 로그를 봅니다.

kubectl logs <failed-pod-name>

다음과 같은 내용을 볼 수 있습니다.

Attempting task...

Pod 로그는 작업이 시작되었지만 오류 코드로 종료되었음을 보여줍니다. 이 정보는 작업 실패를 디버깅하는 데 매우 중요합니다.

실시간으로 로그 팔로우

실시간으로 실행 중인 작업의 로그를 팔로우하려면 -f 플래그를 사용할 수 있습니다.

kubectl logs -f <pod-name>

이는 출력이 발생하는 대로 보려는 더 오래 실행되는 작업에 특히 유용합니다.

이를 시연하기 위해 다른 장기 실행 작업을 만들어 보겠습니다.

cd ~/project
nano counter-job.yaml

다음 YAML 내용을 복사하여 붙여넣습니다.

apiVersion: batch/v1
kind: Job
metadata:
  name: counter-job
spec:
  template:
    spec:
      containers:
        - name: counter
          image: busybox:1.28
          command:
            [
              "sh",
              "-c",
              'for i in $(seq 1 5); do echo "Count: $i"; sleep 5; done'
            ]
      restartPolicy: Never

파일을 저장하고 nano 를 종료한 다음 작업을 생성합니다.

kubectl apply -f counter-job.yaml

이제 로그를 팔로우해 보겠습니다. 먼저 Pod 이름을 찾습니다.

kubectl get pods -l job-name=counter-job

그런 다음 로그를 팔로우합니다.

kubectl logs -f <counter-job-pod-name>

5 초마다 카운트가 증가하는 것을 볼 수 있습니다.

Count: 1
Count: 2
Count: 3
Count: 4
Count: 5

Ctrl+C를 눌러 로그 팔로우를 중지합니다.

로그에 액세스하고 분석하는 방법을 이해하면 Kubernetes 작업을 효과적으로 문제 해결하고 디버깅할 수 있습니다.

고급 작업 모니터링 기술

Kubernetes 작업 모니터링의 기본 사항을 알았으므로, 특히 프로덕션 환경에서 작업을 보다 효과적으로 모니터링하는 데 도움이 되는 몇 가지 더 고급 기술을 살펴보겠습니다.

작업 구성을 위한 레이블 사용

레이블은 Kubernetes 리소스에 연결할 수 있는 키 - 값 쌍입니다. 리소스의 하위 집합을 구성하고 선택하는 데 유용합니다. 사용자 지정 레이블이 있는 작업을 만들어 보겠습니다.

cd ~/project
nano labeled-job.yaml

다음 YAML 내용을 복사하여 붙여넣습니다.

apiVersion: batch/v1
kind: Job
metadata:
  name: labeled-job
  labels:
    department: engineering
    app: demo
    environment: training
spec:
  template:
    spec:
      containers:
        - name: labeled
          image: busybox:1.28
          command: ["sh", "-c", 'echo "This is a labeled job" && sleep 10']
      restartPolicy: Never

파일을 저장하고 nano 를 종료한 다음 작업을 생성합니다.

kubectl apply -f labeled-job.yaml

이제 레이블별로 작업을 필터링할 수 있습니다.

kubectl get jobs -l department=engineering

이렇게 하면 department=engineering 레이블이 있는 작업만 표시됩니다.

더 구체적인 필터링을 위해 여러 레이블을 사용할 수 있습니다.

kubectl get jobs -l department=engineering,environment=training

작업 이벤트 모니터링

Kubernetes 는 작업의 다양한 상태 변경에 대한 이벤트를 생성합니다. 이러한 이벤트는 작업의 수명 주기에 대한 귀중한 정보를 제공할 수 있습니다.

작업과 관련된 이벤트를 살펴보겠습니다.

kubectl get events --sort-by=.metadata.creationTimestamp

이 명령은 네임스페이스의 모든 이벤트를 시간별로 정렬하여 표시합니다. 특정 작업과 관련된 이벤트를 필터링할 수 있습니다.

kubectl get events --field-selector involvedObject.name=labeled-job

이러한 이벤트는 작업이 생성, 시작 또는 문제를 겪은 시기와 이유를 이해하는 데 도움이 될 수 있습니다.

사용자 지정 출력을 위한 JSONPath 사용

Kubernetes 를 사용하면 kubectl 명령의 출력에서 특정 필드를 추출하기 위해 JSONPath 를 사용할 수 있습니다. 이는 작업의 특정 측면에 집중하는 데 유용합니다.

kubectl get job labeled-job -o jsonpath='{.status.succeeded}'

이 명령은 labeled-job에 대해 성공한 Pod 의 수를 출력합니다.

작업의 생성 시간을 얻으려면 다음을 수행합니다.

kubectl get job labeled-job -o jsonpath='{.metadata.creationTimestamp}'

예약된 실행을 위한 CronJob 생성

일정에 따라 실행해야 하는 작업의 경우 Kubernetes 는 CronJob 을 제공합니다. 간단한 CronJob 을 만들어 보겠습니다.

cd ~/project
nano simple-cronjob.yaml

다음 YAML 내용을 복사하여 붙여넣습니다.

apiVersion: batch/v1
kind: CronJob
metadata:
  name: simple-cronjob
spec:
  schedule: "*/1 * * * *" ## Run every minute
  jobTemplate:
    spec:
      template:
        spec:
          containers:
            - name: hello
              image: busybox:1.28
              command: ["sh", "-c", 'date; echo "Hello from CronJob"']
          restartPolicy: Never

파일을 저장하고 nano 를 종료한 다음 CronJob 을 생성합니다.

kubectl apply -f simple-cronjob.yaml

CronJob 이 생성되었는지 확인합니다.

kubectl get cronjobs

다음과 유사한 출력을 볼 수 있습니다.

NAME             SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
simple-cronjob   */1 * * * *   False     0        <none>          10s

1~2 분 정도 기다린 다음 CronJob 에서 생성된 작업을 확인합니다.

kubectl get jobs

simple-cronjob-<timestamp>와 같은 이름의 작업이 표시됩니다.

가장 최근 CronJob 실행의 로그를 보려면 먼저 Pod 를 찾습니다.

kubectl get pods --sort-by=.metadata.creationTimestamp

그런 다음 로그를 봅니다.

kubectl logs <latest-cronjob-pod>

CronJob 은 Kubernetes 클러스터에서 반복 작업을 예약하는 데 강력하며, 우리가 배운 동일한 모니터링 기술을 CronJob 에도 적용할 수 있습니다.

정리

마무리하기 전에 생성한 리소스를 정리해 보겠습니다.

kubectl delete job hello-job long-job failed-job counter-job labeled-job
kubectl delete cronjob simple-cronjob

이렇게 하면 클러스터에서 모든 작업과 CronJob 이 제거됩니다.

요약

이 튜토리얼에서는 Kubernetes 작업을 효과적으로 모니터링하고 로그를 분석하는 방법을 배웠습니다. 이제 다음을 수행하는 방법을 알고 있습니다.

  • Minikube 를 사용하여 Kubernetes 환경 설정
  • 다양한 구성으로 Kubernetes 작업 생성
  • kubectl getkubectl describe를 사용하여 작업 상태 모니터링
  • kubectl logs를 사용하여 작업 로그에 액세스하고 분석
  • 보다 효과적인 모니터링을 위해 레이블, 이벤트 및 JSONPath 와 같은 고급 기술 사용
  • CronJob 을 사용하여 예약된 작업 생성

이러한 기술은 Kubernetes 환경에서 컨테이너화된 애플리케이션을 관리하는 데 필수적이며, 배치 프로세스의 안정성과 성능을 보장할 수 있습니다. 로그를 통해 작업 진행 상황을 추적하고 문제를 해결하는 방법을 이해함으로써 효율적이고 오류 없는 Kubernetes 워크로드를 유지 관리할 수 있습니다.

Kubernetes 여정을 계속 진행하면서 리소스 관리, 작업 병렬 처리, Prometheus 및 Grafana 와 같은 외부 모니터링 솔루션과의 통합과 같은 더 고급 주제를 탐구해 보십시오.