zoukankan      html  css  js  c++  java
  • Kubernetes 负载均衡与 Istio 流量分配对各协议的支持

    前言

    Kubernetes 的负载均衡,和 Istio(服务网格)流量分配,对使用的网络协议/客户端都是有些要求的,不是说随便一个网络协议、随便一个客户端都能直接通过 Kubernetes 实现负载均衡/流量分配。

    Kubernetes 集群的服务发现与内部负载均衡

    Kubernetes 的内部服务发现是基于 DNS 解析实现的,默认情况下解析到的是一个稳定的虚拟 IP 地址(Service),该虚拟 IP 再通过 kube_proxy 将流量均衡到后端的 Pods 上。
    Pod 的 Ip 可能会随着 Pod 的重建而变动,但 Service 的 IP 是稳定的。

    上面讲到的这个稳定 IP 地址,就是一个 ClusterIP 类型的 Service,这个 Service 根据 kube-proxy 的代理模式的不同,有不同的表现:

    1. userspace 模式(最老,性能差)
    2. iptables 模式(性能适中,当前默认):通过 Iptables 实现的一个四层(TCP)NAT,kube_proxy 只负责创建 iptables 的 nat 规则,不负责流量转发。
      • 这种模式下流量的负载均衡很差劲。往往造成多个副本时“一 Pod 有难,多 Pod 围观”。。。
    3. ipvs 模式(最新、性能与负载均衡兼得):可通过 --ipvs-scheduler 指定负载均衡算法,有多种算法可选,详见 ipvs-based-in-cluster-load-balancing

    这个代理模式是通过 kube-proxy 参数 --proxy-mode 指定的,

    另外也可以使用 Headless Service,通过 DNS 的 SRV 记录将 Pod IPs 直接暴露给应用,由应用自己进行负载均衡。这种方式直接绕过了 Service 的虚拟 IP 与负载均衡功能。

    Istio 流量切分

    Istio 的流量切分有三种方法:

    1. 使用 http headers 中的 host 作为元信息进行流量切分(http/grpc/websocket)
    2. 使用 tcp 的 ip 和 port 进行流量分配
    3. 使用 tls 协议的 SNI 值进行流量分配

    因此支持得最好的显然只有 http/tls,其他协议基本只能在第四层应用层(TCP)进行流量分配,比较鸡肋了。

  • 相关阅读:
    阅读编程书籍的方法(转)
    Java 面向对象概念
    Python 统计文本中单词的个数
    Python 学习笔记(五)杂项
    在CentOS7环境下部署TiDB
    前端学习之路:第三章、来做个天气应用吧(1)
    前端学习之路:第二章、Vue-router和axios
    前端学习之路:第一章、开始使用Vue
    在Docker下搭建Apache+PHP+mysql环境的过程记录
    在基于Windows系统的PHP后端中引入Redis
  • 原文地址:https://www.cnblogs.com/kirito-c/p/12669018.html
Copyright © 2011-2022 走看看