理解kubernetes的service流量转发链路

iptables

Posted by Zeusro on May 17, 2019
👈🏻 Select language

img

基本

3 个协议:TCP,UDP,ICMP

4 个状态:NEW,ESTABLISHED,INVALID,RELATED

4个表

  1. raw:高级功能,如:网址过滤。
  2. mangle:数据包修改(QOS),用于实现服务质量。
  3. net:地址转换,用于网关路由器。
  4. filter:包过滤,用于防火墙规则。

5个链

  1. PREROUTING链:用于目标地址转换(DNAT)。
  2. INPUT链:处理输入数据包。
  3. PORWARD链:处理转发数据包。
  4. OUTPUT链:处理输出数据包。
  5. POSTOUTING链:用于源地址转换(SNAT)。

常用方法

1
2
3
4
iptables -t filter -nL
iptables -t nat -nL
iptables -t raw -nL
iptables -t mangle -nL

用iptables分析kubernetes svc流量链路

node节点的iptables是由kube-proxy生成的,具体实现可以参见kube-proxy的代码

kube-proxy只修改了filter和nat表,它对iptables的链进行了扩充,自定义了KUBE-SERVICES,KUBE-NODEPORTS,KUBE-POSTROUTING,KUBE-MARK-MASQ和KUBE-MARK-DROP五个链,并主要通过为 KUBE-SERVICES链(附着在PREROUTING和OUTPUT)增加rule来配制traffic routing 规则

集群信息

Pod CIDR :172.31.0.0/16

阿里云kubernetes v1.12.6-aliyun.1

*.aliyuncs.com/acs/flannel:v0.8.0

SLB私有IP:172.6.6.6 (实际上还绑定了一个EIP)

以某个svc为例

以default名下的testsvc作为例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
➜  ~ kgsvc testsvc
NAME              TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)         w
testsvc           LoadBalancer   172.30.5.207   172.6.6.6      443:30031/TCP   106d

➜  ~ iptables -t nat -nL 

Chain PREROUTING (policy ACCEPT)
target         prot opt source               destination
KUBE-SERVICES  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes service portals */

Chain OUTPUT (policy ACCEPT)
target         prot opt source               destination
KUBE-SERVICES  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes service portals */
DOCKER         all  --  0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

# 所有的服务都在这个Chain里面,非常长
Chain KUBE-SERVICES (2 references)
target                     prot opt source               destination
KUBE-MARK-MASQ             tcp  -- !172.31.0.0/16        172.30.5.207         /* default/testsvc: cluster IP */ tcp dpt:443
KUBE-SVC-M42ZCW2EYUCRBVAF  tcp  --  0.0.0.0/0            172.30.5.207         /* default/testsvc: cluster IP */ tcp dpt:443
......
KUBE-FW-M42ZCW2EYUCRBVAF   tcp  --  0.0.0.0/0            172.6.6.6            /* default/testsvc: loadbalancer IP */ tcp dpt:443

# 对经过的报文打标签
Chain KUBE-MARK-MASQ (522 references)
target     prot opt source               destination
MARK       all  --  0.0.0.0/0            0.0.0.0/0            MARK or 0x4000

Chain KUBE-XLB-M42ZCW2EYUCRBVAF (2 references)
target                     prot opt source               destination
KUBE-SVC-M42ZCW2EYUCRBVAF  all  --  172.31.0.0/16        0.0.0.0/0            /* Redirect pods trying to reach external loadbalancer VIP to clusterIP */
KUBE-MARK-DROP             all  --  0.0.0.0/0            0.0.0.0/0            /* default/testsvc: has no local endpoints */


Chain KUBE-SVC-M42ZCW2EYUCRBVAF (2 references)
target                     prot opt source               destination
KUBE-SEP-EA7TYKWK2S6G4PQR  all  --  0.0.0.0/0            0.0.0.0/0            statistic mode random probability 0.14286000002
KUBE-SEP-ZJI36FVTROQF5MX7  all  --  0.0.0.0/0            0.0.0.0/0            statistic mode random probability 0.16667000018
KUBE-SEP-JLGUPWE7JCRU2AGG  all  --  0.0.0.0/0            0.0.0.0/0            statistic mode random probability 0.20000000019
KUBE-SEP-GCNPY23RDN22AOTX  all  --  0.0.0.0/0            0.0.0.0/0            statistic mode random probability 0.25000000000
KUBE-SEP-FNDISD3HQYKEHL3T  all  --  0.0.0.0/0            0.0.0.0/0            statistic mode random probability 0.33332999982
KUBE-SEP-3RWVMCKITDQWELSA  all  --  0.0.0.0/0            0.0.0.0/0            statistic mode random probability 0.50000000000
KUBE-SEP-BVMKBOC4GGNJ3567  all  --  0.0.0.0/0            0.0.0.0/0

