我們知道kube-proxy在1.8之后就增加了ipvs模式,直到我在部署1.9.1版本的Proxy時(shí),ipvs默認(rèn)仍然還在beta版本。
最近試用了一下,運(yùn)行在ipvs模式下的kube-proxy大體和之前我所用的kube-router類似,但是功能反而沒有kube-router支持的完善。比如對(duì)于ipvs的負(fù)載均衡策略的支持,kube-proxy是配置在啟動(dòng)參數(shù)當(dāng)中,而kube-router是配置在svc的annotate中。相比kube-proxy的功能kube-router要更靈活一些。當(dāng)然這些都不是問題,作為Kubernetes的親兒子,這些功能應(yīng)該很快都會(huì)被支持。
好了,說下最近遇到的問題吧。
背景
既然文章標(biāo)題說是網(wǎng)絡(luò)問題,下面就簡(jiǎn)單介紹下kube-proxy所在的物理機(jī)的網(wǎng)絡(luò)環(huán)境:
| 服務(wù)器類型 | 管理網(wǎng) | 容器網(wǎng) | SVC網(wǎng)絡(luò) | 存儲(chǔ)網(wǎng) |
|---|---|---|---|---|
| Kube-Proxy | 10.17.64.0/22 | IPVLAN | 10.17.74.0/24 | 10.17.70.0/23 |
問題現(xiàn)象:
- 外部服務(wù)器無法ping通eth2網(wǎng)卡,也無法ping通svc網(wǎng)絡(luò)。下面是我kube-proxy的環(huán)境:
kube-proxy運(yùn)行在ipvs模式下,通過svc創(chuàng)建的Cluster都綁定在kube-ipvs0這塊虛擬網(wǎng)卡上。
ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 18:66:da:6d:b5:ac brd ff:ff:ff:ff:ff:ff
inet 10.17.64.14/22 brd 10.17.67.255 scope global eth0
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 18:66:da:6d:b5:ad brd ff:ff:ff:ff:ff:ff
4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 18:66:da:6d:b5:ae brd ff:ff:ff:ff:ff:ff
inet 10.17.74.253/24 scope global eth2
valid_lft forever preferred_lft forever
5: eth3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 18:66:da:6d:b5:af brd ff:ff:ff:ff:ff:ff
inet 10.17.70.14/23 scope global eth3
valid_lft forever preferred_lft forever
18: dummy0: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
link/ether ee:16:fe:84:08:df brd ff:ff:ff:ff:ff:ff
19: kube-ipvs0: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
link/ether 22:41:85:c1:65:54 brd ff:ff:ff:ff:ff:ff
inet 10.17.74.1/32 brd 10.17.74.1 scope global kube-ipvs0
valid_lft forever preferred_lft forever
inet 10.17.74.2/32 brd 10.17.74.2 scope global kube-ipvs0
valid_lft forever preferred_lft forever
這里可以看到我的eth2網(wǎng)卡和kube-ipvs0所處一個(gè)網(wǎng)段。由于默認(rèn)網(wǎng)關(guān)是處于管理網(wǎng),這樣就出現(xiàn)訪問SVC網(wǎng)絡(luò)不通的尷尬場(chǎng)景。這里就牽扯出一個(gè)新的概念了,策略路由
簡(jiǎn)單來說策略路由,是一種可以靈活配置路由包轉(zhuǎn)發(fā)的機(jī)制,可以根據(jù)配置服務(wù)器上的路由策略來選擇外出包的路徑。如果服務(wù)器配置了多網(wǎng)卡,這個(gè)時(shí)候就需要配置策略路由來調(diào)整出口的網(wǎng)卡。
以我這里的kube-proxy為例:
默認(rèn)情況下服務(wù)器用的路由表空間是default,由于需要另加路由表,就需要在/etc/iproute2/rt_tables文件下創(chuàng)建一張新表,如下:
$ cat /etc/iproute2/rt_tables
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
100 eth2
添加路由策略
# 清空路由表100
ip route flush table 100
# 添加一個(gè)默認(rèn)的路由表
ip route add default via 10.17.74.254 dev eth2 src 10.17.74.253 table 100
# 將來自10.17.74.253轉(zhuǎn)發(fā)到table 100上處理
ip rule add from 10.17.74.253 table 100
# 查看路由表信息
ip rule list
這樣就eth2網(wǎng)卡就能在外部被訪問了。
同理,我們將來源是SVC地址的IP也轉(zhuǎn)發(fā)到table 100上處理,這樣SVC的地址就能在外部訪問了。
總結(jié)
雖然這樣能夠暫時(shí)訪問svc,但是畢竟不是長(zhǎng)久之計(jì),目前準(zhǔn)備給社區(qū)提交解決方案。