はじめに
この実験では、Kubernetes ポッド内で実行されているコンテナ内でコマンドを実行するために、Kubernetes の exec
コマンドをどのように使用するかを学びます。簡単な例から始めて、徐々により複雑なシナリオに進みます。
💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください
この実験では、Kubernetes ポッド内で実行されているコンテナ内でコマンドを実行するために、Kubernetes の exec
コマンドをどのように使用するかを学びます。簡単な例から始めて、徐々により複雑なシナリオに進みます。
リソースを作成する前に、動作中の Kubernetes クラスタが必要です。Minikube は、ローカル マシン上で動作する軽量な Kubernetes 環境です。
作業ディレクトリに移動する:
ターミナルを開き、デフォルトのプロジェクト フォルダに移動します。
cd /home/labex/project
Minikube を起動する:
Minikube を起動して Kubernetes クラスタを初期化します。
minikube start
Minikube が動作していることを確認する:
Minikube クラスタの状態を確認します。
minikube status
kubelet
や apiserver
などのコンポーネントが Running
と表示されていることを確認します。minikube start
を再度実行します。Minikube を起動する際に問題が発生した場合は、必要に応じて minikube delete
を使用して環境をリセットします。
kubectl exec
コマンドを調べるkubectl exec
コマンドは、ポッド内のコンテナ内で直接コマンドを実行するために使用されます。特に、コンテナ環境のデバッグや調査に便利です。
kubectl exec
の利用可能なオプションを表示するには、次のコマンドを実行します。
kubectl exec -h
次の出力が表示されます。
コンテナ内でコマンドを実行します。
例:
## デフォルトで最初のコンテナを使用して、ポッド mypod から 'date' コマンドを実行して出力を取得する
kubectl exec mypod -- date
## ポッド mypod の ruby-container 内で 'date' コマンドを実行して出力を取得する
kubectl exec mypod -c ruby-container -- date
## 生の端末モードに切り替えます。ポッド mypod の ruby-container 内の 'bash' に標準入力を送信し、
## 'bash' の標準出力/エラー出力をクライアントに戻します
kubectl exec mypod -c ruby-container -i -t -- bash -il
## ポッド mypod の最初のコンテナから /usr の内容をリスト表示し、変更時刻でソートする
## ポッド内で実行したいコマンドに共通のフラグがある場合 (例: -i)、
## コマンドのフラグ/引数を区切るために 2 つのダッシュ (--) を使用する必要があります
## また、コマンドとそのフラグ/引数を引用符で囲まないでください
## 通常実行する方法 (つまり、ls -t /usr を実行する場合、"ls -t /usr" ではなく) を除きます
kubectl exec mypod -i -t -- ls -t /usr
## デプロイ mydeployment の最初のポッドから 'date' コマンドを実行して出力を取得する
## デフォルトで最初のコンテナを使用する
kubectl exec deploy/mydeployment -- date
## サービス myservice の最初のポッドから 'date' コマンドを実行して出力を取得する
## デフォルトで最初のコンテナを使用する
kubectl exec svc/myservice -- date
このステップでは、ポッド内で実行されているコンテナ内でコマンドを実行する方法を学びます。
1 つのレプリカと Nginx コンテナを持つデプロイを作成します。
kubectl create deployment nginx --image=nginx --replicas=1
ポッドが準備完了するまで待ちます。
kubectl wait --for=condition=Ready pod -l app=nginx
kubectl exec
コマンドを使用して、Nginx コンテナ内でコマンドを実行します。
kubectl -it POD_NAME -- /bin/bash
POD_NAME
を、手順 1 で作成したポッドの名前に置き換えます。kubectl get pod -l app=nginx
コマンドで POD_NAME
を取得できます。
このステップでは、複数のコンテナが実行されているポッド内の特定のコンテナ内でコマンドを実行する方法を学びます。
Nginx と BusyBox の 2 つのコンテナを持つポッドを作成します。
cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: nginx-busybox
spec:
containers:
- name: nginx
image: nginx
- name: busybox
image: busybox
command:
- sleep
- "3600"
EOF
ポッドが準備完了するまで待ちます。
kubectl wait --for=condition=Ready pod nginx-busybox
kubectl exec
コマンドを使用して、BusyBox コンテナ内でコマンドを実行します。
kubectl exec nginx-busybox -c busybox -- ls /bin
このステップでは、コンテナ内で tty 付きでコマンドを実行する方法を学びます。
-it
オプション付きで kubectl exec
コマンドを使用して、tty 付きでコマンドを実行します。
kubectl exec -it nginx-busybox -- /bin/sh
コンテナ シェル内に入ったら、コマンドを実行します。
echo "Hello, world!"
コンテナ シェルを終了します。
exit
このステップでは、コンテナ内で環境変数を使ってコマンドを実行する方法を学びます。
1 つのレプリカと環境変数を持つ Nginx コンテナを備えたデプロイを作成します。
kubectl run nginx-env --image=nginx --env="MY_VAR=my-value"
ポッドが準備完了するまで待ちます。
kubectl wait --for=condition=Ready pod -l run=nginx-env
kubectl exec
コマンドを使用して、環境変数を出力する Nginx コンテナ内でコマンドを実行します。
kubectl exec nginx-env -- sh -c 'echo $MY_VAR'
nginx-env を、手順 1 で作成したポッドの名前に置き換えます。
おめでとうございます。あなたは無事にコンテナオーケストレーションツール Kubernetes の exec コマンドの実験を完了しました!この実験では、Kubernetes のポッド内で実行されているコンテナ内でコマンドを実行するために kubectl exec
コマンドをどのように使用するかを学びました。また、特定のコンテナ内でコマンドを実行したり、tty 付きでコマンドを実行したり、環境変数を使ってコマンドを実行したりする方法も学びました。これらのスキルは、Kubernetes クラスタ内の問題のデバッグに欠かせないものです。