背景:
早期伺服器集中于騰訊雲,開始是傳統網絡。後面是自定義的私有網絡vpc.當然了vpc中還有容器網絡,容器的網絡方案使用了預設的Global Router,并沒有使用VPC-CNI的容器網絡與雲主機網絡在同一個 VPC 内的方案(騰訊雲官方文檔還有了Cilium-Overlay 的方案,恩還有個測試環境的k8s叢集是kubeadm自建的叢集網絡插件用的cilum).今年45月份有些新業務又跑在了阿裡雲上面,叢集環境直接用了阿裡雲的ACK PRO。網絡插件使用了Flannel ,也沒有使用阿裡雲的Terway。現在的需求就是要把兩個網絡打通!
看了一下網上的各種方案:
1. 騰訊雲與阿裡雲如何建立VPN連接配接(不過貌似阿裡雲側vpn鏡像找不到了,故未能跑通)
2.專線?阿裡雲騰訊雲都有專線服務https://cloud.tencent.com/developer/article/1731806?from=15425。這樣的也可以嘗試一下?
3.WireGuard米開朗基楊大佬寫過一系列的文章;如:基于 WireGuard 和 OpenVPN 的混合雲基礎架建構設
我也選擇了WireGuard的方案.....
以下測試都基于新環境搭建,沒有敢在現有的環境去搞......
終極實作目标
**三個vpc **
就先以ABC命名吧 !A B 網絡雙向互通,c網絡可以連接配接b,A網絡可以連接配接C?初步規劃每個叢集起碼有2台伺服器以上,可以ping通ssh目标網絡伺服器?恩 還可以在每個網絡k8s叢集中搞一個nginx service,用curl掉一下測試應用的通路?初步就算那麼想的!
注:所謂互通都包括容器網絡的通信!
VPC子網規劃
還是依賴與這個神奇的工具:http://www.ab126.com/web/3552.html,還是拿10.0.0.0/8去分了。A網絡騰訊雲上海vpc網絡設定為10.10.0.0/16, B網絡阿裡雲網絡10.20.0.0/16,C網絡騰訊雲北京VPC10.40.0.0/21
關于A網絡:
注意:建立子網subnet的時候手殘了,沒有注意本來wireguard-shanghai3對應上海三區,wireguard-shanghai4對應上海四區的,沒有留意,就做成這樣的了......
關于B網絡
阿裡雲B網絡建立VPC也建立了4個可用區。但是他的定義都是叫什麼交換機!,如下:
注意:當然了B網絡也選擇了上海區域,與騰訊雲A網絡處于同一地區!
關于C網絡
覺得A,B網絡浪費資源了....就修改了一下子網路遮罩:
最終網段規劃為10.40.0.0/21
subset子網如下:
關于容器的網絡
A網絡容器網絡
A網絡容器網絡CIDR172.16.0.0/16,Service CIDR172.16.252.0/22(其實就是172.16.0.0/16)
B網絡容器網絡-以及阿裡雲ack叢集的建立
恩 覺得容器網絡 /16整段也有點浪費,修改一下就取172.17.0.0/20吧,本來就是示範的這些資源也都夠用了,實際生産環境中,如果需要考慮多地域,or多叢集,還考慮互通,應該合理劃分子網資源!
由于阿裡雲容器服務需要填寫Pod CIDR Service CIDR開始本來想直接分兩個網段的但是操作失誤删除了叢集重建沖突了(開始用的阿裡雲自己的那作業系統,安裝wireguard不順暢,删除更換系統為centos7了!),就把172.17.0.0/20劃分了四個子網取Pod CIDR172.17.8.0/22 Service CIDR172.17.12.0/22
c網絡容器網絡-以及tke叢集的簡單建立
以網絡c為例:容器網絡依然從172.17.0.0/16子網20去分吧!選擇了172.17.16.0/20段
建立tke叢集可以參考下圖:
打開tke控制台,選擇區域北京,建立:
輸入叢集名稱(個人定義了),關鍵是叢集網絡選擇前面建立的C網絡(北京有好幾個vpc網絡呢),配置容器網絡172.17.16.0/20
比較喜歡TKE容器網絡的設定好帶能搞在一個段裡......阿裡雲的還要算一下。比較麻煩了,系統選擇了ubuntu20.04,也不去用騰訊雲自己的TencentOS Server了,怕跟阿裡雲的系統一樣安裝wireguard有問題(其實可以參考非标準核心的安裝方式,懶得看了)......
下一步,特意添加了兩台cvm且不在同一個subset:
預設下一步吧選擇自己的登陸方式,我這裡選擇了自己的ssh-key方式!
可選元件就直接預設了,畢竟我這裡主要是示範wireguard組網!下一步:
同意,完成等待建立ing......
c叢集 兩台server 10.40.2.6将安裝**wireguard,**10.40.3.14後續作測試。
wireguard的安裝
理一遍關系
注:阿裡雲ack作業系統智能選擇centos7與alios 阿裡雲系統核心不是标準核心故作業系統我使用的centos7,騰訊雲tke叢集我用的是ubuntu 20.4系統!
每個個叢集都初始保證兩台server以上
A叢集資源:
vpc網絡資源10.10.0.0/16
容器網絡資源:172.16.0.0/16
主機名 | ip | subset | 是否安裝wireguard |
---|---|---|---|
VM-4-8-ubuntu | 10.10.4.8 | 上海二區 | 是 |
VM-4-17-ubuntu | 10.10.4.17 | 上海二區 | 否 |
VM-2-4-ubuntu | 10.10.2.4 | 上海一區 | 否 |
B叢集資源:
vpc網絡資源10.20.0.0/16
** 容器網絡資源:Pod CIDR172.17.8.0/22 Service CIDR172.17.12.0/22(17.17.0.0/20)**
主機名 | ip | 交換機(subset) | 是否安裝wireguard |
---|---|---|---|
iZuf6fxoj4zcqlpe8jupv2Z | 10.20.4.42 | 上海 可用區L(wireguard-shanghai4) | 是 |
Zuf6fxoj4zcqlpe8jupv3Z | 10.20.4.43 | 上海 可用區L(wireguard-shanghai4) | 否 |
C叢集資源:
vpc網絡資源10.40.0.0/21
** 容器網絡資源:Pod CIDR172.17.16.0/20 Service CIDR172.17.28.0/22**
主機名 | ip | subset | 是否安裝wireguard |
---|---|---|---|
VM-2-16-ubuntu | **10.40.2.16 ** | 北京二區 | 是 |
** **VM-3-16-ubuntu | **10.40.3.16 ** | 北京三區 | 否 |
前置條件:
防火牆都是關閉的,代理伺服器(安裝wireguard節點)開啟了ip轉發
保證net.ipv4.ip_forward = 1
sysctl -p|grep ip_forward
net.ipv4.ip_forward = 1
A C網絡各一節點安裝wireguard
初步選擇在10.10.4.8這台cvm安裝wireguard
注:由于A C都是tke,且系統相同,我的安裝示範都是在10.40.2.16節點上!主要是開始操作的時候沒有截圖......
root@VM-2-16-ubuntu:~# uname -a
Linux VM-2-6-ubuntu 5.4.0-121-generic #137-Ubuntu SMP Wed Jun 15 13:33:07 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
核心5.4
sudo apt upgrade
sudo apt install wireguard-dkms wireguard-tools -y
sudo mkdir /etc/wireguard/keys
cd /etc/wireguard/keys
sudo wg genkey > vpn-gw.key
sudo wg pubkey < vpn-gw.key > vpn-gw.pub
檢查下 wireguard 子產品是否已經加載,如果沒有加載,試下執行 modprobe wireguard加載子產品
root@VM-2-16-ubuntu:/etc/wireguard/keys# lsmod |grep wire
root@VM-2-16-ubuntu:/etc/wireguard/keys# modprobe wireguard && lsmod | grep wireguard
wireguard 212992 0
ip6_udp_tunnel 16384 1 wireguard
udp_tunnel 16384 1 wireguard
注意:一般推薦是更新一下核心到linux-kernel 5.6以上,5.6kernel已經内置wireguard的mod,but鑒于叢集的穩定性,我沒有更新核心
B網絡一節點安裝wireguard
B網絡伺服器系統為centos7故yum操作安裝wireguard:
yum install epel-release https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
yum install yum-plugin-elrepo
yum install kmod-wireguard wireguard-tools
#檢查下 wireguard 子產品是否已經加載,如果沒有加載,試下執行 modprobe wireguard加載子產品
modprobe wireguard
modprobe wireguard && lsmod | grep wireguard
注:關于核心是否更新看個人意願。或者找一個額外機器更新....為了維護叢集穩定性,未能更新核心
A B網絡互通
基本就是實作下圖這樣B網絡中容器and vpc網絡通過cvm 10.20.4.42的公網ip 到A網絡10.10.4.8的公網Ip 路由通路A網絡中資源,反之A網絡容器and vpc網絡資源通過10.10.4.8的公網ip到B網絡的10.20.4.42的公網ip路由通路B網絡中資源(自己的了解,可能語言表達有誤)
注意:10.30.0.1/24 10.10.30.2/24為wareguard網絡,避免與各個網絡位址沖突!
名詞解釋:
- Interface
Address:這個是開啟wg之後本機的隧道IP
ListenPort:這個就設定51820了忘了看了哪個文章的了
PrivateKey:本機的私鑰/etc/wireguard/keys/vpn-gw.key
- Peer
Public Key: 服務端(就是要連接配接的網絡的有公網ip,安裝wireguard的節點)的公鑰即需要連接配接的對方10.20.4.42的/etc/wireguard/keys/vpn-gw.pub
Allow IPs: 需要走隧道的IP段, 一般包含隧道自身IP段, 以及要借道隧道的IP段, 但是這裡設定并不會産生對應的route
Endpoint: 服務端的IP和端口
Persis.Keepalive: 25 保持活動的時間間隔
A網絡10.10.4.8節點配置
10.10.4.8節點wg0.conf配置
cat /etc/wireguard/ wg0.conf
[Interface]
Address = 10.30.0.1/24
ListenPort = 51820
PrivateKey = xxxxxxxxxxxxxxxxxxxxxxxxxxx
SaveConfig = false
MTU = 1420
# Internet Gateway config: nat wg0 out to the internet on ens5
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
PublicKey = xxxxxxxxxxxxxxxxxxxxx
AllowedIPs = 10.30.0.0/24,10.20.0.0/16,172.17.0.0/20
[Peer]
# Client1: aliyun-shanghai
PublicKey = xxxxxxxxxxxxxxxxxxxxxxxx
Endpoint = xxxxxxxx:51820
AllowedIPs = 10.30.0.2/24,10.20.0.0/16,172.17.0.0/20
PersistentKeepalive = 25
B網絡10.20.4.42節點配置
10.20.4.42節點wg0.conf配置
cat /etc/wireguard/ wg0.conf
[Interface]
Address = 10.30.0.2/24
ListenPort = 51820
PrivateKey = xxxxxxxx
SaveConfig = false
MTU = 1420
# Internet Gateway config: nat wg0 out to the internet on ens5
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
# Client1: MacOS-Desktop
PublicKey = xxxxxxx
Endpoint = xxxxx:51820
AllowedIPs = 10.30.0.2/24,10.10.0.0/16,172.16.0.0/16
PersistentKeepalive = 25
[Peer]
PublicKey = xxxxxxxxx
AllowedIPs = 10.30.0.1/16,10.10.0.0/16,172.16.0.0/16
啟動服務:
注: 10.20.4.42 10.10.4.8都啟動服務,關閉服務down隻是示範,保持服務up啟動!
cd /etc/wireguard
wg-quick up wg0
同理關閉服務就是:
wg-quick down wg0
測試安裝wireguard節點之間的互相通信:
10.10.4.8 ping 10.20.4.42
10.20.4.42 ping 10.10.4.8
vpc内自定義路由
如何ping 通vpc内其他cvm等網絡資源呢?
登陸騰訊雲背景私有網絡控制台找到對應vpc路由表,添加到B網絡的路由(關于172.17.0.0/16網段并沒有與B完全比對.....C網絡的容器網絡我也會路由到這裡就先這樣寫了)
同理,阿裡雲背景,打開路由表
将下一條指定到伺服器i-uf6fxoj4zcqlpe8jupv2即10.20.4.42節點
測試一下其他節點的互通:
從A網絡開始開始:
10.10.4.17 ping 10.20.4.42 10.20.4.43
換一個subset:
10.10.2.4 ping 10.20.4.42 10.20.4.43
可以在A叢集10.10.4.8 tcpdump看一下icmp包的抓包:
反之B網絡測試:
10.20.4.43 ping 10.10.4.8 10.10.4.17 10.10.2.4
AB 容器網絡and vpc的互通:
A網絡run 一個nginx deployment 并開啟service:
沒有開啟内網通路,開啟一下吧,否則都沒有辦法用kubectl,将生成檔案内容copy到A叢集任一節點使用者家目錄下./kube/config檔案中(當然了可以不開啟,直接控制台操作)
可以kubectl run or 控制台建立一個nginx鏡像就好 主要是建立一個service:
B網絡伺服器對A網絡容器網絡的連通性測試
- B網絡伺服器pingA網絡 nginx pod service ip
- B 網絡伺服器curl nginx pod service ip
B 網絡叢集建立pod 通路A 網絡vpc and容器網絡中應用:
kubectl run php --image=richarvey/nginx-php-fpm
注意:可以随便找個帶ping curl的鏡像,這個鏡像我是用習慣了
[root@iZuf6fxoj4zcqlpe8jupv2Z wireguard]# kubectl exec -it php bash
- B網絡叢集中pod ping A網絡vpc cvm位址
- B集網絡叢集pod ping A網絡叢集 中nginx pod service
- B集網絡叢集pod curl A網絡叢集 中nginx pod service
A網絡伺服器對B網絡容器連通性測試
B網絡建立nginx deployment svc
- 同理A 網絡cvm ping B網絡容器叢集nginx pod svc ip
- 同理curl 測試
curl就拿一台cvm測試了。。。。。
A 網絡叢集建立pod 通路B網絡vpc and容器網絡中應用:
kubectl run php --image=richarvey/nginx-php-fpm
root@VM-4-17-ubuntu:~/.kube# kubectl exec -it php bash
bash-5.1# ping 10.20.4.42
bash-5.1# ping 10.20.4.43
ping 容器網絡
C連接配接B連通性測試
配置類:
由圖中關系可見需要在10.20.4.42節點允許10.30.0.3/24的通信
B叢集10.20.4.42節點wg0.conf增加10.30.0.3相關設定
[Peer]
PublicKey = xxxxxxxxxxxxxxxxx
AllowedIPs = 10.30.0.3/24
[root@iZuf6fxoj4zcqlpe8jupv2Z wireguard]# wg-quick down wg0
[root@iZuf6fxoj4zcqlpe8jupv2Z wireguard]# wg-quick up wg0
C叢集10.40.2.16節點:
root@VM-2-16-ubuntu:/etc/wireguard# pwd
/etc/wireguard
root@VM-2-16-ubuntu:/etc/wireguard# cat wg0.conf
[Interface]
Address = 10.30.0.3/24
ListenPort = 51820
PrivateKey = xxxxxxxxxxxxxxxxxxxxxx
SaveConfig = false
MTU = 1420
# Internet Gateway config: nat wg0 out to the internet on ens5
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
# Client1: aliyun-shanghai
PublicKey = xxxxxxxxxxxxxxxxxxxxxxxxxx
Endpoint = xxxxxxxxxxxxxx:51820
AllowedIPs = 10.30.0.2/24,10.20.0.0/16,172.17.0.0/20
PersistentKeepalive = 25
root@VM-2-16-ubuntu:/etc/wireguard# wg-quick up wg0
C叢集cvm ping B叢集vpc and nginx pod svc
C叢集建立pod ping B叢集網絡 and 容器網絡資源
C 叢集其他節點ping B叢集網絡 and 容器網絡資源
en 登陸另外一節點10.40.3.16 ping B叢集節點不通?
恩 依然是路由的問題,找到vpc 路由表,添加路由
curl就稍微看一眼了
B叢集ping C叢集網絡 and 容器網絡資源
測試一下就好了....不通就是對的
A連接配接C連通性測試
配置類
C叢集10.40.2.16節點
root@VM-2-16-ubuntu:/etc/wireguard# cat wg0.conf
[Interface]
Address = 10.30.0.3/24
ListenPort = 51820
PrivateKey = xxxxxxxxxxxxxxxxxxxxx
SaveConfig = false
MTU = 1420
# Internet Gateway config: nat wg0 out to the internet on ens5
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
# Client1: aliyun-shanghai
PublicKey = xxxxxxxxxxxxxxxxxxxxxxxxxxx
Endpoint = xxxxxxxxxxxxx:51820
AllowedIPs = 10.30.0.2/24,10.20.0.0/16,172.17.0.0/20
PersistentKeepalive = 25
[Peer]
PublicKey = xxxxxxxxxxxxxxxxxxxxxx
AllowedIPs = 10.30.0.1/24
wg-quick重新開機wg0服務
root@VM-2-16-ubuntu:/etc/wireguard# wg-quick down wg0
root@VM-2-16-ubuntu:/etc/wireguard# wg-quick up wg0
A叢集10.0.4.8節點:
root@VM-4-8-ubuntu:/etc/wireguard# cat wg0.conf
[Interface]
Address = 10.30.0.1/24
ListenPort = 51820
PrivateKey = xxxxxxxxxxxxxxxxxxx
SaveConfig = false
MTU = 1420
# Internet Gateway config: nat wg0 out to the internet on ens5
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
PublicKey = xxxxxxxxxxxxxxxxxxxxxx
AllowedIPs = 10.30.0.0/24,10.20.0.0/16,172.17.0.0/20
[Peer]
# Client1: aliyun-shanghai
PublicKey = xxxxxxxxxxxxxxxxxxxxxxxxx
Endpoint = xxxxxxxxxxxxx:51820
AllowedIPs = 10.30.0.2/24,10.20.0.0/16,172.17.0.0/20
PersistentKeepalive = 25
[Peer]
# Client1: wireguard-beijing
PublicKey = xxxxxxxxxxxxxxxxxx
Endpoint = xxxxxxxxxxxxxxxxx:51820
AllowedIPs = 10.30.0.3/24,10.40.0.0/21,172.17.16.0/20
PersistentKeepalive = 25
root@VM-4-8-ubuntu:/etc/wireguard# wg-quick down wg0
root@VM-4-8-ubuntu:/etc/wireguard# wg-quick up wg0
強調一下 防火牆 udp:51820
前面沒有說特意拿C網絡來說一下。防火牆要開通UDP:51820(或者着針對自己的ip位址),前面AB叢集我都預設打開了。不開通的時候是ping 不通的,打開tcp:51820依然不通,打開udp:51820就可以ping 通了!
A叢集CVM10.10.4.8(wireguard)節點ping C叢集網絡 and 容器網絡資源
A叢集進入容器pingC叢集網絡 and 容器網絡資源
A叢集其他CVM節點(安裝wireguard節點外節點)ping C叢集網絡資源
A網絡其他cvm ping C網絡一定記得手動添加路由:
C叢集 ping A叢集
草草測試一下吧吧......
問題來了:
上面 A B CB AC的測試再作一遍發現....AB不通了:
看一眼AB 節點的配置檔案
A叢集
B叢集
初步懷疑兩個叢集配置檔案裡面有沖突了?過程就是一次次改嘗試
最終配置檔案如下:
A叢集10.0.4.8節點
[Interface]
Address = 10.30.0.1/24
ListenPort = 51820
PrivateKey = xxxxxxxxxxxxxxxxxxxxxxx
SaveConfig = false
MTU = 1420
# Internet Gateway config: nat wg0 out to the internet on ens5
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
#[Peer]
#PublicKey =xxxxxxxxxxxxxxx
#AllowedIPs = 10.30.0.2/24
[Peer]
# Client1: aliyun-shanghai
PublicKey =xxxxxxxxxxxxxxxxxxxxxx
Endpoint = xxxxxx:51820
AllowedIPs = 10.30.0.2/32,10.20.0.0/16,172.17.0.0/20
PersistentKeepalive = 25
[Peer]
# Client1: wireguard-beijing
PublicKey = xxxxxxxxxxxxxxx
Endpoint = xxxxxxxx:51820
AllowedIPs = 10.30.0.3/32,10.40.0.0/21,172.17.16.0/20
PersistentKeepalive = 25
[Interface]
Address = 10.30.0.2/24
ListenPort = 51820
PrivateKey = xxxxxxxxxxxxxxxxxxxxx
SaveConfig = false
MTU = 1420
# Internet Gateway config: nat wg0 out to the internet on ens5
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
#[Peer]
#PublicKey = xxxxxxxxxxxxxxxxxxxxxxx
#AllowedIPs = 10.30.0.1/24
[Peer]
# Client1: MacOS-Desktop
PublicKey = xxxxxxxxxxxxxxxxxxxxxxxx
Endpoint = xxxxxxxxxxxxxxxxxxx:51820
AllowedIPs = 10.30.0.1/32,10.10.0.0/16,172.16.0.0/16
PersistentKeepalive = 25
[Peer]
PublicKey = xxxxxxxxxxxxxxxxxxxx
AllowedIPs = 10.30.0.3/24
[Interface]
Address = 10.30.0.3/24
ListenPort = 51820
PrivateKey = xxxxxxxxxxxxxxx
SaveConfig = false
MTU = 1420
# Internet Gateway config: nat wg0 out to the internet on ens5
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
# Client1: aliyun-shanghai
PublicKey = xxxxxxxxxxxxxxxx
Endpoint = xxxxxxx:51820
AllowedIPs = 10.30.0.2/32,10.20.0.0/16,172.17.0.0/20
PersistentKeepalive = 25
[Peer]
PublicKey = xxxxxxxxxxxxxxxxxxxx
AllowedIPs = 10.30.0.1/32
wg-quick down wg0
wg-quick up wg0
總結:
- wireguard跨網 組網還是很友善的
- 兩個網絡組網還好,三個組網要注意下子網路遮罩或者各種的沖突,不知道是否會覆寫沖突......
- 網絡基礎還是薄弱,沒有搞太明白....但是好歹三個網絡的測試搞通了
- 安全組防火牆的放行
- 新增自定義路由政策的添加