GKE LoadBalancer Service のユーザー管理ファイアウォール ルール


このページでは、GKE が LoadBalancer Service 用に作成する上り(内向き)許可 VPC ファイアウォール ルールを無効にする方法について説明します。

LoadBalancer Service に対して自動的に作成されたファイアウォール ルールを無効にすると、次のような状況で役立ちます。

LoadBalancer Service の自動的に作成されたファイアウォール ルールを無効にするには、クラスタの作成時または更新時に --disable-l4-lb-firewall-reconciliation フラグを指定する必要があります。--disable-l4-lb-firewall-reconciliation フラグは、ノード間の通信を促進するルールや、サービスのヘルスチェックを許可するルールなど、自動的に作成された他の VPC ファイアウォール ルールには影響しません。

要件

  • LoadBalancer Service のユーザー管理ファイアウォール ルールを使用するには、GKE クラスタでバージョン 1.31.3-gke.105600 以降を使用する必要があります。

制限事項

GKE は、次のタイプの LoadBalancer Service のファイアウォール ルールの自動作成を無効にすることをサポートしています。

次のタイプの LoadBalancer Service のファイアウォール ルールの自動作成を無効にすることはできません。

  • GKE のサブセット化を使用しない内部 LoadBalancer Service
  • ターゲット プールベースの外部 LoadBalancer Service

始める前に

始める前に、次の作業が完了していることを確認してください。

  • Google Kubernetes Engine API を有効にする。
  • Google Kubernetes Engine API の有効化
  • このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。すでに gcloud CLI をインストールしている場合は、gcloud components update を実行して最新のバージョンを取得する。

ファイアウォール ルールを手動で管理するための戦略

GKE クラスタで LoadBalancer Service の VPC ファイアウォール ルールの自動作成を無効にする前に、セキュリティ管理者に相談して、ファイアウォール ルールを手動で構成する戦略を立ててください。

  1. 使用するファイアウォール ポリシーのタイプ(階層型ファイアウォール ポリシー、グローバル ネットワーク ファイアウォール ポリシー、リージョン ネットワーク ファイアウォール ポリシー)を決定します。ファイアウォール ポリシーを作成する手順については、以下をご覧ください。

    ポリシーを使用しない VPC ファイアウォール ルールを使用することもできます。

  2. 暗黙の上り(内向き)拒否ファイアウォール ルールによって受信トラフィックが禁止されるため、手動で作成したファイアウォール ルールは上り(内向き)許可ルールである必要があります。VPC ファイアウォール ルールの自動作成を無効にすると、LoadBalancer Service のトラフィックに一致する上り(内向き)許可ファイアウォール ルールを作成しない限り、受信トラフィックはノードに到達しません。

    ファイアウォール ルールのパラメータによっては、1 つの上り(内向き)許可ファイアウォール ルールを 1 つ以上の LoadBalancer Service に適用できます。作成する上り(内向き)許可ファイアウォール ルールごとに、次のパラメータを定義します。

    • target パラメータ: ファイアウォール ルールに、少なくとも LoadBalancer Service を含むクラスタのすべてのノードが含まれていることを確認します。サポートされるターゲットは、ルールが配置されているファイアウォール ポリシーのタイプ、または VPC ファイアウォール ルールを使用しているかどうかによって異なります。ファイアウォール ポリシーのルールの target パラメータについては、ターゲットをご覧ください。

    • プロトコルとポート: ファイアウォール ルールを適用する必要がある LoadBalancer Service で使用されるすべてのプロトコルと宛先ポートを含めます。

    • destination パラメータ: destination パラメータには、次のいずれかの方法を使用できます。

      • ファイアウォール ルールを適用する必要があるすべての LoadBalancer Service の IP アドレスを destination パラメータに含めます。LoadBalancer Service の IP アドレスを確認するには、次のコマンドを使用します。
         kubectl get svc LOADBALANCER_NAME \
            -n NAMESPACE_NAME \
            -o jsonpath='{.status.loadBalancer.ingress[0].ip}
      
    • source パラメータ: ファイアウォール ルールを適用する必要があるロードバランサ サービスに接続する必要があるクライアントが使用するソース(IP アドレスなど)を指定します。

    ファイアウォール ルールを作成する手順については、以下をご覧ください。

  3. 手動で作成したファイアウォール ルールが正しく機能していることを確認するには、Network Intelligence Center(NIC)接続テストを実行します。接続テストを実行する場合:

    • 宛先を LoadBalancer Service の IP アドレスに設定します。
    • ソースをクライアントの IP アドレスに設定します。

    詳細については、接続の問題のトラブルシューティングをご覧ください。

