Kubernetes サービスを外部デバイスに公開する

Kubernetes アプリケーションを使用する場合は、デプロイしたワークロードと対話できるように、外部デバイスから Kubernetes サービスにアクセスできるようにする必要がある場合があります。 この記事では、AKS Edge Essentials クラスターで実行されている Kubernetes サービスを外部デバイスに公開する方法について説明します。 Kubernetes クラスターの設定に使用したネットワーク構成に応じて、サービスを公開する方法は 2 つあります。

  1. ポート転送を使用する単一マシン クラスター。
  2. 外部仮想スイッチを備えたスケーラブルなクラスター。

Note

Kubernetes サービスを使用する場合は、デプロイ時に必ず Init.ServiceIPRangeSize パラメーターと Init.ServiceIPRangeStart パラメーターを設定してください。 詳細については、「デプロイ構成 JSON パラメーターを参照してください。

オプション 1: ポート転送を使用する単一マシン クラスター

AKS Edge Essentials の単一マシン クラスター構成では、内部仮想スイッチを使用してネットワークを管理します。 このスイッチにより、Windows ホスト OS と Linux/Windows ノード間のすべての通信が、外部デバイスからアクセスできない内部ネットワークを使用して行われます。 AKS Edge Essentials ネットワークの詳細については、「AKS Edge Essentials ネットワーク」を参照してください。

外部デバイスから Kubernetes サービスにアクセスする必要がある場合は、Windows ホスト OS から Linux または Windows ノードへのポート転送を設定します。 LoadBalancer 型の Kubernetes サービスを使用している場合は、kubectl get services コマンドを使用して正しいServiceIpを取得してください。 種類が ClusterIp または NodePort の Kubernetes サービスを使用している場合は、Linux/Windows Kubernetes ノードの IP アドレスを使用します。

ポートフォワーディングを設定するには、 netsh コマンドレットを使用できます。 netshコマンド構文、コンテキスト、および書式設定の詳細については、「Netsh コマンドの構文、コンテキスト、および書式設定」を参照してください。 ポート フォワーディングを設定するには、次の手順に従います。

  1. 管理者特権の PowerShell セッションを開きます。

  2. Windows ホスト OS 外部ポートのファイアウォール規則ポートを有効にします。 詳細については、「 New-NetFirewallRuleを参照してください。

    New-NetFirewallRule -DisplayName "<name-for-rule>" -Direction Inbound -LocalPort <Windows-host-OS-external-port> -Action Allow
    
  3. 名前空間内のターゲット サービスの IP アドレスを取得します。

    kubectl get service -n <namespace>
    
  4. Windows ホスト OS ポートから Kubernetes サービスの IP アドレスとポートへのポート 転送を設定します。

    パラメーター 説明
    listen-port 外部デバイスが Kubernetes サービスと通信するために使用する Windows ホスト OS IPv4 ポート。
    listen-address Windows ホスト OS でリッスンする IPv4 アドレスを指定します。 アドレスが指定されない場合、既定値はローカル コンピューターです。
    connect-port トラフィックをリダイレクトする IPv4 ポートを指定します。 このポートは Kubernetes サービス ポートである必要があります。
    connect-address トラフィックをリダイレクトする IPv4 アドレスを指定します。 このポートは、Kubernetes サービスの IP アドレスである必要があります。
    netsh interface portproxy add v4tov4 listenport=<listen-port> listenaddress=<listen-address> connectport=<connect-port> connectaddress=<connect-address>
    

次の図の例では、 10.0.0.2 IPv4 アドレスを持つ 2 つの Kubernetes サービスが Windows デバイスで実行されています。

  • Linux-Svc Linux ノード 192.168.0.2とポート 30034の IP アドレスを使用して、NodePort サービスを実行します。 このサービスは、Windows ホスト OS のポート 8080 で到達できる必要があります。
  • Win-Svc IP アドレス192.168.0.5とポート 30035を持つ LoadBalancer サービスとして実行されます。 このサービスには、Windows ホスト OS のポート 8081 で到達できる必要があります。

これらのサービスにアクセスする外部デバイスを有効にするには、両方のサービスのポートフォワーディングを設定します。 このシナリオでは、次のコマンドを実行します。

netsh interface portproxy add v4tov4 listenport=8080 listenaddress=10.0.0.2 connectport=30034 connectaddress=192.168.0.2
netsh interface portproxy add v4tov4 listenport=8081 listenaddress=10.0.0.2 connectport=30035 connectaddress=192.168.0.5

内部ネットワーク ポート転送を示すスクリーンショット。

警告

静的ネットワーク構成を使用しない場合、Windows ホスト OS の IPv4 アドレスが変更される可能性があります。 これは、ポート フォワーディングの構成と、外部デバイスで使用されるターゲット IPv4 アドレスに影響する可能性があります。 IPv4 アドレス変更の影響を最小限に抑えるために、より汎用的な listenaddressを使用できます。

オプション 2: 外部仮想スイッチを備えたスケーラブルなクラスター

AKS Edge Essentials のスケーラブルなクラスター構成では、外部仮想スイッチを使用してネットワークを管理します。 ノードは異なるデバイス内で実行されるため、互いに通信するには、すべてのノードが同じネットワークに接続されている必要があります。 AKS Edge Essentials ネットワークの詳細については、「AKS Edge Essentials ネットワーク」を参照してください。

この構成では、Kubernetes ノードは外部ネットワークに接続されているため、Kubernetes サービスはポートフォワーディングを必要とせずに外部デバイスから到達できます。 オプション 1 のガイダンスに従って、LoadBalancer 型の Kubernetes サービスを使用している場合は、kubectl get services コマンドを使用して正しいServiceIpを取得してください。 種類が ClusterIp または NodePort の Kubernetes サービスを使用している場合は、Linux/Windows Kubernetes ノードの IP アドレスを使用します。

Note

スケーラブルなクラスターを 1 つのデバイスに保持し、外部仮想スイッチ構成を使用して、ポートフォワーディングを必要とせずに、外部ネットワーク上の外部デバイスに直接 Kubernetes サービスを公開することができます。

次のステップ