Cloud Run for Anthos on Google Cloud のすべての送信ネットワーク アクセスを有効にする

デフォルトでは、クラスタに対するすべての送信トラフィックがブロックされます(Google API へのアクセスもブロックされます)。たとえば、Cloud Storage や外部 API などの Google Cloud サービスに接続する場合など、すべての送信ネットワーク アクセスを有効にするには、config-network マップを編集して適切なプロキシ IP 範囲を設定する必要があります。

前提条件

これは、設定の手順に沿って gcloud と kubectl コマンドライン ツールを設定していることを前提としています。

すべての送信ネットワーク アクセスを有効にする

次の手順はクラスタ バージョン 1.12.7-gke.171.12 ベースのクラスタ)、または 1.11.9-gke.131.11 ベースのクラスタ)より古いクラスタ バージョンにのみ適用されます。古いバージョンのクラスタでは、インターネット上のすべての IP アドレスへの送信トラフィックを有効にする必要があります。これにより、アプリケーションが信頼できないエンドポイントに接続する可能性があります。

クラスタの IP スコープを決定する

正しいスコープを設定するには、クラスタの現在の IP 範囲を確認する必要があります。スコープはクラスタの構成によって異なります。

  1. 次のコマンドを呼び出してスコープを特定します。

    gcloud container clusters describe [CLUSTER_NAME] \
    | grep -e clusterIpv4Cidr -e servicesIpv4Cidr

    [CLUSTER_NAME] は、クラスタ名に置き換えます。gcloud のデフォルト クラスタとして設定している場合でも、クラスタ名を指定する必要があります。前提条件にあるようにデフォルト ゾーンを設定していない場合は、クラスタ名の後に zone パラメータ --zone=[ZONE] を指定する必要があります。[ZONE] は、クラスタのゾーンに置き換えます。

  2. 上記のコマンドで返された IP 範囲をメモします。次のような結果が返されます。

    ...
    clusterIpv4Cidr: 10.8.0.0/14
    servicesIpv4Cidr: 10.11.240.0/20
    ...
    

    次のセクションで説明するように、すべての送信アクセスを有効にするには、これらの IP 範囲を一緒に追加する必要があります。

IP スコープを設定する

config-network ConfigMap の istio.sidecar.includeOutboundIPRanges パラメータに、Istio サイドカーが傍受する IP 範囲を指定します。送信アクセスを許可するには、デフォルトのパラメータ値の代わりに、前の手順で取得したクラスタの IP 範囲を使用します。

  1. 次のコマンドを実行して、config-network マップを編集します。

    kubectl edit configmap config-network --namespace knative-serving
  2. 任意のエディタを使用して、istio.sidecar.includeOutboundIPRanges パラメータの値を * から、前の手順で取得した IP 範囲に変更します。複数の IP エントリを指定する場合は、エントリをカンマで区切ります。例:

  # Please edit the object below. Lines beginning with a '#' will be ignored,
  # and an empty file will abort the edit. If an error occurs while saving this file will be
  # reopened with the relevant failures.
  #
  apiVersion: v1
  data:
    istio.sidecar.includeOutboundIPRanges: '10.16.0.0/14,10.19.240.0/20'
  kind: ConfigMap
  metadata:
  ...

有効な IP アドレス範囲のセットをパラメータに設定すると、Istio は、指定した範囲外の IP アドレスに対するトラフィックを傍受しなくなります。このため、下り(外向き)ルールの指定は必要ありません。

istio.sidecar.includeOutboundIPRanges パラメータ省略した場合、または " を指定した場合は、Istio デプロイ時に提供される global.proxy.includeIPRanges パラメータの値が使用されます。この値は * です。

無効な値を使用されると、代わりに '' が使用されます。

  1. 変更を保存します。変更は自動的に検出され、デプロイされたすべてのリビジョンで使用されます。

送信ネットワークの問題を解決する

クラスタ外の呼び出しで問題が発生した場合は、Pod のメタデータを確認して、サービスを実行している Pod にポリシーが適用されていることを確認します。traffic.sidecar.istio.io/includeOutboundIPRanges アノテーションが config-map の期待値と一致することを確認します。

  1. Pod は 0 にスケーリングされる場合があるため、実行中の Pod が存在することを確認します。

    curl -H "Host: helloworld-go.default.example.com" http://35.203.155. 229

    ホストの URL と IP アドレスを独自の URL とクラスタの IP アドレスで置き換えます。クラスタの IP アドレスを確認する方法がわからない場合は、デプロイ済みのサービスにアクセスするをご覧ください。

  2. 5 分以内に、このコマンドを呼び出し、使用可能な Pod のリストを取得します。

    kubectl get pods
  3. get pods コマンドの出力から、サービスに関連する Pod を探します。サービスの名前で始まります。

  4. この Pod 名を次のコマンドで使用してメタデータを取得し、適用されているラベルを確認します。

    kubectl get pod [POD_NAME] --output yaml

    [POD_NAME] は、Pod 名に置き換えます。Pod の詳細については、Pod のドキュメントをご覧ください。

    次のような結果が表示されます。

  apiVersion: v1
  kind: Pod
  metadata:
    annotations:
      serving.knative.dev/configurationGeneration: "2"
      sidecar.istio.io/inject: "true"
      ...
      traffic.sidecar.istio.io/includeOutboundIPRanges: 10.16.0.0/14,10.19.240.0/20
  ...

traffic.sidecar.istio.io/includeOutboundIPRanges: 10.16.0.0/14,10.19.240.0/20 で始まる行に、最も重要な情報があります。