多雲搭建 K3S 叢集

菜鳥運維筆記發表於2021-11-19

作者:SRE運維部落格

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

文章地址:https://www.cnsre.cn/posts/211119132529/

相關話題: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  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 包提供了我們所需的工具 wgwg-quick,可以使用它們來分別完成手動部署和自動部署。

先按照官方文件描述的形式,生成騰訊雲1用於加密解密的金鑰

wg genkey | tee privatekey | wg pubkey > publickey

然後在當前目錄下就生成了 privatekeypublickey 兩個檔案

注意:

金鑰是配置到本機的,而公鑰是配置到其它機器裡的。

cat privatekey publickey
EMWcI01iqM4zkb7xfbaaxxxxxxxxDo2GJUA=
0ay8WfGOIHndWklSIVBqrsp5LDWxxxxxxxxxxxxxxQ=

現在我們需要與上述主機對等聯網的 騰訊雲2 阿里雲 ,其公網IP(這邊需要填寫的是能與主機通訊的IP)是 122.xx.xxx.111122.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地址不能有衝突。

各個節點生產的 privatekeypublickey 分別如下

# 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

sre運維|Linux運維|自動化運維|關鍵詞

sre運維|Linux運維|自動化運維|關鍵詞

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

sre運維|Linux運維|自動化運維|關鍵詞

-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 

sre運維|Linux運維|自動化運維|關鍵詞

至此 多雲 K3S 叢集已經搭建完畢。


作者:SRE運維部落格

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

文章地址:https://www.cnsre.cn/posts/211119132529/

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


相關文章