k8s svc的externalTrafficPolicy属性 跨node不通 保留客户端源IP
起因
k8s上面的一个 pod 调用一个 slb 的 service,时通时不通,
现象为:当 pod 调用 svc 的 endpoint 和他同一个 node 就通,不同 node 就超时不通。
后来发现是 svc 的属性 externalTrafficPolicy 设置为 local 引起的
externalTrafficPolicy 查看帮助
这个 属性的目的是 保留 客户单 源 IP 的。详见【官网介绍】
[root@tmp opt]# kubectl explain svc.spec.externalTrafficPolicy KIND: Service VERSION: v1 FIELD: externalTrafficPolicy <string> DESCRIPTION: externalTrafficPolicy denotes if this Service desires to route external traffic to node-local or cluster-wide endpoints. "Local" preserves the client source IP and avoids a second hop for LoadBalancer and Nodeport type services, but risks potentially imbalanced traffic spreading. "Cluster" obscures the client source IP and may cause a second hop to another node, but should have good overall load-spreading.
在容器中看到的源IP可能不是客户端的原始源IP。要启用客户端IP保留, 可以在 service 的 spec 中配置下面的字段
service.spec.externalTrafficPolicy
是否保留源IP
cluster :默认 将外部流量路由到 cluster 范围。
当时当外部流量留到 node1 时候,发现 endpoint 在node2 上,那么他会发生第二跳,此时源IP就变成了 node1
local:将外部流量仅路由到 node本机的endpoint,而不会被转发到其他节点,本机没有直接丢弃
Local保留了客户端源IP,并避免了LoadBalancer和NodePort类型服务的第二跳,但是弊端也是显而易见的。
service.spec.healthCheckNodePort
指定服务的运行状况检查的nodePort
默认 healthCheckNodePort 由服务API自动随机创建。
手动指定healthCheckNodePort:则type必须为LoadBalancer且externalTrafficPolicy设置为Local时,它才有效
相关文章:
共 0 条评论