0

我正在尝试使用两个树莓派 4s 为 k3s 设置高可用性,但无法让第二个服务器链接到第一个服务器。

感谢您为使其正常工作提供的任何帮助。

我已经尝试过嵌入式数据库外部数据库(mariadb)

第一个服务器节点使用以下命令设置良好:

#embedded db - server 1
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--log k3s.log --bind-address 192.168.X.XXX --write-kubeconfig-mode 644 --docker --cluster-init" sh -

#external db - server 1
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--log k3s.log --bind-address 192.168.X.XXX --write-kubeconfig-mode 644 --docker --cluster-init --datastore-endpoint mysql://username:password@tcp(192.168.X.Y:3307)/k3s" sh -


从服务器 1 获取令牌并添加到服务器 2

#get token from server 1
pi@rpi4:~ $ sudo cat /var/lib/rancher/k3s/server/node-token
K10b598b7a839cb4d2351f77b7d7c18f12345678bd7f68603434248b4cdf1b333fd::server:4b7b5a1b8b05271298150f008e1b804e

#on server 2...
export K3S_TOKEN="K10b598b7a839cb4d2351f77b7d7c18f12345678bd7f68603434248b4cdf1b333fd::server:4b7b5a1b8b05271298150f008e1b804e"

然后我尝试使用以下方法让第二台服务器加入集群:

#embedded db - server 2
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--log k3s.log --server https://192.168.X.X:6443 --write-kubeconfig-mode 644 --docker" sh -

#external db - server 2
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--log k3s.log --server https://192.168.X.X:6443 --write-kubeconfig-mode 644  --datastore-endpoint mysql://user:password@tcp(192.168.X.X:3307)/k3s --docker" sh -

服务在两个 rpi 上都运行没有错误,但第二个服务器没有显示为连接到第一个


编辑

必须使用一些变体才能使其与嵌入式数据库一起使用,这可以让第二/第三台服务器加入初始集群

(带K3S_TOKENK3S_URL设置)

curl -fL https://get.k3s.io | INSTALL_K3S_EXEC="--log k3s.log --flannel-iface=eth0 --write-kubeconfig-mode 644 --no-deploy servicelb --docker" sh -s - server

但是,服务器 2 和服务器 3 上的 pod 无法与连接到服务器 1 的 pod 通信。

我已经为此提出了一个单独的问题,因为我最初认为这是一个不同的问题


4

1 回答 1

1

在我看来,您正确地提取了令牌并将其放入第二台服务器,但您没有在安装脚本中调用它:这样第二台服务器甚至不会尝试与第一台服务器同步,而只是旋转一个新集群并创建一个新令牌。

也不需要 --server 选项。我也落入了这个陷阱:它可能是以前版本的一些遗留问题,但它不起作用。目前,据我了解,服务器在获得令牌和数据库时,会进入数据库并查找由令牌定义的集群,如果找到,它会自动以 HA 启动。

我所做的如下:我首先创建一个令牌

A) master1$ NODE_TOKEN=$(echo $(hostname) $(date +%s) | shasum | base64)
   master1$ echo $NODE_TOKEN > node_token

并使用它在第一个主服务器上启动集群

B) master1$ curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="-v 2 -l master1.log -t ${NODE_TOKEN} --flannel-iface=enp0s8 --write-kubeconfig-mode 644 --tls-san k3s-cluster-01.lan --node-taint k3s-controlplane=true:NoExecute --datastore-endpoint mysql://k3s:${MYSQL_PASSWORD}@tcp(${IPADDR}:3306)/k3s" sh -

然后我把它放在我的第二个主人上并安装在那里

C) master2$ curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="-v 2 -l master2.log -t ${NODE_TOKEN} --flannel-iface=enp0s8 --write-kubeconfig-mode 644 --tls-san k3s-cluster-01.lan --node-taint k3s-controlplane=true:NoExecute --datastore-endpoint mysql://k3s:${MYSQL_PASSWORD}@tcp(${IPADDR}:3306)/k3s" sh -

关于没有外部存储的 HA,我无法使其工作,最终我放弃了。到目前为止,我使用的是单个 mysql 实例,但最终必须这样做。是否替换为 K3S 自己的 dqlite 或 etcd 之类的我还不知道。

于 2020-01-21T14:43:57.913 回答