Chain KUBE-SEP-BVMKBOC4GGNJ3567 (1 references)
# 172.31.9.52是pod虚拟IP
target          prot opt source               destination
KUBE-MARK-MASQ  all  --  172.31.9.52          0.0.0.0/0
DNAT            tcp  --  0.0.0.0/0            0.0.0.0/0            tcp to:172.31.9.52:80

Chain KUBE-FW-M42ZCW2EYUCRBVAF (1 references)
target                     prot opt source               destination
KUBE-XLB-M42ZCW2EYUCRBVAF  all  --  0.0.0.0/0            0.0.0.0/0            /* default/testsvc: loadbalancer IP */
KUBE-MARK-DROP             all  --  0.0.0.0/0            0.0.0.0/0            /* default/testsvc: loadbalancer IP */

Chain KUBE-MARK-DROP (60 references)
target     prot opt source               destination
MARK       all  --  0.0.0.0/0            0.0.0.0/0            MARK or 0x8000

图形化:

image

1
2
3
4
5
6
7
8
9
10
11
graph TB
a(内部流量/PREROUTING)-->c(KUBE-SERVICES)
b(外部流量/OUTPUT)-->c
c-->d(KUBE-MARK-MASQ)
d-->|destination:172.30.5.207|e(KUBE-SVC-M42ZCW2EYUCRBVAF)
e-->|destination:172.30.5.207|p1(KUBE-SEP-EA7TYKWK2S6G4PQR)
e-->|destination:172.30.5.207|p2(KUBE-SEP-ZJI36FVTROQF5MX7)
p1-->|destination:<podIP1>|f(KUBE-FW-M42ZCW2EYUCRBVAF)
p2-->|destination:<podIP2>|f
f-->g(KUBE-XLB-M42ZCW2EYUCRBVAF)
g-->|loadbalancer的IP在节点上截获后转给service|h(KUBE-SVC-M42ZCW2EYUCRBVAF)

一些iptables的技巧

为什么pod的probability越来越大

第一个1/3概率 如果匹配上了说明命中了1/3, 没匹配上剩下2/3到下一条

第二条1/2概率 如果匹配上了说明命中了 2/3 * 1/2 = 1/3,没匹配上 1/2到下一条

第三条1的概率 匹配上了是2/3 * 1/2 * 1 = 1/3

最后一个chain KUBE-SEP-BVMKBOC4GGNJ3567为什么没有probability

顺序匹配,他吃剩下的,所以不再需要计算权重了

destination 0.0.0.0/0是什么意思

仔细观察整个链路,到KUBE-SEP-XXX这一步时已经取得了pod的虚拟IP.所以除此以外的chain destination保持不变,不再需要修改

结论

  1. kubernetes 0.8版本的flannel是对iptables的大规模运用。
  2. KUBE-SERVICES这个又臭又长的chain链注定了服务匹配是O(n)的,随着svc越来越多,增删改查会越来越卡。
  3. svc数量大于1000时,卡顿会相当明显
  4. kube-proxy应基于IPVS模式,走iptables只会重蹈覆辙
  5. svcIP是一个中转的虚拟IP

参考链接

  1. Kubernetes 从1.10到1.11升级记录(续):Kubernetes kube-proxy开启IPVS模式
  2. 如何在 kubernetes 中启用 ipvs
  3. 华为云在 K8S 大规模场景下的 Service 性能优化实践
  4. kubernetes的网络数据包流程
  5. kube-proxy的ipvs模式解读
  6. kube-proxy 模式对比:iptables 还是 IPVS?
  7. How to edit iptables rules
  8. 关于iptables & ipvs的简单介绍
  9. iptables相关
  10. 理解kubernetes环境的iptables

img

Basics

3 protocols: TCP, UDP, ICMP

4 states: NEW, ESTABLISHED, INVALID, RELATED

