使用直连 Pod 模式 LoadBalancer Service
使用场景
默认模式 LoadBalancer Service 以集群节点的 IP 地址作为其后端服务器。 当访问默认 LoadBalancer Service 时,请求会被百度智能云提供的负载均衡服务(BLB)转发到节点上,并进一步通过 iptables 或 IPVS 转发到具体的 Pod 上。 在这个过程中请求经历了两次负载均衡操作。
直连 Pod 模式 LoadBalancer Service 以 Pod 的 IP 地址作为其后端服务器。 当访问直连 Pod 模式 LoadBalancer Service 时,Service ,请求只需经过一次负载均衡操作即可被转发到具体的 Pod 上。 这种模式的 Service 具有以下优势:
- 保留请求的源 IP;
- 少一次请求转发,系统具有更高的性能。
注意:不允许在 Pod 直连模式的 LoadBalancer Service 和默认模式的 LoadBalancer Sercvice之间相互转换。如果您希望将一种 LoadBalancer Service 转变为另一种 LoadBalancer Service,请先删除旧的再部署新的。
使用限制
直连 Pod 模式 LoadBalancer Service 后端默认最多关联 50 个 Pod。 如果无法满足需求,请提交工单申请以开放后端数量限制。
使用直连 Pod 模式 LoadBalancer Service 的集群应同时满足以下 2 个条件:
集群版本
新版 CCE 集群(集群 ID 以 cce-
为前缀)集群支持此功能。
旧版 CCE 集群(集群 ID 以 c-
为前缀)集群不支持此功能。
容器网络类型
如果您的集群的容器网卡类型为 veth 或 kubenet ,您无需对集群配置信息进行修改即可部署 CCE-LB-Controller 并创建直连 Pod LoadBalancer Service。
如果您的集群的容器网络类型为 IPVlan,您需要先设置名为 cce-ip-masq-agent
的 ConfigMap 的 masqOutBound
和 masqOutBoundIPv6
属性为 false。操作流程如下:
使用Kubectl连接集群,输入 kubectl describe configmap cce-ip-masq-agent -n kube-system
指令,您可能会得到如下输出,此时 masqOutBound
与 masqOutBoundIPv6
为 true:
# kubectl describe configmap cce-ip-masq-agent -n kube-system
Name: cce-ip-masq-agent
Namespace: kube-system
Labels: addonmanager.kubernetes.io/mode=EnsureExists
Annotations:
Data
====
config:
----
nonMasqueradeCIDRs:
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16
- fc00::/7
masqOutBound: true
masqOutBoundIPv6: true
masqLinkLocal: false
masqLinkLocalIPv6: false
resyncInterval: 60s
Events: <none>
输入 kubectl edit configmap cce-ip-masq-agent -n kube-system
指令,然后修改 masqOutBound
与 masqOutBoundIPv6
为 false 并保存,cce-ip-masq-agent 配置信息将会自动更新,此时再次输入 kubectl describe configmap cce-ip-masq-agent -n kube-system
指令,您可能会得到如下输出,此时 masqOutBound
与 masqOutBoundIPv6
为 false:
# kubectl describe configmap cce-ip-masq-agent -n kube-system
Name: cce-ip-masq-agent
Namespace: kube-system
Labels: addonmanager.kubernetes.io/mode=EnsureExists
Annotations:
Data
====
config:
----
nonMasqueradeCIDRs:
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16
- fc00::/7
masqOutBound: false
masqOutBoundIPv6: false
masqLinkLocal: false
masqLinkLocalIPv6: false
resyncInterval: 60s
Events: <none>
操作步骤
创建直连 Pod 模式 LoadBalancer Service 时需要首先部署 CCE-LB-Controller,然后再创建 LoadBalancer Service。
部署 CCE-LB-Controller
目前 CCE-LB-Controller 已经登录百度云 Helm 模板库,可以通过 Helm 来为集群部署 CCE-LB-Controller。
登录百度云控制台,进入『容器引擎CCE - Helm - Helm模板 - 百度云模板』页面,搜索cce-lb-controller
,可看到如下页面
点击右侧的『安装』,输入实例名称和部署集群,并点击确定,即可完成 CCE-LB-Controller 的部署。
创建直连 Pod 模式的 LoadBalancer Service
创建直连 Pod 模式 LoadBalancer Service 时,需要给对应的 LoadBalancer Service 的 annotations
属性添加一条 service.beta.kubernetes.io/cce-load-balancer-backend-type: "eni"
配置。
如果没有该条 annotation,后台将会创建默认模式 LoadBalancer Service。
直连 Pod 模式 LoadBalancer Service 示例 yaml 如下所示:
apiVersion: v1
kind: Service
metadata:
name: pod-direct-service-example
annotations:
prometheus.io/scrape: "true"
service.beta.kubernetes.io/cce-load-balancer-backend-type: "eni"
spec:
selector:
app: nginx
type: LoadBalancer
externalTrafficPolicy: Cluster
sessionAffinity: None
ports:
- name: nginx
protocol: TCP
port: 80
targetPort: 80