经典:使用 NLB2.0设置 DSR 负载平衡
2.0版 NLB 只能在经典集群中创建,不能在 VPC 集群中创建。 要在 VPC 集群中进行负载均衡,请参阅使用 VPC 负载均衡器公开应用程序。
公开一个端口,并使用第 4 层网络负载均衡器 (NLB) 的可移植 IP 地址来公开容器化应用程序。 有关 V2.0 NLB 的更多信息,请参阅 NLB 2.0 的组件和体系结构。
先决条件
您无法将现有的1.0版 NLB 升级到2.0 版。 您必须创建新的 NLB 2.0。 请注意,您可以在一个集群中同时运行 V1.0 和 V2.0 NLB。
创建 NLB 2.0 之前,必须完成以下必备步骤。
-
要允许 NLB 2.0 将请求转发到多个专区中的应用程序 pod,请打开支持案例以请求对 VLAN 进行容量聚集。 此配置设置不会导致任何网络中断。
- 登录到 IBM Cloud 控制台。
- 在菜单栏中,单击支持,单击管理案例选项卡,然后单击创建新案例。
- 在案例字段中,输入以下内容: 主题: 网络-供应 子主题: 经典-VLAN
- 将以下信息添加到描述中:
Please set up the network to allow capacity aggregation on the public and private VLANs associated with my account. This is related to /docs/containers?topic=containers-loadbalancer-v2#ipvs_provision, and is needed so I can configure NLB v2.0 LoadBalancers in my Classic Kubernetes Cluster.
。 请注意,如果要允许特定 VLAN 上的容量聚集(例如,仅一个集群的公用 VLAN),那么可以在描述中指定这些 VLAN 标识。 - 单击提交。
-
为 IBM Cloud 基础架构帐户启用虚拟路由器功能 (VRF)。 要启用 VRF,请参阅 启用 VRF。 要检查是否已启用 VRF,请使用
ibmcloud account show
命令。 如果无法或不想启用 VRF,请启用 VLAN 生成。 启用了 VRF 或 VLAN 生成后,NLB 2.0 可以将包路由到帐户中的各种子网。 -
如果使用 Calico DNAT 前网络策略 来管理到 NLB 2.0的流量,那么必须将
applyOnForward: true
和doNotTrack: true
字段添加到策略中的spec
部分并从其中除去preDNAT: true
。applyOnForward: true
确保 Calico 策略在封装和转发时应用于流量。doNotTrack: true
确保工作程序节点可以使用 DSR 将响应包直接返回到客户机,而无需跟踪连接。 例如,如果使用Calico策略只允许从特定 IP 地址向 NLB IP 地址传输流量,则该策略看起来类似于下面的内容:apiVersion: projectcalico.org/v3 kind: GlobalNetworkPolicy metadata: name: allowlist spec: applyOnForward: true doNotTrack: true ingress: - action: Allow destination: nets: - <loadbalancer_IP>/32 ports: - 80 protocol: TCP source: nets: - <client_address>/32 selector: ibm.role=='worker_public' order: 500 types: - Ingress
接下来,您可以执行在多专区集群中设置 NLB 2.0 或在单专区集群中设置 NLB 2.0 中的步骤。
在多专区集群中设置 NLB 2.0
开始之前:
-
重要信息:完成 NLB 2.0 先决条件。
-
要在多个专区中创建公共 NLB,至少一个公用 VLAN 必须在每个专区中提供可移植子网。 要在多个专区中创建专用 NLB,至少一个专用 VLAN 必须在每个专区中提供可移植子网。 您可以执行配置集群的子网中的步骤来添加子网。
-
Ensure that you have the 作家 or 经理 IBM Cloud IAM service access role for the
default
namespace. -
确保您具有必需数量的工作程序节点:
- 经典集群:如果将网络流量限制为流至边缘工作程序节点,请确保每个专区中至少启用 2 个边缘工作程序节点,以便 NLB 能以均匀方式进行部署。
-
重新装入集群节点或集群主节点更新包含新的
keepalived
映像时,负载均衡器虚拟 IP 将移至新节点的网络接口。 发生此情况时,必须重新建立与负载均衡器的任何长期连接。 请考虑在应用程序中包含重试逻辑,以便快速尝试重新建立连接。
要在多专区集群中设置 NLB 2.0,请执行以下操作:
-
将应用程序部署到集群。 确保在配置文件的 metadata 部分中添加针对您的部署的标签。 此定制标签可标识运行您的应用程序的所有 pod,以便在负载均衡中包含这些 pod。
-
针对要向公用因特网或专用网络公开的应用程序创建 Load Balancer 服务。
-
创建名为
myloadbalancer.yaml
(举例来说)的服务配置文件。 -
针对要公开的应用程序定义 LoadBalancer 服务。 您可以指定专区、VLAN 和 IP 地址。
apiVersion: v1 kind: Service metadata: name: myloadbalancer annotations: service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: <public_or_private> service.kubernetes.io/ibm-load-balancer-cloud-provider-zone: "<zone>" service.kubernetes.io/ibm-load-balancer-cloud-provider-vlan: "<vlan_id>" service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features: "ipvs" service.kubernetes.io/ibm-load-balancer-cloud-provider-ipvs-scheduler: "<algorithm>" spec: type: LoadBalancer selector: <selector_key>: <selector_value> ports: - protocol: TCP port: 8080 targetPort: 8080 # Optional. By default, the `targetPort` is set to match the `port` value unless specified otherwise. loadBalancerIP: <IP_address> externalTrafficPolicy: Local
service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type:
- 注释,用于指定
private
或public
负载平衡器。 service.kubernetes.io/ibm-load-balancer-cloud-provider-zone:
- 用于指定 LoadBalancer 服务部署到的专区的注释。 要查看区域,请运行
ibmcloud ks zone ls
。 service.kubernetes.io/ibm-load-balancer-cloud-provider-vlan:
- 用于指定 LoadBalancer 服务部署到的 VLAN 的注释。 要查看 VLAN,请运行
ibmcloud ks vlan ls --zone <zone>
。 service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features: "ipvs"
- 用于指定 V2.0 负载均衡器的注释。
service.kubernetes.io/ibm-load-balancer-cloud-provider-ipvs-scheduler:
- 可选:用于指定调度算法的注释。 接受的值是
"rr"
表示循环(默认值)或"sh"
表示源散列。 有关更多信息,请参阅 2.0:调度算法。 selector
- The label key (
<selector_key>
) and value (<selector_value>
) that you used in thespec.template.metadata.labels
section of your app deployment YAML. port
- 服务侦听的端口。
loadBalancerIP
- 可选:要创建专用 NLB 或要将特定可移植 IP 地址用于公共 NLB,请指定要使用的 IP 地址。 该 IP 地址必须位于在注释中指定的专区和 VLAN 中。 如果未指定 IP 地址: 如果集群位于公用 VLAN 上,那么将使用可移植公共 IP 地址。 大多数集群都位于公用 VLAN 上。 如果集群仅位于专用 VLAN 上,那么将使用可移植的专用 IP 地址。
externalTrafficPolicy: Local
- 设置为
Local
。
在
dal12
中创建使用轮循调度算法的 NLB2.0服务的配置文件示例:apiVersion: v1 kind: Service metadata: name: myloadbalancer annotations: service.kubernetes.io/ibm-load-balancer-cloud-provider-zone: "dal12" service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features: "ipvs" service.kubernetes.io/ibm-load-balancer-cloud-provider-ipvs-scheduler: "rr" spec: type: LoadBalancer selector: app: nginx ports: - protocol: TCP port: 8080 targetPort: 8080 # Optional. By default, the `targetPort` is set to match the `port` value unless specified otherwise. externalTrafficPolicy: Local
-
可选: 通过在
spec.loadBalancerSourceRanges
字段中指定 IP,使 NLB 服务仅可用于有限范围的 IP 地址。loadBalancerSourceRanges
由集群中的kube-proxy
通过工作程序节点上的 Iptables 规则实现。 更多信息,请参阅 Kubernetes文档。 -
在集群中创建服务。
kubectl apply -f myloadbalancer.yaml
-
-
验证 NLB 服务是否已成功创建。 这可能需要几分钟时间,才能正确创建 NLB 服务并使应用程序可用。
kubectl describe service myloadbalancer
CLI 输出示例:
NAME: myloadbalancer Namespace: default Labels: <none> Selector: app=liberty Type: LoadBalancer Zone: dal10 IP: 172.21.xxx.xxx LoadBalancer Ingress: 169.xx.xxx.xxx Port: <unset> 8080/TCP NodePort: <unset> 32040/TCP Endpoints: 172.30.xxx.xxx:8080 Session Affinity: None Events: FirstSeen LastSeen Count From SubObjectPath Type Reason Message --------- -------- ----- ---- ------------- ---- ------ ------- 10s 10s 1 {service-controller } Normal CreatingLoadBalancer Creating load balancer 10s 10s 1 {service-controller } Normal CreatedLoadBalancer Created load balancer
LoadBalancer Ingress IP 地址是分配给 NLB 服务的可移植 IP 地址。
-
如果创建了公共 NLB,请从因特网访问该应用程序。
-
打开首选的 Web 浏览器。
-
输入 NLB 的可移植公共 IP 地址和端口。
http://169.xx.xxx.xxx:8080
-
-
要实现高可用性,请重复步骤 2 - 4,以在具有应用程序实例的每个专区中添加一个 NLB 2.0。
-
可选:NLB 服务还可使应用程序在服务的 NodePort 上可用。 对于集群内的每个节点,在每个公共和专用 IP 地址上都可以访问 NodePort。 要在使用 NLB 服务时阻止流至 NodePort 的流量,请参阅控制流至网络负载均衡器 (NLB) 或 NodePort 服务的入站流量。
接下来,可以注册 NLB 子域。
在单专区集群中设置 NLB 2.0
开始之前:
- 重要信息:完成 NLB 2.0 先决条件。
- 必须有可用的可移植公共或专用 IP 地址可分配给 NLB 服务。 有关更多信息,请参阅配置集群的子网。
- Ensure that you have the 作家 or 经理 IBM Cloud IAM service access role for the
default
namespace. - 重新装入集群节点或集群主节点更新包含新的
keepalived
映像时,负载均衡器虚拟 IP 将移至新节点的网络接口。 发生此情况时,必须重新建立与负载均衡器的任何长期连接。 请考虑在应用程序中包含重试逻辑,以便快速尝试重新建立连接。
要在单专区集群中创建 NLB 2.0 服务,请执行以下操作:
-
将应用程序部署到集群。 确保在配置文件的 metadata 部分中添加针对您的部署的标签。 需要使用此标签来标识运行应用程序的所有 pod,以便使它们处于负载平衡中。
-
针对要向公用因特网或专用网络公开的应用程序创建 Load Balancer 服务。
-
创建名为
myloadbalancer.yaml
(举例来说)的服务配置文件。 -
针对要公开的应用程序定义 LoadBalancer 2.0 服务。
apiVersion: v1 kind: Service metadata: name: myloadbalancer annotations: service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: <public_or_private> service.kubernetes.io/ibm-load-balancer-cloud-provider-vlan: "<vlan_id>" service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features: "ipvs" service.kubernetes.io/ibm-load-balancer-cloud-provider-ipvs-scheduler: "<algorithm>" spec: type: LoadBalancer selector: <selector_key>: <selector_value> ports: - protocol: TCP port: 8080 targetPort: 8080 # Optional. By default, the `targetPort` is set to match the `port` value unless specified otherwise. loadBalancerIP: <IP_address> externalTrafficPolicy: Local
service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type:
- 注释,用于指定
private
或public
负载平衡器。 service.kubernetes.io/ibm-load-balancer-cloud-provider-vlan:
- 可选:用于指定 LoadBalancer 服务部署到的 VLAN 的注释。 要查看 VLAN,请运行
ibmcloud ks vlan ls --zone <zone>
。 service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features: "ipvs"
- 用于指定 LoadBalancer 2.0 的注释。
service.kubernetes.io/ibm-load-balancer-cloud-provider-ipvs-scheduler:
- 可选:用于指定调度算法的注释。 接受的值是
"rr"
表示循环(默认值)或"sh"
表示源散列。 有关更多信息,请参阅 2.0:调度算法。 selector
- The label key (
<selector_key>
) and value (<selector_value>
) that you used in thespec.template.metadata.labels
section of your app deployment YAML. port
- 服务侦听的端口。
loadBalancerIP
- 可选:要创建专用 NLB 或要将特定可移植 IP 地址用于公共 NLB,请指定要使用的 IP 地址。 该 IP 地址必须位于在注释中指定的 VLAN 上。 如果不指定 IP 地址:
- 如果集群位于公用 VLAN 上,那么将使用可移植的公共 IP 地址。 大多数集群都位于公用 VLAN 上。
- 如果集群仅位于专用 VLAN 上,那么将使用可移植的专用 IP 地址。
externalTrafficPolicy: Local
- 设置为
Local
。
-
可选: 通过在
spec.loadBalancerSourceRanges
字段中指定 IP,使 NLB 服务仅可用于有限范围的 IP 地址。loadBalancerSourceRanges
由集群中的kube-proxy
通过工作程序节点上的 Iptables 规则实现。 更多信息,请参阅 Kubernetes文档。 -
在集群中创建服务。
kubectl apply -f myloadbalancer.yaml
-
-
验证 NLB 服务是否已成功创建。 可能需要几分钟时间,才能创建该服务并使应用程序可用。
kubectl describe service myloadbalancer
CLI 输出示例:
NAME: myloadbalancer Namespace: default Labels: <none> Selector: app=liberty Type: LoadBalancer Location: dal10 IP: 172.21.xxx.xxx LoadBalancer Ingress: 169.xx.xxx.xxx Port: <unset> 8080/TCP NodePort: <unset> 32040/TCP Endpoints: 172.30.xxx.xxx:8080 Session Affinity: None Events: FirstSeen LastSeen Count From SubObjectPath Type Reason Message --------- -------- ----- ---- ------------- ---- ------ ------- 10s 10s 1 {service-controller } Normal CreatingLoadBalancer Creating load balancer 10s 10s 1 {service-controller } Normal CreatedLoadBalancer Created load balancer
LoadBalancer Ingress IP 地址是分配给 NLB 服务的可移植 IP 地址。
-
如果创建了公共 NLB,请从因特网访问该应用程序。
-
打开首选的 Web 浏览器。
-
输入 NLB 的可移植公共 IP 地址和端口。
http://169.xx.xxx.xxx:8080
-
-
可选:NLB 服务还可使应用程序在服务的 NodePort 上可用。 对于集群内的每个节点,在每个公共和专用 IP 地址上都可以访问 NodePort。 要在使用 NLB 服务时阻止流至 NodePort 的流量,请参阅控制流至网络负载均衡器 (NLB) 或 NodePort 服务的入站流量。
接下来,可以注册 NLB 子域。
安排算法
调度算法确定 NLB 2.0 如何将网络连接分配给应用程序 pod。 客户机请求到达集群时,NLB 会根据调度算法将请求包路由到工作程序节点。 To use a scheduling algorithm, specify its Keepalived
short name in the scheduler annotation of your NLB service configuration file: service.kubernetes.io/ibm-load-balancer-cloud-provider-ipvs-scheduler: "rr"
.
请查看以下列表以了解 IBM Cloud Kubernetes Service 中支持哪些调度算法。 如果未指定调度算法,则默认使用轮循算法。 更多信息,请参阅 Keepalived
文档。
支持的调度算法
- 循环赛
rr
) - 当将连接路由到工作程序节点时,NLB 会在应用程序 pod 列表中循环,对每个应用程序 pod 进行同等处理。循环法是 V 2.0 NLB 的缺省调度算法。
- 源散列
sh
) - NLB 会基于客户机请求包的源 IP 地址生成一个散列键。 然后,NLB 会在静态分配的散列表中查找该散列键,并将请求路由到用于处理该范围的散列的应用程序 pod。 此算法可确保来自特定客户机的请求始终定向到同一应用程序 pod。 Kubernetes使用 Iptables 规则,它会将请求发送到 Worker 上的随机 pod。 要使用此调度算法,您必须确保每个工作程序节点仅部署一个应用程序 pod。 例如,如果每个 pod 都有
run=<app_name>
标签,则在应用程序部署的spec
部分添加以下反亲和性规则:
spec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: run
operator: In
values:
- <APP_NAME>
topologyKey: kubernetes.io/hostname
不受支持的调度算法
- 目的地散列
dh
) - 包的目标(即 NLB IP 地址和端口)用于确定哪个工作程序节点处理入局请求。 但是,IBM Cloud Kubernetes Service 中 NLB 的 IP 地址和端口不会更改。 NLB 被迫在其所在的工作程序节点中保留该请求,因此只有一个工作程序上的应用程序 pod 处理所有入局请求。
- 动态连接计数算法
- 以下算法取决于客户机与 NLB 之间的动态连接计数。 但是,由于直接服务返回 (DSR) 会阻止 NLB 2.0 pod 位于返回数据包路径中,因此 NLB 不会跟踪建立的连接。
- 最少连接
lc
) - 基于地域的最小连接
lblc
) - 基于位置的最少连接复制
lblcr
) - 从不排队
nq
) - 最短预期延迟
seq
)
- 最少连接
- 加权的 pod 算法
- 以下算法取决于加权的应用程序 pod。 但是,在 IBM Cloud Kubernetes Service 中,所有应用程序 pod 会分配有相同的权重以实现负载均衡。
- 加权最小连接
wlc
) - 加权循环法 (
wrr
)
- 加权最小连接