内部负载均衡器 (ILB) 通过分配给组织的内部 IP 池公开组织内的服务。组织外部的任何端点都无法访问 ILB 服务。
默认情况下,您可以从组织中的任何集群访问同一项目中的 ILB 服务。默认项目网络政策不允许您从项目外部访问任何项目资源,此限制也适用于 ILB 服务。如果平台管理员 (PA) 配置的项目网络政策允许从其他项目访问您的项目,那么也可以从同一组织中的这些其他项目访问 ILB 服务。
准备工作
如需配置 ILB,您必须:
- 拥有您要为其配置负载均衡器的项目。如需了解详情,请参阅创建项目。
拥有必要的身份和访问角色:
- 请让您的 IAM 组织管理员为您授予 Load Balancer Admin (
load-balancer-admin) 角色。 - 对于全球 ILB,请让您的 IAM 组织管理员为您授予全球负载均衡器管理员 (
global-load-balancer-admin) 角色。如需了解详情,请参阅预定义角色说明。
- 请让您的 IAM 组织管理员为您授予 Load Balancer Admin (
为共享集群创建内部负载均衡器
您可以为共享集群创建全球级或可用区级 ILB。全球 ILB 的范围涵盖整个 GDC Universe。可用区级 ILB 的范围仅限于创建时指定的可用区。如需了解详情,请参阅全球和可用区级负载均衡器。
在 GDC 中使用三种不同的方法创建 ILB:
- 使用 gdcloud CLI 创建全局或可用区级 ILB。
- 使用网络 Kubernetes 资源模型 (KRM) API 创建全球或可用区级 ILB。
- 直接在 Kubernetes 集群中使用 Kubernetes Service。此方法仅适用于可用区级 ILB。
您可以使用 KRM API 和 gdcloud CLI 定位 Pod 或虚拟机工作负载。直接从 Kubernetes 集群使用 Kubernetes Service 时,您只能定位到创建 Service 对象的集群中的工作负载。
创建可用区级 ILB
使用 gdcloud CLI、KRM API 或 Kubernetes 集群中的 Kubernetes Service 创建可用区级 ILB:
gdcloud
使用 gdcloud CLI 创建一个以 Pod 或虚拟机工作负载为目标的 ILB。
此 ILB 针对项目中与 Backend 对象中定义的标签匹配的所有工作负载。
如需使用 gdcloud CLI 创建 ILB,请按照以下步骤操作:
创建
Backend资源,为 ILB 定义端点:gdcloud compute backends create BACKEND_NAME \ --labels=LABELS \ --project=PROJECT_NAME \ --zone=ZONE \ --cluster-name=CLUSTER_NAME替换以下内容:
BACKEND_NAME:您为后端资源选择的名称,例如my-backend。LABELS:一个选择器,用于定义要为此后端资源使用 Pod 和虚拟机之间的哪些端点。例如app=web。PROJECT_NAME:您的项目的名称。ZONE:要用于此调用的可用区。如需为所有需要可用区标志的命令预设该标志,请运行:gdcloud config set core/zone ZONE。可用区标志仅在多可用区环境中可用。此字段是可选字段。CLUSTER_NAME:所定义选择器的范围仅限于的集群。如果未指定此字段,则系统会选择具有给定标签的所有端点。此字段是可选字段。
如果此 ILB 用于 Pod 工作负载,请跳过此步骤。如果您要为虚拟机工作负载配置 ILB,请为 ILB 定义健康检查类型。例如,如需创建 TCP 健康检查,请按如下方式进行定义:
gdcloud compute health-checks create tcp HEALTH_CHECK_NAME \ --check-interval=CHECK_INTERVAL \ --healthy-threshold=HEALTHY_THRESHOLD \ --timeout=TIMEOUT \ --unhealthy-threshold=UNHEALTHY_THRESHOLD \ --port=PORT \ --zone=ZONE替换以下内容:
HEALTH_CHECK_NAME:您为健康检查资源选择的名称,例如my-health-check。CHECK_INTERVAL:从一次探测开始到下一次探测开始之间的时间量(以秒为单位)。如果省略或设置为 0,则默认为5。不建议将超时时间设置为大于 checkInterval。HEALTHY_THRESHOLD:端点被视为健康状况良好时必须通过的连续探测次数。如果省略或设置为 0,则默认为5。TIMEOUT:在声明失败之前等待的时间(以秒为单位)。如果省略或设置为 0,则默认为5。不建议将超时时间设置为大于 checkInterval。UNHEALTHY_THRESHOLD:要将端点视为运行状况不佳,必须失败的连续探测次数。如果省略或设置为 0,则默认为2。PORT:执行健康检查的端口。默认值为80。此字段是可选字段。ZONE:您要在其中创建此 ILB 的可用区。
创建
BackendService资源,并向其中添加之前创建的Backend资源:gdcloud compute backend-services create BACKEND_SERVICE_NAME \ --project=PROJECT_NAME \ --target-ports=TARGET_PORTS \ --zone=ZONE \ --health-check=HEALTH_CHECK_NAME替换以下内容:
BACKEND_SERVICE_NAME:为此后端服务选择的名称。TARGET_PORTS:此后端服务转换的目标端口的英文逗号分隔列表,其中每个目标端口都指定了协议、转发规则上的端口以及后端实例上的端口。您可以指定多个目标端口。此字段必须采用protocol:port:targetport格式,例如TCP:80:8080。此字段是可选字段。HEALTH_CHECK_NAME:健康检查资源的名称。此字段是可选字段。仅当您为虚拟机工作负载配置 ILB 时,才添加此字段。
将
BackendService资源添加到之前创建的Backend资源:gdcloud compute backend-services add-backend BACKEND_SERVICE_NAME \ --backend=BACKEND_NAME \ --project=PROJECT_NAME \ --zone=ZONE创建一个内部
ForwardingRule资源,用于定义服务可用的 VIP:gdcloud compute forwarding-rules create FORWARDING_RULE_INTERNAL_NAME \ --backend-service=BACKEND_SERVICE_NAME \ --cidr=CIDR \ --ip-protocol-port=PROTOCOL_PORT \ --load-balancing-scheme=INTERNAL \ --zone=ZONE \ --project=PROJECT_NAME替换以下内容:
BACKEND_SERVICE_NAME:后端服务的名称。- 将
FORWARDING_RULE_INTERNAL_NAME替换为您为转发规则选择的名称。 CIDR:此字段是可选字段。如果未指定,系统会自动从可用区级 IP 池中预留IPv4/32CIDR。指定与此转发规则位于同一命名空间中的Subnet资源的名称。Subnet资源表示可用区级子网的请求和分配信息。如需详细了解Subnet资源,请参阅自定义资源示例。PROTOCOL_PORT:要在转发规则中公开的协议和端口。此字段必须采用ip-protocol=TCP:80格式。公开的端口必须与实际应用在容器内公开的端口相同。
如需验证配置的 ILB,请确认每个已创建对象的
Ready条件。通过向 VIP 发送curl请求来验证流量:如需获取分配的 VIP,请描述转发规则:
gdcloud compute forwarding-rules describe FORWARDING_RULE_INTERNAL_NAME通过向转发规则中
PROTOCOL_PORT字段指定的端口上的 VIP 发出curl请求来验证流量:curl http://FORWARDING_RULE_VIP:PORT替换以下内容:
FORWARDING_RULE_VIP:转发规则的 VIP。PORT:转发规则中PROTOCOL_PORT字段的端口号。
API
使用 KRM API 创建一个以 Pod 或虚拟机工作负载为目标的 ILB。
此 ILB 针对项目中与 Backend 对象中定义的标签匹配的所有工作负载。
如需使用 KRM API 创建可用区级 ILB,请按照以下步骤操作:
创建
Backend资源,以定义 ILB 的端点。为工作负载所在的每个可用区创建Backend资源:kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: networking.gdc.goog/v1 kind: Backend metadata: namespace: PROJECT_NAME name: BACKEND_NAME spec: clusterName: CLUSTER_NAME endpointsLabels: matchLabels: app: server EOF替换以下内容:
MANAGEMENT_API_SERVER:可用区级 Management API 服务器的 kubeconfig 路径。如需了解详情,请参阅切换到可用区级上下文。PROJECT_NAME:您的项目的名称。BACKEND_NAME:Backend资源的名称。CLUSTER_NAME:此字段为可选字段。此字段指定所定义选择器的范围仅限于哪个集群。此字段不适用于虚拟机工作负载。如果Backend资源不包含clusterName字段,则指定的标签会应用于项目中的所有工作负载。
您可以为每个可用区使用相同的
Backend资源,也可以为每个可用区创建具有不同标签集的Backend资源。如果此 ILB 用于 Pod 工作负载,请跳过此步骤。如果您要为虚拟机工作负载配置 ILB,请为 ILB 定义健康检查:
kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: networking.gdc.goog/v1 kind: HealthCheck metadata: namespace: PROJECT_NAME name: HEALTH_CHECK_NAME spec: tcpHealthCheck: port: PORT timeoutSec: TIMEOUT checkIntervalSec: CHECK_INTERVAL healthyThreshold: HEALTHY_THRESHOLD unhealthyThreshold: UNHEALTHY_THRESHOLD EOF替换以下内容:
HEALTH_CHECK_NAME:您为健康检查资源选择的名称,例如my-health-check。PORT:执行健康检查的端口。默认值为80。TIMEOUT:在声明失败之前等待的时间(以秒为单位)。如果省略或设置为 0,则默认为5。不建议将超时时间设置为大于 checkInterval。CHECK_INTERVAL:从一次探测开始到下一次探测开始之间的时间量(以秒为单位)。如果省略或设置为 0,则默认为5。不建议将超时时间设置为大于 checkInterval。HEALTHY_THRESHOLD:端点被视为健康状况良好时必须通过的连续探测次数。如果省略或设置为 0,则默认为2。UNHEALTHY_THRESHOLD:要将端点视为运行状况不佳,必须失败的连续探测次数。如果省略或设置为 0,则默认为2。
使用之前创建的
Backend资源创建一个BackendService对象。如果您要为虚拟机工作负载配置 ILB,请添加HealthCheck资源。kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: networking.gdc.goog/v1 kind: BackendService metadata: namespace: PROJECT_NAME name: BACKEND_SERVICE_NAME spec: backendRefs: - name: BACKEND_NAME healthCheckName: HEALTH_CHECK_NAME EOF替换以下内容:
BACKEND_SERVICE_NAME:为BackendService资源选择的名称。HEALTH_CHECK_NAME:您之前创建的HealthCheck资源的名称。如果您要为 Pod 工作负载配置 ILB,请勿添加此字段。
创建一个内部
ForwardingRule资源,用于定义服务可用的 VIP。kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: networking.gdc.goog/v1 kind: ForwardingRuleInternal metadata: namespace: PROJECT_NAME name: FORWARDING_RULE_INTERNAL_NAME spec: cidrRef: name: CIDR_NAME ports: - port: PORT protocol: PROTOCOL backendServiceRef: name: BACKEND_SERVICE_NAME EOF替换以下内容:
FORWARDING_RULE_INTERNAL_NAME:为ForwardingRuleInternal资源选择的名称。CIDR_NAME:cidrRef字段为可选字段。如果未指定,系统会自动从可用区级 IP 池中预留IPv4/32CIDR。指定与此转发规则位于同一命名空间中的Subnet资源的名称。Subnet资源表示可用区级子网的请求和分配信息。如需详细了解Subnet资源,请参阅自定义资源示例。PORT:使用ports字段指定 L4 端口数组,这些端口的数据包会转发到使用此转发规则配置的后端。必须至少指定一个端口。使用port字段指定端口号。公开的端口必须与实际应用在容器内公开的端口相同。PROTOCOL:要用于转发规则的协议,例如TCP。ports数组中的条目必须如下所示:ports: - port: 80 protocol: TCP
如需验证配置的 ILB,请确认每个已创建对象的
Ready条件。通过向 VIP 发送curl请求来验证流量:如需获取 VIP,请使用
kubectl get:kubectl get forwardingruleinternal -n PROJECT_NAME输出如下所示:
NAME BACKENDSERVICE CIDR READY ilb-name BACKEND_SERVICE_NAME 10.200.32.59/32 True通过向转发规则中
PORT字段指定的端口上的 VIP 发出curl请求来验证流量:curl http://FORWARDING_RULE_VIP:PORT将
FORWARDING_RULE_VIP替换为转发规则的 VIP。
Kubernetes 服务
您可以通过在 Kubernetes 集群中创建类型为 LoadBalancer 的 Kubernetes Service 对象,在 GDC 中创建 ILB。此 ILB 仅定位到创建 Service 对象的集群中的工作负载。
如需使用 Service 对象创建 ILB,请按照以下步骤操作:
为类型为
LoadBalancer的Service定义创建一个 YAML 文件。您必须使用networking.gke.io/load-balancer-type: internal注解将 ILB 服务设计为内部服务。以下
Service对象是 ILB 服务的示例:apiVersion: v1 kind: Service metadata: annotations: networking.gke.io/load-balancer-type: internal name: ILB_SERVICE_NAME namespace: PROJECT_NAME spec: ports: - port: 1234 protocol: TCP targetPort: 1234 selector: k8s-app: my-app type: LoadBalancer替换以下内容:
ILB_SERVICE_NAME:ILB 服务的名称。PROJECT_NAME:包含后端工作负载的项目的命名空间。
port字段用于配置您在 VIP 地址上公开的前端端口。targetPort字段用于配置后端端口,您希望将流量转发到后端工作负载上的该端口。负载均衡器支持网络地址转换 (NAT)。前端和后端端口可以不同。在
Service定义的selector字段中,将 Pod 或虚拟机指定为后端工作负载。选择器根据您指定的标签与工作负载上的标签是否匹配,来定义要将哪些工作负载作为此服务的后端工作负载。
Service只能选择在您定义Service的同一项目和同一集群中的后端工作负载。如需详细了解服务选择,请参阅 https://kubernetes.io/docs/concepts/services-networking/service/。
将
Service定义文件保存在后端工作负载所在的项目中。ILB 服务只能选择与Service定义位于同一集群中的工作负载。将
Service定义文件应用于集群:kubectl apply -f ILB_FILE将
ILB_FILE替换为 ILB 服务的Service定义文件的名称。创建 ILB 服务时,该服务会获得一个 IP 地址。您可以通过查看服务状态来获取 ILB 服务的 IP 地址:
kubectl -n PROJECT_NAME get svc ILB_SERVICE_NAME替换以下内容:
PROJECT_NAME:包含后端工作负载的项目的命名空间。ILB_SERVICE_NAME:ILB 服务的名称。
您应该会看到类似于以下示例的输出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ilb-service LoadBalancer 10.0.0.1 10.0.0.1 1234:31930/TCP 22hCLUSTER-IP和EXTERNAL-IP字段必须显示相同的值,即 ILB 服务的 IP 地址。现在,根据项目具有的项目网络政策,组织中的其他集群可以访问此 IP 地址。如果您没有获得输出,请确保您已成功创建 ILB 服务。
GDC 支持服务的域名系统 (DNS) 名称。不过,这些名称仅适用于同一集群中的 ILB 服务。 从其他集群中,您必须使用 IP 地址访问 ILB 服务。
创建全球 ILB
使用 gdcloud CLI 或 KRM API 创建全球 ILB。
gdcloud
使用 gdcloud CLI 创建一个以 Pod 或虚拟机工作负载为目标的 ILB。
此 ILB 针对项目中与 Backend 对象中定义的标签匹配的所有工作负载。Backend 自定义资源必须限定在可用区范围内。
如需使用 gdcloud CLI 创建 ILB,请按照以下步骤操作:
创建
Backend资源,为 ILB 定义端点:gdcloud compute backends create BACKEND_NAME \ --labels=LABELS \ --project=PROJECT_NAME \ --cluster-name=CLUSTER_NAME \ --zone=ZONE替换以下内容:
BACKEND_NAME:您为后端资源选择的名称,例如my-backend。LABELS:一个选择器,用于定义要为此后端资源使用 Pod 和虚拟机之间的哪些端点。例如app=web。PROJECT_NAME:您的项目的名称。CLUSTER_NAME:所定义选择器的范围仅限于的集群。如果未指定此字段,则系统会选择具有给定标签的所有端点。此字段是可选字段。ZONE:要用于此调用的可用区。如需为所有需要可用区标志的命令预设该标志,请运行:gdcloud config set core/zone ZONE。可用区标志仅在多可用区环境中可用。此字段是可选字段。
如果此 ILB 用于 Pod 工作负载,请跳过此步骤。如果您要为虚拟机工作负载配置 ILB,请为 ILB 定义健康检查:
gdcloud compute health-checks create tcp HEALTH_CHECK_NAME \ --check-interval=CHECK_INTERVAL \ --healthy-threshold=HEALTHY_THRESHOLD \ --timeout=TIMEOUT \ --unhealthy-threshold=UNHEALTHY_THRESHOLD \ --port=PORT \ --global替换以下内容:
HEALTH_CHECK_NAME:您为健康检查资源选择的名称,例如my-health-check。CHECK_INTERVAL:从一次探测开始到下一次探测开始之间的时间量(以秒为单位)。如果省略或设置为 0,则默认为5。不建议将超时时间设置为大于 checkInterval。HEALTHY_THRESHOLD:在声明失败之前等待的时间。如果省略或设置为 0,则默认为5。TIMEOUT:在声明失败之前等待的时间(以秒为单位)。如果省略或设置为 0,则默认为5。不建议将超时时间设置为大于 checkInterval。UNHEALTHY_THRESHOLD:要将端点视为运行状况不佳,必须失败的连续探测次数。如果省略或设置为 0,则默认为2。PORT:执行健康检查的端口。默认值为80。此字段是可选字段。
创建
BackendService资源,并向其中添加之前创建的Backend资源:gdcloud compute backend-services create BACKEND_SERVICE_NAME \ --project=PROJECT_NAME \ --target-ports=TARGET_PORTS \ --health-check=HEALTH_CHECK_NAME \ --global替换以下内容:
BACKEND_SERVICE_NAME:为此后端服务选择的名称。TARGET_PORTS:此后端服务转换的目标端口的英文逗号分隔列表,其中每个目标端口都指定了协议、转发规则上的端口以及后端实例上的端口。您可以指定多个目标端口。此字段必须采用protocol:port:targetport格式,例如TCP:80:8080。此字段是可选字段。HEALTH_CHECK_NAME:健康检查资源的名称。此字段是可选字段。仅当您为虚拟机工作负载配置 ILB 时,才添加此字段。
将
BackendService资源添加到之前创建的Backend资源:gdcloud compute backend-services add-backend BACKEND_SERVICE_NAME \ --backend-zone BACKEND_ZONE \ --backend=BACKEND_NAME \ --project=PROJECT_NAME \ --global创建一个内部
ForwardingRule资源,用于定义服务可用的 VIP:gdcloud compute forwarding-rules create FORWARDING_RULE_INTERNAL_NAME \ --backend-service=BACKEND_SERVICE_NAME \ --cidr=CIDR \ --ip-protocol-port=PROTOCOL_PORT \ --load-balancing-scheme=INTERNAL \ --project=PROJECT_NAME \ --global替换以下内容:
FORWARDING_RULE_INTERNAL_NAME:您为转发规则选择的名称。CIDR:与此转发规则位于同一命名空间中的Subnet资源的名称。Subnet资源表示全球子网的请求和分配信息。如需详细了解Subnet资源,请参阅自定义资源示例。如果未指定,系统会自动从全局 IP 池中预留IPv4/32CIDR。此字段是可选字段。PROTOCOL_PORT:要在转发规则中公开的协议和端口。此字段必须采用ip-protocol=TCP:80格式。 公开的端口必须与实际应用在容器内公开的端口相同。
如需验证配置的 ILB,请确认每个已创建对象的
Ready条件。通过向 VIP 发送curl请求来验证流量:如需获取分配的 VIP,请描述转发规则:
gdcloud compute forwarding-rules describe FORWARDING_RULE_INTERNAL_NAME --global通过向转发规则中
PROTOCOL_PORT字段指定的端口上的 VIP 发出curl请求来验证流量:curl http://FORWARDING_RULE_VIP:PORT替换以下内容:
FORWARDING_RULE_VIP:转发规则的 VIP。PORT:转发规则中PROTOCOL_PORT字段的端口号。
API
使用 KRM API 创建一个以 Pod 或虚拟机工作负载为目标的 ILB。此 ILB 以项目中与 Backend 对象中定义的标签匹配的所有工作负载为目标。如需使用 KRM API 创建可用区级 ILB,请按照以下步骤操作:
创建
Backend资源,以定义 ILB 的端点。为工作负载所在的每个可用区创建Backend资源:kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: Backend metadata: namespace: PROJECT_NAME name: BACKEND_NAME spec: clusterName: CLUSTER_NAME endpointsLabels: matchLabels: app: server EOF替换以下内容:
MANAGEMENT_API_SERVER:全局 Management API 服务器的 kubeconfig 路径。如需了解详情,请参阅切换到全局上下文。PROJECT_NAME:您的项目的名称。BACKEND_NAME:Backend资源的名称。CLUSTER_NAME:此字段为可选字段。此字段指定所定义选择器的范围仅限于哪个集群。此字段不适用于虚拟机工作负载。如果Backend资源不包含clusterName字段,则指定的标签会应用于项目中的所有工作负载。
您可以为每个可用区使用相同的
Backend资源,也可以为每个可用区创建具有不同标签集的Backend资源。如果此 ILB 用于 Pod 工作负载,请跳过此步骤。如果您要为虚拟机工作负载配置 ILB,请为 ILB 定义健康检查:
apiVersion: networking.global.gdc.goog/v1 kind: HealthCheck metadata: namespace: PROJECT_NAME name: HEALTH_CHECK_NAME spec: tcpHealthCheck: port: PORT timeoutSec: TIMEOUT checkIntervalSec: CHECK_INTERVAL healthyThreshold: HEALTHY_THRESHOLD unhealthyThreshold: UNHEALTHY_THRESHOLD替换以下内容:
HEALTH_CHECK_NAME:您为健康检查资源选择的名称,例如my-health-check。PORT:执行健康检查的端口。默认值为80。TIMEOUT:在声明失败之前等待的时间(以秒为单位)。如果省略或设置为 0,则默认为5。不建议将超时时间设置为大于 checkInterval。CHECK_INTERVAL:从一次探测开始到下一次探测开始之间的时间量(以秒为单位)。如果省略或设置为 0,则默认为5。不建议将超时时间设置为大于 checkInterval。HEALTHY_THRESHOLD:端点被视为健康状况良好时必须通过的连续探测次数。如果省略或设置为 0,则默认为2。UNHEALTHY_THRESHOLD:要将端点视为运行状况不佳,必须失败的连续探测次数。如果省略或设置为 0,则默认为2。
由于这是全球 ILB,因此请在 Global API 中创建健康检查。
使用之前创建的
Backend资源创建一个BackendService对象。如果您要为虚拟机工作负载配置 ILB,请添加HealthCheck资源。kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: BackendService metadata: namespace: PROJECT_NAME name: BACKEND_SERVICE_NAME spec: backendRefs: - name: BACKEND_NAME zone: ZONE healthCheckName: HEALTH_CHECK_NAME targetPorts: - port: PORT protocol: PROTOCOL targetPort: TARGET_PORT EOF替换以下内容:
BACKEND_SERVICE_NAME:为BackendService资源选择的名称。HEALTH_CHECK_NAME:您之前创建的HealthCheck资源的名称。如果您要为 Pod 工作负载配置 ILB,请勿添加此字段。ZONE:Backend资源创建所在的可用区。您可以在backendRefs字段中指定多个后端。例如:- name: my-be zone: Zone-A - name: my-be zone: Zone-BtargetPorts字段为可选字段。此资源列出了此BackendService资源转换的端口。如果您使用的是此对象,请为以下各项提供值:PORT:服务公开的端口。PROTOCOL:流量必须匹配的第 4 层协议。仅支持 TCP 和 UDP。TARGET_PORT:PORT值转换到的端口,例如8080。TARGET_PORT的值在给定对象中不能重复。targetPorts的示例如下所示:targetPorts: - port: 80 protocol: TCP targetPort: 8080
创建一个内部
ForwardingRule资源,用于定义服务可用的 VIP。kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: ForwardingRuleInternal metadata: namespace: PROJECT_NAME name: FORWARDING_RULE_INTERNAL_NAME spec: cidrRef: name: CIDR_NAME ports: - port: PORT protocol: PROTOCOL backendServiceRef: name: BACKEND_SERVICE_NAME EOF替换以下内容:
FORWARDING_RULE_INTERNAL_NAME:为ForwardingRuleInternal资源选择的名称。CIDR_NAME:与此转发规则位于同一命名空间中的Subnet资源的名称。Subnet资源表示全球子网的请求和分配信息。如需详细了解Subnet资源,请参阅自定义资源示例。如果未指定,系统会自动从全局 IP 池中预留IPv4/32CIDR。此字段是可选字段。PORT:使用ports字段指定 L4 端口数组,数据包会转发到使用此转发规则配置的后端。必须至少指定一个端口。使用port字段指定端口号。公开的端口必须与实际应用在容器内公开的端口相同。PROTOCOL:要用于转发规则的协议,例如TCP。ports数组中的条目必须如下所示:ports: - port: 80 protocol: TCP
如需验证配置的 ILB,请确认每个已创建对象的
Ready条件。通过向 VIP 发送curl请求来验证流量:如需获取 VIP,请使用
kubectl get:kubectl get forwardingruleinternal -n PROJECT_NAME输出如下所示:
NAME BACKENDSERVICE CIDR READY ilb-name BACKEND_SERVICE_NAME 10.200.32.59/32 True通过向转发规则中
PORT字段指定的端口上的 VIP 发出curl请求来测试流量:curl http://FORWARDING_RULE_VIP:PORT将
FORWARDING_RULE_VIP替换为转发规则的 VIP。
为标准集群创建内部负载均衡器
您可以为标准集群创建可用区级 ILB;不支持全球级 ILB。 可用区级 ILB 的范围仅限于创建时指定的可用区。如需了解详情,请参阅全球和可用区级负载均衡器。
直接在 Kubernetes 集群中使用 Kubernetes Service 为标准集群创建可用区级 ILB。直接从 Kubernetes 集群使用 Kubernetes Service 时,您只能定位创建 Service 对象的集群中的工作负载。
为标准集群创建可用区级 ILB
您可以通过在 Kubernetes 集群中创建 LoadBalancer 类型的 Kubernetes Service 对象,在 GDC 中创建 ILB。此 ILB 仅定位到创建 Service 对象的集群中的工作负载。
如需使用 Service 对象创建 ILB,请按照以下步骤操作:
为类型为
LoadBalancer的Service定义创建一个 YAML 文件。您必须使用networking.gke.io/load-balancer-type: internal注解将 ILB 服务设计为内部服务。以下
Service对象是 ILB 服务的示例:apiVersion: v1 kind: Service metadata: annotations: networking.gke.io/load-balancer-type: internal name: ILB_SERVICE_NAME namespace: ILB_SERVICE_NAMESPACE spec: ports: - port: 1234 protocol: TCP targetPort: 1234 selector: k8s-app: my-app type: LoadBalancer替换以下内容:
ILB_SERVICE_NAME:ILB 服务的名称。ILB_SERVICE_NAMESPACE:包含后端工作负载的命名空间。
port字段用于配置您在 VIP 地址上公开的前端端口。targetPort字段用于配置后端端口,您希望将流量转发到后端工作负载上的该端口。负载均衡器支持网络地址转换 (NAT)。前端和后端端口可以不同。在
Service定义的selector字段中,指定将用作后端工作负载的 Pod。选择器根据您指定的标签与工作负载上的标签是否匹配,来定义要将哪些工作负载作为此服务的后端工作负载。
Service只能选择在您定义Service的同一项目和同一集群中的后端工作负载。如需详细了解服务选择,请参阅 https://kubernetes.io/docs/concepts/services-networking/service/。
将
Service规范保存在 YAML 文件中。在以下命令中,将 ILB_FILE 替换为文件名。ILB 服务只能选择与Service定义位于同一集群中的工作负载。将
Service定义文件应用于集群:export KUBECONFIG=KUBECONFIG_PATH kubectl apply -f ILB_FILE替换以下内容:
ILB_FILE:ILB 服务的Service定义文件的名称。KUBECONFIG_PATH:标准集群的 kubeconfig 文件的路径。
创建 ILB 服务时,该服务会获得一个 IP 地址。您可以通过查看服务状态来获取 ILB 服务的 IP 地址:
kubectl -n ILB_SERVICE_NAMESPACE get svc ILB_SERVICE_NAME替换以下内容:
ILB_SERVICE_NAMESPACE:包含后端工作负载的命名空间。ILB_SERVICE_NAME:ILB 服务的名称。KUBECONFIG_PATH:标准集群的 kubeconfig 文件的路径。
您将获得类似于以下示例的输出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ilb-service LoadBalancer 10.0.0.1 198.51.0.1 1234:31930/TCP 22h现在,根据项目具有的项目网络政策,组织中的其他集群可以访问此 IP 地址。
选择虚拟机作为负载均衡器的后端
如需将虚拟机链接到负载均衡器,请执行以下操作:
确保虚拟机的标签与负载均衡器配置中使用的标签选择器匹配。
例如,如果您的虚拟机没有适当的标签,您可以将相应可用区的后端对象中的指定标签添加到该虚拟机:
kubectl --kubeconfig MANAGEMENT_API_SERVER label virtualmachine VM_NAME -n PROJECT_NAMELABEL替换以下内容:
LABEL:与负载均衡器配置中的LabelSelector匹配的标签,例如app=server。VM_NAME:要关联的虚拟机的名称。PROJECT_NAME:您的项目的名称。
确保服务器正在监听
HealthCheck对象中指定的同一端口。