为 Cloud Run for Anthos on Google Cloud 允许所有出站网络访问

默认情况下,集群会禁止所有出站流量(包括对 Google API 的访问)。要允许所有出站网络访问(例如连接到 Cloud Storage 等 Google Cloud 服务或外部 API),您需要通过修改 config-network 映射来设置代理 IP 地址范围的正确范围。

前提条件

这假定您已按照设置说明设置了 gcloud 和 kubectl 命令行工具。

允许所有出站网络访问

以下说明仅适用于 1.12.7-gke.17 之前的集群版本(基于 1.12 的集群),或 1.11.9-gke.13 之前的集群版本(基于 1.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 Sidecar 拦截的 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 正在运行,因为 pod 可缩容到零:

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

    将主机网址和 IP 地址分别替换为您自己的网址和该集群的 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 开头的行包含最重要的信息。