IBM Cloud Docs
VPCクラスタにおけるアウトバウンド・トラフィック保護の管理

VPCクラスタにおけるアウトバウンド・トラフィック保護の管理

Virtual Private Cloud 1.1.30以降

IBM Cloud Kubernetes Serviceの送信トラフィック保護を管理するための以下のオプションを確認してください。VPCクラスタ。 すべてのアウトバウンドアクセスを許可することも、アプリが必要とするコンポーネントへのアウトバウンドトラフィックを選択的に許可することもできます。

以下のシナリオの多くでは、特定のリソースへのアウトバウンド・トラフィックを許可する方法として、「kube-<clusterID> セキュリティ・グループにカスタム・ルールを追加するオプションがあります。 kube-<clusterID> セキュリティ・グループに追加したルールは、「ibmcloud ks security-group reset 後で実行すると削除されることに注意。 セキュリティグループをリセットすると、デフォルトのルールが復元され、追加したルールが削除されます。

送信トラフィック保護を無効にする

Virtual Private Cloud 1.1.30以降

新しいクラスタの送信トラフィック保護を無効にするための以下のオプションを確認してください。

outbound traffic protection enable」と「disable コマンドを使用することで、アウトバウンド・トラフィックの保護のオンとオフを切り替えることができる。 すべてのアウトバウンドトラフィックを許可する設定から移行する場合、この2つの設定を切り替えるとよいでしょう。

オプション1:クラスタ作成時に送信トラフィック保護を無効にする

このオプションは、すべてのアウトバウンドネットワーク接続を許可する。

  • コンソールで、Allow outbound traffic オプションを選択する。
  • CLIでは、'cluster create vpc-gen2 コマンド を使用してクラスタを作成するときに、'--disable-outbound-traffic-protection オプションを指定します。
  • Terraformで'disable_outbound_traffic_protection = true オプションを指定する。
  • APIで「disableOutboundTrafficProtection=true オプションを指定する。

オプション2:カスタムセキュリティグループを通してアウトバウンドトラフィックを許可する

クラスタを作成する前に、クラスタがアクセスする必要がある外部サイトまたはサービスへのアクセスを許可する カスタムセキュリティグループ をVPCに作成します。 次に、クラスタ作成時にこのセキュリティ・グループをクラスタにアタッチします。

  • コンソールで、カスタムセキュリティグループを指定します。
  • CLIでは、'cluster create vpc-gen2 コマンド を使用してクラスタを作成するときに、'--cluster-security-group <security-group-ID> オプションを指定し、カスタム・セキュリティ・グループIDを含めます。
  • Terraformで'security_groups オプションを指定し、カスタムグループを含める。

既存クラスタのアウトバウンド・トラフィック保護を無効にする

Virtual Private Cloud 1.1.30以降

クラスタのプロビジョニング後にアウトバウンド・トラフィック保護を無効にするオプションを確認してください。

オプション1:CLIから送信トラフィック保護を無効にする

このオプションは、すべての外部ネットワーク接続を許可する。

ibmcloud ks vpc outbound-traffic-protection disable --cluster CLUSTER

オプション 2: デフォルトのクラスタワーカーセキュリティグループにセキュリティグループルールを追加する

特定の外部サイトへのアクセスを許可するセキュリティグループルールをクラスタワーカーセキュリティグループ (kube-<clusterID>) に追加することができます。 クラスタがアクセスする必要のあるサイトまたはサブネットごとに、この手順を繰り返します。 詳しくは、アウトバウンドトラフィックを選択的に許可するシナリオ例 を参照してください。

ibmcloud is sg-rulec kube-<clusterID> outbound all --remote <IP-address-or-subnet>

既存クラスタのアウトバウンド・トラフィック保護を有効にする

Virtual Private Cloud 1.1.30以降

既存の1.30クラスタでアウトバウンド・プロテクションを有効にするには、以下のコマンドを実行します。 アウトバウンド・トラフィック保護を有効にすると、すべてのアウトバウンド・トラフィックがブロックされることに注意してください。

