容器服务 Kubernetes 版 ACK 集群中的混合云节点与中心云专有网络 VPC 位于不同网络域,可通过网络型负载均衡 NLB 类型的 Service 将本地 IDC 混合云节点上的容器服务对外暴露。本文介绍部署 NLB 类型 Service 所需的网络前提、配置方式、流量策略和使用限制,实现访问流量直达混合云节点上的业务 Pod。
背景信息
ACK 的混合云节点池可将本地 IDC 的服务器作为节点接入集群,集群中的 Pod 既可以部署在云上 ECS 节点,也可以部署在 IDC 内的混合云节点。混合云节点与中心云 VPC 属于不同的网络域,两者之间通过专线实现三层内网互通。
NLB 实例部署在 VPC 内的交换机上,默认使用 Instance 类型服务器组挂载 VPC 内的 ECS 等云上资源。混合云节点上的 Pod IP 不在 VPC 网段内,无法通过默认的 Instance 类型服务器组直接转发。为 NLB 类型 Service 添加 service.beta.kubernetes.io/backend-type: "eni" 和 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-server-group-type: "Ip" 两个 Annotation 后,CCM 会将 Pod IP 直接注册到 NLB 的 IP 类型服务器组,配合专线路由即可让四层流量直达混合云节点上的业务 Pod。
混合云节点上的服务通过 NLB 对外暴露的流量路径如下图所示。
与云端应用使用负载均衡类型 Service 暴露服务的方式相比,混合云节点场景的差异在于 NLB 的后端不是云上节点,而是 IDC 内混合云节点上的 Pod。云端应用、边缘应用分别如何通过负载均衡类型的 Service 暴露服务,以及两种方式的对比,请参见使用负载均衡类型的Service暴露应用。
NLB 类型 Service 面向四层协议,每个 Service 对应一个独立的 NLB 监听和服务器组。如果业务 Pod 也需要按域名、路径进行七层转发,或需要复用证书、灰度发布等能力,可使用 ALB Ingress 承载入口,请参见使用 ALB Ingress 对外暴露混合云节点服务。
本文只说明混合云节点场景下部署 NLB 类型 Service 需要额外关注的网络前提、Annotation 配置、流量策略和使用限制。NLB 实例、监听和服务器组的创建方式,请参见通过Annotation配置网络型负载均衡NLB。
网络前提
创建 NLB 类型 Service 前,必须确保云上资源可以访问本地 IDC 混合云节点上的 Pod,NLB 依赖这条访问链路将流量转发至 Pod。如果云上与本地 IDC 混合云节点之间的网络尚未打通,需要先完成网络打通,操作方法请参见使用Terway Hybrid网络插件,并确认以下条件:
中心云 VPC 与本地 IDC 已通过专线实现三层内网互通,VPC 路由表、专线网关和 IDC 侧交换机均已配置双向路由。IDC 侧的网元配置请参见混合云节点池场景的网元配置。
云上资源已能访问本地 Pod:混合云节点使用 Terway Hybrid 网络插件,并按其说明完成云上访问本地 Pod 的配置。Underlay 模式下需要通过 BGP 将容器网段路由宣告到 IDC 交换机,Overlay 模式下需安装 ack-hybrid-nodes-gateway 组件。
NLB 实例所在的 VPC 与混合云节点容器网段之间路由可达,确保 IP 类型服务器组中的 Pod IP 能够被 NLB 正常探测和转发。
为 NLB 类型 Service 添加 Annotation
配置前,确认以下约束:
Service 中
spec.loadBalancerClass需要指定为alibabacloud.com/nlb,不指定时默认创建传统型负载均衡 CLB。该字段在 Service 创建后不支持修改,CLB 与 NLB 资源无法相互转换。以下两个 Annotation 必须同时配置,只配置其中一个时,后端挂载对象与服务器组类型不一致,Pod 无法作为 NLB 后端。
创建 NLB 类型 Service 的操作方法,请参见通过使用自动创建负载均衡的服务公开应用文档。混合云节点与中心云的 VPC 处于不同网络域,NLB 后端需要直接指向 Pod,因此创建时需要把以下两个 Annotation 添加到 metadata.annotations。两者分别声明后端挂载对象和后端服务器组类型。
Annotation | 说明 |
| 将 Pod 直接挂载为 NLB 的后端服务器。 |
| 将 NLB 的后端服务器组类型设置为 IP 类型,使后端以 Pod IP 的形式注册。 |
配置生效后,NLB 将流量转发至本地 IDC 混合云节点上的业务 Pod,这些 Pod 上的应用即通过 NLB 对外暴露。
这两个 Annotation 的完整字段说明,以及 NLB 类型 Service 支持的其他 Annotation,请参见通过Annotation配置网络型负载均衡NLB。
使用限制
以下限制中,NLB 通用限制请参见通过Annotation配置网络型负载均衡NLB:
暂不支持通过容器服务控制台管理 NLB,需要使用 kubectl 命令操作。
服务器组类型以创建时的取值为准,同一服务器组中不能混用 IP 类型和 Instance 类型的后端,如需调整,需新建 Service。
NLB 后端为 IDC 混合云节点上的 Pod IP,如果云端无法访问这些 Pod IP,NLB 健康检查会失败,后端服务器将不可用。请先完成使用Terway Hybrid网络插件中的网络打通配置。
流量策略
Service 的外部流量策略 externalTrafficPolicy 仅对 LoadBalancer 和 NodePort 类型的 Service 生效,用于控制来自外部的请求是转发到集群内任意节点上的 Pod(Cluster),还是只转发到接收请求的节点上的 Pod(Local)。
NLB 使用 IP 类型服务器组并以 Pod IP 为后端时,NLB 直接把四层请求转发到 Pod IP,不经过节点的 kube-proxy 端口转发,因此这条链路不需要设置外部流量策略 externalTrafficPolicy。
如果 Service 使用 Instance 类型服务器组(例如将节点作为后端),请求会先到达节点再转发到 Pod。使用 Instance 类型服务器组时,建议将 externalTrafficPolicy 设置为 Cluster:设置为 Local 时,只有接收请求的节点上存在对应 Pod 才会转发,混合云节点与云上节点混合部署时容易因节点上没有对应 Pod 而访问失败。
示例
以下 YAML 创建名为 coffee 的 Deployment 和 NLB 类型 Service coffee-svc。Deployment 通过 toleration 容忍 nodepool-type=hybridcloud:NoSchedule污点,并通过 nodeSelector 匹配节点标签 alibabacloud.com/nodepool-type: hybridcloud,将 Pod 调度到混合云节点;Service 通过 loadBalancerClass 指定创建 NLB,并通过两个 Annotation 把 Pod 直接注册为 NLB 后端。
本文示例会创建 NLB 实例,NLB 实例按量计费,计费组成和价格请参见NLB计费。如果 NLB 为公网类型,还会使用弹性公网 IP(EIP),并产生 EIP 保有费和公网网络费用,计费规则请参见弹性公网IP计费概述。不再使用该服务时,执行 kubectl delete svc coffee-svc 删除 Service,由其自动创建的 NLB 实例会被一并释放,避免持续产生费用。
apiVersion: apps/v1
kind: Deployment
metadata:
name: coffee
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: coffee
template:
metadata:
labels:
app: coffee
spec:
containers:
- name: coffee
image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginxdemos:latest
ports:
- containerPort: 80
# 添加 toleration 使其可部署至混合云节点
tolerations:
- effect: NoSchedule
key: nodepool-type
operator: Equal
value: hybridcloud
# 使用 nodeSelector 将 Pod 定向调度到混合云节点
nodeSelector:
alibabacloud.com/nodepool-type: hybridcloud
---
apiVersion: v1
kind: Service
metadata:
name: coffee-svc
namespace: default
annotations:
# 将 Pod 直接挂载为 NLB 后端
service.beta.kubernetes.io/backend-type: "eni"
# 服务器组类型设置为 IP 类型,后端以 Pod IP 的形式注册
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-server-group-type: "Ip"
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
selector:
app: coffee
# 指定创建 NLB,不指定时默认创建 CLB
loadBalancerClass: "alibabacloud.com/nlb"
type: LoadBalancer创建完成后,执行 kubectl get svc coffee-svc查看 Service 的 EXTERNAL-IP(如果显示为 NLB 实例域名而不是 IP,请 ping 该域名解析出对应的公网 IP,或在 NLB 控制台目标实例的监听页面查看监听端口)。在 NLB 控制台查看对应监听的后端服务器组,确认后端服务器为混合云节点上的 Pod IP。NLB 类型 Service 的创建步骤,请参见通过使用自动创建负载均衡的服务公开应用。