本页介绍了如何配置您在 Google Kubernetes Engine (GKE) 集群中部署网关时 Google Kubernetes Engine (GKE) 创建的负载均衡器。
部署网关时,GatewayClass 配置决定了 GKE 创建的负载平衡器。系统已使用默认设置预先配置此代管式负载均衡器,您可以使用政策进行修改。
您可以将政策附加到网关、Service 或 ServiceImport,以自定义网关资源,使其符合您的基础架构或应用要求。应用或修改政策后,您无需删除或重新创建网关、路由或服务资源,该政策由网关控制器处理,并且底层负载均衡器资源是根据(新)政策进行(重新)配置的。
准备工作
在开始之前,请确保您已执行以下任务:
- 启用 Google Kubernetes Engine API。 启用 Google Kubernetes Engine API
- 如果您要使用 Google Cloud CLI 执行此任务,请安装并初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行
gcloud components update
以获取最新版本。
GKE Gateway Controller 要求
- 对于标准版,需要 GKE 1.24 或更高版本。
- 对于 Autopilot,需要 GKE 1.26 或更高版本。
- Google Cloud CLI 407.0.0 版或更高版本。
- 仅 VPC 原生集群支持 Gateway API。
- 如果您使用的是内部 GatewayClass,则必须启用代理专用子网。
- 集群必须启用
HttpLoadBalancing
插件。 - 如果您使用的是 Istio,则必须将 Istio 升级到以下版本之一:
- 1.15.2 或更高版本
- 1.14.5 或更高版本
- 1.13.9 或更高版本。
- 如果您使用的是共享 VPC,则需要在宿主项目中将
Compute Network User
角色分配给服务项目的 GKE 服务账号。
限制和局限
关于在网关资源上应用的政策,除了 GKE Gateway Controller 的限制和局限之外,还存在以下特定限制:
GCPGatewayPolicy
资源只能关联到gateway.networking.k8s.io
Gateway
。GCPGatewayPolicy
资源必须与目标Gateway
位于同一命名空间中。使用单集群网关时,
GCPBackendPolicy
和HealthCheckPolicy
资源必须引用Service
资源。
- 使用多集群网关时,
GCPBackendPolicy
和HealthCheckPolicy
资源必须引用ServiceImport
资源。
在任何给定时间,只能将一个
GCPGatewayPolicy
附加到一个服务。如果创建了两个GCPGatewayPolicy
政策,并且它们定位到同一Service
或ServiceImport
,则最早的政策将优先,第二个政策将无法附加。GKE Gateway 不支持分层政策。
HealthCheckPolicy
和GCPBackendPolicy
资源必须与目标Service
或ServiceImport
资源位于同一命名空间中。GCPBackendPolicy
和HealthCheckPolicy
资源的结构方式使其只能引用一个后端服务。GCPBackendPolicy
不支持会话亲和性的HEADER_FIELD
或HTTP_COOKIE
选项。
为区域级内部网关配置全球访问权限
本部分介绍运行 1.24 或更高版本的 GKE 集群提供的功能。
如需使用内部网关启用全球访问权限,请将政策关联到网关资源。
以下 GCPGatewayPolicy
清单启用地区内部网关以实现全球访问权限:
apiVersion: networking.gke.io/v1
kind: GCPGatewayPolicy
metadata:
name: my-gateway-policy
namespace: default
spec:
default:
allowGlobalAccess: true
targetRef:
group: gateway.networking.k8s.io
kind: Gateway
name: my-gateway
为多集群网关配置区域
本部分介绍运行 1.30.3-gke.1225000 或更高版本的 GKE 集群提供的功能。
如果您的车队在多个区域都有集群,您可能需要在不同区域部署区域网关,以实现各种用例,例如跨区域冗余、低延迟和数据主权。在多集群 Gateway 配置集群中,您可以指定要部署区域性网关的区域。如果您未指定区域,则默认区域为配置集群的区域。
如需为多集群网关配置区域,请使用 GCPGatewayPolicy
中的 region
字段。在以下示例中,网关在 us-central1
区域中配置:
apiVersion: networking.gke.io/v1
kind: GCPGatewayPolicy
metadata:
name: my-gateway-policy
namespace: default
spec:
default:
region: us-central1
targetRef:
group: gateway.networking.k8s.io
kind: Gateway
name: my-regional-gateway
配置 SSL 政策以保护客户端到负载均衡器的流量
本部分介绍运行 1.24 或更高版本的 GKE 集群提供的功能。
如需保护客户端到负载均衡器的流量,请将政策名称添加到 GCPGatewayPolicy
,以配置 SSL 政策。默认情况下,网关未定义并关联任何 SSL 政策。
确保在 GCPGatewayPolicy
中引用该政策之前创建 SSL 政策。
以下 GCPGatewayPolicy
清单指定了名为 gke-gateway-ssl-policy
的安全政策:
apiVersion: networking.gke.io/v1
kind: GCPGatewayPolicy
metadata:
name: my-gateway-policy
namespace: team1
spec:
default:
sslPolicy: gke-gateway-ssl-policy
targetRef:
group: gateway.networking.k8s.io
kind: Gateway
name: my-gateway
配置健康检查
本部分介绍运行 1.24 或更高版本的 GKE 集群提供的功能。
您可以使用 HealthCheckPolicy
控制负载均衡器的健康检查设置。每种类型的健康检查(http
、https
、grpc
和 http2
)都有可供您定义的参数。 Google Cloud 会为每个后端服务创建唯一的健康检查 GKE 服务。
如果您的健康检查路径不是标准的“/”,您可能需要为负载均衡器配置自定义 HealthCheckPolicy
,以便负载均衡器正常运行。如果路径需要特殊标头,或者您需要调整健康检查参数,也需要进行此配置。例如,如果默认请求路径为“/”,但无法通过该请求路径访问您的服务,而是使用“/health”报告其运行状况,则您必须在 HealthCheckPolicy
中相应地配置 requestPath
。
以下 HealthCheckPolicy
清单显示了配置健康检查政策时可用的所有字段:
服务
apiVersion: networking.gke.io/v1
kind: HealthCheckPolicy
metadata:
name: lb-healthcheck
namespace: lb-service-namespace
spec:
default:
checkIntervalSec: INTERVAL
timeoutSec: TIMEOUT
healthyThreshold: HEALTHY_THRESHOLD
unhealthyThreshold: UNHEALTHY_THRESHOLD
logConfig:
enabled: ENABLED
config:
type: PROTOCOL
httpHealthCheck:
portSpecification: PORT_SPECIFICATION
port: PORT
portName: PORT_NAME
host: HOST
requestPath: REQUEST_PATH
response: RESPONSE
proxyHeader: PROXY_HEADER
httpsHealthCheck:
portSpecification: PORT_SPECIFICATION
port: PORT
portName: PORT_NAME
host: HOST
requestPath: REQUEST_PATH
response: RESPONSE
proxyHeader: PROXY_HEADER
grpcHealthCheck:
grpcServiceName: GRPC_SERVICE_NAME
portSpecification: PORT_SPECIFICATION
port: PORT
portName: PORT_NAME
http2HealthCheck:
portSpecification: PORT_SPECIFICATION
port: PORT
portName: PORT_NAME
host: HOST
requestPath: REQUEST_PATH
response: RESPONSE
proxyHeader: PROXY_HEADER
targetRef:
group: ""
kind: Service
name: lb-service
多集群服务
apiVersion: networking.gke.io/v1
kind: HealthCheckPolicy
metadata:
name: lb-healthcheck
namespace: lb-service-namespace
spec:
default:
checkIntervalSec: INTERVAL
timeoutSec: TIMEOUT
healthyThreshold: HEALTHY_THRESHOLD
unhealthyThreshold: UNHEALTHY_THRESHOLD
logConfig:
enabled: ENABLED
config:
type: PROTOCOL
httpHealthCheck:
portSpecification: PORT_SPECIFICATION
port: PORT
portName: PORT_NAME
host: HOST
requestPath: REQUEST_PATH
response: RESPONSE
proxyHeader: PROXY_HEADER
httpsHealthCheck:
portSpecification: PORT_SPECIFICATION
port: PORT
portName: PORT_NAME
host: HOST
requestPath: REQUEST_PATH
response: RESPONSE
proxyHeader: PROXY_HEADER
grpcHealthCheck:
grpcServiceName: GRPC_SERVICE_NAME
portSpecification: PORT_SPECIFICATION
port: PORT
portName: PORT_NAME
http2HealthCheck:
portSpecification: PORT_SPECIFICATION
port: PORT
portName: PORT_NAME
host: HOST
requestPath: REQUEST_PATH
response: RESPONSE
proxyHeader: PROXY_HEADER
targetRef:
group: net.gke.io
kind: ServiceImport
name: lb-service
替换以下内容:
INTERVAL
:为每个健康检查探测器指定 check-interval(以秒为单位)。这是指从探测器检查开始到其下一次检查开始的时间。如果您省略此参数,则 Google Cloud 的默认值为 15 秒(如果未指定HealthCheckPolicy
),如果指定了HealthCheckPolicy
但未指定checkIntervalSec
值,则为 5 秒。如需了解详情,请参阅多重探测和频率。TIMEOUT
:指定Google Cloud 等待探测响应的时间量。TIMEOUT
的值必须小于或等于INTERVAL
。该时间以秒为单位。每个探测都要求在探测超时之前传送 HTTP 200 (OK) 响应代码。HEALTHY_THRESHOLD
和UNHEALTHY_THRESHOLD
:指定至少一个探测器必须进行的成功或失败顺序连接尝试次数,以将健康状况从健康更改为不健康,或从不健康更改为健康。如果您省略其中一个参数,则使用 Google Cloud 默认值 2。PROTOCOL
:指定探测系统用于健康检查的协议。如需了解详情,请参阅 HTTP、HTTPS、HTTP/2 成功标准和 gRPC 成功标准。此参数必不可少。ENABLED
:指定日志记录是已启用还是已停用。PORT_SPECIFICATION
:指定健康检查使用固定端口 (USE_FIXED_PORT
)、指定端口 (USE_NAMED_PORT
) 还是服务端口 (USE_SERVING_PORT
)。如果未指定,健康检查将遵循port
和portName
字段中指定的行为。如果未指定port
或portName
,则此字段默认为USE_SERVING_PORT
。PORT
:HealthCheckPolicy 仅支持使用端口号指定负载均衡器的健康检查端口。如果您省略此参数,则使用 Google Cloud 默认值 80。由于负载均衡器会将探测直接发送到 Pod 的 IP 地址,因此您应选择与服务 Pod 的containerPort
匹配的端口,即使containerPort
被 Service 的targetPort
引用也是如此。您并非只能使用 Service 的targetPort
引用的containerPorts
。PORT_NAME
:指定 InstanceGroup.NamedPort.name 中定义的端口名称。如果同时定义了port
和portName
,则 Google Cloud 会首先考虑port
值。HOST
:健康检查请求中主机标头的值。此值使用主机名的 RFC 1123 定义,但不允许使用数字 IP 地址。如果未指定或留空,则此值默认为健康检查的 IP 地址。REQUEST_PATH
:指定健康检查请求的 request-path。如果未指定或留空,则默认为/
。RESPONSE
:指定要与响应数据开头匹配的字节。如果未指定或留空,GKE 会将所有响应解读为健康。响应数据只能为 ASCII 字符。PROXY_HEADER
:指定代理标头类型。您可以使用NONE
或PROXY_V1
。默认值为NONE
。GRPC_SERVICE_NAME
:gRPC Service 的可选名称。省略此字段可指定所有 Service。
如需详细了解 HealthCheckPolicy 字段,请参阅 healthChecks
参考文档。
配置 Google Cloud Armor 后端安全政策以保护您的后端服务
本部分介绍运行 1.24 或更高版本的 GKE 集群提供的功能。
通过将安全政策的名称添加到 GCPBackendPolicy
来配置 Google Cloud Armor 后端安全政策,以保护您的后端服务。默认情况下,网关没有定义并关联任何 Google Cloud Armor 后端安全政策。
确保在 GCPBackendPolicy
中引用该政策之前创建 Google Cloud Armor 后端安全政策。如果您要启用地区级网关,则必须创建地区级 Google Cloud Armor 后端安全政策。
以下 GCPBackendPolicy
清单指定了名为 example-security-policy
的后端安全政策:
服务
apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
name: my-backend-policy
namespace: lb-service-namespace
spec:
default:
securityPolicy: example-security-policy
targetRef:
group: ""
kind: Service
name: lb-service
多集群服务
apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
name: my-backend-policy
namespace: lb-service-namespace
spec:
default:
securityPolicy: example-security-policy
targetRef:
group: net.gke.io
kind: ServiceImport
name: lb-service
配置 IAP
本部分介绍运行 1.24 或更高版本的 GKE 集群提供的功能。
Identity-Aware Proxy (IAP) 会对与 HTTPRoute 关联的后端服务强制执行访问权限控制政策。借助此强制执行措施,只有分配了正确 Identity and Access Management (IAM) 角色且经过身份验证的用户或应用才能访问这些后端服务。
默认情况下,系统不会对您的后端服务应用 IAP,您需要在 GCPBackendPolicy
中明确配置 IAP。
如需使用网关配置 IAP,请执行以下操作:
为 GKE 启用 IAP 请勿配置后端(配置 BackendConfig),因为
BackendConfig
仅在 Ingress 部署中有效。为您的 IAP 创建 Secret:
在 Google Cloud 控制台中,前往凭据页面:
点击相应客户端的名称,然后下载 OAuth 客户端文件。
从 OAuth 客户端文件中,将 OAuth 密钥复制到剪贴板。
创建名为
iap-secret.txt
的文件。使用以下命令将 OAuth Secret 粘贴到
iap-secret.txt
文件中:echo -n CLIENT_SECRET > iap-secret.txt kubectl create secret generic SECRET_NAME --from-file=key=iap-secret.txt
如需指定引用密文的 IAP 政策,请执行以下操作:
创建以下
GCPBackendPolicy
清单,分别替换SECRET_NAME
和CLIENT_ID
。将清单保存为backend-policy.yaml
:服务
apiVersion: networking.gke.io/v1 kind: GCPBackendPolicy metadata: name: backend-policy spec: default: iap: enabled: true oauth2ClientSecret: name: SECRET_NAME clientID: CLIENT_ID targetRef: group: "" kind: Service name: lb-service
多集群服务
apiVersion: networking.gke.io/v1 kind: GCPBackendPolicy metadata: name: backend-policy spec: default: iap: enabled: true oauth2ClientSecret: name: SECRET_NAME clientID: CLIENT_ID targetRef: group: net.gke.io kind: ServiceImport name: lb-service
应用
backend-policy.yaml
清单:kubectl apply -f backend-policy.yaml
验证配置:
在使用 IAP 创建
GCPBackendPolicy
后,确认政策是否已应用:kubectl get gcpbackendpolicy
输出类似于以下内容:
NAME AGE backend-policy 45m
如需了解更多详情,请使用 describe 命令:
kubectl describe gcpbackendpolicy
输出类似于以下内容:
Name: backend-policy Namespace: default Labels: <none> Annotations: <none> API Version: networking.gke.io/v1 Kind: GCPBackendPolicy Metadata: Creation Timestamp: 2023-05-27T06:45:32Z Generation: 2 Resource Version: 19780077 UID: f4f60a3b-4bb2-4e12-8748-d3b310d9c8e5 Spec: Default: Iap: Client ID: 441323991697-luotsrnpboij65ebfr13hlcpm5a4heke.apps.googleusercontent.com Enabled: true oauth2ClientSecret: Name: my-iap-secret Target Ref: Group: Kind: Service Name: lb-service Status: Conditions: Last Transition Time: 2023-05-27T06:48:25Z Message: Reason: Attached Status: True Type: Attached Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ADD 46m sc-gateway-controller default/backend-policy Normal SYNC 44s (x15 over 43m) sc-gateway-controller Application of GCPGatewayPolicy "default/backend-policy" was a success
配置后端服务超时
本部分介绍运行 1.24 或更高版本的 GKE 集群提供的功能。
以下 GCPBackendPolicy
清单指定了 40 秒的后端服务超时时间段。timeoutSec
字段默认为 30 秒。
服务
apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
name: my-backend-policy
namespace: lb-service-namespace
spec:
default:
timeoutSec: 40
targetRef:
group: ""
kind: Service
name: lb-service
多集群服务
apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
name: my-backend-policy
namespace: lb-service-namespace
spec:
default:
timeoutSec: 40
targetRef:
group: net.gke.io
kind: ServiceImport
name: lb-service
配置会话亲和性
本部分介绍运行 1.24 或更高版本的 GKE 集群提供的功能。
您可以根据以下条件配置会话亲和性:
- 客户端 IP 地址
- 生成的 Cookie
为您的 Service 配置会话亲和度时,网关的 localityLbPolicy
设置会设为 MAGLEV
。
从 GCPBackendPolicy
中移除会话亲和性配置后,网关会将 localityLbPolicy
设置还原为默认值 ROUND_ROBIN
。
以下 GCPBackendPolicy
清单基于客户端 IP 地址指定会话亲和性:
服务
apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
name: my-backend-policy
namespace: lb-service-namespace
spec:
default:
sessionAffinity:
type: CLIENT_IP
targetRef:
group: ""
kind: Service
name: lb-service
多集群服务
apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
name: my-backend-policy
namespace: lb-service-namespace
spec:
default:
sessionAffinity:
type: CLIENT_IP
targetRef:
group: net.gke.io
kind: ServiceImport
name: lb-service
以下 GCPBackendPolicy
清单基于生成的 Cookie 指定会话亲和性,并将 Cookie TTL 配置为 50 秒:
服务
apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
name: my-backend-policy
namespace: lb-service-namespace
spec:
default:
sessionAffinity:
type: GENERATED_COOKIE
cookieTtlSec: 50
targetRef:
group: ""
kind: Service
name: lb-service
多集群服务
apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
name: my-backend-policy
namespace: lb-service-namespace
spec:
default:
sessionAffinity:
type: GENERATED_COOKIE
cookieTtlSec: 50
targetRef:
group: net.gke.io
kind: ServiceImport
name: lb-service
您可以为 sessionAffinity.type
字段使用以下值:
CLIENT_IP
GENERATED_COOKIE
NONE
配置连接排空超时
本部分介绍运行 1.24 或更高版本的 GKE 集群提供的功能。
您可以使用 GCPBackendPolicy
配置连接排空超时。连接排空超时是指等待连接排空的时间(以秒为单位)。超时持续时间可以介于 0 到 3600 秒之间。
默认值为 0,此值也会停用连接排空。
以下 GCPBackendPolicy
清单指定 60 秒的连接排空超时:
服务
apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
name: my-backend-policy
namespace: lb-service-namespace
spec:
default:
connectionDraining:
drainingTimeoutSec: 60
targetRef:
group: ""
kind: Service
name: lb-service
多集群服务
apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
name: my-backend-policy
namespace: lb-service-namespace
spec:
default:
connectionDraining:
drainingTimeoutSec: 60
targetRef:
group: net.gke.io
kind: ServiceImport
name: lb-service
在指定的超时持续时间内,GKE 会等待对已移除后端发出的现有请求完成。负载均衡器不会向已移除的后端发送新请求。达到超时持续时间之后,GKE 会关闭与该后端的所有剩余连接。
HTTP 访问日志记录
本部分介绍运行 1.24 或更高版本的 GKE 集群提供的功能。
默认情况下:
- 网关控制器会将来自客户端的所有 HTTP 请求记录到 Cloud Logging 中。
- 采样率为 1,000,000,表示所有请求都会记录下来。
您可以通过以下三种方式使用 GCPBackendPolicy
在网关上停用访问日志记录:
- 您可以让
GCPBackendPolicy
不包含logging
部分 - 您可以将
logging.enabled
设置为false
- 您可以将
logging.enabled
设置为true
,并将logging.sampleRate
设置为0
您还可以配置访问日志记录采样率。
以下 GCPBackendPolicy
清单会修改访问日志记录的默认采样率,并将其设置为指定 Service 资源 HTTP 请求的 50%:
服务
apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
name: my-backend-policy
namespace: lb-service-namespace
spec:
default:
logging:
enabled: true
sampleRate: 500000
targetRef:
group: ""
kind: Service
name: lb-service
多集群服务
apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
name: my-backend-policy
namespace: lb-service-namespace
spec:
default:
logging:
enabled: true
sampleRate: 500000
targetRef:
group: net.gke.io
kind: ServiceImport
name: lb-service
此清单包含以下字段:
enable: true
:明确启用访问日志记录。Logging 中提供日志。sampleRate: 500000
:指定记录 50% 的数据包。您可以使用介于 0 到 1000000 之间的值。GKE 通过除以 1000000,将此值转换为 [0, 1] 范围内的浮点值。只有当enable
设置为true
时,此字段才相关。sampleRate
是可选字段,但如果已配置,则必须设置enable: true
。如果enable
设置为true
但未提供sampleRate
,则 GKE 会将enable
设置为false
。
为单集群网关配置基于流量的自动扩缩
确保您的 GKE 集群运行的是 1.31.1-gke.2008000 或更高版本。
如需在单集群网关中启用基于流量的自动扩缩和基于容量的负载均衡,您可以配置 Service 容量。Service 容量是指能够指定在 Pod 自动扩缩或流量溢出到其他可用集群之前 Service 可以接收的流量容量。
如需配置 Service 容量,请创建 Service 和关联的 GCPBackendPolicy
。GCPBackendPolicy
清单使用 maxRatePerEndpoint
字段,该字段用于定义 Service 中每个 Pod 的每秒请求数 (RPS) 上限。以下 GCPBackendPolicy
清单定义了 10 的最大 RPS:
apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
name: store
spec:
default:
maxRatePerEndpoint: 10
targetRef:
group: ""
kind: Service
name: store
如需详细了解基于流量的自动扩缩,请参阅基于负载均衡器流量的自动扩缩。
问题排查
多个 GCPBackendPolicy
附加到同一 Service
具体情况:
将 GCPBackendPolicy
附加到 Service
或 ServiceImport
时,可能会出现以下状态条件:
status:
conditions:
- lastTransitionTime: "2023-09-26T20:18:03Z"
message: conflicted with GCPBackendPolicy "[POLICY_NAME]" of higher precedence, hence not applied
reason: Conflicted
status: "False"
type: Attached
原因:
此状态条件表示您尝试将第二个 GCPBackendPolicy
应用于已附加 GCPBackendPolicy
的 Service
或 ServiceImport
。
GKE Gateway 不支持将多个 GCPBackendPolicy
附加到同一 Service
或 ServiceImport
。如需了解详情,请参阅限制。
临时解决方法:
配置包含所有自定义配置的单个 GCPBackendPolicy
,并将其附加到 Service
或 ServiceImport
。
找不到 Google Cloud Armor 安全政策
具体情况:
在地区网关上启用 Google Cloud Armor 时,您可能会看到以下错误消息:
Invalid value for field 'resource': '{
"securityPolicy":"projects/123456789/regions/us-central1/securityPolicies/<policy_name>"}'.
The given security policy does not exist.
原因:
该错误消息表示,指定的区域性 Google Cloud Armor 安全政策不存在于您的 Google Cloud 项目中。
临时解决方法:
在项目中创建区域性 Google Cloud Armor 安全政策,并在 GCPBackendPolicy
中引用此政策。
后续步骤
- 详细了解 Gateway Controller。
- 了解如何从资源引用网关。
- 查看 Policy Types API 参考文档。
- 查看 API 类型定义。