はじめに
この実験では、Kubernetes ポッド内で実行されているコンテナ内でコマンドを実行するために、Kubernetes の exec コマンドをどのように使用するかを学びます。簡単な例から始めて、徐々により複雑なシナリオに進みます。
Minikube クラスタを起動する
リソースを作成する前に、動作中の Kubernetes クラスタが必要です。Minikube は、ローカル マシン上で動作する軽量な Kubernetes 環境です。
作業ディレクトリに移動する:
ターミナルを開き、デフォルトのプロジェクト フォルダに移動します。
cd /home/labex/projectMinikube を起動する:
Minikube を起動して Kubernetes クラスタを初期化します。
minikube start- このコマンドは、ローカル マシン上に単一ノードの Kubernetes クラスタをセットアップします。
- Minikube は、システムの性能に応じて数分かかる場合があります。
Minikube が動作していることを確認する:
Minikube クラスタの状態を確認します。
minikube statuskubeletや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=nginxkubectl execコマンドを使用して、Nginx コンテナ内でコマンドを実行します。kubectl exec -it POD_NAME -- /bin/bashPOD_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-busyboxkubectl execコマンドを使用して、BusyBox コンテナ内でコマンドを実行します。kubectl exec nginx-busybox -c busybox -- ls /bin
Tty 付きでコマンドを実行する
このステップでは、コンテナ内で 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-envkubectl execコマンドを使用して、環境変数を出力する Nginx コンテナ内でコマンドを実行します。kubectl exec nginx-env -- sh -c 'echo $MY_VAR'nginx-env を、手順 1 で作成したポッドの名前に置き換えます。
まとめ
おめでとうございます。あなたは無事にコンテナオーケストレーションツール Kubernetes の exec コマンドの実験を完了しました!この実験では、Kubernetes のポッド内で実行されているコンテナ内でコマンドを実行するために kubectl exec コマンドをどのように使用するかを学びました。また、特定のコンテナ内でコマンドを実行したり、tty 付きでコマンドを実行したり、環境変数を使ってコマンドを実行したりする方法も学びました。これらのスキルは、Kubernetes クラスタ内の問題のデバッグに欠かせないものです。


