为 GKE 专用集群设置 Container Registry

本页面介绍了如何配置 DNS 条目以将 Container Registry 与 Google Kubernetes Engine 专用集群和 VPC Service Controls 结合使用。 仅当您的 GKE 专用集群使用 Container Registry 时,才需要执行这些步骤。

准备工作

在创建服务边界之前,请设置新的专用集群或标识要保护的现有专用集群。

此外,您必须允许通过端口 443 向 199.36.153.4/30 发送出站流量。通常情况下,VPC 网络具有允许将所有出站流量发送到目标的隐式规则。但是,如果您有拒绝此类流量的规则,则必须创建出站防火墙规则,以允许端口 443 上的 TCP 流量发送到 199.36.153.4/30。

配置 DNS

要支持在服务边界内使用 Container Registry 的 GKE 专用集群,您首先需要配置您的 DNS 服务器,以便将发送到 Container Registry 地址的请求解析为 restricted.googleapis.com(即受限 VIP)。您可以使用 Cloud DNS 专用 DNS 地区执行此操作。

  1. 创建托管专用地区。

    gcloud beta dns managed-zones create ZONE_NAME \
        --visibility=private \
        --networks=https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/NETWORK \
        --description=DESCRIPTION \
        --dns-name=gcr.io \
        --project=PROJECT_ID
    

    其中:

    • ZONE_NAME 是您要创建的地区的名称。例如 gcr。下列各个步骤中将使用此名称。

    • PROJECT_ID 是托管 GKE 专用集群的项目的 ID。

    • NETWORK 是您要从中重定向请求的集群网络的名称。默认网络为 default

    • DESCRIPTION 是可选项,就托管地区提供直观易懂的说明。

  2. 启动一项事务。

    gcloud dns record-sets transaction start \
      --zone=ZONE_NAME \
      --project=PROJECT_ID
    

    其中:

    • ZONE_NAME 是您在第一步中创建的地区的名称。

    • PROJECT_ID 是托管 GKE 专用集群的项目的 ID。

  3. *.gcr.io 添加 CNAME 记录。

    gcloud dns record-sets transaction add \
      --name=*.gcr.io. \
      --type=CNAME gcr.io. \
      --zone=ZONE_NAME \
      --ttl=300 \
      --project=PROJECT_ID
    

    其中:

    • ZONE_NAME 是您在第一步中创建的地区的名称。

    • PROJECT_ID 是托管 GKE 专用集群的项目的 ID。

  4. 为受限 VIP 提供 A 记录。

    gcloud dns record-sets transaction add \
      --name=gcr.io. \
      --type=A 199.36.153.4 199.36.153.5 199.36.153.6 199.36.153.7 \
      --zone=ZONE_NAME \
      --ttl=300 \
      --project=PROJECT_ID
    

    其中:

    • ZONE_NAME 是您在第一步中创建的地区的名称。

    • PROJECT_ID 是托管 GKE 专用集群的项目的 ID。

  5. 执行事务。

    gcloud dns record-sets transaction execute \
      --zone=ZONE_NAME \
      --project=PROJECT_ID
    

    其中:

    • ZONE_NAME 是您在第一步中创建的地区的名称。

    • PROJECT_ID 是托管 GKE 专用集群的项目的 ID。

配置服务边界

配置 DNS 记录后,请创建新服务边界更新现有边界,然后将 Container Registry 服务添加到要使用服务边界保护的服务列表中。

验证边界是否有效

配置服务边界后,您可以按照 PHP 留言板教程验证该边界是否按预期正常运行。

如果配置正常运行,则留言板应用 Web 前端的 pod 无法启动。

以下是边界配置正确时返回的错误消息的示例:

Events:
  Type     Reason                 Age               From                                               Message
  ----     ------                 ----              ----                                               -------
  Normal   Scheduled              8m                default-scheduler                                  Successfully assigned sample-67f11b22f-t7ltj to gke-netpolicy-default-pool-02ad111e-06tk
  Normal   SuccessfulMountVolume  8m                kubelet, gke-netpolicy-default-pool-02ad111e-06tk  MountVolume.SetUp succeeded for volume "default-token-lhx2s"
  Normal   Pulling                6m (x4 over 8m)   kubelet, gke-netpolicy-default-pool-02ad111e-06tk  pulling image "gcr.io/google_samples/gb-frontend:v4"
  Warning  Failed                 6m (x4 over 8m)   kubelet, gke-netpolicy-default-pool-02ad111e-06tk  Failed to pull image "gcr.io/google_samples/gb-frontend:v4": rpc error: code = Unknown desc = Error response from daemon: Get https://gcr.io/v2/google_samples/gb-frontend/manifests/v4: denied: Request is prohibited by organization's policy