【问题标题】:How to change/set k8s master node internal-ip or public-ip?如何更改/设置 k8s 主节点内部 IP 或公共 IP?
【发布时间】:2019-11-13 09:56:47
【问题描述】:

我在云虚拟机上安装了 k3s。 (k3s和k8s很相似。)

k3s 服务器作为主节点启动。

并且主节点的标签显示 internal-ip 是 192.168.xxx.xxx。并且master节点的注解显示public-ip也是192.168.xxx.xxx。

但是CloudVM的真实公共IP是49.xx.xx.xx。所以来自另一台机器的代理无法连接这个主节点。 因为代理总是尝试连接代理“wss://192.168.xxx.xxx:6443/...”。

如果我在云虚拟机上运行 ifconfig,public-ip(49.xx.xx.xx) 不会显示。所以 k3s 找不到正确的 internal-ip 或 public-ip。

我尝试使用 --bind-address=49.xx.xx.xx 启动 k3s,但启动失败。我猜没有 NIC 与这个 IP 地址绑定。

如何解决这个问题,如果我尝试创建一个地址为 49.xx.xx.xx 的虚拟网卡?

【问题讨论】:

  • 您在此设置中使用了哪些云提供商?
  • @DawidKruk 腾讯云
  • 你说的代理只是另一个工作节点?

标签: kubernetes k3s


【解决方案1】:

连接 Kubernetes 主节点和节点的最佳选择是使用私有网络。

如何设置K3S master和单节点集群:

先决条件:

  • 所有机器都需要在同一个专用网络中。例如 192.168.0.0/24
  • 所有机器都需要相互通信。您可以通过以下方式 ping 它们:$ ping IP_ADDRESS

在此示例中,有 2 个虚拟机:

  • 私有 ip 为 10.156.0.13 的主节点 (k3s)
  • 私有 ip 为 10.156.0.8 的工作节点 (k3s-2)

在虚拟机之间建立连接

最重要的是检查机器是否可以相互连接。正如我所说,最好的方法就是 ping 它们。

供应主节点

要在主节点上安装 K3S,您需要从 root 用户调用命令:

$ curl -sfL https://get.k3s.io | sh -

这个命令的输出应该是这样的:

[INFO]  Finding latest release
[INFO]  Using v0.10.2 as release
[INFO]  Downloading hash https://github.com/rancher/k3s/releases/download/v0.10.2/sha256sum-amd64.txt
[INFO]  Downloading binary https://github.com/rancher/k3s/releases/download/v0.10.2/k3s
[INFO]  Verifying binary download
[INFO]  Installing k3s to /usr/local/bin/k3s
[INFO]  Creating /usr/local/bin/kubectl symlink to k3s
[INFO]  Creating /usr/local/bin/crictl symlink to k3s
[INFO]  Creating /usr/local/bin/ctr symlink to k3s
[INFO]  Creating killall script /usr/local/bin/k3s-killall.sh
[INFO]  Creating uninstall script /usr/local/bin/k3s-uninstall.sh
[INFO]  env: Creating environment file /etc/systemd/system/k3s.service.env
[INFO]  systemd: Creating service file /etc/systemd/system/k3s.service
[INFO]  systemd: Enabling k3s unit
Created symlink /etc/systemd/system/multi-user.target.wants/k3s.service → /etc/systemd/system/k3s.service.
[INFO]  systemd: Starting k3s

检查主节点是否工作:

$ kubectl get nodes

上述命令的输出应该是这样的:

NAME   STATUS   ROLES    AGE     VERSION
k3s    Ready    master   2m14s   v1.16.2-k3s.1

使用以下命令从主节点检索 IMPORTANT_TOKEN

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

此令牌将用于将代理节点连接到主节点。 复制它

将代理节点连接到主节点

确保节点可以与主节点通信。 之后,您可以从 root 用户调用命令:

$ curl -sfL https://get.k3s.io | K3S_URL=https://MASTER_NODE_IP:6443 K3S_TOKEN=IMPORTANT_TOKEN sh -

将您的 IMPORTANT_TOKEN 粘贴到此命令中。

在这种情况下,MASTER_NODE_IP 是 10.156.0.13。

此命令的输出应如下所示:

[INFO]  Finding latest release
[INFO]  Using v0.10.2 as release
[INFO]  Downloading hash https://github.com/rancher/k3s/releases/download/v0.10.2/sha256sum-amd64.txt
[INFO]  Downloading binary https://github.com/rancher/k3s/releases/download/v0.10.2/k3s
[INFO]  Verifying binary download
[INFO]  Installing k3s to /usr/local/bin/k3s
[INFO]  Creating /usr/local/bin/kubectl symlink to k3s
[INFO]  Creating /usr/local/bin/crictl symlink to k3s
[INFO]  Creating /usr/local/bin/ctr symlink to k3s
[INFO]  Creating killall script /usr/local/bin/k3s-killall.sh
[INFO]  Creating uninstall script /usr/local/bin/k3s-agent-uninstall.sh
[INFO]  env: Creating environment file /etc/systemd/system/k3s-agent.service.env
[INFO]  systemd: Creating service file /etc/systemd/system/k3s-agent.service
[INFO]  systemd: Enabling k3s-agent unit
Created symlink /etc/systemd/system/multi-user.target.wants/k3s-agent.service → /etc/systemd/system/k3s-agent.service.
[INFO]  systemd: Starting k3s-agent

测试

在主节点上调用命令以检查代理是否连接成功:

$ kubectl get nodes

你之前添加的节点应该在这里可见:

NAME    STATUS   ROLES    AGE     VERSION
k3s     Ready    master   15m     v1.16.2-k3s.1
k3s-2   Ready    <none>   3m19s   v1.16.2-k3s.1

以上输出表明供应已正确进行。

EDIT1:从这一点开始,您可以部署 pod 并将它们公开到公共 IP 空间。

编辑2:

您可以在公共 IP 网络上连接 K3S 主节点和工作节点,但有一些先决条件。

先决条件:

  • 主节点需要打开 6443/TCP 端口
  • 确保主节点保留静态IP地址
  • 确保将防火墙规则配置为仅允许通过工作节点的 IP 地址访问(节点的静态 IP 地址可以帮助实现这一点)

主节点配置

主节点的部署同上。唯一的区别是你需要得到他的公共IP地址。

您的主节点不需要在以下命令中显示您的公共 IP:

  • $ ip a
  • $ ifconfig

供应工作节点

worker节点的部署不同之处仅在于将master节点的IP地址从私有IP地址更改为公共IP地址。从 root 帐户调用此命令:
curl -sfL https://get.k3s.io | K3S_URL=https://PUBLIC_IP_OF_MASTER_NODE:6443 K3S_TOKEN=IMPORTANT_TOKEN sh -

测试集群

要确保节点正确连接,您需要调用命令:

$ kubectl get nodes

输出应该是这样的:

NAME    STATUS   ROLES    AGE   VERSION
k3s-4   Ready    <none>   68m   v1.16.2-k3s.1
k3s-1   Ready    master   69m   v1.16.2-k3s.1
k3s-3   Ready    <none>   69m   v1.16.2-k3s.1
k3s-2   Ready    <none>   68m   v1.16.2-k3s.1

所有节点都应该在这里可见。

【讨论】:

  • 谢谢!我的目标是从云端控制边缘节点。所以我尝试在云上安装 master 并在边缘安装其他代理节点。但是你的意思是k3s最好用在私有网络中。如果我在边缘安装多个 k3s 集群,如何从云中心远程管理它们?
  • @alen 我编辑了我的帖子并添加了带有公共 IP 的段落。
  • 谢谢。但是我的云主节点在Gate后面,并且使用静态映射公共地址。也许需要 VPN 连接。
  • 只是为了澄清。您的主节点具有公共 IP 地址,但位于门后(可能是防火墙)并且不允许任何入站初始化流量?
  • Gate 会将所有目的地为 49.xx.xx.xx 的流量转发到 192.168.xx.xx,这是我的 VM 提交地址。
【解决方案2】:

我也遇到了同样的问题,终于找到了解决办法。 你可以用--node-external-ip启动你的服务器,像这样sudo k3s server --node-external-ip 49.xx.xx.xx,代理需要配置环境或以sudo k3s agent --server https://49.xx.xx.xx:6443 --token ${K3S_TOKEN}开始,然后你的本地设备(边缘节点)从私有IP可以连接公共云。

标志用法是(listener) IP address that apiserver uses to advertise to members of the cluster (default: node-external-ip/node-ip)

这张图是我的电脑连接远程服务器,我测试了一下,raspberry 4B也成功了。

负载均衡器没有将公网IP切换到私网IP,当我使用git blame get flag feature时添加时间是2019.10.26

【讨论】:

    猜你喜欢
    • 2021-06-07
    • 2021-05-25
    • 2021-08-27
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    • 2019-07-08
    • 2018-07-27
    • 2023-01-04
    相关资源
    最近更新 更多