
基本
3 个协议:TCP,UDP,ICMP
4 个状态:NEW,ESTABLISHED,INVALID,RELATED
4个表
- raw:高级功能,如:网址过滤。
- mangle:数据包修改(QOS),用于实现服务质量。
- net:地址转换,用于网关路由器。
- filter:包过滤,用于防火墙规则。
5个链
- PREROUTING链:用于目标地址转换(DNAT)。
- INPUT链:处理输入数据包。
- PORWARD链:处理转发数据包。
- OUTPUT链:处理输出数据包。
- 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
图形化:

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保持不变,不再需要修改
结论
- kubernetes 0.8版本的flannel是对iptables的大规模运用。
- KUBE-SERVICES这个又臭又长的chain链注定了服务匹配是O(n)的,随着svc越来越多,增删改查会越来越卡。
- svc数量大于1000时,卡顿会相当明显
- kube-proxy应基于IPVS模式,走iptables只会重蹈覆辙
- svcIP是一个中转的虚拟IP
参考链接

Basics
3 protocols: TCP, UDP, ICMP
4 states: NEW, ESTABLISHED, INVALID, RELATED
4 tables
- raw: Advanced features, such as: URL filtering.
- mangle: Packet modification (QOS), used to implement quality of service.
- net: Address translation, used for gateway routers.
- filter: Packet filtering, used for firewall rules.
5 chains
- PREROUTING chain: Used for destination address translation (DNAT).
- INPUT chain: Processes input packets.
- FORWARD chain: Processes forwarded packets.
- OUTPUT chain: Processes output packets.
- 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
Analyzing kubernetes svc Traffic Links with iptables
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:

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
- kubernetes 0.8 version’s flannel is a large-scale application of iptables.
- 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.
- When svc count exceeds 1000, lag will be quite obvious.
- kube-proxy should be based on IPVS mode, using iptables will only repeat the same mistake.
- svcIP is a transit virtual IP.
Reference Links
- Kubernetes Upgrade Record from 1.10 to 1.11 (Continued): Kubernetes kube-proxy Enables IPVS Mode
- How to Enable ipvs in kubernetes
- Huawei Cloud’s Service Performance Optimization Practice in Large-Scale K8S Scenarios
- kubernetes Network Packet Flow
- kube-proxy ipvs Mode Interpretation
- kube-proxy Mode Comparison: iptables or IPVS?
- How to edit iptables rules
- Simple Introduction to iptables & ipvs
- iptables Related
- Understanding iptables in kubernetes Environment

基本
3つのプロトコル:TCP、UDP、ICMP
4つの状態:NEW、ESTABLISHED、INVALID、RELATED
4つのテーブル
- raw:高度な機能、例:URLフィルタリング。
- mangle:パケット変更(QOS)、サービス品質の実装に使用。
- net:アドレス変換、ゲートウェイルーターに使用。
- filter:パケットフィルタリング、ファイアウォールルールに使用。
5つのチェーン
- PREROUTINGチェーン:宛先アドレス変換(DNAT)に使用。
- INPUTチェーン:入力パケットを処理。
- FORWARDチェーン:転送パケットを処理。
- OUTPUTチェーン:出力パケットを処理。
- POSTROUTINGチェーン:ソースアドレス変換(SNAT)に使用。
よく使う方法
1
2
3
4
iptables -t filter -nL
iptables -t nat -nL
iptables -t raw -nL
iptables -t mangle -nL
iptablesでkubernetes svcトラフィックリンクを分析
ノードのiptablesはkube-proxyによって生成されます。具体的な実装については、kube-proxyのコードを参照してください。
kube-proxyはfilterテーブルとnatテーブルのみを変更します。iptablesチェーンを拡張し、KUBE-SERVICES、KUBE-NODEPORTS、KUBE-POSTROUTING、KUBE-MARK-MASQ、KUBE-MARK-DROPの5つのチェーンをカスタマイズし、主にKUBE-SERVICESチェーン(PREROUTINGとOUTPUTに付着)にルールを追加してトラフィックルーティングルールを設定します。
クラスター情報
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 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
グラフィカル:

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がノードでインターセプトされた後、サービスに転送|h(KUBE-SVC-M42ZCW2EYUCRBVAF)
iptablesのいくつかのテクニック
podの確率が増加する理由
最初の1/3の確率:一致した場合、1/3にヒットしたことを意味します。一致しない場合、残りの2/3が次の行に進みます。
2番目の1/2の確率:一致した場合、2/3 * 1/2 = 1/3にヒットしたことを意味します。一致しない場合、1/2が次の行に進みます。
3番目の確率1:一致した場合、2/3 * 1/2 * 1 = 1/3です
最後のチェーンKUBE-SEP-BVMKBOC4GGNJ3567に確率がない理由
順次マッチング、残りを取るため、重みを計算する必要がなくなりました。
destination 0.0.0.0/0の意味
リンク全体を注意深く観察してください。KUBE-SEP-XXXステップに到達した時点で、すでにpodの仮想IPを取得しています。したがって、これを除いて、他のチェーンの宛先は変更されず、変更する必要がなくなりました。
結論
- kubernetes 0.8バージョンのflannelはiptablesの大規模な応用です。
- この長くて臭いKUBE-SERVICESチェーンチェーンは、サービスマッチングがO(n)であることを決定します。svcが増加すると、追加/削除/変更/クエリがますます遅くなります。
- svc数が1000を超えると、ラグがかなり明らかになります。
- kube-proxyはIPVSモードに基づくべきで、iptablesを使用すると同じ過ちを繰り返すだけです。
- svcIPは中継仮想IPです。
参考リンク

Основы
3 протокола: TCP, UDP, ICMP
4 состояния: NEW, ESTABLISHED, INVALID, RELATED
4 таблицы
- raw: Расширенные функции, такие как: фильтрация URL.
- mangle: Изменение пакетов (QOS), используется для реализации качества обслуживания.
- net: Преобразование адресов, используется для маршрутизаторов шлюза.
- filter: Фильтрация пакетов, используется для правил файрвола.
5 цепочек
- Цепочка PREROUTING: Используется для преобразования адреса назначения (DNAT).
- Цепочка INPUT: Обрабатывает входящие пакеты.
- Цепочка FORWARD: Обрабатывает пересылаемые пакеты.
- Цепочка OUTPUT: Обрабатывает исходящие пакеты.
- Цепочка 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
Графически:

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 пода. Поэтому, кроме этого, назначения других цепочек остаются неизменными и больше не нуждаются в изменении.
Заключение
- flannel версии kubernetes 0.8 — это крупномасштабное применение iptables.
- Эта длинная и дурно пахнущая цепочка KUBE-SERVICES определяет, что сопоставление служб — O(n). По мере увеличения svc добавление/удаление/изменение/запрос будет становиться все медленнее.
- Когда количество svc превышает 1000, задержка будет довольно заметной.
- kube-proxy должен быть основан на режиме IPVS, использование iptables только повторит ту же ошибку.
- svcIP — это транзитный виртуальный IP.
Ссылки
- Запись обновления Kubernetes с 1.10 до 1.11 (продолжение): Kubernetes kube-proxy включает режим IPVS
- Как включить ipvs в kubernetes
- Практика оптимизации производительности служб Huawei Cloud в крупномасштабных сценариях K8S
- Поток сетевых пакетов kubernetes
- Интерпретация режима ipvs kube-proxy
- Сравнение режимов kube-proxy: iptables или IPVS?
- Как редактировать правила iptables
- Простое введение в iptables & ipvs
- Связанное с iptables
- Понимание iptables в среде kubernetes