From 6eefd9380aa282eb2e00f89d3dee9c391404ad93 Mon Sep 17 00:00:00 2001 From: congfairy Date: Tue, 11 Dec 2018 16:56:50 +0800 Subject: [PATCH 01/11] zh_trans: /blog/_posts/2018-07-09-IPVS-In-Cluster-Load-Balancing.md --- ...18-07-09-IPVS-In-Cluster-Load-Balancing.md | 402 ++++++++++++++++++ 1 file changed, 402 insertions(+) create mode 100644 content/cn/blog/_posts/2018-07-09-IPVS-In-Cluster-Load-Balancing.md diff --git a/content/cn/blog/_posts/2018-07-09-IPVS-In-Cluster-Load-Balancing.md b/content/cn/blog/_posts/2018-07-09-IPVS-In-Cluster-Load-Balancing.md new file mode 100644 index 0000000000..1f0fee7560 --- /dev/null +++ b/content/cn/blog/_posts/2018-07-09-IPVS-In-Cluster-Load-Balancing.md @@ -0,0 +1,402 @@ +--- +title: 基于IPVS的集群内部负载均衡 +cn-approvers: +- congfairy +layout: blog +title: 'IPVS-Based In-Cluster Load Balancing Deep Dive' +date: 2018-07-09 +--- + + + +作者: Jun Du(华为), Haibin Xie(华为), Wei Liang(华为) + +注意: 这篇文章出自系列深度文章介绍Kubernetes 1.11的新特性 + + + +介绍 + +根据Kubernetes 1.11发布的博客文章, 我们宣布基于IPVS的集群内部服务负载均衡已达到 一般可用性。 在这篇博客中,我们将带您深入了解该功能。 + + + +什么是IPVS? + +IPVS (IP Virtual Server)是在Netfileter上层构建的,并作为Linux内核的一部分,实现传输层负载均衡。 + +IPVS集成在LVS(Linux虚拟服务器)中,它在主机上运行,并在物理服务器集群前作为负载均衡器。IPVS可以将基于TCP和UDP服务的请求定向到真实服务器,并使真实服务器的服务在单个IP地址上显示为虚拟服务。 因此,IPVS自然支持Kubernetes服务。 + + + +为什么为Kubernetes选择IPVS? + +随着Kubernetes的使用增长,其资源的可扩展性变得越来越重要。特别是,服务的可扩展性对于运行大型工作负载的开发人员/公司采用Kubernetes至关重要。 + +Kube-proxy是服务路由的构建块,它依赖于经过强化攻击的iptables来实现支持核心的服务类型,如ClusterIP和NodePort。 但是,iptables难以扩展到成千上万的服务,因为它纯粹是为防火墙而设计的,并且基于内核规则列表。 + +尽管Kubernetes在版本v1.6中已经支持5000个节点,但使用iptables的kube-proxy实际上是将集群扩展到5000个节点的瓶颈。 一个例子是,在5000节点集群中使用NodePort服务,如果我们有2000个服务并且每个服务有10个pod,这将在每个工作节点上至少产生20000个iptable记录,这可能使内核非常繁忙。 + +另一方面,使用基于IPVS的集群内服务负载均衡可以为这种情况提供很多帮助。 IPVS专门用于负载均衡,并使用更高效的数据结构(哈希表),允许几乎无限的规模扩张。 + + + +基于IPVS的Kube-proxy + +参数更改 + +参数: --proxy-mode 除了现有的用户空间和iptables模式,IPVS模式通过--proxy-mode = ipvs进行配置。 它隐式使用IPVS NAT模式进行服务端口映射。 + + + +参数: --ipvs-scheduler + +添加了一个新的kube-proxy参数来指定IPVS负载均衡算法,参数为--ipvs-scheduler。 如果未配置,则默认为round-robin算法(rr)。 + +- rr: round-robin +- lc: least connection +- dh: destination hashing +- sh: source hashing +- sed: shortest expected delay +- nq: never queue + +将来,我们可以实现特定于服务的调度程序(可能通过注释),该调度程序具有更高的优先级并覆盖该值。 + + + +参数: --cleanup-ipvs 类似于 --cleanup-iptables 参数,如果为true,则清除在IPVS模式下创建的IPVS配置和IPTables规则。 + +参数: --ipvs-sync-period 刷新IPVS规则的最大间隔时间(例如'5s','1m')。 必须大于0。 + +参数r: --ipvs-min-sync-period 刷新IPVS规则的最小间隔时间间隔(例如'5s','1m')。 必须大于0。 + + + +参数: --ipvs-exclude-cidrs 清除IPVS规则时IPVS代理不应触及的CIDR的逗号分隔列表,因为IPVS代理无法区分kube-proxy创建的IPVS规则和用户原始规则 IPVS规则。 如果您在环境中使用IPVS proxier和您自己的IPVS规则,则应指定此参数,否则将清除原始规则。 + + + +设计注意事项 + +IPVS服务网络拓扑 + +创建ClusterIP类型服务时,IPVS proxier将执行以下三项操作: + +- 确保节点中存在虚拟接口,默认为kube-ipvs0 +- 将服务IP地址绑定到虚拟接口 +- 分别为每个服务IP地址创建IPVS虚拟服务器 + + + +举个例子: + + # kubectl describe svc nginx-service + Name: nginx-service + ... + Type: ClusterIP + IP: 10.102.128.4 + Port: http 3080/TCP + Endpoints: 10.244.0.235:8080,10.244.1.237:8080 + Session Affinity: None + + # ip addr + ... + 73: kube-ipvs0: mtu 1500 qdisc noop state DOWN qlen 1000 + link/ether 1a:ce:f5:5f:c1:4d brd ff:ff:ff:ff:ff:ff + inet 10.102.128.4/32 scope global kube-ipvs0 + valid_lft forever preferred_lft forever + + # ipvsadm -ln + IP Virtual Server version 1.2.1 (size=4096) + Prot LocalAddress:Port Scheduler Flags + -> RemoteAddress:Port Forward Weight ActiveConn InActConn + TCP 10.102.128.4:3080 rr + -> 10.244.0.235:8080 Masq 1 0 0 + -> 10.244.1.237:8080 Masq 1 0 0 + + + +请注意,Kubernetes服务和IPVS虚拟服务器之间的关系是“1:N”。 例如,考虑具有多个IP地址的Kubernetes服务。 外部IP类型服务有两个IP地址 - 集群IP和外部IP。 然后,IPVS代理将创建2个IPVS虚拟服务器 - 一个用于集群IP,另一个用于外部IP。 Kubernetes的endpoint(每个IP +端口对)与IPVS虚拟服务器之间的关系是“1:1”。 + +删除Kubernetes服务将触发删除相应的IPVS虚拟服务器,IPVS物理服务器及其绑定到虚拟接口的IP地址。 + +端口映射 + +IPVS中有三种代理模式:NAT(masq),IPIP和DR。 只有NAT模式支持端口映射。 Kube-proxy利用NAT模式进行端口映射。 以下示例显示IPVS服务端口3080到Pod端口8080的映射。 + + TCP 10.102.128.4:3080 rr + -> 10.244.0.235:8080 Masq 1 0 0 + -> 10.244.1.237:8080 Masq 1 0 + + + +会话亲和性 + +IPVS支持客户端IP会话关联(持久连接)。 当服务指定会话关系时,IPVS代理将在IPVS虚拟服务器中设置超时值(默认为180分钟= 10800秒)。 例如: + + # kubectl describe svc nginx-service + Name: nginx-service + ... + IP: 10.102.128.4 + Port: http 3080/TCP + Session Affinity: ClientIP + + # ipvsadm -ln + IP Virtual Server version 1.2.1 (size=4096) + Prot LocalAddress:Port Scheduler Flags + -> RemoteAddress:Port Forward Weight ActiveConn InActConn + TCP 10.102.128.4:3080 rr persistent 10800 + + + +IPVS代理中的Iptables 和 Ipset + +IPVS用于负载均衡,它无法处理kube-proxy中的其他问题,例如 包过滤,数据包欺骗,SNAT等 + +IPVS proxier在上述场景中利用iptables。 具体来说,ipvs proxier将在以下4种情况下依赖于iptables: + +- kube-proxy以--masquerade-all = true开头 +- 在kube-proxy启动中指定集群CIDR +- 支持Loadbalancer类型服务 +- 支持NodePort类型的服务 + +但是,我们不想创建太多的iptables规则。 所以我们采用ipset来减少iptables规则。 以下是IPVS proxier维护的ipset集表: + + + + 设置名称 成员 用法 + KUBE-CLUSTER-IP 所有服务IP + 端口 masquerade-all=true 或 clusterCIDR 指定的情况下进行伪装 + KUBE-LOOP-BACK 所有服务IP +端口+ IP 解决数据包欺骗问题 + KUBE-EXTERNAL-IP 服务外部IP +端口 将数据包伪装成外部IP + KUBE-LOAD-BALANCER 负载均衡器入口IP +端口 将数据包伪装成Load Balancer类型的服务 + KUBE-LOAD-BALANCER-LOCAL 负载均衡器入口IP +端口 以及 externalTrafficPolicy=local 接受数据包到Load Balancer externalTrafficPolicy=local + KUBE-LOAD-BALANCER-FW 负载均衡器入口IP +端口 以及 loadBalancerSourceRanges 使用指定的loadBalancerSourceRanges丢弃Load Balancer类型Service的数据包 + KUBE-LOAD-BALANCER-SOURCE-CIDR 负载均衡器入口IP +端口 + 源 CIDR 接受Load Balancer类型Service的数据包,并指定loadBalancerSourceRanges + KUBE-NODE-PORT-TCP NodePort类型服务TCP 将数据包伪装成NodePort(TCP) + KUBE-NODE-PORT-LOCAL-TCP NodePort类型服务TCP端口,带有 externalTrafficPolicy=local 接受数据包到NodePort服务 使用 externalTrafficPolicy=local + KUBE-NODE-PORT-UDP NodePort类型服务UDP端口 将数据包伪装成 NodePort(UDP) + KUBE-NODE-PORT-LOCAL-UDP NodePort类型服务UDP端口 使用 externalTrafficPolicy=local 接受数据包到NodePort服务 使用 externalTrafficPolicy=local + + + +通常,对于IPVS proxier,无论我们有多少Service/ Pod,iptables规则的数量都是静态的。 + + + +在IPVS模式下运行kube-proxy + +目前,本地脚本,GCE脚本和kubeadm支持通过导出环境变量(KUBE_PROXY_MODE = ipvs)或指定标志(--proxy-mode = ipvs)来切换IPVS代理模式。 在运行IPVS代理之前,请确保已安装IPVS所需的内核模块。 + + ip_vs + ip_vs_rr + ip_vs_wrr + ip_vs_sh + nf_conntrack_ipv4 + +最后,对于Kubernetes v1.10,“SupportIPVSProxyMode”默认设置为“true”。 对于Kubernetes v1.11,该选项已完全删除。 但是,您需要在v1.10之前为Kubernetes明确启用--feature-gates=SupportIPVSProxyMode=true。 + + + +参与其中 + +参与Kubernetes的最简单方法是加入众多[特别兴趣小组](https://github.com/kubernetes/community/blob/master/sig-list.md)(SIG)中与您的兴趣一致的小组。 你有什么想要向Kubernetes社区广播的吗? 在我们的每周[社区会议](https://github.com/kubernetes/community/blob/master/communication.md#weekly-meeting)或通过以下渠道分享您的声音。 + +感谢您的持续反馈和支持。 + +在[Stack Overflow]上发布问题(或回答问题)(http://stackoverflow.com/questions/tagged/kubernetes) + +加入[K8sPort](http://k8sport.org/)的倡导者社区门户网站 + +在Twitter上关注我们[@Kubernetesio](https://twitter.com/kubernetesio)获取最新更新 + +在[Slack](http://slack.k8s.io/)上与社区聊天 + +分享您的Kubernetes [故事](https://docs.google.com/a/linuxfoundation.org/forms/d/e/1FAIpQLScuI7Ye3VQHQTwBASrgkjQDSS5TP0g3AXfFhwSM9YpHgxRKFA/viewform) From e53b9aff47a67e3a6bcb11312239a2a9fb209a56 Mon Sep 17 00:00:00 2001 From: congfairy Date: Wed, 12 Dec 2018 12:54:28 +0800 Subject: [PATCH 02/11] Update 2018-07-09-IPVS-In-Cluster-Load-Balancing.md --- ...18-07-09-IPVS-In-Cluster-Load-Balancing.md | 108 +++++++++--------- 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/content/cn/blog/_posts/2018-07-09-IPVS-In-Cluster-Load-Balancing.md b/content/cn/blog/_posts/2018-07-09-IPVS-In-Cluster-Load-Balancing.md index 1f0fee7560..d8da0b5496 100644 --- a/content/cn/blog/_posts/2018-07-09-IPVS-In-Cluster-Load-Balancing.md +++ b/content/cn/blog/_posts/2018-07-09-IPVS-In-Cluster-Load-Balancing.md @@ -41,11 +41,11 @@ IPVS is incorporated into the LVS (Linux Virtual Server), where it runs on a hos --> -什么是IPVS? +什么是 IPVS ? -IPVS (IP Virtual Server)是在Netfileter上层构建的,并作为Linux内核的一部分,实现传输层负载均衡。 +IPVS (IP Virtual Server)是在 Netfileter 上层构建的,并作为 Linux 内核的一部分,实现传输层负载均衡。 -IPVS集成在LVS(Linux虚拟服务器)中,它在主机上运行,并在物理服务器集群前作为负载均衡器。IPVS可以将基于TCP和UDP服务的请求定向到真实服务器,并使真实服务器的服务在单个IP地址上显示为虚拟服务。 因此,IPVS自然支持Kubernetes服务。 +IPVS 集成在 LVS( Linux 虚拟服务器)中,它在主机上运行,并在物理服务器集群前作为负载均衡器。IPVS 可以将基于 TCP 和 UDP 服务的请求定向到真实服务器,并使真实服务器的服务在单个 IP 地址上显示为虚拟服务。 因此,IPVS 自然支持 Kubernetes 服务。 -为什么为Kubernetes选择IPVS? +为什么为 Kubernetes 选择 IPVS ? -随着Kubernetes的使用增长,其资源的可扩展性变得越来越重要。特别是,服务的可扩展性对于运行大型工作负载的开发人员/公司采用Kubernetes至关重要。 +随着 Kubernetes 的使用增长,其资源的可扩展性变得越来越重要。特别是,服务的可扩展性对于运行大型工作负载的开发人员/公司采用 Kubernetes 至关重要。 -Kube-proxy是服务路由的构建块,它依赖于经过强化攻击的iptables来实现支持核心的服务类型,如ClusterIP和NodePort。 但是,iptables难以扩展到成千上万的服务,因为它纯粹是为防火墙而设计的,并且基于内核规则列表。 +Kube-proxy 是服务路由的构建块,它依赖于经过强化攻击的 iptables 来实现支持核心的服务类型,如 ClusterIP 和 NodePort。 但是,iptables 难以扩展到成千上万的服务,因为它纯粹是为防火墙而设计的,并且基于内核规则列表。 -尽管Kubernetes在版本v1.6中已经支持5000个节点,但使用iptables的kube-proxy实际上是将集群扩展到5000个节点的瓶颈。 一个例子是,在5000节点集群中使用NodePort服务,如果我们有2000个服务并且每个服务有10个pod,这将在每个工作节点上至少产生20000个iptable记录,这可能使内核非常繁忙。 +尽管 Kubernetes 在版本 v1.6 中已经支持 5000 个节点,但使用 iptables 的 kube-proxy 实际上是将集群扩展到 5000个节点的瓶颈。 一个例子是,在 5000 节点集群中使用 NodePort 服务,如果我们有 2000 个服务并且每个服务有 10 个 pod,这将在每个工作节点上至少产生 20000 个 iptable 记录,这可能使内核非常繁忙。 -另一方面,使用基于IPVS的集群内服务负载均衡可以为这种情况提供很多帮助。 IPVS专门用于负载均衡,并使用更高效的数据结构(哈希表),允许几乎无限的规模扩张。 +另一方面,使用基于 IPVS 的集群内服务负载均衡可以为这种情况提供很多帮助。 IPVS 专门用于负载均衡,并使用更高效的数据结构(哈希表),允许几乎无限的规模扩张。 -基于IPVS的Kube-proxy +基于 IPVS 的 Kube-proxy 参数更改 -参数: --proxy-mode 除了现有的用户空间和iptables模式,IPVS模式通过--proxy-mode = ipvs进行配置。 它隐式使用IPVS NAT模式进行服务端口映射。 +参数: --proxy-mode 除了现有的用户空间和 iptables 模式,IPVS 模式通过--proxy-mode = ipvs进行配置。 它隐式使用 IPVS NAT 模式进行服务端口映射。 -参数: --cleanup-ipvs 类似于 --cleanup-iptables 参数,如果为true,则清除在IPVS模式下创建的IPVS配置和IPTables规则。 +参数: --cleanup-ipvs 类似于 --cleanup-iptables 参数,如果为 true,则清除在 IPVS 模式下创建的 IPVS 配置和 IPTables 规则。 -参数: --ipvs-sync-period 刷新IPVS规则的最大间隔时间(例如'5s','1m')。 必须大于0。 +参数: --ipvs-sync-period 刷新 IPVS 规则的最大间隔时间(例如'5s','1m')。 必须大于 0。 -参数r: --ipvs-min-sync-period 刷新IPVS规则的最小间隔时间间隔(例如'5s','1m')。 必须大于0。 +参数r: --ipvs-min-sync-period 刷新 IPVS 规则的最小间隔时间间隔(例如'5s','1m')。 必须大于 0。 -参数: --ipvs-exclude-cidrs 清除IPVS规则时IPVS代理不应触及的CIDR的逗号分隔列表,因为IPVS代理无法区分kube-proxy创建的IPVS规则和用户原始规则 IPVS规则。 如果您在环境中使用IPVS proxier和您自己的IPVS规则,则应指定此参数,否则将清除原始规则。 +参数: --ipvs-exclude-cidrs 清除 IPVS 规则时 IPVS 代理不应触及的 CIDR 的逗号分隔列表,因为 IPVS 代理无法区分 kube-proxy 创建的 IPVS 规则和用户原始规则 IPVS 规则。 如果您在环境中使用 IPVS proxier 和您自己的 IPVS 规则,则应指定此参数,否则将清除原始规则。 -请注意,Kubernetes服务和IPVS虚拟服务器之间的关系是“1:N”。 例如,考虑具有多个IP地址的Kubernetes服务。 外部IP类型服务有两个IP地址 - 集群IP和外部IP。 然后,IPVS代理将创建2个IPVS虚拟服务器 - 一个用于集群IP,另一个用于外部IP。 Kubernetes的endpoint(每个IP +端口对)与IPVS虚拟服务器之间的关系是“1:1”。 +请注意,Kubernetes 服务和 IPVS 虚拟服务器之间的关系是 “1:N”。 例如,考虑具有多个 IP 地址的 Kubernetes 服务。 外部 IP 类型服务有两个 IP 地址 - 集群 IP 和外部 IP。 然后,IPVS 代理将创建 2 个 IPVS 虚拟服务器 - 一个用于集群 IP ,另一个用于外部 IP。 Kubernetes 的 endpoint(每个 IP +端口对)与 IPVS 虚拟服务器之间的关系是 “1:1”。 -删除Kubernetes服务将触发删除相应的IPVS虚拟服务器,IPVS物理服务器及其绑定到虚拟接口的IP地址。 +删除 Kubernetes 服务将触发删除相应的IPVS虚拟服务器,IPVS物理服务器及其绑定到虚拟接口的IP地址。 端口映射 -IPVS中有三种代理模式:NAT(masq),IPIP和DR。 只有NAT模式支持端口映射。 Kube-proxy利用NAT模式进行端口映射。 以下示例显示IPVS服务端口3080到Pod端口8080的映射。 +IPVS 中有三种代理模式:NAT(masq),IPIP 和 DR。 只有 NAT 模式支持端口映射。 Kube-proxy 利用 NAT 模式进行端口映射。 以下示例显示 IPVS 服务端口3080到 Pod 端口8080的映射。 TCP 10.102.128.4:3080 rr -> 10.244.0.235:8080 Masq 1 0 0 @@ -254,7 +254,7 @@ IPVS supports client IP session affinity (persistent connection). When a Service 会话亲和性 -IPVS支持客户端IP会话关联(持久连接)。 当服务指定会话关系时,IPVS代理将在IPVS虚拟服务器中设置超时值(默认为180分钟= 10800秒)。 例如: +IPVS 支持客户端 IP 会话关联(持久连接)。 当服务指定会话关系时,IPVS 代理将在 IPVS 虚拟服务器中设置超时值(默认为180分钟= 10800秒)。 例如: # kubectl describe svc nginx-service Name: nginx-service @@ -286,18 +286,18 @@ However, we don't want to create too many iptables rules. So we adopt ipset for --> -IPVS代理中的Iptables 和 Ipset +IPVS 代理中的 Iptables 和 Ipset -IPVS用于负载均衡,它无法处理kube-proxy中的其他问题,例如 包过滤,数据包欺骗,SNAT等 +IPVS 用于负载均衡,它无法处理 kube-proxy中的其他问题,例如 包过滤,数据包欺骗,SNAT 等 -IPVS proxier在上述场景中利用iptables。 具体来说,ipvs proxier将在以下4种情况下依赖于iptables: +IPVS proxier在上述场景中利用 iptables。 具体来说,ipvs proxier 将在以下4种情况下依赖于 iptables: -- kube-proxy以--masquerade-all = true开头 -- 在kube-proxy启动中指定集群CIDR -- 支持Loadbalancer类型服务 -- 支持NodePort类型的服务 +- kube-proxy 以--masquerade-all = true 开头 +- 在 kube-proxy 启动中指定集群 CIDR +- 支持 Loadbalancer 类型服务 +- 支持 NodePort 类型的服务 -但是,我们不想创建太多的iptables规则。 所以我们采用ipset来减少iptables规则。 以下是IPVS proxier维护的ipset集表: +但是,我们不想创建太多的 iptables 规则。 所以我们采用 ipset 来减少 iptables 规则。 以下是 IPVS proxier 维护的 ipset 集表: 设置名称 成员 用法 - KUBE-CLUSTER-IP 所有服务IP + 端口 masquerade-all=true 或 clusterCIDR 指定的情况下进行伪装 - KUBE-LOOP-BACK 所有服务IP +端口+ IP 解决数据包欺骗问题 - KUBE-EXTERNAL-IP 服务外部IP +端口 将数据包伪装成外部IP - KUBE-LOAD-BALANCER 负载均衡器入口IP +端口 将数据包伪装成Load Balancer类型的服务 - KUBE-LOAD-BALANCER-LOCAL 负载均衡器入口IP +端口 以及 externalTrafficPolicy=local 接受数据包到Load Balancer externalTrafficPolicy=local - KUBE-LOAD-BALANCER-FW 负载均衡器入口IP +端口 以及 loadBalancerSourceRanges 使用指定的loadBalancerSourceRanges丢弃Load Balancer类型Service的数据包 - KUBE-LOAD-BALANCER-SOURCE-CIDR 负载均衡器入口IP +端口 + 源 CIDR 接受Load Balancer类型Service的数据包,并指定loadBalancerSourceRanges - KUBE-NODE-PORT-TCP NodePort类型服务TCP 将数据包伪装成NodePort(TCP) - KUBE-NODE-PORT-LOCAL-TCP NodePort类型服务TCP端口,带有 externalTrafficPolicy=local 接受数据包到NodePort服务 使用 externalTrafficPolicy=local - KUBE-NODE-PORT-UDP NodePort类型服务UDP端口 将数据包伪装成 NodePort(UDP) - KUBE-NODE-PORT-LOCAL-UDP NodePort类型服务UDP端口 使用 externalTrafficPolicy=local 接受数据包到NodePort服务 使用 externalTrafficPolicy=local + KUBE-CLUSTER-IP 所有服务 IP + 端口 masquerade-all=true 或 clusterCIDR 指定的情况下进行伪装 + KUBE-LOOP-BACK 所有服务 IP +端口+ IP 解决数据包欺骗问题 + KUBE-EXTERNAL-IP 服务外部 IP +端口 将数据包伪装成外部 IP + KUBE-LOAD-BALANCER 负载均衡器入口 IP +端口 将数据包伪装成 Load Balancer 类型的服务 + KUBE-LOAD-BALANCER-LOCAL 负载均衡器入口 IP +端口 以及 externalTrafficPolicy=local 接受数据包到 Load Balancer externalTrafficPolicy=local + KUBE-LOAD-BALANCER-FW 负载均衡器入口 IP +端口 以及 loadBalancerSourceRanges 使用指定的 loadBalancerSourceRanges 丢弃 Load Balancer类型Service的数据包 + KUBE-LOAD-BALANCER-SOURCE-CIDR 负载均衡器入口 IP +端口 + 源 CIDR 接受 Load Balancer 类型 Service的数据包,并指定loadBalancerSourceRanges + KUBE-NODE-PORT-TCP NodePort 类型服务 TCP 将数据包伪装成 NodePort(TCP) + KUBE-NODE-PORT-LOCAL-TCP NodePort 类型服务 TCP端口,带有 externalTrafficPolicy=local 接受数据包到 NodePort 服务 使用 externalTrafficPolicy=local + KUBE-NODE-PORT-UDP NodePort 类型服务 UDP 端口 将数据包伪装成 NodePort(UDP) + KUBE-NODE-PORT-LOCAL-UDP NodePort 类型服务 UDP 端口 使用 externalTrafficPolicy=local 接受数据包到 NodePort 服务 使用 externalTrafficPolicy=local -通常,对于IPVS proxier,无论我们有多少Service/ Pod,iptables规则的数量都是静态的。 +通常,对于 IPVS proxier,无论我们有多少 Service/ Pod,iptables 规则的数量都是静态的。 -在IPVS模式下运行kube-proxy +在 IPVS 模式下运行 kube-proxy -目前,本地脚本,GCE脚本和kubeadm支持通过导出环境变量(KUBE_PROXY_MODE = ipvs)或指定标志(--proxy-mode = ipvs)来切换IPVS代理模式。 在运行IPVS代理之前,请确保已安装IPVS所需的内核模块。 +目前,本地脚本,GCE 脚本和 kubeadm 支持通过导出环境变量(KUBE_PROXY_MODE = ipvs)或指定标志(--proxy-mode = ipvs)来切换 IPVS 代理模式。 在运行IPVS 代理之前,请确保已安装 IPVS 所需的内核模块。 ip_vs ip_vs_rr @@ -363,8 +363,8 @@ Finally, for Kubernetes v1.10, feature gate SupportIPVSProxyMode is set to true ip_vs_sh nf_conntrack_ipv4 -最后,对于Kubernetes v1.10,“SupportIPVSProxyMode”默认设置为“true”。 对于Kubernetes v1.11,该选项已完全删除。 但是,您需要在v1.10之前为Kubernetes明确启用--feature-gates=SupportIPVSProxyMode=true。 - +最后,对于 Kubernetes v1.10,“SupportIPVSProxyMode” 默认设置为 “true”。 对于 Kubernetes v1.11,该选项已完全删除。 但是,您需要在 v1.10 之前为Kubernetes 明确启用--feature-gates=SupportIPVSProxyMode=true。 + -举个例子: +这是一个例子: # kubectl describe svc nginx-service Name: nginx-service @@ -240,13 +241,14 @@ There are three proxy modes in IPVS: NAT (masq), IPIP and DR. Only NAT mode supp --> -请注意,Kubernetes 服务和 IPVS 虚拟服务器之间的关系是 “1:N”。 例如,考虑具有多个 IP 地址的 Kubernetes 服务。 外部 IP 类型服务有两个 IP 地址 - 集群 IP 和外部 IP。 然后,IPVS 代理将创建 2 个 IPVS 虚拟服务器 - 一个用于集群 IP ,另一个用于外部 IP。 Kubernetes 的 endpoint(每个 IP +端口对)与 IPVS 虚拟服务器之间的关系是 “1:1”。 +请注意,Kubernetes 服务和 IPVS 虚拟服务器之间的关系是“1:N”。 例如,考虑具有多个 IP 地址的 Kubernetes 服务。 外部 IP 类型服务有两个 IP 地址 - 集群IP和外部 IP。 然后,IPVS 代理将创建2个 IPVS 虚拟服务器 - 一个用于集群 IP,另一个用于外部 IP。 Kubernetes 的 endpoint(每个IP +端口对)与 IPVS 虚拟服务器之间的关系是“1:1”。 -删除 Kubernetes 服务将触发删除相应的IPVS虚拟服务器,IPVS物理服务器及其绑定到虚拟接口的IP地址。 +删除 Kubernetes 服务将触发删除相应的 IPVS 虚拟服务器,IPVS 物理服务器及其绑定到虚拟接口的 IP 地址。 端口映射 -IPVS 中有三种代理模式:NAT(masq),IPIP 和 DR。 只有 NAT 模式支持端口映射。 Kube-proxy 利用 NAT 模式进行端口映射。 以下示例显示 IPVS 服务端口3080到 Pod 端口8080的映射。 +IPVS 中有三种代理模式:NAT(masq),IPIP 和 DR。 只有 NAT 模式支持端口映射。 Kube-proxy 利用 NAT 模式进行端口映射。 以下示例显示 IPVS 服务端口3080到Pod端口8080的映射。 + TCP 10.102.128.4:3080 rr -> 10.244.0.235:8080 Masq 1 0 0 @@ -260,7 +262,7 @@ IPVS supports client IP session affinity (persistent connection). When a Service --> -会话亲和性 +会话关系 IPVS 支持客户端 IP 会话关联(持久连接)。 当服务指定会话关系时,IPVS 代理将在 IPVS 虚拟服务器中设置超时值(默认为180分钟= 10800秒)。 例如: @@ -294,13 +296,15 @@ However, we don't want to create too many iptables rules. So we adopt ipset for --> + + IPVS 代理中的 Iptables 和 Ipset -IPVS 用于负载均衡,它无法处理 kube-proxy中的其他问题,例如 包过滤,数据包欺骗,SNAT 等 +IPVS 用于负载均衡,它无法处理 kube-proxy 中的其他问题,例如 包过滤,数据包欺骗,SNAT 等 -IPVS proxier在上述场景中利用 iptables。 具体来说,ipvs proxier 将在以下4种情况下依赖于 iptables: +IPVS proxier 在上述场景中利用 iptables。 具体来说,ipvs proxier 将在以下4种情况下依赖于 iptables: -- kube-proxy 以--masquerade-all = true 开头 +- kube-proxy 以 --masquerade-all = true 开头 - 在 kube-proxy 启动中指定集群 CIDR - 支持 Loadbalancer 类型服务 - 支持 NodePort 类型的服务 @@ -330,12 +334,12 @@ IPVS proxier在上述场景中利用 iptables。 具体来说,ipvs proxier 将 KUBE-EXTERNAL-IP 服务外部 IP +端口 将数据包伪装成外部 IP KUBE-LOAD-BALANCER 负载均衡器入口 IP +端口 将数据包伪装成 Load Balancer 类型的服务 KUBE-LOAD-BALANCER-LOCAL 负载均衡器入口 IP +端口 以及 externalTrafficPolicy=local 接受数据包到 Load Balancer externalTrafficPolicy=local - KUBE-LOAD-BALANCER-FW 负载均衡器入口 IP +端口 以及 loadBalancerSourceRanges 使用指定的 loadBalancerSourceRanges 丢弃 Load Balancer类型Service的数据包 - KUBE-LOAD-BALANCER-SOURCE-CIDR 负载均衡器入口 IP +端口 + 源 CIDR 接受 Load Balancer 类型 Service的数据包,并指定loadBalancerSourceRanges - KUBE-NODE-PORT-TCP NodePort 类型服务 TCP 将数据包伪装成 NodePort(TCP) - KUBE-NODE-PORT-LOCAL-TCP NodePort 类型服务 TCP端口,带有 externalTrafficPolicy=local 接受数据包到 NodePort 服务 使用 externalTrafficPolicy=local + KUBE-LOAD-BALANCER-FW 负载均衡器入口 IP +端口 以及 loadBalancerSourceRanges 使用指定的 loadBalancerSourceRanges 丢弃 Load Balancer类型Service的数据包 + KUBE-LOAD-BALANCER-SOURCE-CIDR 负载均衡器入口 IP +端口 + 源 CIDR 接受 Load Balancer 类型 Service 的数据包,并指定loadBalancerSourceRanges + KUBE-NODE-PORT-TCP NodePort 类型服务 TCP 将数据包伪装成 NodePort(TCP) + KUBE-NODE-PORT-LOCAL-TCP NodePort 类型服务 TCP 端口,带有 externalTrafficPolicy=local 接受数据包到 NodePort 服务 使用 externalTrafficPolicy=local KUBE-NODE-PORT-UDP NodePort 类型服务 UDP 端口 将数据包伪装成 NodePort(UDP) - KUBE-NODE-PORT-LOCAL-UDP NodePort 类型服务 UDP 端口 使用 externalTrafficPolicy=local 接受数据包到 NodePort 服务 使用 externalTrafficPolicy=local + KUBE-NODE-PORT-LOCAL-UDP NodePort 类型服务 UDP 端口 使用 externalTrafficPolicy=local 接受数据包到NodePort服务 使用 externalTrafficPolicy=local - - IPVS 代理中的 Iptables 和 Ipset IPVS 用于负载均衡,它无法处理 kube-proxy 中的其他问题,例如 包过滤,数据包欺骗,SNAT 等 @@ -334,7 +322,7 @@ IPVS proxier 在上述场景中利用 iptables。 具体来说,ipvs proxier KUBE-EXTERNAL-IP 服务外部 IP +端口 将数据包伪装成外部 IP KUBE-LOAD-BALANCER 负载均衡器入口 IP +端口 将数据包伪装成 Load Balancer 类型的服务 KUBE-LOAD-BALANCER-LOCAL 负载均衡器入口 IP +端口 以及 externalTrafficPolicy=local 接受数据包到 Load Balancer externalTrafficPolicy=local - KUBE-LOAD-BALANCER-FW 负载均衡器入口 IP +端口 以及 loadBalancerSourceRanges 使用指定的 loadBalancerSourceRanges 丢弃 Load Balancer类型Service的数据包 + KUBE-LOAD-BALANCER-FW 负载均衡器入口 IP +端口 以及 loadBalancerSourceRanges 使用指定的 loadBalancerSourceRanges 丢弃 Load Balancer类型Service的数据包 KUBE-LOAD-BALANCER-SOURCE-CIDR 负载均衡器入口 IP +端口 + 源 CIDR 接受 Load Balancer 类型 Service 的数据包,并指定loadBalancerSourceRanges KUBE-NODE-PORT-TCP NodePort 类型服务 TCP 将数据包伪装成 NodePort(TCP) KUBE-NODE-PORT-LOCAL-TCP NodePort 类型服务 TCP 端口,带有 externalTrafficPolicy=local 接受数据包到 NodePort 服务 使用 externalTrafficPolicy=local @@ -377,7 +365,6 @@ Finally, for Kubernetes v1.10, feature gate SupportIPVSProxyMode is set to true 最后,对于 Kubernetes v1.10,“SupportIPVSProxyMode” 默认设置为 “true”。 对于 Kubernetes v1.11 ,该选项已完全删除。 但是,您需要在v1.10之前为Kubernetes 明确启用--feature-gates=SupportIPVSProxyMode=true。 -