上云无忧 > 文档中心 > 百度智能云容器引擎服务 CCE 使用直连 Pod 模式 LoadBalancer Service
容器引擎服务CCE
百度智能云容器引擎服务 CCE 使用直连 Pod 模式 LoadBalancer Service

文档简介:
直连 Pod 模式 LoadBalancer Service 以 Pod 的 IP 地址作为其后端服务器。 当访问直连 Pod 模式 LoadBalancer Service 时,Service ,请求只需经过一次负载均衡操作即可被转发到具体的 Pod 上。 这种模式的 Service 具有以下优势: 保留请求的源 IP; 少一次请求转发,系统具有更高的性能。 Pod 层面更均匀的负载均衡。
*此产品及展示信息均由百度智能云官方提供。免费试用 咨询热线:400-826-7010,为您提供专业的售前咨询,让您快速了解云产品,助您轻松上云! 微信咨询
  免费试用、价格特惠

传统模式与直连模式对比

特性

传统模式 LoadBalancer Service 以集群节点的 IP 地址作为 BLB 的后端服务器。 当访问传统模式 LoadBalancer Service 时,请求会被百度智能云提供的负载均衡服务(BLB)转发到节点上,并在节点中进一步通过 iptables 或 IPVS 转发到具体的某一个 Pod 上。 在这个过程中请求经历了 2 次负载均衡操作。

直连 Pod 模式 LoadBalancer Service 以 Pod 的 IP 地址作为其后端服务器。 当访问直连 Pod 模式 LoadBalancer Service 时,Service ,请求只需经过一次负载均衡操作即可被转发到具体的 Pod 上。 这种模式的 Service 具有以下优势:

  • 保留请求的源 IP;
  • 少一次请求转发,系统具有更高的性能。
  • Pod 层面更均匀的负载均衡

性能

针对两种模式的 LoadBalancer Service,我们对其平均网络延时进行了测试。根据测试结果,直连 Pod 的 LoadBalancer Service 平均可以减少约 10% 的网络时延。

使用前提条件

使用直连 Pod 模式 LoadBalancer Service 的集群应同时满足集群版本、插件、容器网络类型 3 个方面的前提条件:

确认集群版本

新版 CCE 集群(集群 ID 以 cce- 为前缀)集群支持此功能。
旧版 CCE 集群(集群 ID 以 c- 为前缀)集群不支持此功能。

确认 CCE LB Controller 插件

集群中应当部署有 CCE LB Controller 插件。
查看集群控制台的『工作负载-部署列表』界面,在 kube-system 命名空间下存在 cce-lb-controller 时支持此功能,如图所示。

如果集群并未部署该插件,可以采用如下方式部署:
登录百度云控制台,进入『容器引擎CCE - Helm - Helm模板 - 百度云模板』页面,搜索cce-lb-controller,可看到如下页面

点击进入可以看到如下页面,选择 1.0.0 版本 并安装。请留意安装正确的版本。

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

确认容器网卡类型

  • 网卡类型为 veth 或 kubenet 时,满足要求。
  • 网卡类型为 IPVLAN 时,需要设置 ConfigMap cce-ip-masq-agent 的 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 使用应用型 BLB,其后端默认最多关联 50 个 Pod。 如果无法满足需求,请提交工单申请开放后端数量限制。

开放安全组端口

当 CCE 集群的容器网络模式为 VPC 网络 时,需要为集群节点绑定的安全组中为目的端口 Service TargetPort 放通流量。否则数据包无法到达 Pod。

当 CCE 集群的容器网络模式为 VPC-CNI 时,需要在 ENI 弹性网卡绑定的安全组中为目的端口 Service TargetPort 放通流量。否则数据包无法到达 Pod。

创建 Service

创建直连 Pod 模式 LoadBalancer Service 时,需要为 annotations 属性添加 service.beta.kubernetes.io/cce-load-balancer-backend-type: "eni"。
示例 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 sessionAffinity: None ports: - name: nginx protocol: TCP port: 80 targetPort: 80

常见问题

Pod 零中断滚动更新

使用直连 Pod 的 LB Service 在 Pod 滚动更新时可能服务中断问题。
原因
一个 Pod 在被终止时,会发生如下事件:

  1. Pod 进入 Terminating 状态;
  2. Pod 从 Endpoints 中被摘除;LB Controller 监听到 Endpoints 变化,并从应用型 BLB 中摘除该 Pod 后端;
  3. Pod 销毁;
    其中2,3步是并行执行的。当 Pod 销毁后,LB Controller 仍未将 Pod 摘除时,就可能会有流量被转发到被销毁的 Pod,导致服务中断。
    解决方法
    为 Pod 设置 preStopHook,睡眠一段时间(一般为 30 秒),待到应用型 BLB 将 Pod 摘除后再销毁。
    参考如下:
lifecycle: preStop: exec: command: ["sleep", "30"]

相似文档
  • Ingress 是 Kubernetes 提供的一种 7 层流量接入方式,它通过连接外部负载均衡与容器内部服务的方式对流量进行管理,相比 LoadBalancer Service,Ingress 可以简化主机对外开放端口的管理,同时利用外部负载的能力提供更完善的路由和安全规则,详情参考官网说明:Kubernetes Ingress。
  • 本文档介绍如何通过YAML创建和管理CCE Ingress。 创建Ingress Controller资源: 使用以下yaml内容创建Ingress Controller: kubectl create -f ingress-controller.yaml ingress-controller.yaml 如下所示: apiVersion: rbac.authorization.k8s.io/v1
  • 本文介绍如何利用百度云容器服务的Ingress功能,实现蓝绿发布。 背景信息: 灰度及蓝绿发布是为新版本创建一个与老版本完全一致的生产环境,在不影响老版本的前提下,按照一定的规则把部分流量切换到新版本,当新版本试运行一段时间没有问题后,将用户的全量流量从老版本迁移至新版本。
  • 本文介绍使用 Nginx Ingress 作为 Ingress 的实现方式。 Kubernetes Ingress 除了 CCE Ingress 实现之外,也可以使用 Kubernetes 社区的 Nginx Ingress实现。 Nginx 支持反向代理与负载均衡器等功能。 Nginx Ingress Controller 是 Ingress 控制器,使用 Nginx 实现反向代理功能,并通过解析集群中的 Ingress 来配置转发规则。
  • 对于 cce-ingress-nginx-controller 组件有 2 处位置可以对组件参数或 Ingress 资源进行配置。 我们可以在组件的 ConfigMap 配置组件的全局运行参数,或是在 Ingress Annotation 中对某个 Ingress 或是 Host、Rule 的配置进行修改。
官方微信
联系客服
400-826-7010
7x24小时客服热线
分享
  • QQ好友
  • QQ空间
  • 微信
  • 微博
返回顶部