複数のコマンドの実行と起動失敗の処理
このステップでは、ポッド起動時に複数のコマンドを実行する方法と、ヘルスチェックを使用して起動失敗を処理する方法を学びます。
複数のコマンドの実行
コンテナが起動するときに複数のコマンドを実行する必要があることがよくあります。Kubernetes では、これを行う方法がいくつかあります。
- シェル演算子 (
&&
, ;
など) を使用してコマンドを連鎖させる
- スクリプトファイルを使用する
- 初期化コンテナ (init container) を使用する
最初の方法を、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
を押してエディタを終了します。
このポッドを作成しましょう。
kubectl apply -f multi-command-pod.yaml
以下のように表示されるはずです。
pod/multi-command-pod created
作成されたファイルを確認することで、両方のコマンドが実行されたことを検証しましょう。
kubectl exec multi-command-pod -- cat /tmp/first.txt
以下のように表示されるはずです。
First command
2 つ目のファイルについても同様に確認します。
kubectl exec multi-command-pod -- cat /tmp/second.txt
以下のように表示されるはずです。
Second command
ヘルスチェックによる起動失敗の処理
Kubernetes は、起動失敗を検出して処理するメカニズムを提供しています。
- 生存性プローブ (Liveness Probes):コンテナが実行中かどうかを確認します。実行中でない場合、Kubernetes はコンテナを再起動します。
- 就緒性プローブ (Readiness Probes):コンテナがトラフィックを受け入れる準備ができているかどうかを確認します。
- 起動プローブ (Startup Probes):アプリケーションが起動したかどうかを確認します。起動が遅いコンテナに役立ちます。
生存性プローブを使用するポッドを調べてみましょう。
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
ファイルを作成します。
- 生存性プローブは、このファイルを 5 秒ごとに確認します。
- ファイルが存在しない場合、Kubernetes はコンテナが不健康であると見なし、コンテナを再起動します。
Ctrl+X
を押してエディタを終了します。
このポッドを作成しましょう。
kubectl apply -f liveness-probe-pod.yaml
以下のように表示されるはずです。
pod/liveness-probe-pod created
ポッドが実行されていることを確認します。
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 秒待ってから、ポッドの状態を再度確認します。
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 が起動失敗から自動的に回復し、アプリケーションの望ましい状態を維持できることを示しています。
カスタム起動スクリプトの作成
より複雑な初期化には、カスタム起動スクリプトを使用することができます。シェルスクリプトを使用して起動するポッドを作成してみましょう。
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
を押して保存して終了します。
このポッドを作成しましょう。
kubectl apply -f script-pod.yaml
以下のように表示されるはずです。
pod/script-pod created
ポッドが起動するのを少し待ってから、その状態を確認します。
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 でコンテナを初期化するために複雑な起動スクリプトを使用する方法を示しています。