Post

[Kubernetes] 파드 생성 및 관리

Kubernetes에서 Pod 생성과 관리

Kubernetes에서 Pod는 클러스터에서 애플리케이션이 실행되는 가장 기본적인 단위입니다. Pod는 컨테이너들의 집합으로, 하나 이상의 컨테이너를 포함할 수 있으며, 컨테이너들은 같은 네트워크 네임스페이스를 공유하고 클러스터 내에서 단일 IP 주소를 갖습니다. 이번 포스팅에서는 Pod의 생성과 관리에 대한 내용을 살펴보겠습니다.

1. Pod 생성

Pod를 생성하는 방법은 크게 두 가지로 나눌 수 있습니다: 선언형 방식과 명령형 방식.

1.1 선언형 방식으로 Pod 생성

Kubernetes에서 Pod를 선형 방식으로 생성하려면 YAML 파일을 사용하여 Pod의 정의를 작성한 후, 이를 kubectl apply 명령어로 적용합니다. 다음은 Nginx 컨테이너를 실행하는 간단한 Pod 정의 예시입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
yaml
apiVersion: v1
kind: Pod
metadata:
  name: myweb1
  labels:
    app: myweb1
spec:
  containers:
  - name: nginx-container
    image: nginx:1.25.3-alpine
    ports:
    - containerPort: 80

YAML 파일을 작성한 후 아래와 같이 명령어를 실행하여 Pod를 생성할 수 있습니다.

1
kubectl apply -f myweb1-pod.yaml

Pod가 정상적으로 생성되었는지 확인하려면 kubectl get po 명령어를 사용할 수 있습니다.

1
kubectl get po -o wide | grep myweb1

이 명령어는 myweb1 Pod의 상태와 네트워크 정보를 출력합니다.

1.2 명령형 방식으로 Pod 생성

명령형 방식에서는 YAML 파일 없이 바로 명령어를 사용해 Pod를 생성할 수 있습니다. 예를 들어, Nginx 컨테이너를 명령형 방식으로 실행하려면 다음과 같이 실행합니다.

1
kubectl run myweb2 --image=nginx:1.25.3-alpine --port=80

Pod 생성 후, 이를 서비스로 노출하려면 kubectl expose 명령어를 사용합니다.

1
kubectl expose pod myweb2 --name=myweb2-svc --port=8002 --target-port=80

서비스가 제대로 생성되었는지 확인하려면 kubectl get svc 명령을 실행합니다.

1
kubectl get svc -o wide | grep myweb2

2. Pod 라이프사이클

Kubernetes에서 Pod의 라이프사이클은 크게 4가지 상태로 나뉩니다: Pending, Running, Succeeded, Failed. 이 상태들은 kubectl get po 명령을 통해 확인할 수 있습니다.

1
kubectl get po -o wide
  • Pending: Pod가 클러스터에 할당되었지만, 컨테이너가 아직 실행되지 않은 상태.
  • Running: Pod가 성공적으로 실행 중인 상태.
  • Succeeded: Pod가 성공적으로 완료된 상태. 주로 작업이 완료되면 나타나는 상태.
  • Failed: Pod 내 컨테이너가 실패한 경우 나타나는 상태.

각 상태의 변환은 kubectl describe po 명령어로 확인할 수 있으며, Pod가 실행 중이거나 종료되는 과정에서 문제가 발생할 때 유용하게 사용할 수 있습니다.

1
kubectl describe pod mypod

3. Pod 설계 패턴

Pod는 다양한 설계 패턴을 따를 수 있습니다. 여러 컨테이너를 함께 사용하여 애플리케이션을 효율적으로 관리할 수 있습니다. 대표적인 설계 패턴으로는 sidecar containerinit container가 있습니다.

3.1 Sidecar 컨테이너 패턴

