负载均衡(LoadBalancer) 集群内使用ELB地址无法访问Service说明 当LoadBalancer Service设置了服务亲和为节点级别,即externalTrafficPolicy取值为Local时,在使用中可能会碰到从集群内部(节点上或容器中)使用ELB地址访问不通的情况,回显类似如下内容: upstream connect error or disconnect/reset before headers. reset reason: connection failure 这是由于Kubernetes在创建LoadBalancer Service时,kubeproxy会把ELB的访问地址作为ExternalIP添加到iptables或IPVS中。如果客户端从集群内部发起访问ELB地址的请求,该地址会被认为是服务的ExternalIP,被kubeproxy直接转发,而不再经过集群外部的ELB。 当externalTrafficPolicy的取值为Local时,在不同容器网络模型和服务转发模式下,情况会有所不同,详情如下: Server Client 容器隧道集群(IPVS) VPC集群(IPVS) 容器隧道集群(iptables) VPC集群(iptables) :::::: 节点访问类型Service 同节点 OK,Pod容器所在节点通,其他不通 OK,访问Pod容器所在节点通 OK,访问Pod容器所在节点通 OK,访问Pod容器所在节点通 节点访问类型Service 跨节点 OK,Pod容器所在节点通,其他不通 OK,访问Pod容器所在节点通 OK,访问Pod容器所在节点通,访问本节点IP+访问端口通;其他不通 OK,访问Pod容器所在节点通,访问本节点IP+访问端口通;其他不通 节点访问类型Service 同节点容器 OK,Pod容器所在节点通,其他不通 OK,访问Pod容器所在节点不通 OK,访问Pod容器所在节点通 OK,访问Pod容器所在节点不通 节点访问类型Service 跨节点容器 OK,Pod容器所在节点通,其他不通 OK,访问Pod容器所在节点通 OK,访问Pod容器所在节点通 OK,访问Pod容器所在节点通 独享型负载均衡类型Service 同节点 公网通,私网不通 公网通,私网不通 公网通,私网不通 公网通,私网不通 独享型负载均衡类型Service 同节点容器 公网通,私网不通 公网通,私网不通 公网通,私网不通 公网通,私网不通 nginxingress插件的service为Local级别独享型 同节点 公网通,私网不通 公网通,私网不通 公网通,私网不通 公网通,私网不通 nginxingress插件的service为Local级别独享型 同节点容器 公网通,私网不通 公网通,私网不通 公网通,私网不通 公网通,私网不通 ( 推荐 )在集群内部访问使用Service的ClusterIP或服务域名访问。 将Service的externalTrafficPolicy设置为Cluster,即集群级别服务亲和。不过需要注意这会影响源地址保持。 apiVersion: v1 kind: Service metadata: annotations: kubernetes.io/elb.class: union kubernetes.io/elb.autocreate: '{"type":"public","bandwidthname":"ccebandwidth","bandwidthchargemode":"bandwidth","bandwidthsize":5,"bandwidthsharetype":"PER","eiptype":"5bgp","name":"james"}' labels: app: nginx name: nginx spec: externalTrafficPolicy: Cluster ports: name: service0 port: 80 protocol: TCP targetPort: 80 selector: app: nginx type: LoadBalancer 使用Service的passthrough特性,使用ELB地址访问时绕过kubeproxy,先访问ELB,经过ELB再访问到负载。 说明 独享型负载均衡配置passthrough后,在工作负载同节点和同节点容器内无法通过Service访问。 1.15及以下老版本集群暂不支持该能力。 IPVS网络模式下,对接同一个ELB的Service需保持passthrough设置情况一致。 apiVersion: v1 kind: Service metadata: annotations: kubernetes.io/elb.passthrough: "true" kubernetes.io/elb.class: union kubernetes.io/elb.autocreate: '{"type":"public","bandwidthname":"ccebandwidth","bandwidthchargemode":"bandwidth","bandwidthsize":5,"bandwidthsharetype":"PER","eiptype":"5bgp","name":"james"}' labels: app: nginx name: nginx spec: externalTrafficPolicy: Local ports: name: service0 port: 80 protocol: TCP targetPort: 80 selector: app: nginx type: LoadBalancer