开发者社区> 问答> 正文

如何在 Kubernetes 中实现负载均衡?

如何在 Kubernetes 中实现负载均衡?

展开
收起
钉群小二 2019-12-24 19:13:55 1101 0
1 条回答
写回答
取消 提交回答
  • [root@master1] ~$ kubectl describe svc example-service Name: example-service Namespace: default Labels: run=load-balancer-example Annotations: Selector: run=load-balancer-example Type: NodePort IP: 10.96.224.67 Port: 80/TCP TargetPort: 80/TCP NodePort: 31454/TCP Endpoints: 10.244.0.2:80,10.244.3.2:80,10.244.4.2:80 Session Affinity: None External Traffic Policy: Cluster Events:

    答案是 iptables。

    Service Cluster IP 是一个虚拟 IP,是由 Kubernetes 节点上的 iptables 规则管理的。

    可以通过 iptables-save 命令打印出当前节点的 iptables 规则

    -A KUBE-SERVICES ! -s 10.244.0.0/16 -d 10.96.224.67/32 -p tcp -m comment --comment "default/example-service: cluster IP" -m tcp --dport 80 -j KUBE-MARK-MASQ
    -A KUBE-SERVICES -d 10.96.224.67/32 -p tcp -m comment --comment "default/example-service: cluster IP" -m tcp --dport 80 -j KUBE-SVC-BR4KARPIGKMRMN3E
    
    

    这两条规则的含义是:

    如果 Cluster 内的 Pod(源地址来自 10.244.0.0/16)要访问 httpd-svc,则允许。

    其他源地址访问 httpd-svc,跳转到规则 KUBE-SVC-BR4KARPIGKMRMN3E。

    KUBE-SVC-BR4KARPIGKMRMN3E 规则如下:

    -A KUBE-SVC-BR4KARPIGKMRMN3E -m statistic --mode random --probability 0.33332999982 -j KUBE-SEP-GVCUN5Q2CADPMXQN
    -A KUBE-SVC-BR4KARPIGKMRMN3E -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-7EB3JKJSNOWKCEL2
    -A KUBE-SVC-BR4KARPIGKMRMN3E -j KUBE-SEP-MFV34SBILX27ERI2
    
    

    1/3的概率跳转到规则 KUBE-SEP-GVCUN5Q2CADPMXQN。

    1/3 的概率(剩下 2/3 的一半)跳转到规则 KUBE-SEP-7EB3JKJSNOWKCEL2。

    1/3 的概率跳转到规则 KUBE-SEP-MFV34SBILX27ERI2。

    上面三个跳转的规则如下:

    -A KUBE-SEP-7EB3JKJSNOWKCEL2 -s 10.244.3.2/32 -j KUBE-MARK-MASQ -A KUBE-SEP-7EB3JKJSNOWKCEL2 -p tcp -m tcp -j DNAT --to-destination 10.244.3.2:80

    -A KUBE-SEP-GVCUN5Q2CADPMXQN -s 10.244.0.2/32 -j KUBE-MARK-MASQ
    -A KUBE-SEP-GVCUN5Q2CADPMXQN -p tcp -m tcp -j DNAT --to-destination 10.244.0.2:80
    
    -A KUBE-SEP-MFV34SBILX27ERI2 -s 10.244.4.2/32 -j KUBE-MARK-MASQ
    -A KUBE-SEP-MFV34SBILX27ERI2 -p tcp -m tcp -j DNAT --to-destination 10.244.4.2:80
    
    

    即将请求分别转发到后端的三个 Pod。通过上面的分析,我们得到如下结论:

    iptables 将访问 Service 的流量转发到后端 Pod,而且使用类似轮询的负载均衡策略。

    另外需要补充一点:Cluster 的每一个节点都配置了相同的 iptables 规则,这样就确保了整个 Cluster 都能够通过 Service 的 Cluster IP 访问 Service

    2019-12-27 16:00:46
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
ACK 云原生弹性方案—云原生时代的加速器 立即下载
ACK集群类型选择最佳实践 立即下载
企业运维之云原生和Kubernetes 实战 立即下载

相关镜像