Sidecar 컨테이너는 주 컨테이너와 함께 실행되며, 보조 역할을 수행합니다. 주로 로깅, 모니터링, 데이터 수집 등의 작업에 사용됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
yaml
apiVersion: v1
kind: Pod
metadata:
  name: log-pod
spec:
  containers:
  - name: app-container
    image: nginx:1.25.3
    volumeMounts:
    - name: html-log
      mountPath: /usr/share/nginx/html
  - name: sidecar-container
    image: debian:10
    volumeMounts:
    - name: html-log
      mountPath: /date-log
    command: ["/bin/sh", "-c"]
    args:
    - while true; do
        date >> /date-log/index.html;
        sleep 1;
      done
  volumes:
  - name: html-log
    emptyDir: {}

이 Pod는 nginx 컨테이너와 sidecar 컨테이너로 구성되어 있으며, sidecar 컨테이너는 날짜 정보를 주기적으로 HTML 파일에 기록합니다.

3.2 Init 컨테이너 패턴

Init 컨테이너는 메인 애플리케이션이 실행되기 전에 초기화 작업을 수행하는 컨테이너입니다. 애플리케이션 실행에 필요한 설정 파일 다운로드 또는 환경 설정 등을 처리하는 데 사용됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
yaml
apiVersion: v1
kind: Pod
metadata:
  name: weather-pod
spec:
  volumes:
  - name: weather-data
    emptyDir: {}
  initContainers:
  - name: download-config
    image: curlimages/curl:7.85.0
    args: ["https://api.open-meteo.com/v1/forecast?latitude=37.5443878&longitude=127.03744246&current_weather=true", "-o", "/usr/share/nginx/html/index.html"]
    volumeMounts:
    - mountPath: /usr/share/nginx/html
      name: weather-data
  containers:
  - name: nginx-container
    image: nginx:1.25.3-alpine
    ports:
    - containerPort: 80
    volumeMounts:
    - mountPath: /usr/share/nginx/html
      name: weather-data

위 예시에서는 init 컨테이너가 API로부터 데이터를 가져와 nginx 컨테이너가 실행되는 동안 데이터를 활용할 수 있도록 설정합니다.

4. Label과 Selector 활용

Kubernetes에서 Label은 리소스를 그룹화하고 관리하는 데 중요한 역할을 합니다. Label을 통해 여러 Pod를 그룹화하여 쉽게 관리할 수 있으며, 이를 통해 Selector로 필터링하여 리소스를 조회할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
yaml
apiVersion: v1
kind: Pod
metadata:
  name: label-pod
  labels:
    app: myapp
    tier: backend
spec:
  containers:
  - name: myapp-container
    image: myapp:latest

이러한 Pod를 필터링하려면 아래 명령어를 사용할 수 있습니다.

1
kubectl get po --selector=app=myapp

5. Node Scheduling

Node Scheduling은 Pod가 실행될 노드를 선택하는 과정입니다. 노드 선택을 제어하기 위해 nodeSelector와 같은 메커니즘을 사용할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
yaml
apiVersion: v1
kind: Pod
metadata:
  name: sch-test1
spec:
  nodeSelector:
    kubernetes.io/hostname: k8s-node1
  containers:
  - name: nginx-container
    image: nginx:1.25.3

이 설정은 Pod가 k8s-node1에서만 실행되도록 제어합니다.

6. Probes

Probes는 Kubernetes에서 컨테이너의 상태를 확인하는 데 사용됩니다. Readiness Probe와 Liveness Probe가 있으며, 애플리케이션이 준비되었는지 또는 정상 동작 중인지를 판단하는 데 사용됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
yaml
apiVersion: v1
kind: Pod
metadata:
  name: read-http-pod
spec:
  containers:
  - name: http-container
    image: nginx
    readinessProbe:
      httpGet:
        path: /testpath
        port: 8080
      initialDelaySeconds: 15
      periodSeconds: 10

이 설정은 Nginx가 /testpath 경로에서 HTTP 상태 코드 200을 반환하는지 확인합니다.

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.