ibmcloud ks vpc outbound-traffic-protection enable --cluster CLUSTER

アウトバウンド・トラフィックを選択的に許可するシナリオ例

quay.io などの外部コンテナー登録、Red Hat Marketplace、OperatorHub などの一般的なリソースやコンポーネントへの送信トラフィックを許可する方法については、以下のセクションを参照してください。 カスタムセキュリティグループルールを作成することによってアウトバウンドトラフィックを選択的に許可する場合、「ibmcloud ks security-group reset コマンドを実行してセキュリティグループをデフォルトの設定にリセットすると、変更が削除されることに注意してください。

DockerHub'quay.io ような外部コンテナ登録からイメージにアクセスする。

DockerHub'quay.io、'registry.redhat.com などのレジストリからイメージにアクセスするには、以下のオプションのいずれかを選択します。

  • 送信トラフィック保護を無効にする。
    ibmcloud ks vpc outbound-traffic-protection disable --cluster CLUSTER
    
  • アプリに必要な画像を'icr.io にミラーリングする。 これらの画像をIBM Cloud Container Registryにプル、タグ付け、プッシュします。 詳しくは、IBM Cloud Container Registryに画像をプッシュする を参照してください。

VPE経由で1.30クラスタとWebコンソールにアクセスする

プライベートvpeゲートウェイ経由でのクラスタアクセスを許可するようにKubernetesを設定できます。 このオプションは、プライベートのみ、またはパブリックとプライベートの両方のVPCクラスタで使用できます。 アクセスはプライベート・エンドポイントを経由するため、顧客はクラスタにアクセスするためにクライアントからVPCにVPNを設定する必要がある。

1.30クラスタ以降、VPEアクセスを機能させるには、追加のセキュリティ・グループ・ルールが必要です。 追加のセキュリティ・グループ・ルールは、プライベート専用のクラスタと、パブリックおよびプライベートのエンドポイントを持つクラスタの両方に必要です。

  1. VPNサーバーをリストアップします。

    ibmcloud is vpn-servers
    
  2. VPNサーバーの詳細を取得します。

    ibmcloud is vpn-server SERVER
    
  3. VPNサーバーのクライアントIPプールを取得します。

    ibmcloud is vpn-server | grep "Client IP pool"
    
  4. クラスタの詳細を取得し、VPEポートをメモする。

    ibmcloud ks cluster get --cluster <clusterID>
    
  5. クライアントでVPNを開始する。

  6. VPE経由でクラスタにアクセスします。

    ibmcloud ks cluster config --admin --cluster <clusterID> --endpoint vpe
    
  7. ポッドをリストします。 クライアントがVPEゲートウェイを経由してVPN経由でクラスタにアクセスできないため、このコマンドは失敗することに注意してください。

    kubectl get pods -A
    
  8. kube-vpegw-<clusterID>」にVPN用のセキュリティグループルールを追加する。 この場合のリモートは、VPNのクライアントIPのCIDRに由来する。

    ibmcloud is sg-rulec kube-vpegw-<clusterID> inbound tcp --port-min PORT  --port-max PORT --remote IP-OR-CIDR
    

    コマンドの例。

    ibmcloud is sg-rulec kube-vpegw-<clusterID> inbound tcp --port-min 30829  --port-max 30829 --remote 192.168.192.0/22
    
  9. ポッドをリストします。

    kubectl get pods -A
    

ウェブフックのアウトバウンド・トラフィックを許可する

クラスタ外部の URL またはサービスに連絡する Webhook を使用している場合は、クラスタワーカーから URL または外部サービスへの送信トラフィックを許可するセキュリティグループルールを追加する必要があります。 あるいは、送信トラフィックの保護を完全に無効にすることもできます。

通常、クラスタサービス参照を使用するアドミッションウェブフックでは、変更は必要ありません。

次の例では、クラスタ・サービスに接続するアドミッションWebhookは、マスターがデフォルトで許可されているKonnectivity接続を介してサービスに接続するため、通常は変更を必要としません。 例外は、そのクラスタサービスを実装しているポッドが、 URL または何らかの外部サービスに接続する必要がある場合です。 もしそうなら、この例に示すように、それらのポッドが URL または外部サービスにアクセスすることを許可する。

apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
  name: my-cluster-service.webhook.io
webhooks:
- admissionReviewVersions:
  - v1
  clientConfig:
    caBundle: ABCDEFG...
    service:
      name: my-admission-webhook
      namespace: default
      path: /validate
      port: 443
...

ただし、アドミッション・ウェブフックが URL を使用する場合は、追加のセキュリティー・グループ・ルールが必要です。

URL に接続するウェブフックの例。

apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
  name: my-url.webhook.io
webhooks:
- admissionReviewVersions:
  - v1
  clientConfig:
    caBundle: ABCDEFG...
    url: https://webhook.ibm.com:20001/validate
...

Webhook の外部 URL またはサービスへのアクセスを許可するには、以下のオ プションのいずれかを選択します

  • 以下のコマンドを実行して、送信トラフィック保護を無効にする。

    ibmcloud ks vpc outbound-traffic-protection disable --cluster CLUSTER
    
  • クラスターワーカーに接続を許可するために、'kube-<clusterID> セキュリティグループにアウトバウンドセキュリティグループルールを追加します。 前の例では、ポート「20001」の「webhook.ibm.com サービスが使われている。

    1. dig を使って、 URL にアクセスするためのIPを調べる。

      dig +short URL
      

      コマンドの例。

      dig +short webhook.ibm.com
      

      出力例

      1.2.3.4
      4.5.6.7
      
    2. 返されたIPアドレスごとにルールを作成する。

      ibmcloud is sg-rulec kube-<clusterID> outbound all --remote <IP-address-or-subnet>
      

      コマンドの例。

      ibmcloud is sg-rulec kube-CLUSTERID outbound tcp --port-min 20001 --port-max 20001 --remote 1.2.3.4
      ibmcloud is sg-rulec kube-CLUSTERID outbound tcp --port-min 20001 --port-max 20001 --remote 4.5.6.7
      

詳細については、ダイナミック・アドミッション・コントロールを参照してください

パブリック・サービスへのアウトバウンド・トラフィックを許可する

アプリケーションによって呼び出される外部サービスが、そのサービスをホストするために使用されるIP/CIDRの小さなセットを持っていて、それがあまり頻繁に変更されない場合、「kube-clusterID セキュリティグループ上でそれらのIPまたはCIDRへのアウトバウンドアクセスを選択的に許可することができます。

次の例では、github.comのAPIを'api.github.com で使用しています。

  1. curl によってIPをプログラムで検索する。

    curl -sS -H "Accept: application/vnd.github+json" https://api.github.com/meta | jq '.api'
    
  2. 前のステップで見つけた各CIDRを、「kube-clusterID セキュリティグループの送信セキュリティグループルールの宛先として追加する。 あるいは、クラスタ作成時にクラスタワーカーに追加するカスタムセキュリティグループを作成することもできます。

    ibmcloud is sg-rulec kube-<clusterID> outbound all --remote <IP-address-or-subnet>
    

詳しくは GitHub'sのIPアドレス についてをご覧ください。

ハブおよびスポークVPCのアウトバウンド・トラフィック保護に関する考察

ハブ&スポークモデルでは、DNS解決に使用されるのはハブのVPCクラスタのみです。 スポーククラスタはハブを経由してDNSにアクセスする。 ハブクラスタとスポーククラスタは多くの場合、異なるVPCにあり、それらはTransit Gatewayて接続されている。