LoadBalancer Service の VPC ファイアウォール ルールの作成を無効にする

このセクションでは、LoadBalancer Service の VPC ファイアウォール ルールの自動作成を無効にする手順について説明します。

VPC ファイアウォール ルールの作成が無効になっている新しい GKE クラスタを作成する

  1. 新しく作成したクラスタで LoadBalancer Service の自動的に作成された VPC ファイアウォール ルールを無効にするには、--disable-l4-lb-firewall-reconciliation フラグを指定してクラスタを作成します。

    Autopilot:

    gcloud container clusters create-auto CLUSTER_NAME \
      --disable-l4-lb-firewall-reconciliation \
      --cluster-version=VERSION
    

    Standard:

    gcloud container clusters create CLUSTER_NAME \
      --disable-l4-lb-firewall-reconciliation \
      --enable-l4-ilb-subsetting \
      --cluster-version=VERSION
    

    次のように置き換えます。

    • CLUSTER_NAME: 新しいクラスタの名前。
    • VERSION: GKE のバージョン。
  2. 外部または内部の LoadBalancer Service を作成します。

  3. GKE が LoadBalancer Service の上り(内向き)許可ファイアウォール ルールを作成しないことを確認します。(自動的に作成される上り(内向き)許可ファイアウォール ルールの名前は、k8s2-[cluster-id]-[namespace]-[service-name]-[suffixhash] という形式になります)。

    次のコマンドは、k8s2 を含むファイアウォール ルールのリストを返します。

    gcloud compute firewall-rules list --format="value(name)" | grep "k8s2"
    

    externalTrafficPolicy パラメータが Local に設定されている場合、レスポンスは k8s2-[cluster-id]-[namespace]-[service-name]-[suffixhash]-fw という形式のヘルスチェック ファイアウォール ルールのみを返します。spec.healthCheckNodePort パラメータで定義された TCP ポートを使用します。指定しない場合、Kubernetes コントロール プレーンがノードポートの範囲からヘルスチェック ポートを割り当てます。

    k8s2-rkdld6go-default-ilb-svc-dluvsefq-fw  default  INGRESS  1000  tcp:30868  False
    

    externalTrafficPolicy パラメータが Cluster に設定されている場合は、代わりに次のヘルスチェック ファイアウォール ルールが返されます。

    k8s2-rkdld6go-l4-shared-hc-fw  default  INGRESS  1000  tcp:10256  False
    

    GKE Service 用に生成されたファイアウォール ルールの詳細については、自動的に作成されるファイアウォール ルールをご覧ください。

既存の GKE クラスタを更新して VPC ファイアウォール ルールの作成を無効にする

VPC ファイアウォール ルールの作成を無効にする前に、既存のクラスタの更新に関する次の点に注意してください。

  • VPC ファイアウォール ルールの作成を無効にするように既存のクラスタを更新すると、GKE が LoadBalancer Service 用に自動的に作成した既存のファイアウォール ルールは削除されません。
  • GKE は既存のルールの更新を停止し、新しい LoadBalancer Service 用の新しいルールを作成しません。
  • VPC ファイアウォール ルールの作成を再度有効にするには、gcloud_name container clusters update コマンドで --enable-l4-lb-firewall-reconciliation フラグを使用します。