4 tables

  1. raw: Advanced features, such as: URL filtering.
  2. mangle: Packet modification (QOS), used to implement quality of service.
  3. net: Address translation, used for gateway routers.
  4. filter: Packet filtering, used for firewall rules.

5 chains

  1. PREROUTING chain: Used for destination address translation (DNAT).
  2. INPUT chain: Processes input packets.
  3. FORWARD chain: Processes forwarded packets.
  4. OUTPUT chain: Processes output packets.
  5. POSTROUTING chain: Used for source address translation (SNAT).

Common Methods

1
2
3
4
iptables -t filter -nL
iptables -t nat -nL
iptables -t raw -nL
iptables -t mangle -nL

The iptables on node nodes are generated by kube-proxy. For specific implementation, see kube-proxy code

kube-proxy only modifies the filter and nat tables. It extends iptables chains, customizing five chains: KUBE-SERVICES, KUBE-NODEPORTS, KUBE-POSTROUTING, KUBE-MARK-MASQ and KUBE-MARK-DROP, and mainly configures traffic routing rules by adding rules to the KUBE-SERVICES chain (attached to PREROUTING and OUTPUT)

Cluster Information

Pod CIDR: 172.31.0.0/16

Alibaba Cloud kubernetes v1.12.6-aliyun.1

*.aliyuncs.com/acs/flannel:v0.8.0

SLB private IP: 172.6.6.6 (actually also bound to an EIP)

Using a svc as an Example

Using testsvc under default namespace as an example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
➜  ~ kgsvc testsvc
NAME              TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)         w
testsvc           LoadBalancer   172.30.5.207   172.6.6.6      443:30031/TCP   106d

➜  ~ iptables -t nat -nL 

Chain PREROUTING (policy ACCEPT)
target         prot opt source               destination
KUBE-SERVICES  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes service portals */

Chain OUTPUT (policy ACCEPT)
target         prot opt source               destination
KUBE-SERVICES  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes service portals */
DOCKER         all  --  0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

# All services are in this Chain, very long
Chain KUBE-SERVICES (2 references)
target                     prot opt source               destination
KUBE-MARK-MASQ             tcp  -- !172.31.0.0/16        172.30.5.207         /* default/testsvc: cluster IP */ tcp dpt:443
KUBE-SVC-M42ZCW2EYUCRBVAF  tcp  --  0.0.0.0/0            172.30.5.207         /* default/testsvc: cluster IP */ tcp dpt:443
......
KUBE-FW-M42ZCW2EYUCRBVAF   tcp  --  0.0.0.0/0            172.6.6.6            /* default/testsvc: loadbalancer IP */ tcp dpt:443

# Mark packets passing through
Chain KUBE-MARK-MASQ (522 references)
target     prot opt source               destination
MARK       all  --  0.0.0.0/0            0.0.0.0/0            MARK or 0x4000

Chain KUBE-XLB-M42ZCW2EYUCRBVAF (2 references)
target                     prot opt source               destination
KUBE-SVC-M42ZCW2EYUCRBVAF  all  --  172.31.0.0/16        0.0.0.0/0            /* Redirect pods trying to reach external loadbalancer VIP to clusterIP */
KUBE-MARK-DROP             all  --  0.0.0.0/0            0.0.0.0/0            /* default/testsvc: has no local endpoints */


Chain KUBE-SVC-M42ZCW2EYUCRBVAF (2 references)
target                     prot opt source               destination
KUBE-SEP-EA7TYKWK2S6G4PQR  all  --  0.0.0.0/0            0.0.0.0/0            statistic mode random probability 0.14286000002
KUBE-SEP-ZJI36FVTROQF5MX7  all  --  0.0.0.0/0            0.0.0.0/0            statistic mode random probability 0.16667000018
KUBE-SEP-JLGUPWE7JCRU2AGG  all  --  0.0.0.0/0            0.0.0.0/0            statistic mode random probability 0.20000000019
KUBE-SEP-GCNPY23RDN22AOTX  all  --  0.0.0.0/0            0.0.0.0/0            statistic mode random probability 0.25000000000
KUBE-SEP-FNDISD3HQYKEHL3T  all  --  0.0.0.0/0            0.0.0.0/0            statistic mode random probability 0.33332999982
KUBE-SEP-3RWVMCKITDQWELSA  all  --  0.0.0.0/0            0.0.0.0/0            statistic mode random probability 0.50000000000
KUBE-SEP-BVMKBOC4GGNJ3567  all  --  0.0.0.0/0            0.0.0.0/0

