Kubernetes のポート転送コマンド

KubernetesKubernetesBeginner
オンラインで実践に進む

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Kubernetes のport-forwardコマンドを使って、ローカルポートをポッド内のポートに転送する方法を学びます。ポート転送は、クラスタ内で実行されているアプリケーションにセキュアにアクセスできるようにする重要なデバッグツールであり、それらをインターネットに公開することなく使用できます。簡単な例から始めて、複数のポート、複数のコンテナ、およびサービスを扱うようなより複雑なシナリオに徐々に進みます。

これは Guided Lab です。学習と実践を支援するためのステップバイステップの指示を提供します。各ステップを完了し、実践的な経験を積むために、指示に注意深く従ってください。過去のデータによると、この 初級 レベルの実験の完了率は 100%です。学習者から 88% の好評価を得ています。

Minikube クラスタを起動する

リソースを作成する前に、動作中の Kubernetes クラスタが必要です。Minikube は、ローカルマシン上で動作する軽量の Kubernetes 環境です。

  1. 作業ディレクトリに移動する:

    ターミナルを開き、デフォルトのプロジェクトフォルダに移動します。

    cd /home/labex/project
  2. Minikube を起動する:

    Minikube を起動して Kubernetes クラスタを初期化します。

    minikube start
    • このコマンドは、ローカルマシン上に単一ノードの Kubernetes クラスタをセットアップします。
    • Minikube の起動には、システムの性能に応じて数分かかる場合があります。
  3. Minikube が動作していることを確認する:

    Minikube クラスタの状態を確認します。

    minikube status
    • kubeletapiserverなどのコンポーネントが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. 1 つのレプリカと Nginx コンテナを持つデプロイメントを作成します。

    kubectl create deployment nginx --image=nginx --replicas=1

    このコマンドは、公式の Nginx コンテナイメージを実行するデプロイメントを作成します。

  2. ポッドが準備完了するのを待ちます。

    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
  3. 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
  4. 新しい端末ウィンドウを開き(ポート転送は現在の端末で実行され続けるため)、ポート転送を確認します。

    curl http://localhost:19000

    Nginx のウェルカムページの HTML コンテンツが表示されるはずです。

    また、Web ブラウザを開いて http://localhost:19000 にアクセスして、レンダリングされたページを表示することもできます。

ポッドに複数のローカルポートを転送する

このステップを開始する前に、以下のことが必要です。

  1. ステップ 1 のポート転送を停止し、その端末に戻り、Ctrl+C を押します。

このステップでは、ポッドに複数のローカルポートを転送する方法を学びます。同じコンテナポートに 2 つの異なるローカルポートを転送します。これは、同じサービスに異なるアクセスポイントを提供したい場合に便利です。

  1. 以下のコマンドを使用してポート転送を設定します。

    まだ行っていない場合は、まずポッド名を取得します。

    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

    このコマンドは、以下のように転送します。

    • ローカルポート 19080 をコンテナポート 80 に
    • ローカルポート 19081 をコンテナポート 80 に

    両方のローカルポートは同じ Nginx コンテナポート 80 にマップされており、異なるローカルポートを通じて同じ Web サーバにアクセスできるようになります。

  2. リッスンしているポートを確認することでポート転送を確認します。

    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:*
  3. これで、どちらのポートを通じても Nginx のウェルカムページにアクセスできます。

    curl http://localhost:19080
    curl http://localhost:19081

両方の URL は同じコンテナポートに転送されるため、同じ Nginx のウェルカムページが表示されます。

複数コンテナを持つポッドにローカルポートを転送する

このステップを開始する前に:

  1. 前のステップから実行されているポート転送コマンドがある場合は、それらの端末に移動して、停止するために Ctrl+C を押します。
  2. 新しいマルチコンテナポッドのセットアップで新しく始めます。

このステップでは、複数のコンテナを持つポッド内の特定のコンテナにローカルポートを転送する方法を学びます。サイドカーが使用されるマイクロサービスアーキテクチャにおいて一般的なシナリオです。

  1. まず、前のリソースをクリーンアップします。

    kubectl delete deployment nginx
  2. 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
  3. ポッドが準備完了するのを待ちます。

    kubectl wait --for=condition=Ready pod/nginx-busybox
  4. 両方のコンテナが実行されていることを確認します。

    kubectl get pod nginx-busybox -o wide

    READY 列の下に 2/2 が表示されるはずです。

  5. kubectl port-forward コマンドを使用して、Nginx コンテナにローカルポートを転送します。

    kubectl port-forward pod/nginx-busybox 19001:80
  6. 新しい端末で接続を確認します。

    curl http://localhost:19001

    Nginx のウェルカムページの HTML コンテンツが表示されるはずです。

Kubernetes サービスでのポート転送の使用

このステップを開始する前に:

  1. ステップ 3 から実行されているポート転送コマンドがある場合は、その端末に移動して、停止するために Ctrl+C を押します。
  2. このステップで新しいデプロイメントとサービスを作成しますが、前のポッドを削除する必要はありません。なぜなら、それが新しいリソースに干渉しないからです。

このステップでは、Kubernetes サービスで kubectl port-forward コマンドをどのように使用するかを学びます。サービスへのポート転送は、ポッドへのポート転送とは異なり、サービスが指す任意のポッドにアクセスできるようにします。

  1. まず、複数のレプリカを持つ新しいデプロイメントを作成します。

    kubectl create deployment nginx-service --image=nginx --replicas=3
  2. すべてのポッドが準備完了するのを待ちます。

    kubectl wait --for=condition=Ready pod -l app=nginx-service
  3. デプロイメント用のサービスを作成します。

    kubectl expose deployment nginx-service --port=80 --type=ClusterIP --name=nginx-service
  4. サービスが作成されたことを確認します。

    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
  5. kubectl port-forward コマンドを使用して、サービスにローカルポートを転送します。

    kubectl port-forward service/nginx-service 20000:80
  6. 新しい端末で接続をテストします。

    curl http://localhost:20000

    Nginx のウェルカムページの HTML コンテンツが表示されるはずです。このコマンドを何度も実行してみると、サービスの背後にある異なるポッドからの応答があることに気付くかもしれません。

まとめ

この実験では、Kubernetes のポート転送コマンドをさまざまなシナリオで効果的に使用する方法を学びました。以下のことを練習しました。

  1. 単一のローカルポートをポッドに転送する
  2. 複数のローカルポートを同じコンテナポートに転送する
  3. マルチコンテナポッドとポート転送を使う
  4. Kubernetes サービスへのポート転送

これらのスキルは、Kubernetes クラスタ内でアプリケーションをデバッグおよびテストする際に欠かせないものです。ポート転送は、開発およびトラブルシューティング中にアプリケーションにアクセスするための安全な方法を提供し、それらをパブリックインターネットに公開することなく行います。

主な要点:

  • ポート転送は、kubectl port-forward コマンドが実行されている間だけ続く一時的な接続です
  • 同じコンテナポートに複数のローカルポートを転送できます
  • ポート転送は、ポッドとサービスの両方で機能します
  • サービスにポート転送する場合、要求は複数のポッドに分散される場合があります

ポート転送は主にデバッグツールであり、アプリケーションの本番アクセスには使用しないでください。本番シナリオでは、適切な Kubernetes サービスタイプ(LoadBalancer、NodePort)またはイングレスコントローラを使用する必要があります。