为 GKE 专用集群配置受限访问权限

通过将 DNS 路由配置为受限虚拟 IP (VIP),Google Kubernetes Engine 专用集群可以访问 VPC Service Controls 服务边界内的 Artifact Registry 代码库。

由于专用集群节点与互联网隔离,并且注册表网域默认解析为公共 IP 地址,因此您必须通过受限 VIP 路由对 pkg.dev 网域的请求。

概览

您的专用集群应始终通过受限 VIP 访问 Artifact Registry,以防止数据从受支持的服务泄露到不受支持的服务。

如果满足以下所有条件,请为 GKE 专用集群配置受限访问权限:

  • 您使用的是 GKE 专用集群。
  • 您尚未配置 pkg.dev 注册表网域到 restricted. 的路由。

准备工作

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

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

配置 DNS

配置您的 DNS 服务器,以便将发送到注册表地址的请求解析为 restricted.(即受限 VIP)。您可以使用 Cloud DNS 专用 DNS 区域执行此操作。

  1. 创建专用代管区域。

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

    其中:

    • ZONE_NAME 是您要创建的区域的名称。例如 registry。下列各个步骤中都将使用此名称。
    • PROJECT_ID 是托管 GKE 专用集群的项目的 ID。
    • NETWORK 是一个可选列表,其中包含您要从中重定向请求的集群网络的名称。
    • DESCRIPTION 是托管式区域的人类可读说明。
    • REGISTRY_DOMAIN 是注册表的网域:
      • pkg.dev(对于 Artifact Registry)
  2. 启动一项事务。

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

    其中:

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

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

  3. 为注册表添加 CNAME 记录。

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

    其中:

    • ZONE_NAME 是您在第一步中创建的可用区的名称。
    • PROJECT_ID 是托管 GKE 专用集群的项目的 ID。
    • REGISTRY_DOMAIN 是注册表的网域:
      • pkg.dev(对于 Artifact Registry)
  4. 为受限 VIP 提供 A 记录。

    gcloud dns record-sets transaction add \
      --name=REGISTRY_DOMAIN. \
      --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。
    • REGISTRY_DOMAIN 是注册表的网域:
      • pkg.dev(对于 Artifact Registry)
  5. 执行事务。

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

    其中:

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

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

配置 DNS 路由后,请确保您的 GKE、注册表和其他必需服务位于 VPC Service Controls 服务边界内。如需配置服务边界,请参阅以下部分。

配置服务边界

配置 DNS 记录后,请执行以下操作:

  1. 创建新的服务边界或更新现有边界。
  2. 将 Artifact Registry 服务添加到您要使用服务边界保护的服务列表中。
  3. 将存储库使用的其他受支持的服务添加到服务边界。

验证边界是否有效

配置服务边界后,如果映像存储在服务边界内的项目中,则 GKE 专用集群中的节点可以访问 Artifact Registry 中的容器映像。

边界外项目中的容器映像仍然无法访问,但某些特定的只读公共制品库除外。

例如,如果 google-samples 项目不在服务边界内,则运行命令以从 hello-app 容器创建部署将失败:

pkg.dev 域名

kubectl create deployment hello-server --image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0

gcr.io 域名

kubectl create deployment hello-server --image=gcr.io/google-samples/hello-app:1.0

使用以下命令检查 pod 的状态:

kubectl get pods

该命令会返回如下例所示的表。Pod 状态 ErrImagePull 表示拉取失败。

NAME                            READY   STATUS         RESTARTS   AGE
hello-server-dbd86c8c4-h5wsf    1/1     ErrImagePull   0          45s

您可以使用 kubectl describe pod 命令查看有关部署的更多详细信息。对于上例中的 pod,命令如下:

kubectl describe pod hello-server-dbd86c8c4-h5wsf