Chain KUBE-SEP-BVMKBOC4GGNJ3567 (1 references)
# 172.31.9.52 is pod virtual IP
target          prot opt source               destination
KUBE-MARK-MASQ  all  --  172.31.9.52          0.0.0.0/0
DNAT            tcp  --  0.0.0.0/0            0.0.0.0/0            tcp to:172.31.9.52:80

Chain KUBE-FW-M42ZCW2EYUCRBVAF (1 references)
target                     prot opt source               destination
KUBE-XLB-M42ZCW2EYUCRBVAF  all  --  0.0.0.0/0            0.0.0.0/0            /* default/testsvc: loadbalancer IP */
KUBE-MARK-DROP             all  --  0.0.0.0/0            0.0.0.0/0            /* default/testsvc: loadbalancer IP */

Chain KUBE-MARK-DROP (60 references)
target     prot opt source               destination
MARK       all  --  0.0.0.0/0            0.0.0.0/0            MARK or 0x8000

Graphical:

image

1
2
3
4
5
6
7
8
9
10
11
graph TB
a(Internal traffic/PREROUTING)-->c(KUBE-SERVICES)
b(External traffic/OUTPUT)-->c
c-->d(KUBE-MARK-MASQ)
d-->|destination:172.30.5.207|e(KUBE-SVC-M42ZCW2EYUCRBVAF)
e-->|destination:172.30.5.207|p1(KUBE-SEP-EA7TYKWK2S6G4PQR)
e-->|destination:172.30.5.207|p2(KUBE-SEP-ZJI36FVTROQF5MX7)
p1-->|destination:<podIP1>|f(KUBE-FW-M42ZCW2EYUCRBVAF)
p2-->|destination:<podIP2>|f
f-->g(KUBE-XLB-M42ZCW2EYUCRBVAF)
g-->|After loadbalancer IP is intercepted on node, forward to service|h(KUBE-SVC-M42ZCW2EYUCRBVAF)

Some iptables Tips

Why pod’s probability increases

First 1/3 probability: If matched, it means hit 1/3. If not matched, remaining 2/3 goes to next line.

Second 1/2 probability: If matched, it means hit 2/3 * 1/2 = 1/3. If not matched, 1/2 goes to next line.

Third probability 1: If matched, it’s 2/3 * 1/2 * 1 = 1/3

Why the last chain KUBE-SEP-BVMKBOC4GGNJ3567 has no probability

Sequential matching, it takes the remainder, so no need to calculate weight anymore.

What does destination 0.0.0.0/0 mean

Carefully observe the entire link. By the time we reach KUBE-SEP-XXX step, we’ve already obtained the pod’s virtual IP. So except for this, other chains’ destinations remain unchanged and no longer need modification.

Conclusion

  1. kubernetes 0.8 version’s flannel is a large-scale application of iptables.
  2. This long and smelly KUBE-SERVICES chain chain determines that service matching is O(n). As svc increases, add/delete/modify/query will become increasingly slow.
  3. When svc count exceeds 1000, lag will be quite obvious.
  4. kube-proxy should be based on IPVS mode, using iptables will only repeat the same mistake.
  5. svcIP is a transit virtual IP.
  1. Kubernetes Upgrade Record from 1.10 to 1.11 (Continued): Kubernetes kube-proxy Enables IPVS Mode
  2. How to Enable ipvs in kubernetes
  3. Huawei Cloud’s Service Performance Optimization Practice in Large-Scale K8S Scenarios
  4. kubernetes Network Packet Flow
  5. kube-proxy ipvs Mode Interpretation
  6. kube-proxy Mode Comparison: iptables or IPVS?
  7. How to edit iptables rules
  8. Simple Introduction to iptables & ipvs
  9. iptables Related
  10. Understanding iptables in kubernetes Environment

img

Основы

3 протокола: TCP, UDP, ICMP

4 состояния: NEW, ESTABLISHED, INVALID, RELATED

4 таблицы

  1. raw: Расширенные функции, такие как: фильтрация URL.
  2. mangle: Изменение пакетов (QOS), используется для реализации качества обслуживания.
  3. net: Преобразование адресов, используется для маршрутизаторов шлюза.
  4. filter: Фильтрация пакетов, используется для правил файрвола.

