• 12、Kubernetes中KubeProxy实现之iptables和ipvs


    目录

    一、概述

    二、iptables 代理模式

    三、iptables案例分析

    四、ipvs案例分析

    一、概述

    iptables和ipvs其实都是依赖的一个共同的Linux内核模块:Netfilter。Netfilter是Linux 2.4.x引入的一个子系统,它作为一个通用的、抽象的框架,提供一整套的hook函数的管理机制,使得诸如数据包过滤、网络地址转换(NAT)和基于协议类型的连接跟踪成为了可能。

    Netfilter的架构就是在整个网络流程的若干位置放置了一些检测点(HOOK),而在每个检测点上登记了一些处理函数进行处理。

    在一个网络包进入Linux网卡后,有可能经过这上面五个Hook点,我们可以自己写Hook函数,注册到任意一个点上,而iptables和ipvs都是在这个基础上实现的。

    二、iptables 代理模式

    iptables模式下 kube-proxy 为每一个pod创建相对应的 iptables 规则,发送给 ClusterIP 的请求会被直接发送给后端pod之上。

    在该模式下 kube-proxy 不承担负载均衡器的角色,其只会负责创建相应的转发策略,该模式的优点在于效率较高,但是不能提供灵活的LB策略,当后端Pod不可用的时候无法进行重试。

    iptables是把一些特定规则以“链”的形式挂载到每个Hook点,这些链的规则是固定的,而是是比较通用的,可以通过iptables命令在用户层动态的增删,这些链必须串行的执行。执行到某条规则,如果不匹配,则继续执行下一条,如果匹配,根据规则,可能继续向下执行,也可能跳到某条规则上,也可能下面的规则都跳过。

    三、iptables案例分析

    1. apiVersion: apps/v1
    2. kind: Deployment
    3. metadata:
    4. name: nginx-deployment
    5. spec:
    6. replicas: 3
    7. selector:
    8. matchLabels:
    9. app: nginx
    10. template:
    11. metadata:
    12. labels:
    13. app: nginx
    14. spec:
    15. containers:
    16. - name: nginx
    17. image: nginx
    18. ---
    19. apiVersion: v1
    20. kind: Service
    21. metadata:
    22. name: nginx-basic
    23. spec:
    24. type: ClusterIP
    25. ports:
    26. - port: 80
    27. protocol: TCP
    28. name: http
    29. selector:
    30. app: nginx

    我们这里创建一个副本数量为3的nginx pod,并创建一个对应的service对外暴露服务,service类型为ClusterIP。

    创建完成后,资源如下:

    1. $ kubectl get pod -o wide
    2. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
    3. nginx-deployment-748c667d99-dtr82 1/1 Running 0 38m 192.168.1.3 node01 <none> <none>
    4. nginx-deployment-748c667d99-jzpqf 1/1 Running 0 38m 192.168.0.7 controlplane <none> <none>
    5. nginx-deployment-748c667d99-whgr5 1/1 Running 0 38m 192.168.1.4 node01 <none> <none>
    6. $ kubectl get svc nginx-basic -o wide
    7. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
    8. nginx-basic ClusterIP 10.105.250.129 <none> 80/TCP 39m app=nginx

    可以看到,三个pod的IP分别为192.168.1.3、192.168.0.7、192.168.1.4。service的ClusterIP地址为10.105.250.129。

    下面我们通过【iptables-save -t nat】命令输出iptables中nat表的信息,说明iptables如何实现转发。

    1. $ iptables-save -t nat
    2. # Generated by iptables-save v1.8.4 on Mon Feb 20 01:52:41 2023
    3. *nat
    4. :PREROUTING ACCEPT [11:660]
    5. :INPUT ACCEPT [11:660]
    6. :OUTPUT ACCEPT [4706:282406]
    7. :POSTROUTING ACCEPT [4706:282406]
    8. :DOCKER - [0:0]
    9. :KUBE-KUBELET-CANARY - [0:0]
    10. :KUBE-MARK-DROP - [0:0]
    11. :KUBE-MARK-MASQ - [0:0]
    12. :KUBE-NODEPORTS - [0:0]
    13. :KUBE-POSTROUTING - [0:0]
    14. :KUBE-PROXY-CANARY - [0:0]
    15. :KUBE-SEP-ABG426TTTCGMOND7 - [0:0]
    16. :KUBE-SEP-BEMSLTMJA26ZCLYL - [0:0]
    17. :KUBE-SEP-D23ODROEH5R4FSGE - [0:0]
    18. :KUBE-SEP-G44RJ25JKAEOKO42 - [0:0]
    19. :KUBE-SEP-GHNVWKROTCCBFQKZ - [0:0]
    20. :KUBE-SEP-NGZXZA7GIJDM26Z3 - [0:0]
    21. :KUBE-SEP-NH2YM7NDCNPLOCTP - [0:0]
    22. :KUBE-SEP-UF65ZV4QBOPNRP6O - [0:0]
    23. :KUBE-SEP-UG4OSZR4VSWZ27C5 - [0:0]
    24. :KUBE-SEP-WQR67ZLSTPDXXME4 - [0:0]
    25. :KUBE-SERVICES - [0:0]
    26. :KUBE-SVC-ERIFXISQEP7F7OF4 - [0:0]
    27. :KUBE-SVC-JD5MR3NA4I4DYORP - [0:0]
    28. :KUBE-SVC-NPX46M4PTMTKRN6Y - [0:0]
    29. :KUBE-SVC-TCOU7JCQXEZGVUNU - [0:0]
    30. :KUBE-SVC-WWRFY3PZ7W3FGMQW - [0:0]
    31. :cali-OUTPUT - [0:0]
    32. :cali-POSTROUTING - [0:0]
    33. :cali-PREROUTING - [0:0]
    34. :cali-fip-dnat - [0:0]
    35. :cali-fip-snat - [0:0]
    36. :cali-nat-outgoing - [0:0]
    37. -A PREROUTING -m comment --comment "cali:6gwbT8clXdHdC1b1" -j cali-PREROUTING
    38. -A PREROUTING -m comment --comment "kubernetes service portals" -j KUBE-SERVICES
    39. -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
    40. -A OUTPUT -m comment --comment "cali:tVnHkvAo15HuiPy0" -j cali-OUTPUT
    41. -A OUTPUT -m comment --comment "kubernetes service portals" -j KUBE-SERVICES
    42. -A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
    43. -A POSTROUTING -m comment --comment "cali:O3lYWMrLQYEMJtB5" -j cali-POSTROUTING
    44. -A POSTROUTING -m comment --comment "kubernetes postrouting rules" -j KUBE-POSTROUTING
    45. -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
    46. -A POSTROUTING -s 192.168.0.0/16 -d 192.168.0.0/16 -j RETURN
    47. -A POSTROUTING -s 192.168.0.0/16 ! -d 224.0.0.0/4 -j MASQUERADE --random-fully
    48. -A POSTROUTING ! -s 192.168.0.0/16 -d 192.168.0.0/24 -j RETURN
    49. -A POSTROUTING ! -s 192.168.0.0/16 -d 192.168.0.0/16 -j MASQUERADE --random-fully
    50. -A DOCKER -i docker0 -j RETURN
    51. -A KUBE-MARK-DROP -j MARK --set-xmark 0x8000/0x8000
    52. -A KUBE-MARK-MASQ -j MARK --set-xmark 0x4000/0x4000
    53. -A KUBE-POSTROUTING -m mark ! --mark 0x4000/0x4000 -j RETURN
    54. -A KUBE-POSTROUTING -j MARK --set-xmark 0x4000/0x0
    55. -A KUBE-POSTROUTING -m comment --comment "kubernetes service traffic requiring SNAT" -j MASQUERADE --random-fully
    56. -A KUBE-SEP-ABG426TTTCGMOND7 -s 192.168.1.2/32 -m comment --comment "kube-system/kube-dns:dns-tcp" -j KUBE-MARK-MASQ
    57. -A KUBE-SEP-ABG426TTTCGMOND7 -p tcp -m comment --comment "kube-system/kube-dns:dns-tcp" -m tcp -j DNAT --to-destination 192.168.1.2:53
    58. -A KUBE-SEP-BEMSLTMJA26ZCLYL -s 192.168.0.7/32 -m comment --comment "default/nginx-basic:http" -j KUBE-MARK-MASQ
    59. -A KUBE-SEP-BEMSLTMJA26ZCLYL -p tcp -m comment --comment "default/nginx-basic:http" -m tcp -j DNAT --to-destination 192.168.0.7:80
    60. -A KUBE-SEP-D23ODROEH5R4FSGE -s 172.30.1.2/32 -m comment --comment "default/kubernetes:https" -j KUBE-MARK-MASQ
    61. -A KUBE-SEP-D23ODROEH5R4FSGE -p tcp -m comment --comment "default/kubernetes:https" -m tcp -j DNAT --to-destination 172.30.1.2:6443
    62. -A KUBE-SEP-G44RJ25JKAEOKO42 -s 192.168.0.6/32 -m comment --comment "kube-system/kube-dns:dns-tcp" -j KUBE-MARK-MASQ
    63. -A KUBE-SEP-G44RJ25JKAEOKO42 -p tcp -m comment --comment "kube-system/kube-dns:dns-tcp" -m tcp -j DNAT --to-destination 192.168.0.6:53
    64. -A KUBE-SEP-GHNVWKROTCCBFQKZ -s 192.168.1.2/32 -m comment --comment "kube-system/kube-dns:dns" -j KUBE-MARK-MASQ
    65. -A KUBE-SEP-GHNVWKROTCCBFQKZ -p udp -m comment --comment "kube-system/kube-dns:dns" -m udp -j DNAT --to-destination 192.168.1.2:53
    66. -A KUBE-SEP-NGZXZA7GIJDM26Z3 -s 192.168.0.6/32 -m comment --comment "kube-system/kube-dns:dns" -j KUBE-MARK-MASQ
    67. -A KUBE-SEP-NGZXZA7GIJDM26Z3 -p udp -m comment --comment "kube-system/kube-dns:dns" -m udp -j DNAT --to-destination 192.168.0.6:53
    68. -A KUBE-SEP-NH2YM7NDCNPLOCTP -s 192.168.0.6/32 -m comment --comment "kube-system/kube-dns:metrics" -j KUBE-MARK-MASQ
    69. -A KUBE-SEP-NH2YM7NDCNPLOCTP -p tcp -m comment --comment "kube-system/kube-dns:metrics" -m tcp -j DNAT --to-destination 192.168.0.6:9153
    70. -A KUBE-SEP-UF65ZV4QBOPNRP6O -s 192.168.1.3/32 -m comment --comment "default/nginx-basic:http" -j KUBE-MARK-MASQ
    71. -A KUBE-SEP-UF65ZV4QBOPNRP6O -p tcp -m comment --comment "default/nginx-basic:http" -m tcp -j DNAT --to-destination 192.168.1.3:80
    72. -A KUBE-SEP-UG4OSZR4VSWZ27C5 -s 192.168.1.2/32 -m comment --comment "kube-system/kube-dns:metrics" -j KUBE-MARK-MASQ
    73. -A KUBE-SEP-UG4OSZR4VSWZ27C5 -p tcp -m comment --comment "kube-system/kube-dns:metrics" -m tcp -j DNAT --to-destination 192.168.1.2:9153
    74. -A KUBE-SEP-WQR67ZLSTPDXXME4 -s 192.168.1.4/32 -m comment --comment "default/nginx-basic:http" -j KUBE-MARK-MASQ
    75. -A KUBE-SEP-WQR67ZLSTPDXXME4 -p tcp -m comment --comment "default/nginx-basic:http" -m tcp -j DNAT --to-destination 192.168.1.4:80
    76. -A KUBE-SERVICES -d 10.96.0.10/32 -p tcp -m comment --comment "kube-system/kube-dns:dns-tcp cluster IP" -m tcp --dport 53 -j KUBE-SVC-ERIFXISQEP7F7OF4
    77. -A KUBE-SERVICES -d 10.96.0.10/32 -p tcp -m comment --comment "kube-system/kube-dns:metrics cluster IP" -m tcp --dport 9153 -j KUBE-SVC-JD5MR3NA4I4DYORP
    78. -A KUBE-SERVICES -d 10.96.0.10/32 -p udp -m comment --comment "kube-system/kube-dns:dns cluster IP" -m udp --dport 53 -j KUBE-SVC-TCOU7JCQXEZGVUNU
    79. -A KUBE-SERVICES -d 10.105.250.129/32 -p tcp -m comment --comment "default/nginx-basic:http cluster IP" -m tcp --dport 80 -j KUBE-SVC-WWRFY3PZ7W3FGMQW
    80. -A KUBE-SERVICES -d 10.96.0.1/32 -p tcp -m comment --comment "default/kubernetes:https cluster IP" -m tcp --dport 443 -j KUBE-SVC-NPX46M4PTMTKRN6Y
    81. -A KUBE-SERVICES -m comment --comment "kubernetes service nodeports; NOTE: this must be the last rule in this chain" -m addrtype --dst-type LOCAL -j KUBE-NODEPORTS
    82. -A KUBE-SVC-ERIFXISQEP7F7OF4 ! -s 192.168.0.0/16 -d 10.96.0.10/32 -p tcp -m comment --comment "kube-system/kube-dns:dns-tcp cluster IP" -m tcp --dport 53 -j KUBE-MARK-MASQ
    83. -A KUBE-SVC-ERIFXISQEP7F7OF4 -m comment --comment "kube-system/kube-dns:dns-tcp -> 192.168.0.6:53" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-G44RJ25JKAEOKO42
    84. -A KUBE-SVC-ERIFXISQEP7F7OF4 -m comment --comment "kube-system/kube-dns:dns-tcp -> 192.168.1.2:53" -j KUBE-SEP-ABG426TTTCGMOND7
    85. -A KUBE-SVC-JD5MR3NA4I4DYORP ! -s 192.168.0.0/16 -d 10.96.0.10/32 -p tcp -m comment --comment "kube-system/kube-dns:metrics cluster IP" -m tcp --dport 9153 -j KUBE-MARK-MASQ
    86. -A KUBE-SVC-JD5MR3NA4I4DYORP -m comment --comment "kube-system/kube-dns:metrics -> 192.168.0.6:9153" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-NH2YM7NDCNPLOCTP
    87. -A KUBE-SVC-JD5MR3NA4I4DYORP -m comment --comment "kube-system/kube-dns:metrics -> 192.168.1.2:9153" -j KUBE-SEP-UG4OSZR4VSWZ27C5
    88. -A KUBE-SVC-NPX46M4PTMTKRN6Y ! -s 192.168.0.0/16 -d 10.96.0.1/32 -p tcp -m comment --comment "default/kubernetes:https cluster IP" -m tcp --dport 443 -j KUBE-MARK-MASQ
    89. -A KUBE-SVC-NPX46M4PTMTKRN6Y -m comment --comment "default/kubernetes:https -> 172.30.1.2:6443" -j KUBE-SEP-D23ODROEH5R4FSGE
    90. -A KUBE-SVC-TCOU7JCQXEZGVUNU ! -s 192.168.0.0/16 -d 10.96.0.10/32 -p udp -m comment --comment "kube-system/kube-dns:dns cluster IP" -m udp --dport 53 -j KUBE-MARK-MASQ
    91. -A KUBE-SVC-TCOU7JCQXEZGVUNU -m comment --comment "kube-system/kube-dns:dns -> 192.168.0.6:53" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-NGZXZA7GIJDM26Z3
    92. -A KUBE-SVC-TCOU7JCQXEZGVUNU -m comment --comment "kube-system/kube-dns:dns -> 192.168.1.2:53" -j KUBE-SEP-GHNVWKROTCCBFQKZ
    93. -A KUBE-SVC-WWRFY3PZ7W3FGMQW ! -s 192.168.0.0/16 -d 10.105.250.129/32 -p tcp -m comment --comment "default/nginx-basic:http cluster IP" -m tcp --dport 80 -j KUBE-MARK-MASQ
    94. -A KUBE-SVC-WWRFY3PZ7W3FGMQW -m comment --comment "default/nginx-basic:http -> 192.168.0.7:80" -m statistic --mode random --probability 0.33333333349 -j KUBE-SEP-BEMSLTMJA26ZCLYL
    95. -A KUBE-SVC-WWRFY3PZ7W3FGMQW -m comment --comment "default/nginx-basic:http -> 192.168.1.3:80" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-UF65ZV4QBOPNRP6O
    96. -A KUBE-SVC-WWRFY3PZ7W3FGMQW -m comment --comment "default/nginx-basic:http -> 192.168.1.4:80" -j KUBE-SEP-WQR67ZLSTPDXXME4
    97. -A cali-OUTPUT -m comment --comment "cali:GBTAv2p5CwevEyJm" -j cali-fip-dnat
    98. -A cali-POSTROUTING -m comment --comment "cali:Z-c7XtVd2Bq7s_hA" -j cali-fip-snat
    99. -A cali-POSTROUTING -m comment --comment "cali:nYKhEzDlr11Jccal" -j cali-nat-outgoing
    100. -A cali-PREROUTING -m comment --comment "cali:r6XmIziWUJsdOK6Z" -j cali-fip-dnat
    101. -A cali-nat-outgoing -m comment --comment "cali:flqWnvo8yq4ULQLa" -m set --match-set cali40masq-ipam-pools src -m set ! --match-set cali40all-ipam-pools dst -j MASQUERADE --random-fully
    102. COMMIT

    iptables-save命令,可以查看当前所有的iptables规则,涉及到k8s的比较多,基本在每个链上都有,包括一些SNAT的,就是Pod访问外部的地址的时候,需要做一下NAT转换,我们只看涉及到Service负载均衡的。

    首先,PREROUTING和OUTPUT都加了一个KUBE-SERVICES规则,也就是进来的包和出去的包都要都走一下KUBE-SERVICES规则。

    1. -A PREROUTING -m comment --comment "kubernetes service portals" -j KUBE-SERVICES
    2. -A OUTPUT -m comment --comment "kubernetes service portals" -j KUBE-SERVICES

    接着,因为我们service的ClusterIP地址为10.105.250.129,所以我们从nat表中找出跟10.105.250.129有关的转发规则。

    -A KUBE-SERVICES -d 10.105.250.129/32 -p tcp -m comment --comment "default/nginx-basic:http cluster IP" -m tcp --dport 80 -j KUBE-SVC-WWRFY3PZ7W3FGMQW

     可以看到,当目标地址是10.105.250.129/32并且目标端口是80的,也就是这个服务的ClusterIP,走到KUBE-SVC-WWRFY3PZ7W3FGMQW规则,这个规则其实就是Kube-Proxy。

    下面我们查看KUBE-SVC-WWRFY3PZ7W3FGMQW规则:

    1. -A KUBE-SVC-WWRFY3PZ7W3FGMQW -m comment --comment "default/nginx-basic:http -> 192.168.0.7:80" -m statistic --mode random --probability 0.33333333349 -j KUBE-SEP-BEMSLTMJA26ZCLYL
    2. -A KUBE-SVC-WWRFY3PZ7W3FGMQW -m comment --comment "default/nginx-basic:http -> 192.168.1.3:80" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-UF65ZV4QBOPNRP6O
    3. -A KUBE-SVC-WWRFY3PZ7W3FGMQW -m comment --comment "default/nginx-basic:http -> 192.168.1.4:80" -j KUBE-SEP-WQR67ZLSTPDXXME4

    可以看到,KUBE-SVC-WWRFY3PZ7W3FGMQW又对应了三条规则,分别来看下:

    1)、第一条规则

    1. -A KUBE-SVC-WWRFY3PZ7W3FGMQW -m comment --comment "default/nginx-basic:http -> 192.168.0.7:80" -m statistic --mode random --probability 0.33333333349 -j KUBE-SEP-BEMSLTMJA26ZCLYL
    2. # 这条规则对应的又会走KUBE-SEP-BEMSLTMJA26ZCLYL规则
    3. -A KUBE-SEP-BEMSLTMJA26ZCLYL -p tcp -m comment --comment "default/nginx-basic:http" -m tcp -j DNAT --to-destination 192.168.0.7:80
    4. # 可以看到, 有33%的概率将会被转发到【192.168.0.7:80】这个pod

    2)、第二条规则

    1. -A KUBE-SVC-WWRFY3PZ7W3FGMQW -m comment --comment "default/nginx-basic:http -> 192.168.1.3:80" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-UF65ZV4QBOPNRP6O
    2. # 这条规则对应的又会走KUBE-SEP-UF65ZV4QBOPNRP6O规则
    3. -A KUBE-SEP-UF65ZV4QBOPNRP6O -p tcp -m comment --comment "default/nginx-basic:http" -m tcp -j DNAT --to-destination 192.168.1.3:80
    4. # 可以看到, 有50%的概率将会被转发到【192.168.1.3:80】这个pod

    3)、第三条规则

    1. -A KUBE-SVC-WWRFY3PZ7W3FGMQW -m comment --comment "default/nginx-basic:http -> 192.168.1.4:80" -j KUBE-SEP-WQR67ZLSTPDXXME4
    2. # 这条规则对应的又会走KUBE-SEP-WQR67ZLSTPDXXME4规则
    3. -A KUBE-SEP-WQR67ZLSTPDXXME4 -p tcp -m comment --comment "default/nginx-basic:http" -m tcp -j DNAT --to-destination 192.168.1.4:80
    4. # 可以看到,这条规则没有加--probability,所以有100%的概率将会被转发到【192.168.1.4:80】这个pod

    可以看到,最重要的就是KUBE-SVC-WWRFY3PZ7W3FGMQW规则,它以不同的概率走到了不同的规则,这些规则最终走到了Pod里,这就是负载均衡策略。

    我们把这个负载均衡用图画出来,大体就是如下:

    上述我们演示的是ClusterIP类型的Service,我们可以尝试修改为NodePort类型,实际上,在iptables规则里,最终也是会转发到KUBE-SVC-WWRFY3PZ7W3FGMQW规则,综上,不管是ClusterIP,还是NodePort,都走到了同一个规则上。

    四、ipvs案例分析

    IPVS模式工作在内核态,在同步代理规则时具有更好的性能,同时提高网络吞吐量为大型集群提供了更好的可扩展性,同时提供了大量的负责均衡算法。

    还是通过一个例子说明ipvs怎么转发的,首先我们需要修改kube-proxy的代理模式为ipvs,我们可以通过修改configmap来实现:

    1. $ kubectl edit configmap kube-proxy -n kube-system
    2. configmap/kube-proxy edited

    将mode修改为ipvs即可,如下图:

    image.png

    1. apiVersion: apps/v1
    2. kind: Deployment
    3. metadata:
    4. name: nginx-deployment
    5. spec:
    6. replicas: 3
    7. selector:
    8. matchLabels:
    9. app: nginx
    10. template:
    11. metadata:
    12. labels:
    13. app: nginx
    14. spec:
    15. containers:
    16. - name: nginx
    17. image: nginx
    18. ---
    19. apiVersion: v1
    20. kind: Service
    21. metadata:
    22. name: nginx-basic
    23. spec:
    24. type: ClusterIP
    25. ports:
    26. - port: 80
    27. protocol: TCP
    28. name: http
    29. selector:
    30. app: nginx

    创建对应的pod和service:

    1. $ vim ipvs.yaml
    2. controlplane $ kubectl create -f ipvs.yaml
    3. deployment.apps/nginx-deployment created
    4. service/nginx-basic created
    5. $ kubectl get pods -o wide
    6. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
    7. nginx-deployment-748c667d99-fpsh6 1/1 Running 0 12s 192.168.1.3 node01 <none> <none>
    8. nginx-deployment-748c667d99-hsnzw 1/1 Running 0 12s 192.168.0.7 controlplane <none> <none>
    9. nginx-deployment-748c667d99-sb9b2 1/1 Running 0 12s 192.168.1.4 node01 <none> <none>
    10. $ kubectl get svc -o wide
    11. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
    12. nginx-basic ClusterIP 10.96.115.68 <none> 80/TCP 36s app=nginx

    我们通过【ipvsadm -L】命令查看ipvs转发规则:

    1. $ ipvsadm -Ln
    2. IP Virtual Server version 1.2.1 (size=4096)
    3. Prot LocalAddress:Port Scheduler Flags
    4. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
    5. ...省略...
    6. TCP 10.96.115.68:80 rr
    7. -> 192.168.0.7:80 Masq 1 0 0
    8. -> 192.168.1.3:80 Masq 1 0 0
    9. -> 192.168.1.4:80 Masq 1 0 0
    10. ...省略...

    可以看到,到ClusterIP:Port的流量,都被以rr(round robin)的策略转发到3个后端pod上。

    五、iptables vs ipvs

    ●1、iptables更通用,主要是应用在防火墙上,也能应用于路由转发等功能,ipvs更聚焦,它只能做负载均衡,不能实现其它的例如防火墙上。
    ●2、iptables在处理规则时,是按“链”逐条匹配,如果规则过多,性能会变差,它匹配规则的复杂度是O(n),而ipvs处理规则时,在专门的模块内处理,查找规则的复杂度是O(1)。
    ●3、iptables虽然可以实现负载均衡,但是它的策略比较简单,只能以概率转发,而ipvs可以实现多种策略。

  • 相关阅读:
    c语言练习题81:颠倒二进制位
    Linux学习笔记7-文件IO编程(一)
    Windows 10 也能安装Kafka?这篇教程让你轻松掌握!
    数据结构c版(2)——二叉树
    【C++】学习笔记——类和对象_4
    实验数据处理
    m基于GA遗传优化算法的认知中继网络最优中继功率分配和最佳中继节点选择算法matlab仿真
    Redis的事务管理
    HTTP协议中GET请求和POST请求的区别
    ARM Soc内部总线
  • 原文地址:https://blog.csdn.net/Weixiaohuai/article/details/133425615