文档首页> 云容器引擎 CCE> 常见问题> 网络管理> 网络异常> 集群内部无法使用ELB地址访问负载
更新时间:2022-05-06 GMT+08:00
分享

集群内部无法使用ELB地址访问负载

问题现象

在集群内部(节点上或容器中),使用ELB地址无法访问。

问题原因

当LoadBalancer Service设置了服务亲和为节点级别,即externalTrafficPolicy取值为Local时,在使用中可能会碰到从集群内部(节点上或容器中)使用ELB地址访问不通的情况。

这是因为创建LoadBalancer Service时,kube-proxy会把ELB的访问地址(external-ip)添加到iptables或IPVS中,当在集群内部访问ELB地址时不会经过ELB,而是kube-proxy直接转发。不同容器网络模型和服务转发模式下会有情况不同。

解决办法

解决这个问题通常有如下办法:

  • 推荐)在集群内部访问使用Service的ClusterIP或服务域名访问。
  • 将Service的externalTrafficPolicy设置为Cluster,即集群级别服务亲和。不过需要注意这会影响源地址保持。
    apiVersion: v1 
    kind: Service
    metadata: 
      annotations:   
        kubernetes.io/elb.class: union
        kubernetes.io/elb.autocreate: '{"type":"public","bandwidth_name":"cce-bandwidth","bandwidth_chargemode":"bandwidth","bandwidth_size":5,"bandwidth_sharetype":"PER","eip_type":"5_bgp","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的pass-through特性,使用ELB地址访问时绕过kube-proxy,先访问ELB,进过ELB再访问到负载。具体请参见LoadBalancer类型Service使用pass-through能力
    apiVersion: v1 
    kind: Service 
    metadata: 
      annotations:   
        kubernetes.io/elb.pass-through: "true"
        kubernetes.io/elb.class: union
        kubernetes.io/elb.autocreate: '{"type":"public","bandwidth_name":"cce-bandwidth","bandwidth_chargemode":"bandwidth","bandwidth_size":5,"bandwidth_sharetype":"PER","eip_type":"5_bgp","name":"james"}'
      labels: 
        app: nginx 
      name: nginx 
    spec: 
      externalTrafficPolicy: Local
      ports: 
      - name: service0 
        port: 80
        protocol: TCP 
        targetPort: 80
      selector: 
        app: nginx 
      type: LoadBalancer
分享:

网络异常 所有常见问题

more

关闭导读