既存のクラスタでファイアウォール ルールの自動作成を無効にするには:

  1. LoadBalancer Service 用のファイアウォール ルールの自動作成と管理を無効にするようにクラスタを更新します。

    gcloud container clusters update CLUSTER_NAME \
    --disable-l4-lb-firewall-reconciliation \
    --cluster-version=supported_version
    

    次のように置き換えます。

    • CLUSTER_NAME: 新しいクラスタの名前。
    • VERSION: GKE のバージョン。
  2. 外部または内部の LoadBalancer Service を作成します。

  3. GKE が LoadBalancer Service の上り(内向き)許可ファイアウォール ルールを作成しないことを確認します。(自動的に作成される上り(内向き)許可ファイアウォール ルールの名前は、k8s2-[cluster-id]-[namespace]-[service-name]-[suffixhash] という形式になります)。

    次のコマンドは、k8s2 を含むファイアウォール ルールのリストを返します。

    gcloud compute firewall-rules list --format="value(name)" | grep "k8s2"
    

    externalTrafficPolicy パラメータが Local に設定されている場合、レスポンスは k8s2-[cluster-id]-[namespace]-[service-name]-[suffixhash]-fw という形式のヘルスチェック ファイアウォール ルールのみを返します。spec.healthCheckNodePort パラメータで定義された TCP ポートを使用します。指定しない場合、Kubernetes コントロール プレーンがノードポートの範囲からヘルスチェック ポートを割り当てます。

    k8s2-rkdld6go-default-ilb-svc-dluvsefq-fw  default  INGRESS  1000  tcp:30868  False
    

    externalTrafficPolicy パラメータが Cluster に設定されている場合は、代わりに次のヘルスチェック ファイアウォール ルールが返されます。

    k8s2-rkdld6go-l4-shared-hc-fw  default  INGRESS  1000  tcp:10256  False
    

    GKE Service 用に生成されたファイアウォール ルールの詳細については、自動的に作成されるファイアウォール ルールをご覧ください。

接続に関する問題のトラブルシューティング

次の例は、Network Intelligence Center の接続テストを使用して、外部 LoadBalancer Service への接続をテストする方法を示しています。

  • Network Intelligence Center:

    1. Trusted Cloud コンソールで、Network Intelligence Center に移動して新しい接続テストを開始します。
    2. プルダウン メニューで、ソースとして [Any external public IP address] を選択し、宛先からロードバランサを選択します。
    3. 接続テストを再実行します。
  • gcloud CLI:

    次のコマンド例では、ローカル ワークステーションのパブリック IP アドレスをソースとし、外部ロードバランサの外部 IP アドレスを宛先としてテストを作成して実行します。

    gcloud network-management connectivity-tests create TEST_NAME \
    --source-ip-address=SOURCE_IP_ADDRESS \
    --source-network-type=NON_GCP_NETWORK \
    --destination-ip-address=$(kubectl get svc LOADBALANCER_NAME -o jsonpath='{.status.loadBalancer.ingress[0].ip}') \
    --destination-port=$(kubectl get svc LOADBALANCER_NAME -o jsonpath='{.spec.ports[0].targetPort}') \
    --destination-network=projects/PROJECT_ID/global/networks/NETWORK_NAME
    

    次のように置き換えます。

    • TEST_NAME: 接続テストの名前。
    • SOURCE_IP_ADDRESS: 外部 LoadBalancer Service に接続する必要があるシステムの IP アドレス。次に例を示します。
    • LOADBALANCER_NAME: 外部 LoadBalancer Service の名前。
    • PROJECT_ID: クラスタの VPC ネットワークを含むプロジェクトのプロジェクト ID。クラスタが共有 VPC ネットワークを使用している場合は、ホスト プロジェクトのプロジェクト ID を使用します。
    • NETWORK_NAME: クラスタの VPC ネットワークの名前。

    テスト結果を確認します。

    gcloud network-management connectivity-tests describe TEST_NAME
    

次のステップ