天天看點

多雲搭建k3s叢集(帶wg管理UI)

作者:SRE運維部落格

部落格位址:https://www.cnsre.cn/

相關話題:https://www.cnsre.cn/tags/k3s/

雙十一薅了幾個雲廠商的羊毛,一開始搭建了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 https://pan.cnsre.cn/d/Package/Linux/kernel/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配置

# 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配置

# node1 節點
cat /etc/wireguard/wg0.conf
[Interface]
PrivateKey = QGdNkzpnIkuvUU+00C6XYxxxxxxxxxK0D82qJVc=
Address = 192.168.1.2
ListenPort = 5418

[Peer]
PublicKey = 0ay8WfGOIHndWklSIVBqrsp5LDWxxxxxxxxxxxxxxQ=
EndPoint = 42.xxx.xx.16:5418
AllowedIPs = 192.168.1.1/32

[Peer]
PublicKey = 0f0dn60+tBUfYgzw7rIihKbqxxxxxxxxa6Wo=
EndPoint = 122.xx.xx.155:5418
AllowedIPs = 192.168.1.3/32      

node2配置

# node2 節點
cat /etc/wireguard/wg0.conf
[Interface]
PrivateKey = WOOObkWINkW/hqaAME9r+xxxxxxxxxm+r2Q=
Address = 192.168.1.3
ListenPort = 5418

[Peer]
PublicKey = 0ay8WfGOIHndWklSIVBqrsp5LDWxxxxxxxxxxxxxxQ=
EndPoint = 42.xxx.xx.16: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      
多雲搭建k3s叢集(帶wg管理UI)

sre運維|Linux運維|自動化運維|多雲搭建K3S叢集|公網搭建K3S叢集|跨雲搭建K3S叢集

多雲搭建k3s叢集(帶wg管理UI)

sre運維|Linux運維|自動化運維|多雲搭建K3S叢集|公網搭建K3S叢集|跨雲搭建K3S叢集

可以看到列出了對等聯網的節點資訊,還有通信測量資料。然後可以通過 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.xxx.xx.16​

    ​ 為節點設定外部IP,阿裡雲VPC的外網IP并未直接綁定到虛拟機網卡上,是以我要設定這個參數,避免k3s元件在設定loadbalance時,将内網IP當作公網IP使用。
  • ​--advertise-address 42.xxx.xx.16​

    ​ 用于設定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      
多雲搭建k3s叢集(帶wg管理UI)

sre運維|Linux運維|自動化運維|多雲搭建K3S叢集|公網搭建K3S叢集|跨雲搭建K3S叢集

​-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=K107xxxxxxxxxxxxxxxx2cf95048d6a3cd85f15717edfbe5::server:xxxxxxxxxxxxxxxxxxxx4da1b7e701f67e 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​

    ​​ 去 ​

    ​cat /var/lib/rancher/k3s/server/node-token​

    ​ 擷取即可。
  • ​K3S_URL​

    ​ 需要設定master的通信位址端口,端口預設是6443,IP位址就是虛拟網域的IP,這樣流量就會通過WireGuard加密傳輸。
  • ​node-external-ip​

    ​ 為節點公網位址
  • ​node-ip​

    ​ 節點虛拟IP位址 執行完稍等一會,安裝成功後,檢視服務運作狀态。
systemctl status k3s-agent      

如果有報錯就根據報錯查找解決方案。

都安裝好以後 在master節點檢查。

kubectl get nodes -o wide       
多雲搭建k3s叢集(帶wg管理UI)

sre運維|Linux運維|自動化運維|多雲搭建K3S叢集|公網搭建K3S叢集|跨雲搭建K3S叢集