K3s,其他server节点加入时,能否像agent一样,固定注册地址。

环境信息:
K3s 版本:

k3s version v1.33.3+k3s1 (236cbf25)
go version go1.24.4

节点 CPU 架构、操作系统和版本::

4.19.90-52.23.v2207.ky10.x86_64 #1 SMP Thu Mar 23 14:20:04 CST 2023 x86_64 x86_64 x86_64 GNU/Linux
集群配置:

3 servers, 16 agents
问题描述:

部署架构为
4层LB(使用VIP),负载第一个server,其他server在加入第一个server时,额能否使用这个VIP负载。我在官网上没看到此用法,是否表明不可用。

复现步骤:

  • 安装 K3s 的命令:
    第一个server启动

第一个主节点

INSTALL_K3S_SKIP_DOWNLOAD=true
INSTALL_K3S_EXEC=“server
–cluster-init
–tls-san
–advertise-address
–node-ip 第一个server的IP
–node-name master-xxxxxx
–data-dir /data/kubernetes
–kubelet-arg=root-dir=/data/kubernetes/kubelet
–kube-proxy-arg=proxy-mode=ipvs”
./install.sh

第二个主节点,加入第一个主节点

INSTALL_K3S_SKIP_DOWNLOAD=true
K3S_URL=https://:6443 \ ##### 这个地方能否为4层负载的IP
K3S_TOKEN=xxxxxxxxxxx
INSTALL_K3S_EXEC=“server
–tls-san
–advertise-address
–node-ip 第二个server的ip
–node-name master-xxxxxx
–data-dir /data/kubernetes
–kubelet-arg=root-dir=/data/kubernetes/kubelet
–kube-proxy-arg=proxy-mode=ipvs”
./install.sh

这个没必要做 LB 的负载,因为第二个和第三个 master 加入到集群之后,etcd 会自动组建为一个 集群,就算第一个节点挂了,也不会影响后面加入的两个 server。

好的,谢谢,现在还有一个问题
1.1.1.1 为负载均衡固定IP,2.2.2.2为server的IP,我在注册agent的时候,写的–server 1.1.1.1,但是,我在查看日志的时候,他还是2.2.2.2的IP,我是哪个配置没有写吗?

这是server
INSTALL_K3S_SKIP_DOWNLOAD=true \
INSTALL_K3S_EXEC="server \
  --cluster-init \
  --tls-san 1.1.1.1 \
  --advertise-address 2.2.2.2 \
  --node-ip 2.2.2.2 \
  --node-name master-2.2.2.2 \
  --data-dir /data/kubernetes \
  --kubelet-arg=root-dir=/data/kubernetes/kubelet \
  --kube-proxy-arg=proxy-mode=ipvs" \
./install.sh

这是agent
INSTALL_K3S_SKIP_DOWNLOAD=true \
K3S_TOKEN=a\
INSTALL_K3S_EXEC="agent \
  --node-name slave-6 \
  --server https://1.1.1.1:6443 \ 写的是VIP负载均衡
  --data-dir /data/kubernetes \
  --kubelet-arg=root-dir=/data/kubernetes/kubelet \
  --kube-proxy-arg=proxy-mode=ipvs" \
./install.sh

日志报错为

Aug 04 14:15:08 a k3s[1830]: time="2025-08-04T14:15:08+08:00" level=error msg="Failed to connect to proxy. Empty dialer response" error="dial tcp2.2.2.2:6443: connect: connection refused"
Aug 04 14:15:08 a k3s[1830]: time="2025-08-04T14:15:08+08:00" level=error msg="Remotedialer proxy error; reconnecting..." error="dial tcp 2.2.2.2:6443: connect: connection refused" url="wss://2.2.2.2:6443/v1-k3s/connect"
Aug 04 14:15:11 a k3s[1830]: time="2025-08-04T14:15:11+08:00" level=info msg="Connecting to proxy" url="wss://2.2.2.2:6443/v1-k3s/connect"
Aug 04 14:15:12 a k3s[1830]: time="2025-08-04T14:15:12+08:00" level=error msg="Failed to connect to proxy. Empty dialer response" error="dial tcp 2.2.2.2:6443: connect: connection refused"
Aug 04 14:15:12 a k3s[1830]: time="2025-08-04T14:15:12+08:00" level=error msg="Remotedialer proxy error; reconnecting..." error="dial tcp 2.2.2.2:6443: connect: connection refused" url="wss://2.2.2.2:6443/v1-k3s/connect"

2.2.2.2 6443 为什么访问不了?你这啥网络环境

curl -k https://2.2.2.2:6443/version
{
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {},
  "status": "Failure",
  "message": "Unauthorized",
  "reason": "Unauthorized",
  "code": 401

测试了一下,2.2.2.2,是一个代号。
大佬,我想知道,agent --server,指定负载均衡IP,在agent的日志中,还是会连接server真实IP吗?

默认是的,因为 K3S agent 自己会通过进程做一个 LB, 注册到集群之后,会先查询集群中的所有 K3S master 的 IP:port,然后在本地通过 agent 进程做一个 LB。

那我这个问题会不会是因为–tls-san,这个参数,这个我只指定了一个VIP。
还是说,我的网络有问题。
我也进行了一个测试,
server端
–advertise-address 1.1.1.1 \,把这个改成了负载均衡IP,就可以了。

我进行了大量测试,只要安装上k3s-agent,agent这个主机就无法连接到server:6443端口,执行uninstall 之后,就可以连接
使用 curl -k https://server:6443

其实我没太知道你的重现步骤是啥,或者你的需求是啥,你可以详细的说说,我来重现试试

K3S_URL=https://:6443 \ ##### 这个地方能否为4层负载的IP

考虑到后面的升级和维护,这个最好还是用 负载均衡的 IP ,如果这里第一个 server 节点挂了,后面升级所有的 server 节点 和加入新的 server 节点都挺麻烦的

当然可以啊