Zerotier + K3s 异地组网搭建 Kubernetes 集群

简介

目标很简单,一台云服务器(有公网 IP)+ N 台服务器(无公网),通过 Zerotier 异地组网搭建 Kubernetes 集群。

你问我哪整的无公网 IP 的服务器?那当然是放家里的 Mini PC 或者树莓派之类的咯!不知道这么做有何意义?嗯… 我猜想,如果放弃思考人类吃饱以后会干什么,应该能避免很多烦恼吧!

人生不短,本文不长。所以此篇,只叙重点。如果此前对于 K3s 完全没有经验,建议先阅读 K3s 官方文档

实操

  1. 安装 Zerotier
1
curl -s https://install.zerotier.com | sudo bash
  1. 修改 Zerotier 配置

修改 Zerotier 配置文件 /var/lib/zerotier-one/local.conf,内容如下。

1
2
3
4
5
{
	"settings": {
		"interfacePrefixBlacklist": [ "flannel" ]
	}
}
  1. 安装 k3s server

注意事项:

  • <zerotier-device-name> 替换为当前主机中 ZeroTier 虚拟网络设备的名称。
  • <node-external-ip> 替换为当前主机的外网 IP (在本文中即为那台有公网 IP 的云服务器)
1
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn INSTALL_K3S_EXEC="--flannel-iface=<zerotier-device-name> --node-external-ip=<node-external-ip>" sh -

可通过 ip addr 获取 ZeroTier 虚拟网络设备的名称。

  1. 安装 k3s agent(可选)

注意事项

  • <server-ip> 替换为服务器节点在 Zerotier 中获得的内网 IP。
  • <token> 替换为从服务器节点上获取的有效 Token。
  • <zerotier-device-name> 替换为当前主机中 ZeroTier 虚拟网络设备的名称。
1
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_URL=https://<server-ip>:6443 K3S_TOKEN=<token> INSTALL_K3S_EXEC="--flannel-iface=<zerotier-device-name>" sh -
  • 可通过 ip addr 获取 ZeroTier 虚拟网络设备的名称。
  • 可通过 sudo cat /var/lib/rancher/k3s/server/node-token 获取服务器节点的 Token,用返回的内容替换上述命令中的 <token> 即可。

番外

众所周知,番外是可以不看的。

interfacePrefixBlacklist

interfacePrefixBlacklist 将阻止 ZeroTier 绑定到任何与规则匹配的接口,这么做是为了让 ZeroTier 忽略 flannel 即将建立的虚拟网络设备上的任何包, 因为 flannel 的虚拟网络将建立在 ZeroTier 的虚拟网络之上

Server Token 和 Agent Token

K3s 中,有两种类型的 Token,分别为 K3S_TOKEN 和 K3S_AGENT_TOKEN。

  • K3S_TOKEN:定义了 server 提供 HTTP 配置资源所需的密钥。其他 server 在加入 K3s HA 集群之前会请求这些资源。如果没有定义 K3S_AGENT_TOKEN,agent 也使用这个 token 来访问加入集群所需的 HTTP 资源。请注意,这个 token 还用于为数据库中的重要内容(例如引导数据)生成加密密钥。
  • K3S_AGENT_TOKEN(可选):定义了 server 向 agent 提供 HTTP 配置资源所需的密钥。如果没有定义,agent 将需要 K3S_TOKEN。推荐使用 K3S_AGENT_TOKEN 避免 agent 节点必须知道 K3S_TOKEN,它也用于加密数据。

如果没有定义 K3S_TOKEN,第一个 K3s server 将生成一个随机的 K3S_TOKEN。其结果是 /var/lib/rancher/k3s/server/token 中的部分内容。

例如在 K1070878408e06a827960208f84ed18b65fa10f27864e71a57d9e053c4caff8504b::server:df54383b5659b9280aa1e73e60ef78fc 中,server: 后面的 df54383b5659b9280aa1e73e60ef78fc 即为 K3S_TOKEN。

修改 K3s Agent 使用的 Token/ServerUrl

如果安装 Agent 时输错了 Token/ServerUrl,亦或是后期因为其他原因需要更换 Agent 使用的 Token/ServerUrl,可以直接编辑 /etc/systemd/system/k3s-agent.service.env 文件,然后重启服务即可。

可使用 sudo systemctl daemon-reload && sudo systemctl restart k3s-agent 重启 K3s Agent。

参考资料