5 цепочек

  1. Цепочка PREROUTING: Используется для преобразования адреса назначения (DNAT).
  2. Цепочка INPUT: Обрабатывает входящие пакеты.
  3. Цепочка FORWARD: Обрабатывает пересылаемые пакеты.
  4. Цепочка OUTPUT: Обрабатывает исходящие пакеты.
  5. Цепочка POSTROUTING: Используется для преобразования адреса источника (SNAT).

Общие методы

1
2
3
4
iptables -t filter -nL
iptables -t nat -nL
iptables -t raw -nL
iptables -t mangle -nL

Анализ ссылок трафика kubernetes svc с помощью iptables

iptables на узлах генерируются kube-proxy. Для конкретной реализации см. код kube-proxy

kube-proxy изменяет только таблицы filter и nat. Он расширяет цепочки iptables, настраивая пять цепочек: KUBE-SERVICES, KUBE-NODEPORTS, KUBE-POSTROUTING, KUBE-MARK-MASQ и KUBE-MARK-DROP, и в основном настраивает правила маршрутизации трафика, добавляя правила в цепочку KUBE-SERVICES (прикрепленную к PREROUTING и OUTPUT)

Информация о кластере

Pod CIDR: 172.31.0.0/16

Alibaba Cloud kubernetes v1.12.6-aliyun.1

*.aliyuncs.com/acs/flannel:v0.8.0

Приватный IP SLB: 172.6.6.6 (на самом деле также привязан к EIP)

Использование svc в качестве примера

Использование testsvc под пространством имен default в качестве примера

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
➜  ~ kgsvc testsvc
NAME              TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)         w
testsvc           LoadBalancer   172.30.5.207   172.6.6.6      443:30031/TCP   106d

➜  ~ iptables -t nat -nL 

Chain PREROUTING (policy ACCEPT)
target         prot opt source               destination
KUBE-SERVICES  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes service portals */

Chain OUTPUT (policy ACCEPT)
target         prot opt source               destination
KUBE-SERVICES  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes service portals */
DOCKER         all  --  0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

# Все службы находятся в этой цепочке, очень длинной
Chain KUBE-SERVICES (2 references)
target                     prot opt source               destination
KUBE-MARK-MASQ             tcp  -- !172.31.0.0/16        172.30.5.207         /* default/testsvc: cluster IP */ tcp dpt:443
KUBE-SVC-M42ZCW2EYUCRBVAF  tcp  --  0.0.0.0/0            172.30.5.207         /* default/testsvc: cluster IP */ tcp dpt:443
......
KUBE-FW-M42ZCW2EYUCRBVAF   tcp  --  0.0.0.0/0            172.6.6.6            /* default/testsvc: loadbalancer IP */ tcp dpt:443

# Пометить проходящие пакеты
Chain KUBE-MARK-MASQ (522 references)
target     prot opt source               destination
MARK       all  --  0.0.0.0/0            0.0.0.0/0            MARK or 0x4000

Chain KUBE-XLB-M42ZCW2EYUCRBVAF (2 references)
target                     prot opt source               destination
KUBE-SVC-M42ZCW2EYUCRBVAF  all  --  172.31.0.0/16        0.0.0.0/0            /* Redirect pods trying to reach external loadbalancer VIP to clusterIP */
KUBE-MARK-DROP             all  --  0.0.0.0/0            0.0.0.0/0            /* default/testsvc: has no local endpoints */


Chain KUBE-SVC-M42ZCW2EYUCRBVAF (2 references)
target                     prot opt source               destination
KUBE-SEP-EA7TYKWK2S6G4PQR  all  --  0.0.0.0/0            0.0.0.0/0            statistic mode random probability 0.14286000002
KUBE-SEP-ZJI36FVTROQF5MX7  all  --  0.0.0.0/0            0.0.0.0/0            statistic mode random probability 0.16667000018
KUBE-SEP-JLGUPWE7JCRU2AGG  all  --  0.0.0.0/0            0.0.0.0/0            statistic mode random probability 0.20000000019
KUBE-SEP-GCNPY23RDN22AOTX  all  --  0.0.0.0/0            0.0.0.0/0            statistic mode random probability 0.25000000000
KUBE-SEP-FNDISD3HQYKEHL3T  all  --  0.0.0.0/0            0.0.0.0/0            statistic mode random probability 0.33332999982
KUBE-SEP-3RWVMCKITDQWELSA  all  --  0.0.0.0/0            0.0.0.0/0            statistic mode random probability 0.50000000000
KUBE-SEP-BVMKBOC4GGNJ3567  all  --  0.0.0.0/0            0.0.0.0/0

