作者:SRE運維部落格
部落格地址: https://www.cnsre.cn/
雙十一薅了幾個雲廠商的羊毛,一開始搭建了k3s的單機版,後面就想著能不能搭建一個k3s叢集,然後參考了這位大佬的文章,就試著用 WireGuard 來進行組網。它輕量、便捷、高效,而且資料全程加密傳輸,是依託公網組建虛擬區域網的優秀選擇。
環境介紹
伺服器介紹
雲廠商 | 公網IP地址 | 內網IP地址 | 虛擬網路IP地址 | 作業系統 | 核心版本 |
---|---|---|---|---|---|
騰訊雲1 | 42.xx.xx.12 | 10.0.16.8 | 192.168.1.1 | CentOS Linux release 7.9.2009 (Core) | 5.15.2-1 |
騰訊雲2 | 122.xx.xxx.111 | 10.0.0.6 | 192.168.1.2 | CentOS Linux release 7.9.2009 (Core) | 5.15.2-1 |
阿里雲 | 122.xx.xx.155 | 172.17.0.3 | 192.168.1.3 | CentOS Linux release 7.9.2009 (Core) | 5.15.2-1 |
搭建前準備
在搭建跨雲的 k3s
叢集前,我們需要把 WireGuard
安裝好,WireGuard
對核心是有要求的,所以核心已經要升級到 5.15.2-1.el7.elrepo.x86_64
在所有節點開啟 IP 地址轉發:
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
echo "net.ipv4.conf.all.proxy_arp = 1" >> /etc/sysctl.conf
sysctl -p /etc/sysctl.conf
所有節點開啟修改主機名稱
# 騰訊雲1執行
hostnamectl set-hostname k3s-master
# 騰訊雲2執行
hostnamectl set-hostname k3s-node1
# 阿里雲執行
hostnamectl set-hostname k3s-node2
升級核心
幾個伺服器預設的核心都是 3.10
的,安裝WireGuard
需要吧核心升級到比較高的版本。
升級核心前
先升級軟體包(非必要)
yum update -y
新增 iptables 規則,允許本機的 NAT 轉換:
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i wg0 -o wg0 -m conntrack --ctstate NEW -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.1.1/24 -o eth0 -j MASQUERADE
注意:
wg0
:為你定義的虛擬網路卡
192.168.1.1
: 為你的虛擬IP地址段
eth0
:為你的物理網路卡
升級核心
所有節點都要執行
方法1:
直接下載RPM包進行安裝。
如果你想安裝其他核心,你也可以在 這裡下載
wget http://ftp.sjtu.edu.cn/sites/elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-ml-5.15.2-1.el7.elrepo.x86_64.rpm
rpm -ivh kernel-ml-5.15.2-1.el7.elrepo.x86_64.rpm
方法 2:
利用包管理工具更新
# 載入公鑰
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
# 升級安裝 elrepo
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-5.el7.elrepo.noarch.rpm
# 載入 elrepo-kernel 後設資料
yum --disablerepo=\* --enablerepo=elrepo-kernel repolist
# 安裝最新版本的核心
yum --disablerepo=\* --enablerepo=elrepo-kernel install kernel-ml.x86_64 -y
# 刪除舊版本工具包
yum remove kernel-tools-libs.x86_64 kernel-tools.x86_64 -y
方法3:
通過原始碼包編譯安裝.
這種方式可定製性強,但也比較複雜,有需要的可自行查詢資料安裝,下面只給出各系統版本核心原始碼包的下載地址
修改預設核心版本
# 檢視當前實際啟動順序
grub2-editenv list
# 檢視核心插入順序
grep "^menuentry" /boot/grub2/grub.cfg | cut -d "'" -f2
# 設定預設啟動
grub2-set-default 'CentOS Linux (5.15.2-1.el7.elrepo.x86_64) 7 (Core)'
# 重新建立核心配置
grub2-mkconfig -o /boot/grub2/grub.cfg
# 重啟伺服器
reboot
# 驗證當前核心版本
uname -r
注意:
核心版本一定要是比較高的,不然啟動WireGuard
會報錯。
[#] ip link add wg0 type wireguard
RTNETLINK answers: Operation not supported
Unable to access interface: Protocol not supported
[#] ip link delete dev wg0
Cannot find device "wg0"
安裝 WireGuard
所有節點執行
安裝流程非常簡單,我這裡是直接將 CentOS 核心更新到目前最新的 5.15.2 版本,其中就已經包含了 WireGuard
的核心模組,只需要安裝 wireguard-tools
這個 yum
包就行了。
yum install epel-release https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
yum install yum-plugin-elrepo kmod-wireguard wireguard-tools -y
配置 WireGuard
wireguard-tools
包提供了我們所需的工具 wg
和 wg-quick
,可以使用它們來分別完成手動部署和自動部署。
先按照官方文件描述的形式,生成騰訊雲1
用於加密解密的金鑰
wg genkey | tee privatekey | wg pubkey > publickey
然後在當前目錄下就生成了 privatekey
和 publickey
兩個檔案
注意:
金鑰是配置到本機的,而公鑰是配置到其它機器裡的。
cat privatekey publickey
EMWcI01iqM4zkb7xfbaaxxxxxxxxDo2GJUA=
0ay8WfGOIHndWklSIVBqrsp5LDWxxxxxxxxxxxxxxQ=
現在我們需要與上述主機對等聯網的 騰訊雲2
阿里雲
,其公網IP(這邊需要填寫的是能與主機通訊的IP)是 122.xx.xxx.111
,122.xx.xx.155
我們首先依照上面的流程安裝 WireGuard
並生成好 騰訊雲2
阿里雲
的金鑰。
然後編寫 騰訊雲1
完整的配置檔案,以供 wg-quick
使用,在主機A的 /etc/wireguard/wg0.conf
中寫入
[Interface]
PrivateKey = EMWcI01iqM4zkb7xfbaaxxxxxxxxDo2GJUA=
Address = 192.168.1.1
ListenPort = 5418
[Peer]
PublicKey = 騰訊雲2 publickey
EndPoint = 122.xx.xxx.111:5418
AllowedIPs = 192.168.1.2/32
[Peer]
PublicKey = 阿里雲publickey
EndPoint = 122.xx.xx.155:5418
AllowedIPs = 192.168.1.3/32
配置說明
Interface
: 小節是屬於騰訊雲1
(也就是本機)的配置.
Address
: 是分配給 騰訊雲1
虛擬IP,
ListenPort
: 是主機之間通訊使用的埠,是 UDP 協議的。
Peer
: 是屬於需要通訊的 騰訊雲2
、阿里雲
的資訊,有多少需要通訊的主機,就新增多少個 Peer
小節。
EndPoint
: 是 騰訊雲2
、阿里雲
的公網IP與 WireGuard
監聽的 UDP
埠,這個 IP
不一定是公網,
注意
如果你的機器通過內網也能通訊,直接用內網 IP
也可以,當然要注意這個IP
需要所有加入區域網的主機都能通訊才行。
AllowedIPs
: 是指本機發起連線的哪些IP應該將流量轉發到這個節點去,比如我們給主機B分配了內網IP 192.168.1.2
,那麼在主機A上傳送到 192.168.1.2
的資料包,都應該轉發到這個 EndPoint
上,它其實起的是一個過濾作用。而且多個 Peer
時,這裡配置的IP
地址不能有衝突。
各個節點生產的 privatekey
和publickey
分別如下
# master 節點
[root@k3s-master ~]# cat privatekey publickey
EMWcI01iqM4zkb7xfbaaxxxxxxxxDo2GJUA=
0ay8WfGOIHndWklSIVBqrsp5LDWxxxxxxxxxxxxxxQ=
# node1 節點
[root@k3s-node1 ~]# cat privatekey publickey
QGdNkzpnIkuvUU+00C6XYxxxxxxxxxK0D82qJVc=
3izpVbZgPhlM+S5szOogTDTxxxxxxxxxuKuDGn4=
# node2 節點
[root@k3s-node2 ~]# cat privatekey publickey
WOOObkWINkW/hqaAME9r+xxxxxxxxxm+r2Q=
0f0dn60+tBUfYgzw7rIihKbqxxxxxxxxa6Wo=
各個節點配置檔案如下
# master 節點
cat /etc/wireguard/wg0.conf
[Interface]
PrivateKey = EMWcI01iqM4zkb7xfbaaxxxxxxxxDo2GJUA=
Address = 192.168.1.1
ListenPort = 5418
[Peer]
PublicKey = 3izpVbZgPhlM+S5szOogTDTxxxxxxxxxuKuDGn4=
EndPoint = 122.xx.xxx.111:5418
AllowedIPs = 192.168.1.2/32
[Peer]
PublicKey = 0f0dn60+tBUfYgzw7rIihKbqxxxxxxxxa6Wo=
EndPoint = 122.xx.xx.155:5418
AllowedIPs = 192.168.1.3/32
# node1 節點
cat /etc/wireguard/wg0.conf
[Interface]
PrivateKey = QGdNkzpnIkuvUU+00C6XYxxxxxxxxxK0D82qJVc=
Address = 192.168.1.2
ListenPort = 5418
[Peer]
PublicKey = 0ay8WfGOIHndWklSIVBqrsp5LDWxxxxxxxxxxxxxxQ=
EndPoint = 42.xx.xx.12:5418
AllowedIPs = 192.168.1.1/32
[Peer]
PublicKey = 0f0dn60+tBUfYgzw7rIihKbqxxxxxxxxa6Wo=
EndPoint = 122.xx.xx.155:5418
AllowedIPs = 192.168.1.3/32
# node2 節點
cat /etc/wireguard/wg0.conf
[Interface]
PrivateKey = WOOObkWINkW/hqaAME9r+xxxxxxxxxm+r2Q=
Address = 192.168.1.3
ListenPort = 5418
[Peer]
PublicKey = 0ay8WfGOIHndWklSIVBqrsp5LDWxxxxxxxxxxxxxxQ=
EndPoint = 42.xx.xx.12:5418
AllowedIPs = 192.168.1.1/32
[Peer]
PublicKey = 3izpVbZgPhlM+S5szOogTDTxxxxxxxxxuKuDGn4=
EndPoint = 122.xx.xx.155:5418
AllowedIPs = 192.168.1.2/32
啟動 WireGuard
配置檔案寫好後,使用 wg-quick
工具來建立虛擬網路卡,
wg-quick up wg0
上面命令中的 wg0
對應的是 /etc/wireguard/wg0.conf
這個配置檔案,其自動建立的網路卡裝置,名字就是 wg0,這對應關係自不必多言。
將騰訊雲2
、阿里雲
的網路卡裝置都安裝配置好後,就能使用 wg
命令來觀察組網情況了
[root@k3s-master ~]# wg
interface: wg0
public key: 0ay8WfGOIHndWklSIVBqrsp5LDWxxxxxxxxxxxxxxQ=
private key: (hidden)
listening port: 5418
peer: 0f0dn60+tBUfYgzw7rIihKbqxxxxxxxxa6Wo=
endpoint: 122.xx.xx.155:5418
allowed ips: 192.168.1.3/32
latest handshake: 3 minutes, 3 seconds ago
transfer: 35.40 KiB received, 47.46 KiB sent
peer: 3izpVbZgPhlM+S5szOogTDTxxxxxxxxxuKuDGn4=
endpoint: 122.xx.xxx.111:5418
allowed ips: 192.168.1.2/32
latest handshake: 5 minutes, 6 seconds ago
transfer: 24.84 KiB received, 35.21 KiB sent
可以看到列出了對等聯網的節點資訊,還有通訊測量資料。然後可以通過 ping 其他主機的虛擬IP或者 ssh 其他主機的IP地址,來檢查網路通訊是否正常。
自動化
系統重啟後,WireGuard
建立的網路卡裝置就會丟失,有自動化的指令碼
systemctl enable wg-quick@wg0
使用上述命令生成systemd守護指令碼,開機會自動執行up指令。
配置熱過載
wg-quick並未提供過載相關的指令,但是提供了 strip
指令,可以將 conf 檔案轉換為 wg 指令可以識別的格式。
wg syncconf wg0 <(wg-quick strip wg0)
即可實現熱過載。
完成 WireGuard
的安裝配置以後,我們就可以接下來安裝 k3s 的叢集了。
安裝 K3S 叢集
master節點安裝
curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -s - --node-external-ip 42.xx.xx.12 --advertise-address 42.xx.xx.12 --node-ip 192.168.1.1 --flannel-iface wg0
引數說明:
--node-external-ip 42.xx.xx.12
為節點設定外部IP,阿里雲VPC的外網IP並未直接繫結到虛擬機器網路卡上,所以我要設定這個引數,避免k3s元件在設定loadbalance時,將內網IP當作公網IP使用。--advertise-address 42.xx.xx.12
用於設定kubectl工具以及子節點進行通訊使用的地址,可以是IP,也可以是域名,在建立apiserver證照時會將此設定到有效域中。--node-ip 10.20.30.1
如果不設定這個引數,那麼第一張網路卡裝置上的IP就會被選中,所以這個IP常是內網IP。但我自行組建了虛擬區域網,所以需要指定虛擬區域網的IP(也就是WireGuard的IP)。--flannel-iface wg0
wg0是WireGuard建立的網路卡裝置,我需要使用虛擬區域網來進行節點間的通訊,所以這裡需要指定為wg0。
另外就是,由於WireGuard的所有流量都是加密傳輸的,通過它來進行節點間的通訊,就已經能夠保證通訊安全,也就沒有必要改用其它的CNI驅動,使用預設的就可以了。
在主節點執行上述命令後,一分鐘不到就可以看到指令碼提示安裝完成。通過命令檢視下主控端的執行情況
systemctl status k3s
如果執行正常,那麼就看看容器的執行狀態是否正常
kubectl get pods -A
-A
引數用於檢視所有名稱空間,如果容器都處於 running 狀態,那麼安裝就成功了,接下來要可以新增被控節點。
Agent 安裝
有了上述安裝主控的經驗,安裝work節點更加簡單,引數需要一定的調整
騰訊雲2執行
curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_URL=https://192.168.1.1:6443 K3S_TOKEN=K10720eda8a278bdc7b9b6d787c9676a92119bb2cf95048d6a3cd85f15717edfbe5::server:e98b986e8202885cb54da1b7e701f67e sh -s - --node-external-ip 122.xx.xxx.111 --node-ip 192.168.1.2 --flannel-iface wg0
阿里雲執行
curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_URL=https://192.168.1.1:6443 K3S_TOKEN=K10720eda8a278bdc7b9b6d787c9676a92119bb2cf95048d6a3cd85f15717edfbe5::server:e98b986e8202885cb54da1b7e701f67e sh -s - --node-external-ip 122.xx.xx.155 --node-ip 192.168.1.3 --flannel-iface wg0
引數不必過多解釋
K3S_Token
根據文件說明,去/var/lib/rancher/k3s/server/node-token
獲取即可。K3S_URL
需要設定主控的通訊地址埠,埠預設是6443,IP地址就是虛擬網域的IP,這樣流量就會通過WireGuard加密傳輸。
另外兩個引數也不必多說,與主控一樣的邏輯。執行後稍等一會,安裝成功後,照例檢視服務執行狀態
systemctl status k3s-agent
如果有報錯就根據報錯查詢解決方案。
都安裝好以後 在master節點檢查。
kubectl get nodes -o wide
至此 多雲 K3S 叢集已經搭建完畢。
作者:SRE運維部落格
部落格地址: https://www.cnsre.cn/