はじめに
この実験では、Kubernetes のport-forward
コマンドを使って、ローカルポートをポッド内のポートに転送する方法を学びます。ポート転送は、クラスタ内で実行されているアプリケーションにセキュアにアクセスできるようにする重要なデバッグツールであり、それらをインターネットに公開することなく使用できます。簡単な例から始めて、複数のポート、複数のコンテナ、およびサービスを扱うようなより複雑なシナリオに徐々に進みます。
💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください
この実験では、Kubernetes のport-forward
コマンドを使って、ローカルポートをポッド内のポートに転送する方法を学びます。ポート転送は、クラスタ内で実行されているアプリケーションにセキュアにアクセスできるようにする重要なデバッグツールであり、それらをインターネットに公開することなく使用できます。簡単な例から始めて、複数のポート、複数のコンテナ、およびサービスを扱うようなより複雑なシナリオに徐々に進みます。
リソースを作成する前に、動作中の 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 port-forward
コマンドを調べるkubectl port-forward
コマンドを使用すると、Kubernetes クラスタ内のポッド、デプロイメント、またはサービスに 1 つ以上のローカルポートを転送できます。これは、サービスを外部に公開することなく、テストやデバッグに一般的に使用されます。
kubectl port-forward
の利用可能なオプションを表示するには、次のコマンドを実行します。
kubectl port-forward -h
次の出力が表示されます。
1つ以上のローカルポートをポッドに転送します。
デプロイメント/myデプロイメントのようなリソースタイプ/名前を使用して、ポッドを選択します。省略した場合、リソースタイプは「ポッド」にデフォルト設定されます。
基準に一致する複数のポッドがある場合、自動的にポッドが選択されます。転送セッションは、選択されたポッドが終了すると終了し、転送を再開するにはコマンドを再度実行する必要があります。
例:
## ローカルの5000ポートと6000ポートでリッスンし、ポッド内の5000ポートと6000ポートにデータを転送します
kubectl port-forward pod/マイポッド 5000 6000
## ローカルの5000ポートと6000ポートでリッスンし、デプロイメントによって選択されたポッド内の5000ポートと6000ポートにデータを転送します
kubectl port-forward deployment/マイデプロイメント 5000 6000
## ローカルの8443ポートでリッスンし、サービスによって選択されたポッド内の「https」と名付けられたサービスのポートのtargetPortに転送します
kubectl port-forward service/マイサービス 8443:https
## ローカルの8888ポートでリッスンし、ポッド内の5000に転送します
kubectl port-forward pod/マイポッド 8888:5000
## すべてのアドレスの8888ポートでリッスンし、ポッド内の5000に転送します
kubectl port-forward --address 0.0.0.0 pod/マイポッド 8888:5000
## localhostと選択されたIPの8888ポートでリッスンし、ポッド内の5000に転送します
kubectl port-forward --address localhost,10.19.21.23 pod/マイポッド 8888:5000
## ローカルでランダムなポートでリッスンし、ポッド内の5000に転送します
kubectl port-forward pod/マイポッド :5000
このステップでは、ローカルポートをポッド内のポートに転送する方法を学びます。これは、アプリケーションのデバッグやクラスタ外に公開されていないサービスにアクセスする際に役立ちます。
端末管理に関する注意事項:
kubectl port-forward
コマンドは、端末内で実行され続け、他の使用を妨げます。Ctrl+C
を押すことができます。1 つのレプリカと Nginx コンテナを持つデプロイメントを作成します。
kubectl create deployment nginx --image=nginx --replicas=1
このコマンドは、公式の Nginx コンテナイメージを実行するデプロイメントを作成します。
ポッドが準備完了するのを待ちます。
kubectl wait --for=condition=Ready pod -l app=nginx
ポート転送に使用するポッド名を取得します。
kubectl get pod -l app=nginx
以下のような出力が表示されるはずです。
NAME READY STATUS RESTARTS AGE
nginx-66b6c48dd5-abcd1 1/1 Running 0 30s
kubectl port-forward
コマンドを使用して、ローカルポートをポッドに転送します。
まず、ポッド名を取得します。
export POD_NAME=$(kubectl get pods -l app=nginx -o jsonpath='{.items[0].metadata.name}')
echo $POD_NAME
以下のような出力が表示されるはずです。
nginx-748c667d99-pdhzs
次に、ポッド名を使用してポート転送を設定します。
kubectl port-forward $POD_NAME 19000:80
以下のような出力が表示されるはずです。
Forwarding from 127.0.0.1:19000 -> 80
Forwarding from [::1]:19000 -> 80
新しい端末ウィンドウを開き(ポート転送は現在の端末で実行され続けるため)、ポート転送を確認します。
curl http://localhost:19000
Nginx のウェルカムページの HTML コンテンツが表示されるはずです。
また、Web ブラウザを開いて http://localhost:19000
にアクセスして、レンダリングされたページを表示することもできます。
このステップを開始する前に、以下のことが必要です。
Ctrl+C
を押します。このステップでは、ポッドに複数のローカルポートを転送する方法を学びます。同じコンテナポートに 2 つの異なるローカルポートを転送します。これは、同じサービスに異なるアクセスポイントを提供したい場合に便利です。
以下のコマンドを使用してポート転送を設定します。
まだ行っていない場合は、まずポッド名を取得します。
export POD_NAME=$(kubectl get pods -l app=nginx -o jsonpath='{.items[0].metadata.name}')
echo $POD_NAME
以下のような出力が表示されるはずです。
nginx-748c667d99-pdhzs
次に、2 つのローカルポート(19080 と 19081)をコンテナのポート 80 にマップするようにポート転送を設定します。
## 正しい形式は:kubectl port-forward POD_NAME LOCAL_PORT:CONTAINER_PORT [LOCAL_PORT:CONTAINER_PORT...]
kubectl port-forward pod/$POD_NAME 19080:80 19081:80
以下のような出力が表示されるはずです。
Forwarding from 127.0.0.1:19080 -> 80
Forwarding from [::1]:19080 -> 80
Forwarding from 127.0.0.1:19081 -> 80
Forwarding from [::1]:19081 -> 80
このコマンドは、以下のように転送します。
両方のローカルポートは同じ Nginx コンテナポート 80 にマップされており、異なるローカルポートを通じて同じ Web サーバにアクセスできるようになります。
リッスンしているポートを確認することでポート転送を確認します。
ss -tulnp | grep 1908
以下のような出力が表示されるはずです。
tcp LISTEN 0 4096 0.0.0.0:19080 0.0.0.0:*
tcp LISTEN 0 4096 0.0.0.0:19081 0.0.0.0:*
これで、どちらのポートを通じても Nginx のウェルカムページにアクセスできます。
curl http://localhost:19080
curl http://localhost:19081
両方の URL は同じコンテナポートに転送されるため、同じ Nginx のウェルカムページが表示されます。
このステップを開始する前に:
Ctrl+C
を押します。このステップでは、複数のコンテナを持つポッド内の特定のコンテナにローカルポートを転送する方法を学びます。サイドカーが使用されるマイクロサービスアーキテクチャにおいて一般的なシナリオです。
まず、前のリソースをクリーンアップします。
kubectl delete deployment nginx
Nginx と BusyBox の 2 つのコンテナを持つポッドを作成します。
cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: nginx-busybox
labels:
app: nginx-multi
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
- name: busybox
image: busybox
command: ['sh', '-c', 'while true; do sleep 3600; done']
EOF
ポッドが準備完了するのを待ちます。
kubectl wait --for=condition=Ready pod/nginx-busybox
両方のコンテナが実行されていることを確認します。
kubectl get pod nginx-busybox -o wide
READY
列の下に 2/2
が表示されるはずです。
kubectl port-forward
コマンドを使用して、Nginx コンテナにローカルポートを転送します。
kubectl port-forward pod/nginx-busybox 19001:80
新しい端末で接続を確認します。
curl http://localhost:19001
Nginx のウェルカムページの HTML コンテンツが表示されるはずです。
このステップを開始する前に:
Ctrl+C
を押します。このステップでは、Kubernetes サービスで kubectl port-forward
コマンドをどのように使用するかを学びます。サービスへのポート転送は、ポッドへのポート転送とは異なり、サービスが指す任意のポッドにアクセスできるようにします。
まず、複数のレプリカを持つ新しいデプロイメントを作成します。
kubectl create deployment nginx-service --image=nginx --replicas=3
すべてのポッドが準備完了するのを待ちます。
kubectl wait --for=condition=Ready pod -l app=nginx-service
デプロイメント用のサービスを作成します。
kubectl expose deployment nginx-service --port=80 --type=ClusterIP --name=nginx-service
サービスが作成されたことを確認します。
kubectl get service nginx-service
以下のような出力が表示されるはずです。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-service ClusterIP 10.96.123.456 <none> 80/TCP 10s
kubectl port-forward
コマンドを使用して、サービスにローカルポートを転送します。
kubectl port-forward service/nginx-service 20000:80
新しい端末で接続をテストします。
curl http://localhost:20000
Nginx のウェルカムページの HTML コンテンツが表示されるはずです。このコマンドを何度も実行してみると、サービスの背後にある異なるポッドからの応答があることに気付くかもしれません。
この実験では、Kubernetes のポート転送コマンドをさまざまなシナリオで効果的に使用する方法を学びました。以下のことを練習しました。
これらのスキルは、Kubernetes クラスタ内でアプリケーションをデバッグおよびテストする際に欠かせないものです。ポート転送は、開発およびトラブルシューティング中にアプリケーションにアクセスするための安全な方法を提供し、それらをパブリックインターネットに公開することなく行います。
主な要点:
kubectl port-forward
コマンドが実行されている間だけ続く一時的な接続ですポート転送は主にデバッグツールであり、アプリケーションの本番アクセスには使用しないでください。本番シナリオでは、適切な Kubernetes サービスタイプ(LoadBalancer、NodePort)またはイングレスコントローラを使用する必要があります。