经典:使用 NLB 1.0 设置基本负载均衡
1.0版 NLB 只能在经典集群中创建,不能在 VPC 集群中创建。 要在 VPC 集群中进行负载均衡,请参阅使用 VPC 负载均衡器公开应用程序。
公开一个端口,并使用第 4 层网络负载均衡器 (NLB) 的可移植 IP 地址来公开容器化应用程序。 有关 V1.0 NLB 的信息,请参阅 NLB 1.0 的组件和体系结构。
在多专区集群中设置 NLB 1.0
开始之前:
- 要在多个专区中创建公共网络负载均衡器 (NLB),至少一个公用 VLAN 必须在每个专区中提供可移植子网。 要在多个专区中创建专用 NLB,至少一个专用 VLAN 必须在每个专区中提供可移植子网。 您可以执行配置集群的子网中的步骤来添加子网。
- 为 IBM Cloud 基础架构帐户启用虚拟路由器功能 (VRF)。 要启用 VRF,请参阅 启用 VRF。 要检查是否已启用 VRF,请使用
ibmcloud account show
命令。 如果无法或不想启用 VRF,请启用 VLAN 生成。 启用 VRF 或 VLAN 跨接后,NLB1.0可将数据包路由到开户免费送彩金38元中的各个子网。 - Ensure you have the 作家或 "经理""IBM CloudIAM 服务访问角色 for the
default
namespace. - 确保具有所需数量的工作程序节点: 如果限制到边缘工作程序节点的网络流量,请确保在每个专区中至少启用两个 边缘工作程序节点,以便 NLB 统一部署。
- 重新装入集群节点或集群主节点更新包含新的
keepalived
映像时,负载均衡器虚拟 IP 将移至新节点的网络接口。 发生此情况时,必须重新建立与负载均衡器的任何长期连接。 请考虑在应用程序中包含重试逻辑,以便快速尝试重新建立连接。
要在多专区集群中设置 NLB 1.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>" 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>
service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type
- 注释,用于指定“
private
或”public
负载平衡器。 如果未指定此注释,且工作节点连接到公共 VLAN,则会创建公共 "LoadBalancer
服务。 如果工作程序节点仅连接到专用 VLAN,那么将创建专用LoadBalancer
服务。 service.kubernetes.io/ibm-load-balancer-cloud-provider-zone
- 用于指定 LoadBalancer 服务部署到的专区的注释。 要查看区域,请运行 "
ibmcloud oc zone ls
。 service.kubernetes.io/ibm-load-balancer-cloud-provider-vlan
- 用于指定 LoadBalancer 服务部署到的 VLAN 的注释。 要查看 VLAN,请运行 "
ibmcloud oc vlan ls --zone <zone>
。 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
-
- 可选:要创建专用负载均衡器或要将特定可移植 IP 地址用于公共负载均衡器,请指定要使用的 IP 地址。 该 IP 地址必须位于在注释中指定的 VLAN 和专区上。 如果不指定 IP 地址:
- 如果集群位于公用 VLAN 上,那么将使用可移植的公共 IP 地址。 大多数集群都位于公用 VLAN 上。
- 如果集群仅位于专用 VLAN 上,那么将使用可移植的专用 IP 地址。
用于创建使用
2234945
中专用 VLANdal12
上指定 IP 地址的专用 NLB 1.0 服务的示例配置文件:apiVersion: v1 kind: Service metadata: name: myloadbalancer annotations: service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: private service.kubernetes.io/ibm-load-balancer-cloud-provider-zone: "dal12" service.kubernetes.io/ibm-load-balancer-cloud-provider-vlan: "2234945" 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. loadBalancerIP: 172.21.xxx.xxx
-
可选: 通过在
spec.loadBalancerSourceRanges
字段中指定 IP,使 NLB 服务仅可用于有限范围的 IP 地址。loadBalancerSourceRanges
由集群中的kube-proxy
通过工作程序节点上的 Iptables 规则实现。 更多信息,请参阅 Kubernetes文档。 -
在集群中创建服务。
oc apply -f myloadbalancer.yaml
-
-
验证 NLB 服务是否已成功创建。 可能需要几分钟时间,才能创建该服务并使应用程序可用。
oc describe service myloadbalancer
在输出中,LoadBalancer入口IP 地址是分配给 NLB 服务的便携式 IP 地址:
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
-
如果创建了公共 NLB,请从因特网访问该应用程序。
-
打开首选的 Web 浏览器。
-
输入 NLB 的可移植公共 IP 地址和端口。
http://169.xx.xxx.xxx:8080
-
-
重复步骤 2 - 4,以在每个专区中添加一个 V1.0 NLB。
-
如果选择为 NLB 1.0 服务启用源 IP 保留,请确保通过向应用程序 pod 添加边缘节点亲缘关系,将应用程序 pod 安排到边缘工作程序节点。 应用程序 pod 必须安排到边缘节点才能接收入局请求。
-
可选:LoadBalancer 服务还可使应用程序在服务的 NodePort 上可用。 对于集群内的每个节点,在每个公共和专用 IP 地址上都可以访问 NodePort。 要在使用 NLB 服务时阻止流至 NodePort 的流量,请参阅控制流至网络负载均衡器 (NLB) 或 NodePort 服务的入站流量。
接下来,可以注册 NLB 子域。
在单专区集群中设置 NLB 1.0
开始之前:
- 必须有可用的可移植公共或专用 IP 地址可分配给网络负载均衡器 (NLB) 服务。 有关更多信息,请参阅配置集群的子网。
- Ensure you have the 作家或 "经理""IBM CloudIAM 服务访问角色 for the
default
namespace. - 重新装入集群节点或集群主节点更新包含新的
keepalived
映像时,负载均衡器虚拟 IP 将移至新节点的网络接口。 发生此情况时,必须重新建立与负载均衡器的任何长期连接。 请考虑在应用程序中包含重试逻辑,以便快速尝试重新建立连接。
要在单专区集群中创建 NLB 1.0 服务,请执行以下操作:
-
将应用程序部署到集群。 确保在配置文件的 metadata 部分中添加针对您的部署的标签。 需要使用此标签来标识运行应用程序的所有 pod,以便使它们处于负载平衡中。
-
针对要向公用因特网或专用网络公开的应用程序创建 Load Balancer 服务。
-
创建名为
myloadbalancer.yaml
(举例来说)的服务配置文件。 -
针对要公开的应用程序定义 LoadBalancer 服务。
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>" 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>
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 oc vlan ls --zone <zone>
。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
-
- 可选:要创建专用负载均衡器或要将特定可移植 IP 地址用于公共负载均衡器,请指定要使用的 IP 地址。 该 IP 地址必须位于在注释中指定的 VLAN 上。 如果不指定 IP 地址:
- 如果集群位于公用 VLAN 上,那么将使用可移植的公共 IP 地址。 大多数集群都位于公用 VLAN 上。
- 如果集群仅位于专用 VLAN 上,那么将使用可移植的专用 IP 地址。
用于创建使用专用 VLAN
2234945
上指定 IP 地址的专用 NLB 1.0 服务的示例配置文件:apiVersion: v1 kind: Service metadata: name: myloadbalancer annotations: service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: private service.kubernetes.io/ibm-load-balancer-cloud-provider-vlan: "2234945" 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. loadBalancerIP: 172.21.xxx.xxx
-
可选: 通过在
spec.loadBalancerSourceRanges
字段中指定 IP,使 NLB 服务仅可用于有限范围的 IP 地址。loadBalancerSourceRanges
由集群中的kube-proxy
通过工作程序节点上的 Iptables 规则实现。 更多信息,请参阅 Kubernetes文档。 -
在集群中创建服务。
oc apply -f myloadbalancer.yaml
-
-
验证 NLB 服务是否已成功创建。 可能需要几分钟时间,才能创建该服务并使应用程序可用。
oc 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 1.0 服务启用源 IP 保留,请确保通过向应用程序 pod 添加边缘节点亲缘关系,将应用程序 pod 安排到边缘工作程序节点。 应用程序 pod 必须安排到边缘节点才能接收入局请求。
-
可选:LoadBalancer 服务还可使应用程序在服务的 NodePort 上可用。 对于集群内的每个节点,在每个公共和专用 IP 地址上都可以访问 NodePort。 要在使用 NLB 服务时阻止流至 NodePort 的流量,请参阅控制流至网络负载均衡器 (NLB) 或 NodePort 服务的入站流量。
接下来,可以注册 NLB 子域。
启用源 IP 保留
此功能仅适用于 V1.0 网络负载均衡器 (NLB)。 缺省情况下,V2.0 NLB 中会保留客户机请求的源 IP 地址。
对应用程序的客户机请求发送到集群时,LoadBalancer 服务 pod 会收到该请求。 如果在与负载平衡器服务 pod 相同的工作节点上不存在应用程序 pod,NLB 会将请求转发到不同的工作节点。 包的源 IP 地址将更改为运行 LoadBalancer 服务 pod 的工作程序节点的公共 IP 地址。
要保留客户端请求的原始源 IP 地址,可以在负载平衡器服务中使用 "启用源 IP。 TCP 连接会一直连接到应用程序 pod,以便应用程序可以查看发起方的实际源 IP 地址。 例如,在应用程序服务器必须应用安全性和访问控制策略的情况下,保留客户机的 IP 非常有用。
启用源 IP 后,LoadBalancer 服务 pod 必须将请求转发到仅部署到同一工作程序节点的应用程序 pod。 通常,LoadBalancer 服务 pod 也会部署到应用程序 pod 所部署到的工作程序节点上。 但是,在某些情况下,负载均衡器 pod 和应用程序 pod 可能未安排到同一工作程序节点上:
- 您具有有污点的边缘节点,所以只有 LoadBalancer 服务 pod 才能部署到这些节点。 不允许应用程序 pod 部署到这些节点。
- 集群连接到多个公用或专用 VLAN,但应用程序 pod 可能会部署到仅连接到一个 VLAN 的工作程序节点。 LoadBalancer 服务 pod 可能不会部署到这些工作程序节点,因为 NLB IP 地址连接到的 VLAN 与工作程序节点连接到的不同。
要强制将应用程序部署到 LoadBalancer 服务 pod 也可以部署到的特定工作程序节点,必须将亲缘关系规则和容忍度添加到应用程序部署。
添加边缘节点亲缘关系规则和容忍度
当您使用“将工作节点标记为边缘节点 和”玷污边缘节点 时,负载平衡器服务 pod 只能部署到这些边缘节点,而应用程序 pod 无法部署到边缘节点。 当 NLB 服务启用源 IP 时,边缘节点上的负载平衡器 pod 无法将传入请求转发到其他工作节点上的应用程序 pod。
要强制应用程序 pod 部署到边缘节点,可在应用程序部署中添加边缘节点 亲和规则和 容忍度。
具有边缘节点亲缘关系和边缘节点容忍度的示例部署 YAML 文件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: with-node-affinity
spec:
selector:
matchLabels:
<label_name>: <label_value>
template:
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: dedicated
operator: In
values:
- edge
tolerations:
- key: dedicated
value: edge
...
affinity 和 tolerations 部分都将 dedicated
作为 key
,将 edge
作为 value
。
为多个公用或专用 VLAN 添加亲缘关系规则
集群连接到多个公用或专用 VLAN 时,应用程序 pod 可能会部署到仅连接到一个 VLAN 的工作程序节点。 如果 NLB IP 地址连接到的 VLAN 与这些工作程序节点连接到的不同,那么 LoadBalancer 服务 pod 不会部署到这些工作程序节点。
启用源 IP 后,通过将亲缘关系规则添加到应用程序部署,将应用程序 pod 安排在 NLB 的 IP 地址所在 VLAN 中的工作程序节点上。
开始之前: 访问 Red Hat OpenShift 集群。
-
获取 NLB 服务的 IP 地址。 在 LoadBalancer Ingress 字段中查找该 IP 地址。
oc describe service <loadbalancer_service_name>
-
检索 NLB 服务连接到的 VLAN 标识。
-
列出集群的可移植公用 VLAN。
ibmcloud oc cluster get --cluster <cluster_name_or_ID> --show-resources
示例输出
... Subnet VLANs VLAN ID Subnet CIDR Public User-managed 2234947 10.xxx.xx.xxx/29 false false 2234945 169.36.5.xxx/29 true false
-
在输出的 Subnet VLANs 下,查找与先前检索到的 NLB IP 地址相匹配的子网 CIDR,并记下相应的 VLAN 标识。
例如,如果 NLB 服务 IP 地址为
169.36.5.xxx
,那么上一步的输出示例中的匹配子网为169.36.5.xxx/29
。 该子网连接到的 VLAN 标识为2234945
。
-
-
为上一步中提到的 VLAN ID 在应用程序部署中 添加亲和规则。
例如,如果您有多个 VLAN,但希望应用程序 pod 仅部署到
2234945
公用 VLAN 上的工作程序节点:apiVersion: apps/v1 kind: Deployment metadata: name: with-node-affinity spec: selector: matchLabels: <label_name>: <label_value> template: spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: publicVLAN operator: In values: - "2234945" ...
在示例 YAML 中,affinity 部分将
publicVLAN
作为key
,将"2234945"
作为value
。 -
应用已更新的部署配置文件。
oc apply -f with-node-affinity.yaml
-
验证应用程序 pod 是否已部署到连接至指定 VLAN 的工作程序节点。
-
列出集群中的 pod。 将 "
<selector>
替换为您在应用程序中使用的标签。oc get pods -o wide app=<selector>
示例输出
NAME READY STATUS RESTARTS AGE IP NODE cf-py-d7b7d94db-vp8pq 1/1 Running 0 10d 172.30.xxx.xxx 10.176.48.78
-
在输出中,确定应用程序的 pod。 记下该 pod 所在的工作程序节点的 NODE 标识。
在上一步的输出示例中,应用程序 pod
cf-py-d7b7d94db-vp8pq
位于工作程序节点10.176.48.78
上。 -
列出工作程序节点的详细信息。
oc describe node <worker_node_ID>
示例输出
NAME: 10.xxx.xx.xxx Role: Labels: arch=amd64 beta.kubernetes.io/arch=amd64 beta.kubernetes.io/os=linux failure-domain.beta.kubernetes.io/region=us-south failure-domain.beta.kubernetes.io/zone=dal10 ibm-cloud.kubernetes.io/encrypted-docker-data=true kubernetes.io/hostname=10.xxx.xx.xxx privateVLAN=2234945 publicVLAN=2234967 ...
-
在输出的 Labels 部分中,验证公用或专用 VLAN 是否为在先前步骤中指定的 VLAN。
-