IBM Cloud Docs
NodePort を使用したアプリへのアクセスのテスト

NodePort を使用したアプリへのアクセスのテスト

仮想プライベート・クラウド クラシック・インフラストラクチャー Satellite

Kubernetes クラスター内の任意のワーカー・ノードのパブリック IP アドレスを使用し、NodePort を公開することにより、コンテナー化アプリにインターネットからアクセスできるようにします。 このオプションは、IBM Cloud® Kubernetes Service でのテストや短期間のパブリック・アクセスのために使用します。

NodePort について

ワーカー・ノードのパブリック・ポートを公開し、ワーカー・ノードのパブリック IP アドレスを使用して、クラスター内のサービスにインターネットからパブリック・アクセスを行います。

NodePort タイプの Kubernetes サービスを作成してアプリを公開する場合は、30000 から 32767 の範囲の NodePort と内部クラスター IP アドレスがサービスに割り当てられます。 NodePort サービスは、アプリに対する着信要求のための外部エントリー・ポイントとして機能します。 割り当てられた NodePort は、クラスター内の各ワーカー・ノードの kubeproxy 設定でパブリックに公開されます。 どのワーカー・ノードも、割り当てられた NodePort で、サービスに対する着信要求の listen を開始します。 インターネットからサービスにアクセスするには、クラスターの作成時に割り当てられたワーカー・ノードのパブリック IP アドレスと NodePort をフォーマット <IP_address>:<nodeport> で使用します。 プライベート・ネットワーク上のサービスにアクセスする場合は、パブリック IP アドレスではなく、任意のワーカー・ノードのプライベート IP アドレスを使用します。

次の図は、NodePort サービスが構成されているときに、インターネットからアプリへの通信がどのように誘導されるかを示しています。

IBM Cloud Kubernetes Service でアプリを公開するには、 NodePort
図 1 を使用してアプリを公開します。 NodePort を使用してアプリを公開する

  1. ワーカー・ノードのパブリック IP アドレスとワーカー・ノード上の NodePort を使用して、要求がアプリに送信されます。

  2. 要求が、NodePort サービスの内部クラスター IP アドレスとポートに自動的に転送されます。 内部クラスター IP アドレスはクラスター内でのみアクセス可能です。

  3. kube-proxy が、要求をアプリの Kubernetes NodePort サービスにルーティングします。

  4. 要求が、アプリがデプロイされたポッドのプライベート IP アドレスに転送されます。 複数のアプリ・インスタンスがクラスターにデプロイされている場合、NodePort サービスは、アプリ・ポッド間で要求をルーティングします。

ワーカー・ノードのパブリック IP アドレスは永続的なアドレスではありません。 ワーカー・ノードが削除されたり再作成されたりすると、新しいパブリック IP アドレスがワーカー・ノードに割り当てられます。 NodePort サービスは、アプリのパブリック・アクセスをテストする場合や、パブリック・アクセスが短期間だけ必要な場合に使用できます。 安定的なパブリック IP アドレスによってサービスの可用性を高める必要がある場合は、ネットワーク・ロード・バランサー (NLB) サービスまたは Ingress を使用してアプリを公開してください。

NodePort サービスを使用してアプリへのアクセスを有効にする

アプリを Kubernetes NodePort サービスとして公開します。

VPC クラスター内のワーカー・ノードはパブリック IP アドレスを持たないため、VPN 接続を使用するなどしてプライベート VPC ネットワークに接続されている場合に限り、NodePort を使用してアプリにアクセスできます。 インターネットからアプリにアクセスするには、代わりに VPC ロード・バランサー・サービスまたは Ingress サービスを使用する必要があります。

まだアプリの準備ができていない場合は、 Guestbookという Kubernetes サンプル・アプリを使用できます。

開始前に

