여러 명령 실행 및 시작 실패 처리
이 단계에서는 Pod 시작 시 여러 명령을 실행하고 상태 검사를 사용하여 시작 실패를 처리하는 방법을 배웁니다.
여러 명령 실행
컨테이너가 시작될 때 여러 명령을 실행해야 하는 경우가 많습니다. Kubernetes 에서 이를 수행하는 방법에는 여러 가지가 있습니다.
- 셸 연산자 (
&&, ; 등) 를 사용하여 명령을 연결합니다.
- 스크립트 파일을 사용합니다.
- init 컨테이너를 사용합니다.
multi-command-pod.yaml 파일을 검토하여 첫 번째 방법을 살펴보겠습니다.
nano multi-command-pod.yaml
다음과 같은 내용을 볼 수 있습니다.
apiVersion: v1
kind: Pod
metadata:
name: multi-command-pod
spec:
containers:
- name: ubuntu
image: ubuntu:20.04
command: ["/bin/bash", "-c"]
args:
[
"echo 'First command' > /tmp/first.txt && echo 'Second command' > /tmp/second.txt && sleep 3600"
]
이 구성은 && 연산자를 사용하여 여러 명령을 함께 연결하며, 이전 명령이 성공한 경우에만 각 명령을 실행합니다.
편집기를 종료하려면 Ctrl+X를 누릅니다.
이 Pod 를 생성해 보겠습니다.
kubectl apply -f multi-command-pod.yaml
다음과 같은 출력을 볼 수 있습니다.
pod/multi-command-pod created
이제 생성된 파일을 확인하여 두 명령이 모두 실행되었는지 확인해 보겠습니다.
kubectl exec multi-command-pod -- cat /tmp/first.txt
다음과 같은 출력을 볼 수 있습니다.
First command
그리고 두 번째 파일의 경우:
kubectl exec multi-command-pod -- cat /tmp/second.txt
다음과 같은 출력을 볼 수 있습니다.
Second command
상태 검사를 사용하여 시작 실패 처리
Kubernetes 는 시작 실패를 감지하고 처리하는 메커니즘을 제공합니다.
- Liveness Probe (생존 프로브): 컨테이너가 실행 중인지 확인합니다. 그렇지 않은 경우 Kubernetes 가 다시 시작합니다.
- Readiness Probe (준비 프로브): 컨테이너가 트래픽을 수신할 준비가 되었는지 확인합니다.
- Startup Probe (시작 프로브): 애플리케이션이 시작되었는지 확인합니다. 느리게 시작되는 컨테이너에 유용합니다.
Liveness Probe 를 사용하는 Pod 를 살펴보겠습니다.
nano liveness-probe-pod.yaml
다음과 같은 내용을 볼 수 있습니다.
apiVersion: v1
kind: Pod
metadata:
name: liveness-probe-pod
spec:
containers:
- name: ubuntu
image: ubuntu:20.04
command: ["/bin/bash", "-c"]
args: ["touch /tmp/healthy && sleep 3600"]
livenessProbe:
exec:
command: ["cat", "/tmp/healthy"]
initialDelaySeconds: 5
periodSeconds: 5
이 구성에서:
- 컨테이너는 시작 시
/tmp/healthy 파일을 생성합니다.
- Liveness Probe 는 5 초마다 이 파일을 확인합니다.
- 파일이 없으면 Kubernetes 는 컨테이너가 비정상이라고 간주하고 다시 시작합니다.
편집기를 종료하려면 Ctrl+X를 누릅니다.
이 Pod 를 생성해 보겠습니다.
kubectl apply -f liveness-probe-pod.yaml
다음과 같은 출력을 볼 수 있습니다.
pod/liveness-probe-pod created
Pod 가 실행 중인지 확인합니다.
kubectl get pods liveness-probe-pod
다음과 같은 출력을 볼 수 있습니다.
NAME READY STATUS RESTARTS AGE
liveness-probe-pod 1/1 Running 0 30s
이제 상태 검사 파일을 제거하면 어떻게 되는지 살펴보겠습니다.
kubectl exec liveness-probe-pod -- rm /tmp/healthy
약 10 초 동안 기다린 다음 Pod 상태를 다시 확인합니다.
kubectl get pods liveness-probe-pod
컨테이너가 다시 시작되었음을 볼 수 있습니다.
NAME READY STATUS RESTARTS AGE
liveness-probe-pod 1/1 Running 1 60s
RESTARTS 횟수가 1 로 증가하여 Kubernetes 가 비정상 상태를 감지하고 컨테이너를 다시 시작했음을 나타냅니다.
상태 검사 파일이 다시 존재하는지 확인해 보겠습니다 (컨테이너가 다시 시작될 때 시작 명령에 의해 다시 생성되었어야 합니다).
kubectl exec liveness-probe-pod -- ls -la /tmp/healthy
파일이 다시 존재하는 것을 볼 수 있습니다.
-rw-r--r-- 1 root root 0 Sep 21 10:30 /tmp/healthy
이는 Kubernetes 가 시작 실패로부터 자동으로 복구하고 애플리케이션의 원하는 상태를 유지하는 방법을 보여줍니다.
사용자 지정 시작 스크립트 생성
더 복잡한 초기화를 위해 사용자 지정 시작 스크립트를 사용하고 싶을 수 있습니다. 시작을 위해 셸 스크립트를 사용하는 Pod 를 만들어 보겠습니다.
nano script-pod.yaml
다음 내용을 추가합니다.
apiVersion: v1
kind: Pod
metadata:
name: script-pod
spec:
containers:
- name: ubuntu
image: ubuntu:20.04
command: ["/bin/bash", "-c"]
args:
- |
cat > /tmp/startup.sh << 'EOF'
#!/bin/bash
echo "Script started at $(date)" > /tmp/script-log.txt
echo "Creating configuration files..." >> /tmp/script-log.txt
mkdir -p /tmp/config
echo "app_name=MyApp" > /tmp/config/app.conf
echo "version=1.0" >> /tmp/config/app.conf
echo "Script completed successfully" >> /tmp/script-log.txt
EOF
chmod +x /tmp/startup.sh
/tmp/startup.sh
sleep 3600
이 구성은 다음을 수행합니다.
- 컨테이너에 시작 스크립트를 생성합니다.
- 실행 가능하게 만듭니다.
- 스크립트를 실행합니다.
- sleep 으로 컨테이너를 계속 실행합니다.
Ctrl+X를 누른 다음 Y와 Enter를 눌러 저장하고 종료합니다.
이 Pod 를 생성해 보겠습니다.
kubectl apply -f script-pod.yaml
다음과 같은 출력을 볼 수 있습니다.
pod/script-pod created
Pod 가 시작될 때까지 잠시 기다린 다음 상태를 확인합니다.
kubectl get pods script-pod
다음과 같은 출력을 볼 수 있습니다.
NAME READY STATUS RESTARTS AGE
script-pod 1/1 Running 0 30s
이제 스크립트의 출력을 확인해 보겠습니다.
kubectl exec script-pod -- cat /tmp/script-log.txt
다음과 유사한 출력을 볼 수 있습니다.
Script started at Tue Sep 21 10:35:42 UTC 2023
Creating configuration files...
Script completed successfully
그리고 구성 파일이 생성되었는지 확인해 보겠습니다.
kubectl exec script-pod -- cat /tmp/config/app.conf
다음과 같은 출력을 볼 수 있습니다.
app_name=MyApp
version=1.0
이는 Kubernetes 에서 복잡한 시작 스크립트를 사용하여 컨테이너를 초기화하는 방법을 보여줍니다.