您可以使用 Cloud Build 专用池将 Cloud Build 连接到 Secure Source Manager Private Service Connect 实例。
准备工作
- 创建 Private Service Connect Secure Source Manager 实例。
- 如果您之前为 Private Service Connect 实例配置了端点,则必须断开这些端点的连接。如需释放端点,请按照释放静态内部 IPv4 或 IPv6 地址中的说明操作。
-
Enable the Cloud Build, Service Networking, and Compute Engine APIs.
所需的角色
如需获得将 Cloud Build 连接到 Private Service Connect Secure Source Manager 实例所需的权限,请让您的管理员为您授予组织的 Access Context Manager Admin 角色 (roles/accesscontextmanager.policyAdmin
) IAM 角色。
配置服务账号
为了在 Cloud Build 中遵循最低权限原则,您可以将 Cloud Build 配置为使用仅具有执行 build 所需权限的服务账号。
如果您未指定服务账号,Cloud Build 可能会自动选择一个服务账号来代表您执行构建。此服务账号可能具有对于您的使用情形而言不必要的宽泛权限,例如访问您的 Secure Source Manager 实例和项目中的任何代码库。
如果您还没有要使用的服务账号,请创建一个服务账号。
-
在 Google Cloud 控制台中,前往 settings Secure Source Manager 权限页面:
在服务账号权限标签页中,选择您要用作 Cloud Build 服务账号的服务账号。
(可选)选择设为首选服务账号,以便在您创建新触发器时预先填充您的服务账号。
向服务账号授予所需权限
向服务账号授予您的使用情形所需的 Cloud Build 角色。如需了解不同的 Cloud Build 操作需要哪些 Cloud Build 角色,请参阅配置对 Cloud Build 的访问权限。
如需向服务账号授予检索 CA 证书的权限,请运行以下命令。
gcloud projects add-iam-policy-binding CA_PROJECT_ID \ --member=serviceAccount:SA_EMAIL \ --role=roles/privateca.auditor \ --condition=None
替换以下内容:
CA_PROJECT_ID
:CA 池项目的项目 ID。SA_EMAIL
:替换为您设置为 Cloud Build 服务账号的服务账号的电子邮件地址。
如需向服务账号授予访问 Secure Source Manager 实例的权限,请运行以下命令。
gcloud projects add-iam-policy-binding INSTANCE_PROJECT_ID \ --member=serviceAccount:SA_EMAIL \ --role=roles/securesourcemanager.instanceAccessor \ --condition=None
如需向服务账号授予从 Secure Source Manager 代码库读取数据的权限,请运行以下命令。
gcloud projects add-iam-policy-binding INSTANCE_PROJECT_ID \ --member=serviceAccount:SA_EMAIL \ --role=roles/securesourcemanager.repoReader \ --condition=None
设置 build 日志
如果您为构建指定自己的服务账号,则必须将构建日志存储在 Cloud Logging 或用户创建的 Cloud Storage 存储桶中。您无法将日志存储在默认日志存储桶中。
如需将构建日志存储在 Cloud Logging 中,请向您的 Cloud Build 服务账号授予 Logs Writer (roles/logging.logWriter
) 角色。
如需详细了解如何设置 build 日志,请参阅配置用户指定的服务账号。
创建专用 Cloud DNS 区域
如需创建托管式专用 Cloud DNS 区域,请运行以下命令。
gcloud dns managed-zones create ZONE_NAME \
--project=PROJECT_ID \
--description=DESCRIPTION \
--dns-name="INSTANCE_LOCATION.p.sourcemanager.dev." \
--visibility="private" \
--networks="https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/NETWORK"
替换以下内容:
ZONE_NAME
:替换为您要为托管地区指定的名称。PROJECT_ID
:替换为您要用于 Cloud DNS 区域的 Google Cloud 项目 ID。DESCRIPTION
:包含可用区的说明。INSTANCE_LOCATION
:替换为您要创建 Secure Source Manager 实例的位置。
如需详细了解受管理的专用 Cloud DNS 地区,请参阅 Cloud DNS 概览。
配置 Virtual Private Cloud (VPC) 网络
预留您要用于将 Secure Source Manager VPC 与 Cloud Build 专用池对等互连的 IP 范围。
gcloud compute addresses create CB_PEER_RANGE \ --global \ --purpose=VPC_PEERING \ --prefix-length=24 \ --description="IP range for peering with Cloud Build private pool" \ --network=NETWORK \ --project=INSTANCE_PROJECT_ID
替换以下内容:
CB_PEER_RANGE
:包含要创建的地址的名称。NETWORK
:应在其中预留地址的网络资源。如果您使用的是默认网络,则该值为default
。INSTANCE_PROJECT_ID
:Private Service Connect 实例项目 ID。
如需创建与
servicenetworking.googleapis.com
的 VPC 对等互连,请运行以下命令。gcloud services vpc-peerings connect \ --service=servicenetworking.googleapis.com \ --ranges=CB_PEER_RANGE \ --network=NETWORK \ --project=INSTANCE_PROJECT_ID
如需创建对等互连 DNS 网域以与 Cloud Build 连接,请运行以下命令。
gcloud services peered-dns-domains create DNS_PEERING_DOMAIN \ --network=NETWORK \ --project=INSTANCE_PROJECT_ID \ --dns-suffix=INSTANCE_LOCATION.p.sourcemanager.dev.
替换以下内容:
DNS_PEERING_DOMAIN
:要创建的对等互连 DNS 网域的名称。
专用 DNS 区域必须明确共享。如需详细了解如何共享专用 DNS 区域,请参阅与服务提供方共享专用 DNS 区域。
如需将网络路由导出到 Cloud Build,请运行以下命令。
gcloud compute networks peerings update servicenetworking-googleapis-com \ --network=NETWORK \ --export-custom-routes \ --no-export-subnet-routes-with-public-ip \ --project=INSTANCE_PROJECT_ID
如需在与 Private Service Connect 实例相同的 Google Cloud项目中创建 Cloud Build 专用池,请运行以下命令。
gcloud builds worker-pools create PRIVATE_POOL_ID \ --project=INSTANCE_PROJECT_ID \ --region=INSTANCE_LOCATION \ --peered-network=projects/INSTANCE_PROJECT_ID/global/networks/NETWORK \ --worker-disk-size=100 \ --no-public-egress
其中,
PRIVATE_POOL_ID
是您要创建的专用池的名称。名称长度必须介于 1 到 63 个字符之间,有效字符为[a-zA-Z0-9_-]+
。如需为 HTTP 端点创建 Private Service Connect 网络端点组 (NEG),请运行以下命令:
gcloud beta compute network-endpoint-groups create HTTP_NEG_NAME \ --project=INSTANCE_PROJECT_ID \ --region=INSTANCE_LOCATION \ --network-endpoint-type=PRIVATE_SERVICE_CONNECT \ --psc-target-service=HTTP_PSC \ --network=NETWORK --subnet=SUBNET
其中:
HTTP_NEG_NAME
是您要为 HTTP 端点创建的 NEG 的名称。HTTP_PSC
是 HTTP Private Service Connect 端点值。
如需为 SSH 端点创建 Private Service Connect NEG,请运行以下命令:
gcloud beta compute network-endpoint-groups create SSH_NEG_NAME \ --project=INSTANCE_PROJECT_ID \ --region=INSTANCE_LOCATION \ --network-endpoint-type=PRIVATE_SERVICE_CONNECT \ --psc-target-service=SSH_PSC \ --network=NETWORK --subnet=SUBNET
其中:
SSH_NEG_NAME
是您要为 SSH 端点创建的 NEG 的名称。SSH_PSC
是 SSH Private Service Connect 端点值。
设置代理内部负载均衡器 (ILB)
无法从对等互连的 VPC 网络访问端点。如需访问 Secure Source Manager 端点,您必须为每个端点设置 L4 内部负载均衡器 (ILB)。如需详细了解如何通过端点访问已发布的服务,请参阅通过端点访问已发布服务的简介。
如需为 ILB 创建代理专用子网,请运行以下命令。
gcloud compute networks subnets create ILB_PROXY_SUBNET_NAME \ --purpose=REGIONAL_MANAGED_PROXY \ --role=ACTIVE \ --region=INSTANCE_LOCATION \ --network=NETWORK \ --range=CIDR_RANGE \ --project=INSTANCE_PROJECT_ID
其中:
ILB_PROXY_SUBNET_NAME
是要创建的子网的名称。CIDR_RANGE
是该子网的主要 IP 地址范围。 使用的子网掩码长度不得超过26
,以确保至少有 64 个 IP 地址可用于该区域中的代理。建议的子网掩码长度为/23
。如需详细了解代理专用子网,请参阅基于 Envoy 的负载平衡器的代理专用子网。
如需为 HTTP 连接 NEG 创建 L4 ILB,请运行以下命令。
gcloud compute backend-services create HTTP_PROXY_ILB \ --project=INSTANCE_PROJECT_ID \ --region=INSTANCE_LOCATION \ --load-balancing-scheme=INTERNAL_MANAGED
其中,
HTTP_PROXY_ILB
是要为 HTTP 端点创建的 ILB 的名称。如需为 SSH 连接 NEG 创建 L4 ILB,请运行以下命令。
gcloud compute backend-services create SSH_PROXY_ILB \ --project=INSTANCE_PROJECT_ID \ --region=INSTANCE_LOCATION \ --load-balancing-scheme=INTERNAL_MANAGED
其中,
SSH_PROXY_ILB
是要为 SSH 端点创建的 ILB 的名称。
将 Private Service Connect NEG 注册为 ILB 的后端
如需注册 HTTP NEG,请运行以下命令。
gcloud compute backend-services add-backend HTTP_PROXY_ILB \ --network-endpoint-group=HTTP_NEG_NAME \ --network-endpoint-group-region=INSTANCE_LOCATION \ --project=INSTANCE_PROJECT_ID
如需注册 SSH NEG,请运行以下命令。
gcloud compute backend-services add-backend SSH_PROXY_ILB \ --network-endpoint-group=SSH_NEG_NAME \ --network-endpoint-group-region=INSTANCE_LOCATION \ --project=INSTANCE_PROJECT_ID
为 ILB 创建目标 TCP 代理
如需为 HTTP ILB 创建目标 TCP 代理,请运行以下命令。
gcloud compute target-tcp-proxies create ILB_HTTP_TCP_TARGET_PROXY \ --backend-service=HTTP_PROXY_ILB \ --region=INSTANCE_LOCATION \ --project=INSTANCE_PROJECT_ID
其中,
ILB_HTTP_TCP_TARGET_PROXY
是要为 HTTP ILB 创建的目标 TCP 代理的名称。如需为 SSH ILB 创建目标 TCP 代理,请运行以下命令。
gcloud compute target-tcp-proxies create ILB_SSH_TCP_TARGET_PROXY \ --backend-service=SSH_PROXY_ILB \ --region=INSTANCE_LOCATION \ --project=INSTANCE_PROJECT_ID
其中,
ILB_SSH_TP_TARGET_PROXY
是您为 SSH ILB 创建的目标 TCP 代理的名称。
创建转发规则以将流量路由到 ILB
如需创建转发规则以将流量路由到 HTTP ILB,请运行以下命令。
gcloud compute forwarding-rules create HTTP_PROXY_FORWARD \ --project=INSTANCE_PROJECT_ID \ --ports 443 \ --target-tcp-proxy=ILB_HTTP_TCP_TARGET_PROXY \ --target-tcp-proxy-region=INSTANCE_LOCATION \ --network-tier PREMIUM \ --load-balancing-scheme=INTERNAL_MANAGED \ --network=NETWORK \ --subnet=SUBNET \ --subnet-region=INSTANCE_LOCATION
其中,
HTTP_PROXY_FORWARD
是您要创建的转发规则的名称。如需创建用于将流量路由到 SSH ILB 的转发规则,请运行以下命令。
gcloud compute forwarding-rules create SSH_PROXY_FORWARD \ --project=INSTANCE_PROJECT_ID \ --ports 22 \ --target-tcp-proxy=ILB_SSH_TCP_TARGET_PROXY \ --target-tcp-proxy-region=INSTANCE_LOCATION \ --network-tier PREMIUM \ --load-balancing-scheme=INTERNAL_MANAGED \ --network=NETWORK \ --subnet=SUBNET \ --subnet-region=INSTANCE_LOCATION
其中,
SSH_PROXY_FORWARD
是您要创建的转发规则的名称。
创建专用 DNS 记录
设置转发规则后,您需要在专用 Cloud DNS 区域中为每个实例的主机名注册 DNS 记录。
如需获取 HTTP 转发规则的 IP 地址,请运行以下命令。
gcloud compute forwarding-rules describe HTTP_PROXY_FORWARD \ --project=INSTANCE_PROJECT_ID \ --region=INSTANCE_LOCATION
其中,
HTTP_PROXY_FORWARD
是您为 HTTP 转发规则指定的名称。如需注册 API 主机名,请运行以下命令。
gcloud dns record-sets create INSTANCE_ID-INSTANCE_PROJECT_NUMBER-api.INSTANCE_LOCATION.p.sourcemanager.dev. \ --project=INSTANCE_PROJECT_ID \ --zone=ZONE_NAME \ --type=A \ --ttl=300 \ --rrdatas=HTTP_LB_IP
替换以下内容:
INSTANCE_ID
:替换为您的实例 ID。INSTANCE_PROJECT_NUMBER
:替换为实例的 Google Cloud项目编号。INSTANCE_LOCATION
:替换为您的实例所在的区域。INSTANCE_PROJECT_ID
:替换为实例的 Google Cloud项目 ID。ZONE_NAME
:您为托管地区指定的名称。HTTP_LB_IP
:是gcloud compute forwarding-rules describe HTTP_PROXY_FORWARD
的输出。
如需注册 Git HTTP 主机名,请运行以下命令。
gcloud dns record-sets create INSTANCE_ID-INSTANCE_PROJECT_NUMBER-git.INSTANCE_LOCATION.p.sourcemanager.dev. \ --project=INSTANCE_PROJECT_ID \ --zone=ZONE_NAME \ --type=A \ --ttl=300 \ --rrdatas=HTTP_LB_IP
如需注册网页界面的 HTML 主机名,请运行以下命令。
gcloud dns record-sets create INSTANCE_ID-INSTANCE_PROJECT_NUMBER.INSTANCE_LOCATION.p.sourcemanager.dev.\ --project=INSTANCE_PROJECT_ID \ --zone=ZONE_NAME \ --type=A \ --ttl=300 \ --rrdatas=HTTP_LB_IP
如需获取 SSH 转发规则的 IP 地址,请运行以下命令。
gcloud compute forwarding-rules describe SSH_PROXY_FORWARD \ --project=INSTANCE_PROJECT_ID \ --region=INSTANCE_LOCATION
其中,
SSH_PROXY_FORWARD
是您为 SSH 转发规则指定的名称。如需注册 Git SSH 主机名,请运行以下命令。
gcloud dns record-sets create INSTANCE_ID-INSTANCE_PROJECT_NUMBER-ssh.INSTANCE_LOCATION.p.sourcemanager.dev. \ --project=INSTANCE_PROJECT_ID \ --zone=ZONE_NAME \ --type=A \ --ttl=300 \ --rrdatas=SSH_LB_IP
其中,
SSH_LB_IP
是gcloud compute forwarding-rules describe SSH_PROXY_FORWARD
的输出。
在实例中创建代码库
您可以使用堡垒主机在 Private Service Connect 实例中访问和创建代码库。
运行以下命令,创建代码库。
curl \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ https://INSTANCE_ID-PROJECT_NUMBER-api.INSTANCE_LOCATION.p.sourcemanager.dev/v1/projects/PROJECT_NUMBER/locations/INSTANCE_LOCATION/repositories?repository_id=REPOSITORY_ID \ -d '{}'
替换以下内容:
INSTANCE_ID
:替换为您的 Secure Source Manager 实例的名称。PROJECT_NUMBER
:替换为实例的 Google Cloud 项目编号。INSTANCE_LOCATION
:实例的位置。REPOSITORY_ID
:替换为您要为代码库指定的名称。
系统会在您的 Private Service Connect 实例中创建一个代码库。
测试从 Cloud Build 对 Secure Source Manager 的访问权限
如需确认一切正常运行,您可以使用以下 build 配置文件来测试连接性并从 Secure Source Manager 中拉取源代码。构建配置文件假定您使用 Cloud Logging 来存储构建日志。如果您使用的是用户创建的 Cloud Storage 存储桶,请参阅使用配置文件执行 build,了解如何修改构建配置文件。
在使用以下 YAML 文件之前,请替换以下内容:
CA_POOL_NAME
:您在创建 Private Service Connect 实例时使用的 CA 池名称。CA_PROJECT_ID
:与您用于创建 CA 池的 Google Cloud 项目。INSTANCE_LOCATION
:实例的位置。INSTANCE_ID
:实例的名称。INSTANCE_PROJECT_NUMBER
:替换为实例的 Google Cloud 项目编号。REPOSITORY_ID
:您为代码库指定的名称。- 将
SA_PROJECT_ID
替换为您在 Cloud Build 中使用的服务账号的项目 ID。 SERVICE_ACCOUNT
:替换为您在 Cloud Build 中使用的服务账号的电子邮件地址。
steps:
- name: gcr.io/cloud-builders/gcloud
args:
- privateca
- pools
- get-ca-certs
- CA_POOL_NAME
- '--project'
- CA_PROJECT_ID
- '--location'
- INSTANCE_LOCATION
- '--output-file=cacert.pem'
- name: gcr.io/cloud-builders/git
args:
- config
- '--global'
- 'credential.https://INSTANCE_ID-INSTANCE_PROJECT_NUMBER-git.INSTANCE_LOCATION.p.sourcemanager.dev.helper'
- gcloud.sh
- name: gcr.io/cloud-builders/git
args:
- config
- '--global'
- http.sslCAInfo
- cacert.pem
- name: gcr.io/cloud-builders/git
env:
- GIT_TRACE=1
- GIT_CURL_VERBOSE=1
args:
- clone
- >-
https://INSTANCE_ID-INSTANCE_PROJECT_NUMBER-git.INSTANCE_LOCATION.p.sourcemanager.dev/INSTANCE_PROJECT_ID/REPOSITORY_ID
- https-clone
serviceAccount: 'projects/SA_PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT'
options:
logging: CLOUD_LOGGING_ONLY
后续步骤
- 如需自动执行来自 Secure Source Manager 的 build,请按照创建触发器文件中的说明操作。