Kubernetes/Kubernetes Best Practices

[Scenario Playbook Ep.5] 🚀 POD 편 #5 | Pod 스케줄링 & 실행 전략

ygtoken 2025. 3. 15. 13:32
728x90

 

쿠버네티스에서 Pod이 특정 조건에서만 실행되도록 제어하는 방법은 매우 중요합니다.

이번 글에서는 Taint & Toleration을 이용한 노드 제어Pod이 재시작될 때마다 새로운 ID를 생성하는 방법을 다룹니다.

 


📌 글에서 다루는 상황들

 

1️⃣ Taint 및 Toleration을 이용하여 특정 노드에서 실행

2️⃣ Pod이 재시작될 때마다 새로운 ID를 생성해야 하는 경우

 

각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.

 


1️⃣ Taint 및 Toleration을 이용하여 특정 노드에서 실행

 

📍 상황 설명

 

운영팀에서 특정 애플리케이션을 지정된 노드에서만 실행하도록 요구했습니다.

이 애플리케이션은 다른 워크로드와 분리되어 특정 노드에서만 실행되어야 합니다.

특정 노드에 Taint를 추가하여 기본적으로 모든 Pod의 실행을 차단합니다.

Pod에 Toleration을 추가하여 특정 노드에서만 실행되도록 허용합니다.

 


🛠️ 해결 방법

 

1. 노드에 Taint를 추가하여 기본적으로 Pod이 실행되지 않도록 설정해야 합니다.

kubectl taint nodes <노드이름> key=value:NoSchedule

<노드이름>: Taint를 추가할 노드

NoSchedule: 이 Taint가 적용된 노드에는 허용된 Pod만 실행됨

 

2. Pod에 Toleration을 추가하여 특정 Taint가 적용된 노드에서도 실행되도록 설정해야 합니다.

 


✅ 정답 Manifest (Toleration이 적용된 Pod)

apiVersion: v1
kind: Pod
metadata:
  name: tainted-pod  # Pod의 이름
spec:
  tolerations:
  - key: "key"  # 노드에 설정된 Taint의 키
    operator: "Equal"
    value: "value"  # 노드에 설정된 Taint의 값
    effect: "NoSchedule"  # 해당 Taint에 대해 실행을 허용

  containers:
  - name: my-app
    image: my-app:latest  # 애플리케이션 컨테이너

 

 


📌 적용 후 예상 결과 값

 

1) Taint 추가 확인

kubectl describe node <노드이름> | grep Taints

 

💡 예상 출력 값

Taints: key=value:NoSchedule

 

2) Pod 생성 확인

kubectl get pods -o wide

 

💡 예상 출력 값

NAME           READY   STATUS    RESTARTS   AGE   NODE
tainted-pod    1/1     Running   0          5s    special-node

 

 


2️⃣ Pod이 재시작될 때마다 새로운 ID를 생성해야 하는 경우

 

📍 상황 설명

 

일부 애플리케이션은 실행될 때마다 고유한 ID를 생성해야 하는 요구 사항이 있습니다.

이러한 경우, Pod이 재시작될 때마다 새로운 ID가 설정되도록 구성해야 합니다.

Pod의 이름은 random-id-pod이어야 합니다.

실행될 때마다 환경 변수로 새로운 UUID를 생성해야 합니다.

 


🛠️ 해결 방법

 

1. Pod 실행 시마다 새로운 환경 변수 값을 생성해야 합니다.

valueFrom.fieldRef.fieldPath를 사용하여 metadata.uid 값을 환경 변수로 전달

2. Pod이 재시작되면 UID가 변경되도록 설정해야 합니다.

restartPolicy: Always로 설정하여 재시작 시마다 새로운 UID를 받도록 구성

 


✅ 정답 Manifest (재시작 시 새로운 ID가 적용된 Pod)

apiVersion: v1
kind: Pod
metadata:
  name: random-id-pod  # Pod의 이름
spec:
  restartPolicy: Always  # 재시작될 때마다 새로운 환경 변수를 받도록 설정
  containers:
  - name: my-app
    image: my-app:latest  # 애플리케이션 컨테이너
    env:
    - name: INSTANCE_ID
      valueFrom:
        fieldRef:
          fieldPath: metadata.uid  # Pod의 UID를 환경 변수로 설정

 

 


📌 적용 후 예상 결과 값

1) Pod 생성 확인

kubectl get pods

 

💡 예상 출력 값

NAME            READY   STATUS    RESTARTS   AGE
random-id-pod   1/1     Running   0          5s

 

2) Pod 내부에서 생성된 ID 확인

kubectl exec -it random-id-pod -- env | grep INSTANCE_ID

 

💡 예상 출력 값

INSTANCE_ID=a3b2c1d4-e5f6-7890-1234-56789abcdef0

 

3) Pod 재시작 후 새로운 ID 확인

kubectl delete pod random-id-pod
kubectl apply -f random-id-pod.yaml
kubectl exec -it random-id-pod -- env | grep INSTANCE_ID

 

💡 예상 출력 값

INSTANCE_ID=b4c3d2e1-f6a5-0987-6543-210fedcba987

 

 

728x90