バージョン1.30以降のクラスタでは、それぞれのセキュリティ・グループを調整しないと、ハブ&スポーク・モデルは機能しません。 これらの調整により、ハブとスポークVPC間のトラフィックが可能になる。

  1. 各スポーククラスタの「kube-<clusterID> セキュリティグループにルールを追加して、スポークVPC内のクラスタがハブVPCにアクセスできるように更新します。 ハブクラスターワーカーが配置されている各VPC サブネットのCIDRに送信ルールを追加してください。 例えば、スポークが1つのハブに接続しており、そのハブに3つのゾーンにワーカーがいる場合、スポークの「kube-<clusterID> セキュリティグループに3つのルールを、各サブネットに1つずつ追加する必要があります。

    ibmcloud is sg-rulec kube-<spoke-clusterID> outbound all --remote <hub-subnet-CIDR>
    
  2. ハブの共有VPEゲートウェイセキュリティグループ(kube-vpegw-vpcID)にルールを追加して、スポークからのトラフィックを許可するようにハブクラスタを更新します。または、共有 VPE ゲートウェイに独自のカスタムセキュリティグループを使用している場合は、代わりにそのカスタムセキュリティグループにルールを追加します。

  3. 以下のコマンドを実行して、VPEゲートウェイを見つけ、ゲートウェイの詳細を見て、関連するセキュリティグループを見つける。 次のステップでルールを追加するために、セキュリティグループIDをメモしておく。

    ibmcloud is egs
    
  4. スポークワーカーが配置されているVPC サブネットからインバウンドルールを追加します。 例えば、スポークが3つの異なるゾーンに配備されているが、それぞれのゾーンで1つのサブネットに配備されている場合、ハブの共有VPEゲートウェイのセキュリティグループに3つのルールが追加されます。

    ibmcloud is sg-rulec kube-vpegw-<hub-vpcID> inbound all --remote <spoke-subnet-CIDR>
    

パブリックネットワーク経由でクラスタAPIサーバへの一時的なトラフィックを許可する

VPCクラスタワーカーはクラスタマスターとの通信にプライベートネットワークを使用します。 以前は、パブリックサービスのエンドポイントが有効になっているVPCクラスタでは、プライベートネットワークがブロックされているか利用できない場合、クラスタワーカーはクラスタマスタとの通信にパブリックネットワークを使用するようにフォールバックできました。

1.30以降のクラスタでは、クラスタワーカーからのパブリックアウトバウンドトラフィックがブロックされているため、パブリックネットワークにフォールバックするオプションはありません。 このパブリックネットワークバックアップオプションを許可するために、アウトバウンドトラフィックの保護を無効にしたいかもしれませんが、より良い代替手段があります。 その代わりに、プライベートネットワークを介したワーカーとマスターの接続に一時的な問題が発生した場合、その時点でクラスタマスター「apiserver ポートへのアウトバウンドトラフィックを許可する一時的なセキュリティグループルールを「kube-clusterID セキュリティグループに追加することができます。 その後、問題が解決したら、一時的なルールを削除することができる。

プライベート・ネットワークがダウンしている場合にパブリック・ネットワーク経由のトラフィックを許可するには、以下のオプションのいずれかを選択します。

  • kube-clusterID セキュリティグループに、APIサーバーへのトラフィックを許可するセキュリティグループルールを追加する。

    1. クラスタの詳細を取得し、APIサーバーのポートを控えておいてください。

      ic ks cluster get --cluster <clusterID>
      

      APIサーバーのポートが「30685 である場合の出力例。

      Name:                           prestg-sbd-vpc-4.15
      ID:                             coekl4a107ovqfndhh60
      ...
      Public Service Endpoint URL:    https://c100-e.containers.pretest.cloud.ibm.com:30685
      Private Service Endpoint URL:   https://c100.private.containers.pretest.cloud.ibm.com:30685
      ...
      
    2. kube-<clusterID>」から「0.0.0.0/0」への送信セキュリティグループルールを追加し、すべてのパブリックネットワークアクセスを許可する。

      ibmcloud is sg-rulec kube-<clusterID> outbound tcp --port-min <API port> --port-max <API port> --remote 0.0.0.0/0
      

      APIサーバーのポートを'30685 とした場合のコマンド例。

      ibmcloud is sg-rulec kube-<clusterID> outbound tcp --port-min 30685 --port-max 30685 --remote 0.0.0.0/0
      
  • 送信トラフィック保護を無効にする。

    ibmcloud ks vpc outbound-traffic-protection disable --cluster CLUSTER