外部负载平衡器 (ELB) 会公开服务,以便组织外部的用户可以通过分配给组织(从更大的实例外部 IP 池中)的池 IP 地址访问这些服务。
ELB 虚拟 IP (VIP) 地址在组织之间不会发生冲突,并且在所有组织中都是唯一的。因此,您必须仅将 ELB 服务用于组织外部的客户必须访问的服务。
只要您允许组织内部运行的工作负载退出组织,这些工作负载就可以访问 ELB 服务。此流量模式实际上要求先从组织发出出站流量,然后再返回到内部服务。
准备工作
如需配置 ELB 服务,您必须具备以下条件:
- 拥有您要配置负载均衡器的项目。如需了解详情,请参阅创建项目。
- 自定义的
ProjectNetworkPolicy
(PNP) 入站流量政策,用于允许流量流向此 ELB 服务。如需了解详情,请参阅配置 PNP 以允许流量流向 ELB。 必要的身份和访问权限角色:
- Project NetworkPolicy Admin:有权管理项目命名空间中的项目网络政策。请让您的组织 IAM 管理员为您授予 Project NetworkPolicy Admin (
project-networkpolicy-admin
) 角色。 - Load Balancer Admin:请组织 IAM 管理员为您授予 Load Balancer Admin (
load-balancer-admin
) 角色。 - Global Load Balancer Admin:对于全球 ELB,请让组织 IAM 管理员向您授予 Global Load Balancer Admin (
global-load-balancer-admin
) 角色。如需了解详情,请参阅预定义角色说明。
- Project NetworkPolicy Admin:有权管理项目命名空间中的项目网络政策。请让您的组织 IAM 管理员为您授予 Project NetworkPolicy Admin (
配置 PNP 以允许流量流向 ELB
为了使 ELB 服务正常运行,您必须配置并应用自己的自定义 ProjectNetworkPolicy
入站流量政策,以允许流量流向此 ELB 服务的工作负载。网络政策控制对工作负载的访问,而不是负载均衡器本身的访问权限。
ELB 会将工作负载公开给客户网络,因此需要明确的网络政策来允许外部流量流向工作负载端口,例如 8080
。
指定外部 CIDR 地址以允许流量流向此 ELB 的工作负载:
kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
apiVersion: networking.gdc.goog/v1
kind: ProjectNetworkPolicy
metadata:
namespace: PROJECT
name: allow-inbound-traffic-from-external
spec:
policyType: Ingress
subject:
subjectType: UserWorkload
ingress:
- from:
- ipBlock:
cidr: CIDR
ports:
- protocol: TCP
port: PORT
EOF
替换以下内容:
MANAGEMENT_API_SERVER
:管理 API 服务器的 kubeconfig 路径的 kubeconfig 路径。如果您尚未为目标可用区中的 API 服务器生成 kubeconfig 文件,请参阅登录了解详情。PROJECT
:您的 GDC 项目的名称。CIDR
:需要从哪个外部 CIDR 访问 ELB。此政策是必需的,因为外部负载均衡器使用直接服务器返回 (DSR),该功能可保留源外部 IP 地址,并在返回路径上绕过负载均衡器。如需了解详情,请参阅为跨组织流量创建全球入站防火墙规则。PORT
:负载均衡器后面的 pod 上的后端端口。此值位于Service
资源的清单的.spec.ports[].targetPort
字段中。此字段是可选字段。
创建外部负载平衡器
您可以创建全球级或可用区级 ELB。全球 ELB 的范围涵盖整个 GDC 宇宙。区域 ELB 的范围仅限于创建时指定的可用区。如需了解详情,请参阅全球和可用区级负载平衡器。
在 GDC 中使用三种不同的方法创建 ELB:
- 使用 gdcloud CLI 创建全球或可用区级 ELB。
- 使用 Networking Kubernetes 资源模型 (KRM) API 创建全球级或可用区级 ELB。
- 直接在 Kubernetes 集群中使用 Kubernetes 服务。此方法仅适用于可用区级 ELB。
您可以使用 KRM API 和 gdcloud CLI 定位 Pod 或虚拟机工作负载。当您直接在 Kubernetes 集群中使用 Kubernetes 服务时,只能以创建 Service
对象的集群中的工作负载为目标。
创建可用区级 ELB
使用 gcloud CLI、KRM API 或 Kubernetes 集群中的 Kubernetes 服务创建区域 ELB:
gdcloud
使用 gdcloud CLI 创建以 Pod 或虚拟机工作负载为目标的 ELB。
此 ELB 以项目中与 Backend
对象中定义的标签匹配的所有工作负载为目标。
如需使用 gdcloud CLI 创建 ELB,请按照以下步骤操作:
创建
Backend
资源以定义 ELB 的端点:gdcloud compute backends create BACKEND_NAME \ --labels=LABELS \ --project=PROJECT_NAME \ --zone=ZONE \ --cluster=CLUSTER_NAME
替换以下内容:
BACKEND_NAME
:您为后端资源选择的名称,例如my-backend
。LABELS
:一种选择器,用于定义要为此后端资源使用哪些 Pod 与虚拟机之间的端点。例如app=web
。PROJECT_NAME
:您的项目的名称。ZONE
:要用于此调用的可用区。如需为所有需要可用区标志的命令预设该标志,请运行:gdcloud config set core/zone ZONE
。可用区标志仅在多可用区环境中可用。此字段是可选字段。CLUSTER_NAME
:定义的选择器的范围所限制到的集群。如果未指定此字段,则会选择具有指定标签的所有端点。此字段是可选字段。
如果此 ELB 适用于 pod 工作负载,请跳过此步骤。如果您要为虚拟机工作负载配置 ELB,请为 ELB 定义健康检查:
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
:从一次探测开始到下一次探测开始之间的时间量(以秒为单位)。默认值为5
。此字段是可选字段。HEALTHY_THRESHOLD
:在声明失败之前等待的时间。默认值为5
。此字段是可选字段。TIMEOUT
:在声明失败之前等待的时间量(以秒为单位)。默认值为5
。此字段是可选字段。UNHEALTHY_THRESHOLD
:要将端点视为运行状况不佳所必须失败的连续探测次数。默认值为2
。此字段是可选字段。PORT
:执行健康检查的端口。默认值为80
。此字段是可选字段。ZONE
:您要在其中创建此 ELB 的可用区。
创建
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_PORT
:此后端服务转换的目标端口的英文逗号分隔列表,其中每个目标端口都指定了协议、转发规则中的端口和后端实例中的端口。您可以指定多个目标端口。此字段必须采用protocol:port:targetport
格式,例如TCP:80:8080
。此字段是可选字段。HEALTH_CHECK_NAME
:健康检查资源的名称。此字段是可选字段。仅当您为虚拟机工作负载配置 ELB 时,才添加此字段。
将
BackendService
资源添加到之前创建的Backend
资源:gdcloud compute backend-services add-backend BACKEND_SERVICE_NAME \ --backend=BACKEND_NAME \ --project=PROJECT_NAME \ --zone=ZONE
可选:为 ELB 使用会话亲和性,以确保来自同一客户端的请求始终路由到同一后端。如需为负载平衡器启用会话亲和性,请使用
gdcloud compute load-balancer-policy create
命令创建后端服务政策:gdcloud compute load-balancer-policy create POLICY_NAME --session-affinity=MODE --selectors=RESOURCE_LABEL
替换以下内容:
POLICY_NAME
:您为后端服务政策选择的名称。MODE
:会话亲和性模式。支持两种模式:NONE
:会话亲和性已停用。请求会路由到任何可用的后端。此为默认模式。CLIENT_IP_DST_PORT_PROTO
:来自同一四元组(来源 IP 地址、目标 IP 地址、目标端口和协议)的请求会被路由到同一后端。
RESOURCE_LABEL
:用于选择BackendServicePolicy
资源所应用到的后端服务的标签选择器(位于项目命名空间中)。如果多个BackendServicePolicy
资源与同一后端服务匹配,并且其中至少有一项政策启用了会话亲和性,则相应BackendService
资源的会话亲和性会变为已启用。
创建外部
ForwardingRule
资源,用于定义服务可用的 VIP:gdcloud compute forwarding-rules create FORWARDING_RULE_EXTERNAL_NAME \ --backend-service=BACKEND_SERVICE_NAME \ --cidr=CIDR \ --ip-protocol-port=PROTOCOL_PORT \ --load-balancing-scheme=EXTERNAL \ --zone=ZONE \ --project=PROJECT_NAME
替换以下内容:
BACKEND_SERVICE_NAME
:后端服务的名称。FORWARDING_RULE_EXTERNAL_NAME
:您为转发规则选择的名称。CIDR
:此字段是可选字段。如果未指定,系统会自动从可用区 IP 池中预留一个IPv4/32
CIDR。指定与相应转发规则位于同一命名空间中的Subnet
资源的名称。Subnet
资源表示区域子网的请求和分配信息。如需详细了解Subnet
资源,请参阅自定义资源示例。PROTOCOL_PORT
:要在转发规则中公开的协议和端口。此字段必须采用ip-protocol=TCP:80
格式。公开的端口必须与实际应用在容器内公开的端口相同。
如需验证配置的 ELB,请确认每个已创建对象的
Ready
条件。如需获取负载均衡器的已分配 IP 地址,请描述转发规则:gdcloud compute forwarding-rules describe FORWARDING_RULE_EXTERNAL_NAME
如需验证配置的 ELB,请确认每个已创建对象的
Ready
条件。通过向 VIP 发送curl
请求来验证流量:如需获取分配的 VIP,请描述转发规则:
gdcloud compute forwarding-rules describe FORWARDING_RULE_EXTERNAL_NAME
通过向转发规则中
PROTOCOL_PORT
字段指定的端口上的 VIP 发送curl
请求来验证流量:curl http://FORWARDING_RULE_VIP:PORT
替换以下内容:
FORWARDING_RULE_VIP
:转发规则的 VIP。PORT
:转发规则中PROTOCOL_PORT
字段的起始端口号。
API
使用 KRM API 创建以 Pod 或虚拟机工作负载为目标的 ELB。
此 ELB 以项目中与 Backend
对象中定义的标签匹配的所有工作负载为目标。
如需使用 KRM API 创建可用区级 ELB,请按以下步骤操作:
创建
Backend
资源以定义 ELB 的端点。为放置工作负载的每个可用区创建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
:区域管理 API 服务器的 kubeconfig 路径。如需了解详情,请参阅切换到地区性广告资源背景。PROJECT_NAME
:您的项目的名称。BACKEND_NAME
:Backend
资源的名称。CLUSTER_NAME
:此字段为可选字段。此字段用于指定所定义选择器的范围所限定到的集群。此字段不适用于虚拟机工作负载。如果Backend
资源未包含clusterName
字段,则指定的标签会应用于项目中的所有工作负载。
如果此 ELB 适用于 pod 工作负载,请跳过此步骤。如果您要为虚拟机工作负载配置 ELB,请为 ELB 定义健康检查:
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
:在声明失败之前等待的时间量(以秒为单位)。默认值为5
。CHECK_INTERVAL
:从一次探测开始到下一次探测开始之间的时间量(以秒为单位)。默认值为5
。HEALTHY_THRESHOLD
:要将端点视为运行状况良好必须通过的连续探测次数。默认值为2
。UNHEALTHY_THRESHOLD
:要将端点视为运行状况不佳所必须失败的连续探测次数。默认值为2
。
使用之前创建的
Backend
资源创建一个BackendService
对象。如果您要为虚拟机工作负载配置 ELB,请添加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 工作负载配置 ELB,请勿添加此字段。
可选:为 ELB 使用会话亲和性,以确保来自同一客户端的请求始终路由到同一后端。如需为负载平衡器启用会话亲和性,请创建
BackendServicePolicy
资源。此资源定义了会话亲和性设置,并将BackendServicePolicy
资源应用于BackendService
资源。创建并应用BackendServicePolicy
资源:kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: BackendServicePolicy metadata: namespace: PROJECT_NAME name: POLICY_NAME spec: sessionAffinity: MODE selector: matchLabels: RESOURCE_LABEL
替换以下内容:
POLICY_NAME
:您为后端服务政策选择的名称。MODE
:会话亲和性模式。支持两种模式:NONE
:会话亲和性已停用。请求会路由到任何可用的后端。此为默认模式。CLIENT_IP_DST_PORT_PROTO
:来自同一四元组(来源 IP 地址、目标 IP 地址、目标端口和协议)的请求会被路由到同一后端。
RESOURCE_LABEL
:用于选择BackendServicePolicy
资源所应用到的后端服务的标签选择器(位于项目命名空间中)。如果多个BackendServicePolicy
资源与同一后端服务匹配,并且其中至少有一项政策启用了会话亲和性,则相应BackendService
资源的会话亲和性会变为已启用。
创建外部
ForwardingRule
资源,用于定义服务可用的 VIP。kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: networking.gdc.goog/v1 kind: ForwardingRuleExternal metadata: namespace: PROJECT_NAME Name: FORWARDING_RULE_EXTERNAL_NAME spec: cidrRef: CIDR ports: - port: PORT Protocol: PROTOCOL backendServiceRef: name: BACKEND_SERVICE_NAME EOF
替换以下内容:
BACKEND_SERVICE_NAME
:您的BackendService
资源的名称。FORWARDING_RULE_EXTERNAL_NAME
:您为ForwardingRuleExternal
资源选择的名称。CIDR
:此字段是可选字段。如果未指定,系统会自动从可用区 IP 池中预留一个IPv4/32
CIDR。指定与相应转发规则位于同一命名空间中的Subnet
资源的名称。Subnet
资源表示可用区子网的请求和分配信息。如需详细了解Subnet
资源,请参阅自定义资源示例。PORT
:使用ports
字段指定一个 L4 端口数组,数据包将转发到使用此转发规则配置的后端。必须至少指定一个端口。使用port
字段指定端口号。公开的端口必须与实际应用在容器内公开的端口相同。PROTOCOL
:用于转发规则的协议,例如TCP
。ports
数组中的条目必须如下所示:ports: - port: 80 protocol: TCP
如需验证配置的 ELB,请确认每个已创建对象的
Ready
条件。通过向 VIP 发送curl
请求来验证流量:如需获取 VIP,请使用
kubectl get
:kubectl get forwardingruleexternal -n PROJECT_NAME
输出如下所示:
NAME BACKENDSERVICE CIDR READY elb-name BACKEND_SERVICE_NAME 10.200.32.59/32 True
通过向转发规则中
PORT
字段指定的端口上的 VIP 发送curl
请求来验证流量:curl http://FORWARDING_RULE_VIP:PORT
将
FORWARDING_RULE_VIP
替换为转发规则的 VIP。
Kubernetes Service
您可以在 GDC 中通过在 Kubernetes 集群中创建类型为 LoadBalancer
的 Kubernetes Service
来创建 ELB。
如需创建 ELB 服务,请执行以下操作:
为
LoadBalancer
类型的Service
定义创建一个 YAML 文件。以下
Service
对象是 ELB 服务的示例:apiVersion: v1 kind: Service metadata: name: ELB_SERVICE_NAME namespace: PROJECT_NAME spec: ports: - port: 1235 protocol: TCP targetPort: 1235 selector: k8s-app: my-app type: LoadBalancer
替换以下内容:
ELB_SERVICE_NAME
:ELB 服务的名称。PROJECT_NAME
:包含后端工作负载的项目的命名空间。
port
字段用于配置您在 VIP 地址上公开的前端端口。targetPort
字段用于配置您希望将后端工作负载上的流量转发到的后端端口。负载均衡器支持网络地址转换 (NAT)。前端端口和后端端口可以不同。在
Service
定义的selector
字段中,将 Pod 或虚拟机指定为后端工作负载。选择器用于根据您指定的标签与工作负载上的标签的匹配情况,定义要将哪些工作负载作为此服务的后端工作负载。
Service
只能选择您定义Service
的同一项目和同一集群中的后端工作负载。如需详细了解服务选择,请参阅 https://kubernetes.io/docs/concepts/services-networking/service/。
将
Service
定义文件保存在与后端工作负载相同的项目中。将
Service
定义文件应用于集群:kubectl apply -f ELB_FILE
将
ELB_FILE
替换为 ELB 服务的Service
定义文件的名称。创建 ELB 时,该服务会获得两个 IP 地址。一个是只能从同一集群内访问的内部 IP 地址。另一个是外部 IP 地址,可从组织内部和外部访问。您可以通过查看服务状态来获取 ELB 服务的 IP 地址:
kubectl -n PROJECT_NAME get svc ELB_SERVICE_NAME
替换以下内容:
PROJECT_NAME
:包含后端工作负载的项目的命名空间。ELB_SERVICE_NAME
:ELB 服务的名称。
您必须获得类似于以下示例的输出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE elb-service LoadBalancer 10.0.0.1 20.12.1.11 1235:31931/TCP 22h
EXTERNAL-IP
是可从组织外部访问的服务的 IP 地址。如果您未获得输出,请确保您已成功创建 ELB 服务。
创建全局 ELB
使用 gdcloud CLI 或 KRM API 创建全局 ELB。
gdcloud
使用 gdcloud CLI 创建以 Pod 或虚拟机工作负载为目标的 ELB。
此 ELB 以项目中与 Backend
对象中定义的标签匹配的所有工作负载为目标。Backend
自定义资源的范围必须限定为某个可用区。
如需使用 gdcloud CLI 创建 ELB,请按照以下步骤操作:
创建
Backend
资源以定义 ELB 的端点:gdcloud compute backends create BACKEND_NAME \ --labels=LABELS \ --project=PROJECT_NAME \ --cluster=CLUSTER_NAME \ --zone=ZONE
替换以下内容:
BACKEND_NAME
:您为后端资源选择的名称,例如my-backend
。LABELS
:一种选择器,用于定义要为此后端资源使用哪些 Pod 与虚拟机之间的端点。例如app=web
。PROJECT_NAME
:您的项目的名称。CLUSTER_NAME
:定义的选择器的范围所限制到的集群。如果未指定此字段,则会选择具有指定标签的所有端点。此字段是可选字段。ZONE
:要用于此调用的可用区。如需为所有需要可用区标志的命令预设该标志,请运行:gdcloud config set core/zone ZONE
。只有在多区域环境中,区域标志才可用。此字段是可选字段。
如果此 ELB 适用于 pod 工作负载,请跳过此步骤。如果您要为虚拟机工作负载配置 ELB,请为 ELB 定义健康检查:
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
:从一次探测开始到下一次探测开始之间的时间量(以秒为单位)。默认值为5
。此字段是可选字段。HEALTHY_THRESHOLD
:在声明失败之前等待的时间。默认值为5
。此字段是可选字段。TIMEOUT
:在声明失败之前等待的时间量(以秒为单位)。默认值为5
。此字段是可选字段。UNHEALTHY_THRESHOLD
:要将端点视为运行状况不佳所必须失败的连续探测次数。默认值为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
:健康检查资源的名称。此字段是可选字段。仅当您为虚拟机工作负载配置 ELB 时,才添加此字段。
将
BackendService
资源添加到之前创建的Backend
资源:gdcloud compute backend-services add-backend BACKEND_SERVICE_NAME \ --backend=BACKEND_NAME \ --backend-zone BACKEND_ZONE \ --project=PROJECT_NAME \ --global
可选:为 ELB 使用会话亲和性,以确保来自同一客户端的请求始终路由到同一后端。如需为负载平衡器启用会话亲和性,请使用
gdcloud compute load-balancer-policy create
命令创建后端服务政策:gdcloud compute load-balancer-policy create POLICY_NAME --session-affinity=MODE --selectors=RESOURCE_LABEL
替换以下内容:
POLICY_NAME
:您为后端服务政策选择的名称。MODE
:会话亲和性模式。支持两种模式:NONE
:会话亲和性已停用。请求会路由到任何可用的后端。此为默认模式。CLIENT_IP_DST_PORT_PROTO
:来自同一四元组(来源 IP 地址、目标 IP 地址、目标端口和协议)的请求会被路由到同一后端。
RESOURCE_LABEL
:用于选择BackendServicePolicy
资源所应用到的后端服务的标签选择器(位于项目命名空间中)。如果多个BackendServicePolicy
资源与同一后端服务匹配,并且其中至少有一项政策启用了会话亲和性,则相应BackendService
资源的会话亲和性会变为已启用。
创建外部
ForwardingRule
资源,用于定义服务可用的 VIP:gdcloud compute forwarding-rules create FORWARDING_RULE_EXTERNAL_NAME \ --backend-service=BACKEND_SERVICE_NAME \ --cidr=CIDR \ --ip-protocol-port=PROTOCOL_PORT \ --load-balancing-scheme=EXTERNAL \ --project=PROJECT_NAME \ --global
替换以下内容:
BACKEND_SERVICE_NAME
:后端服务的名称。FORWARDING_RULE_EXTERNAL_NAME
:您为转发规则选择的名称。CIDR
:此字段是可选字段。如果未指定,系统会自动从全局 IP 池中预留一个IPv4/32
CIDR。 指定与相应转发规则位于同一命名空间中的Subnet
资源的名称。Subnet
资源表示全球子网的请求和分配信息。如需详细了解Subnet
资源,请参阅自定义资源示例。PROTOCOL_PORT
:要在转发规则中公开的协议和端口。此字段必须采用ip-protocol=TCP:80
格式。公开的端口必须与实际应用在容器内公开的端口相同。
如需验证配置的 ELB,请确认每个已创建对象的
Ready
条件。如需获取负载均衡器的已分配 IP 地址,请描述转发规则:gdcloud compute forwarding-rules describe FORWARDING_RULE_EXTERNAL_NAME
如需验证配置的 ELB,请确认每个已创建对象的
Ready
条件。通过向 VIP 发送curl
请求来验证流量:如需获取分配的 VIP,请描述转发规则:
gdcloud compute forwarding-rules describe FORWARDING_RULE_EXTERNAL_NAME --global
通过向转发规则中
PROTOCOL_PORT
字段指定的端口上的 VIP 发送curl
请求来验证流量:curl http://FORWARDING_RULE_VIP:PORT
替换以下内容:
FORWARDING_RULE_VIP
:转发规则的 VIP。PORT
:转发规则中PROTOCOL_PORT
字段的起始端口号。
API
使用 KRM API 创建以 Pod 或虚拟机工作负载为目标的 ELB。此 ELB 以项目中与 Backend 对象中定义的标签匹配的所有工作负载为目标。如需使用 KRM API 创建可用区级 ELB,请按以下步骤操作:
创建
Backend
资源以定义 ELB 的端点。为放置工作负载的每个可用区创建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
:全局管理 API 服务器的 kubeconfig 路径。如需了解详情,请参阅切换到全局上下文。PROJECT_NAME
:您的项目的名称。BACKEND_NAME
:Backend
资源的名称。CLUSTER_NAME
:此字段为可选字段。此字段用于指定所定义选择器的范围所限定到的集群。此字段不适用于虚拟机工作负载。如果Backend
资源未包含clusterName
字段,则指定的标签会应用于项目中的所有工作负载。
如果此 ELB 适用于 pod 工作负载,请跳过此步骤。如果您要为虚拟机工作负载配置 ELB,请为 ELB 定义健康检查:
kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF 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 EOF
替换以下内容:
HEALTH_CHECK_NAME
:您为健康检查资源选择的名称,例如my-health-check
。PORT
:执行健康检查的端口。默认值为80
。TIMEOUT
:在声明失败之前等待的时间量(以秒为单位)。默认值为5
。CHECK_INTERVAL
:从一次探测开始到下一次探测开始之间的时间量(以秒为单位)。默认值为5
。HEALTHY_THRESHOLD
:要将端点视为运行状况良好必须通过的连续探测次数。默认值为2
。UNHEALTHY_THRESHOLD
:要将端点视为运行状况不佳所必须失败的连续探测次数。默认值为2
。
由于这是全局 ELB,因此请在全局 API 中创建健康检查。
使用之前创建的
Backend
资源创建一个BackendService
对象。如果您要为虚拟机工作负载配置 ELB,请添加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 工作负载配置 ELB,请勿添加此字段。ZONE
:创建Backend
资源的可用区。您可以在backendRefs
字段中指定多个后端。例如:- name: my-be zone: Zone-A - name: my-be zone: Zone-B
targetPorts
字段为可选字段。此资源列出了BackendService
资源转换的端口。如果您使用的是此对象,请为以下各项提供值:PORT
:服务公开的端口。PROTOCOL
:流量必须匹配的第 4 层协议。仅支持 TCP 和 UDP。TARGET_PORT
:PORT
值转换到的端口,例如8080
。TARGET_PORT
的值在给定对象中不能重复。targetPorts
的示例可能如下所示:targetPorts: - port: 80 protocol: TCP targetPort: 8080
可选:为 ELB 使用会话亲和性,以确保来自同一客户端的请求始终路由到同一后端。如需为负载平衡器启用会话亲和性,请创建
BackendServicePolicy
资源。此资源定义了会话亲和性设置,并将BackendServicePolicy
资源应用于BackendService
资源。创建并应用BackendServicePolicy
资源:kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: BackendServicePolicy metadata: namespace: PROJECT_NAME name: POLICY_NAME spec: sessionAffinity: MODE selector: matchLabels: RESOURCE_LABEL
替换以下内容:
POLICY_NAME
:您为后端服务政策选择的名称。MODE
:会话亲和性模式。支持两种模式:NONE
:会话亲和性已停用。请求会路由到任何可用的后端。此为默认模式。CLIENT_IP_DST_PORT_PROTO
:来自同一四元组(来源 IP 地址、目标 IP 地址、目标端口和协议)的请求会被路由到同一后端。
RESOURCE_LABEL
:用于选择BackendServicePolicy
资源所应用到的后端服务的标签选择器(位于项目命名空间中)。如果多个BackendServicePolicy
资源与同一后端服务匹配,并且其中至少有一项政策启用了会话亲和性,则相应BackendService
资源的会话亲和性会变为已启用。
创建外部
ForwardingRule
资源,用于定义服务可用的 VIP。kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: ForwardingRuleExternal metadata: namespace: PROJECT_NAME Name: FORWARDING_RULE_EXTERNAL_NAME spec: cidrRef: CIDR ports: - port: PORT Protocol: PROTOCOL backendServiceRef: name: BACKEND_SERVICE_NAME EOF
替换以下内容:
FORWARDING_RULE_EXTERNAL_NAME
:为ForwardingRuleExternal
资源选择的名称。CIDR
:此字段是可选字段。如果未指定,系统会自动从全局 IP 池中预留一个IPv4/32
CIDR。 指定与相应转发规则位于同一命名空间中的Subnet
资源的名称。Subnet
资源表示全球子网的请求和分配信息。如需详细了解Subnet
资源,请参阅自定义资源示例。PORT
:使用ports
字段指定一个 L4 端口数组,数据包将转发到使用此转发规则配置的后端。必须至少指定一个端口。使用port
字段指定端口号。公开的端口必须与实际应用在容器内公开的端口相同。PROTOCOL
:用于转发规则的协议,例如TCP
。ports
数组中的条目必须如下所示:ports: - port: 80 protocol: TCP
如需验证配置的 ELB,请确认每个已创建对象的
Ready
条件。通过向 VIP 发送curl
请求来验证流量:如需获取 VIP,请使用
kubectl get
:kubectl get forwardingruleexternal -n PROJECT_NAME
输出如下所示:
NAME BACKENDSERVICE CIDR READY elb-name BACKEND_SERVICE_NAME 10.200.32.59/32 True
通过向转发规则中
PORT
字段指定的端口上的 VIP 发送curl
请求来验证流量:curl http://FORWARDING_RULE_VIP:PORT
将
FORWARDING_RULE_VIP
替换为转发规则的 VIP。