NodePort を使用するには、以下のようにします。

  1. アプリの構成ファイルで、 service セクションを定義します。

    Guestbook サンプルで、フロントエンド・サービス・セクションは構成ファイル内に存在しています。 Guestbook アプリを外部で使用できるようにするには、NodePort タイプと、30000 から 32767 の範囲の NodePort をフロントエンド・サービス・セクションに追加します。

    apiVersion: v1
    kind: Service
    metadata:
      name: <my-nodeport-service>
      labels:
        <my-label-key>: <my-label-value>
    spec:
      selector:
        <my-selector-key>: <my-selector-value>
      type: NodePort
      ports:
       - port: <8081>
         # nodePort: <31514>
    
    
    表 1. NodePort サービス・コンポーネントについて
    コンポーネント 説明
    name <my-nodeport-service> を NodePort サービスの名前で置き換えます。 Kubernetes リソースを処理する際の個人情報の保護の詳細を確認してください。
    labels <my-label-key> および <my-label-value> を、サービスに使用するラベルで置き換えます。
    selector <my-selector-key><my-selector-value> を、デプロイメント YAML の spec.template.metadata.labels セクションで使用したキー/値のペアで置き換えます。 サービスをデプロイメントに関連付けるには、セレクターがデプロイメント・ラベルと一致する必要があります。
    port <8081> を、サービスが listen するポートで置き換えます。
    nodePort オプション: <31514> を 30000 から 32767 までの範囲の NodePort で置き換えます。 別のサービスで既に使用されているノード・ポートは指定しないでください。 NodePort を割り当てなければ、ランダムに割り当てられます。
    NodePort を指定し、どの NodePorts が既に使用されているかを確認するには、 kubectl get svc コマンドを実行します。 使用中の NodePorts は、Ports フィールドの下に表示されます。
  2. 更新された構成ファイルを保存します。

  3. アプリをデプロイする時に、いずれかのワーカー・ノードのパブリック IP アドレスと NodePort を使用して、ブラウザーでそのアプリにアクセスするためのパブリック URL を作成できます。 ワーカー・ノードをプライベート VLAN にのみ接続した場合は、プライベート NodePort サービスが作成されているので、ワーカー・ノードのプライベート IP アドレスを使用してアクセスできます。

    1. クラスター内のワーカー・ノードのパブリック IP アドレスを取得します。 プライベート・ネットワーク上のワーカー・ノードにアクセスする場合、または VPC クラスターを使用する場合は、代わりにプライベート IP アドレスを取得してください。

      ibmcloud ks worker ls --cluster <cluster_name>
      

      出力

      ID                                                Public IP   Private IP    Size     State    Status
      prod-dal10-pa215dcf5bbc0844a990fa6b0fcdbff286-w1  192.0.2.23  10.100.10.10  u3c.2x4  normal   Ready
      prod-dal10-pa215dcf5bbc0844a990fa6b0fcdbff286-w2  192.0.2.27  10.100.10.15  u3c.2x4  normal   Ready
      
    2. ランダムな NodePort が割り当てられた場合は、その値を確認します。

      kubectl describe service <service_name>
      

      出力

      NAME:                   <service_name>
      Namespace:              default
      Labels:                 run=<deployment_name>
      Selector:               run=<deployment_name>
      Type:                   NodePort
      IP:                     10.10.10.8
      Port:                   <unset> 8080/TCP
      NodePort:               <unset> 30872/TCP
      Endpoints:              172.30.171.87:8080
      Session Affinity:       None
      No events.
      

      この例では、NodePort は 30872 です。

      Endpoints セクションに <none> が表示される場合は、<selectorkey><selectorvalue> (NodePort サービスの spec.selector セクションで使用するもの) を確認します。 これが、_キー/値_のペア (デプロイメント YAML の spec.template.metadata.labels セクションで使用したもの) と同じであることを確認します。

    3. ワーカー・ノードの IP アドレスの 1 つと NodePort を使用して URL を作成します。 例: http://192.0.2.23:30872。 VPC クラスターの場合は、VPN 接続などを使用してプライベート・ネットワークに接続して、ワーカー・ノードのプライベート IP アドレスおよび NodePort にアクセスする必要があります。