使用直连 Pod 模式 LoadBalancer Service
所有文档

          容器引擎 CCE

          使用直连 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 的 masqOutBoundmasqOutBoundIPv6 属性为 false。操作流程如下:

          使用Kubectl连接集群,输入 kubectl describe configmap cce-ip-masq-agent -n kube-system 指令,您可能会得到如下输出,此时 masqOutBoundmasqOutBoundIPv6 为 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 指令,然后修改 masqOutBoundmasqOutBoundIPv6 为 false 并保存,cce-ip-masq-agent 配置信息将会自动更新,此时再次输入 kubectl describe configmap cce-ip-masq-agent -n kube-system 指令,您可能会得到如下输出,此时 masqOutBoundmasqOutBoundIPv6 为 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,可看到如下页面

          helm.png

          点击右侧的『安装』,输入实例名称和部署集群,并点击确定,即可完成 CCE-LB-Controller 的部署

          helminstall.png

          创建直连 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
          上一篇
          通过 YAML 创建 LoadBalancer Service
          下一篇
          通过 CCE 使用 K8S Ingress