Chain KUBE-SEP-BVMKBOC4GGNJ3567 (1 references)
# 172.31.9.52 — это виртуальный IP пода
target          prot opt source               destination
KUBE-MARK-MASQ  all  --  172.31.9.52          0.0.0.0/0
DNAT            tcp  --  0.0.0.0/0            0.0.0.0/0            tcp to:172.31.9.52:80

Chain KUBE-FW-M42ZCW2EYUCRBVAF (1 references)
target                     prot opt source               destination
KUBE-XLB-M42ZCW2EYUCRBVAF  all  --  0.0.0.0/0            0.0.0.0/0            /* default/testsvc: loadbalancer IP */
KUBE-MARK-DROP             all  --  0.0.0.0/0            0.0.0.0/0            /* default/testsvc: loadbalancer IP */

Chain KUBE-MARK-DROP (60 references)
target     prot opt source               destination
MARK       all  --  0.0.0.0/0            0.0.0.0/0            MARK or 0x8000

Графически:

image

1
2
3
4
5
6
7
8
9
10
11
graph TB
a(Внутренний трафик/PREROUTING)-->c(KUBE-SERVICES)
b(Внешний трафик/OUTPUT)-->c
c-->d(KUBE-MARK-MASQ)
d-->|destination:172.30.5.207|e(KUBE-SVC-M42ZCW2EYUCRBVAF)
e-->|destination:172.30.5.207|p1(KUBE-SEP-EA7TYKWK2S6G4PQR)
e-->|destination:172.30.5.207|p2(KUBE-SEP-ZJI36FVTROQF5MX7)
p1-->|destination:<podIP1>|f(KUBE-FW-M42ZCW2EYUCRBVAF)
p2-->|destination:<podIP2>|f
f-->g(KUBE-XLB-M42ZCW2EYUCRBVAF)
g-->|После перехвата IP балансировщика нагрузки на узле, пересылка в службу|h(KUBE-SVC-M42ZCW2EYUCRBVAF)

Некоторые приемы iptables

Почему вероятность пода увеличивается

Первая вероятность 1/3: Если совпало, это означает попадание в 1/3. Если не совпало, оставшиеся 2/3 переходят к следующей строке.

Вторая вероятность 1/2: Если совпало, это означает попадание в 2/3 * 1/2 = 1/3. Если не совпало, 1/2 переходит к следующей строке.

Третья вероятность 1: Если совпало, это 2/3 * 1/2 * 1 = 1/3

Почему последняя цепочка KUBE-SEP-BVMKBOC4GGNJ3567 не имеет вероятности

Последовательное сопоставление, она берет остаток, поэтому больше не нужно вычислять вес.

Что означает destination 0.0.0.0/0

Внимательно наблюдайте за всей ссылкой. К моменту достижения шага KUBE-SEP-XXX мы уже получили виртуальный IP пода. Поэтому, кроме этого, назначения других цепочек остаются неизменными и больше не нуждаются в изменении.

Заключение

  1. flannel версии kubernetes 0.8 — это крупномасштабное применение iptables.
  2. Эта длинная и дурно пахнущая цепочка KUBE-SERVICES определяет, что сопоставление служб — O(n). По мере увеличения svc добавление/удаление/изменение/запрос будет становиться все медленнее.
  3. Когда количество svc превышает 1000, задержка будет довольно заметной.
  4. kube-proxy должен быть основан на режиме IPVS, использование iptables только повторит ту же ошибку.
  5. svcIP — это транзитный виртуальный IP.

Ссылки

  1. Запись обновления Kubernetes с 1.10 до 1.11 (продолжение): Kubernetes kube-proxy включает режим IPVS
  2. Как включить ipvs в kubernetes
  3. Практика оптимизации производительности служб Huawei Cloud в крупномасштабных сценариях K8S
  4. Поток сетевых пакетов kubernetes
  5. Интерпретация режима ipvs kube-proxy
  6. Сравнение режимов kube-proxy: iptables или IPVS?
  7. Как редактировать правила iptables
  8. Простое введение в iptables & ipvs
  9. Связанное с iptables
  10. Понимание iptables в среде kubernetes