功能要求
如果使用kubeadm部署K8S集群,则默认情况下似乎使用了云提供商的内部IP地址。 但是,提供一个选项来设置kubelet的--node-ip选项(对于https://kubernetes.io/docs/admin/kubelet/),这真的很有帮助(对于跨云部署用例)。
因此,在具有<public_master_ip>
节点上进行kubeadm初始化调用可能像这样:
kubeadm init --token=<token> --api-advertise-addresses=<public_master_ip> --node-ip=<public_master_ip>
在具有<public_worker_ip>
的节点上进行kubeadm连接看起来像这样:
kubeadm join --token=<token> --node-ip=<public_worker_ip>
有了这个,kubeadm可以很容易地用于跨云提供商的部署。 如果还有其他我不知道的选项,我想听听。 但是我的搜索并没有找到解决方案(使用kubeadm)。
因此,我目前在DigitalOcean中设置Kubernetes集群时遇到问题。 默认情况下,kubelet将绑定并公开/广播默认网关的ip,在这种情况下,默认网关是面向Internet流量的公共IP。 然后,当要设置一个Pod网络附加组件(如Weave)时,整个事情就变得一团糟,因为主服务器的播发IP是内部网络的IP地址,而工作节点却试图向公众公开它:/
解决方案是更新放置在/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
下的单位文件以添加--node-ip=<private_worker_ip>
,重新加载单位并重新启动kubelet以使其工作。
如果kubeadm
在默认情况下可以通过传递@nkratzke这样的选项来做到这一点,那将很棒!
我只是想确认将--node-ip=<private-worker-ip>
选项添加到/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
文件中的设置不会解决我之前解释的设置的此问题。 即使节点正在侦听此接口,Kubernetes仍继续使用默认网关在节点之间进行通信,在这种情况下,公共网关是公共IP地址。
我有同样的问题。 我尝试了您的方法,但对我也不起作用。 您设法使其成功了吗?
@agsergi我试图在DigitalOcean中设置启用了“专用网络”选项的k8s集群,这导致我遇到此问题。 禁用该功能对我有用,但是我不确定您是否在同一条船上。
我想如果您在计算机上连接了两个以上的NIC,仍然会出现此问题。
伙计们, 它为我工作。
我的VM上有两个接口,一个接口用于NAT,第二个接口用于hostonly-adaptor。 默认情况下,如果要使用其他接口,则kubeadmin使用默认接口IP(在我的情况下为NAT),然后使用:
$ sudo kubeadm init --apiserver-advertise-address =
@luxas为什么将其标记为种类/支持? 有什么方法可以将kubeadm与不是默认路由源的节点ip一起使用?
@evocage没有--apiserver-advertise-address = 非常感谢。
我在Scaleway上遇到了同样的问题。
初始化主服务器后,我已经通过了--apiserver-advertise-address=<private_net_IP>
但是当我想添加节点( kubeadm join --toke=<token> <master_private_IP>:6443
)时,kube-proxy和weave-net pod不会启动(错误同步pod)
但是,当我将公共IP附加到我的节点并重新启动时,一切进展顺利:thinking:
任何想法?
尝试在具有单个IP的VM主机上设置kubernetes时出现同样的问题,其中只有一些端口可以转发到VM。 有任何解决方法可以使其正常工作吗?
只是想+1。 我正在尝试在一组Digitalocean VM上运行所有私有IP,但是面向公众的地址仍以某种方式继续进入集群。
我设法通过在master上运行此命令来使私有IP工作:
kubeadm init --apiserver-advertise-address=<private-master-ip> init
将--node-ip=<private-node-ip>
到/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
,重新加载守护程序,重新启动kubelet,然后运行:
kubeadm join --token <token> <private-master-ip>:6443 --discovery-token-ca-cert-hash sha256:<hash>
@mongrelion master <->节点之间的哪种通信仍在使用公共接口? 我无法复制它,所以我很想知道kubernetes是否表现异常。
做到了! --apiserver-advertise-address
和--node-ip
在kubelet配置中的组合是确保主节点在正确位置启动的不可思议的组合。
但是根据此请求,直接在kubeadm
具有--node-ip
选项,以便正确初始化配置文件将对像我这样尝试启动集群的无知新手有所帮助:)
谢谢@jamiehannaford的总结。 我们认为我们应该对此进行更明显的记录吗?
@luxas是的,我认为明确记录此用
@jamiehannaford如果您还想将此内容添加到v1.9的文档改组中,请给我一个段落以添加到https://github.com/kubernetes/website/pull/6103
@fabriziopandini当然可以! 完毕
你好,
我也希望提供一些反馈。 我正在尝试使用kubeadm构建安全的单节点集群。
我希望所有kubernetes服务都绑定到localhost,但这不起作用。
我正在使用此命令并创建了集群:
kubeadm init \
--pod-network-cidr=10.244.0.0/16 \
--apiserver-advertise-address=127.0.0.1 \
--apiserver-cert-extra-sans=127.0.0.1,staging.my-server.net
但是/etc/kubernetes/admin.conf
和朋友包含主机的公共IP地址。
server: https://75.xx.yy.zz:6443
我将尝试--node方法,但是如果您能帮助我找到解决方案,我将不胜感激。
我的用例:
我有一台功能强大的机器,希望用作暂存环境,也可以用作我不关心HA的小型项目的生产环境。 我可以使用SSH并使用kubectl来控制集群。
谢谢,
我在这里遇到了与@ Mosho1完全相同的问题,然后深入到它的底部。
我使用DO和CoreOS,但这确实与两者无关,并且可能在其他提供商和发行版上发生。 这也与启用或禁用DO的专用网络无关:在这两种情况下,我均会重现该问题。
发生的情况是,由 kubeadm
设置的kubelet
查看接口并决定将自己的专用子网加入组合,而不管分配的IP或可用接口如何,并希望这样做。它认为是“主要”的同一个人(第一个?WAN的一个?我不知道)。通过ifconfig
不可见,但是通过ip addr
可见,并且还设置了一条路线,但是这将很少有机会飞过连接节点eth0
的DO网络。
编辑:感谢@klausenbusk ,
解决方案的确是告诉kubelet使用什么IP。 如果使用可选的专用网络,它可以是公用的,也可以是专用的。
这是我利用--node-ip
。 请注意,这假定尚未在单位文件中设置KUBELET_EXTRA_ARGS
。
$ DROPLET_IP_ADDRESS=$(ip addr show dev eth0 | awk 'match($0,/inet (([0-9]|\.)+).* scope global eth0$/,a) { print a[1]; exit }')
$ echo $DROPLET_IP_ADDRESS # check this, jus tin case
$ echo "Environment=\"KUBELET_EXTRA_ARGS=--node-ip=$DROPLET_IP_ADDRESS\"" >> /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
$ systemctl daemon-reload
$ systemctl restart kubelet
@lloeki感谢您的撰写。 您介意更新文档吗,可能在这里: https :
因此,它选择了一个WAN(eth0),看到(或忽略了)一个公共IP,并决定添加第二个私有子网(在我的情况下为10.19.0.0/255),可能是因为相信所有节点eth0都是在同一链接上。
你确定吗? 它可能只是锚点ip(与curl http://169.254.169.254/metadata/v1/interfaces/public/0/anchor_ipv4/address
)
@klausenbusk,您绝对正确,那是我的娱乐猜测,对不起! 以下来自主节点,现在使用--node-ip
。
如此看来,kubelet会在没有用处的前提下选择其中一个?
$ curl http://169.254.169.254/metadata/v1/interfaces/public/0/anchor_ipv4/address
10.19.0.39
$ ip addr show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
inet yyy.yyy.yyy.yyy/20 brd yyy.yyy.yyy.255 scope global eth0
valid_lft forever preferred_lft forever
inet 10.19.0.39/16 brd 10.19.255.255 scope global eth0
valid_lft forever preferred_lft forever
您介意更新文档吗
@jamiehannaford听起来我可以做到这一点:)
/ assign @liztio
我看了一下,即使用户请求将--node-ip
参数添加到kubeadm,我也认为共识是修改kubelet配置并使用类似@jamiehannaford的参数,这是建议的方法:
https://github.com/kubernetes/kubeadm/issues/203#issuecomment -335416377
(或者在重新启动Kublet之前附加到$ KUBELET_EXTRA_ARGS)。
考虑到不再向kubeadm添加额外的cmd参数的决定,我认为关闭此问题可能是安全的....除非有计划通过kubeadm MasterConfig选项启用它(以某种方式?...我们依赖用户编辑kubelet配置并手动搁置更改)。
编辑:或者如果可能的话,使用动态kubelet配置?
上面有关文档更改的所有建议似乎都已合并。
@timstclair @liztio
我可以关闭这一个。
只需注意在Kubernetes 1.11中/etc/systemd/system/kubelet.service.d/20-custom.conf中的KUBELET_EXTRA_ARGS设置不再起作用:应该在/ etc / sysconfig / kubelet中设置(语法有点不同)这些文件)。
@stepin我刚刚使用kubeadm设置了1.11集群,然后得到了cat: /etc/sysconfig/kubelet: No such file or directory
/etc/systemd/system/kubelet.service.d/20-custom.conf
也不存在,所以我不确定您在做什么。
如果您说的是正确的,那么似乎配置土豆的游戏仍在继续。
我可以在这里找到kubelet配置的另一个位置: /etc/default/kubelet
对于未来的旅行者(至少在接下来的一周内),这似乎有效:
PRIVATE_IP=10.99.0.0
echo "KUBELET_EXTRA_ARGS=--node-ip=$PRIVATE_IP" > /etc/default/kubelet
systemctl daemon-reload
systemctl restart kubelet
显然,您需要将IP更改为该特定节点上的IP。
免责声明:我只是在检查Kubernetes,所以我不保证这不会做得很糟糕。 虽然/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
确实指向/etc/default/kubelet
,所以我想这是正确的做法。
@jazoom-感谢您的评论,它最终使我更加仔细地阅读了systemd单位文件。 我以为我会发疯,因为我可以在1.10中启动相同的配置,并且一切正常...在1.11中启动配置,而我设置的自定义--node-ip
根本没有应用。 切换到在/etc/default/kubelet
添加额外的args为我解决了这个问题。
@geerlingguy不客气。
至少不是“我每提起一个1.11集群第二次就起作用”的情况。 这些不可复制的问题确实会让您发疯。
刚在“ Kubeadm 1.13”中遇到此问题。 使用以下方法修复了该问题:
1)在“ /var/lib/kubelet/kubeadm-flags.env”中添加“ --node-ip”:
[root@Node-18121 ~]# cat /var/lib/kubelet/kubeadm-flags.env
KUBELET_KUBEADM_ARGS=--cgroup-driver=systemd --network-plugin=cni --pod-infra-container-image=k8s.gcr.io/pause:3.1 --node-ip=10.10.10.1
2)重新启动Kubelet:
systemctl daemon-reload && systemctl restart kubelet
^如果有人知道如何使用未在NIC上显示的浮动IP来工作,请告诉我。 否则成功。
你好,
请尝试使用https://wiki.hetzner.de/index.php/Cloud_floating_IP_persistent/zh-CN 。
它适用于Hetzner,但我认为它是通用的。
欧根
这工作得很好。 谢谢你。
刚在“ Kubeadm 1.13”中遇到此问题。使用以下方法修复了该问题:
- 在“ /var/lib/kubelet/kubeadm-flags.env”中添加“ --node-ip”:
[root@Node-18121 ~]# cat /var/lib/kubelet/kubeadm-flags.env KUBELET_KUBEADM_ARGS=--cgroup-driver=systemd --network-plugin=cni --pod-infra-container-image=k8s.gcr.io/pause:3.1 --node-ip=10.10.10.1
- 重新启动Kubelet:
systemctl daemon-reload && systemctl restart kubelet
thanks a lot ,moving
最有用的评论
@stepin我刚刚使用kubeadm设置了1.11集群,然后得到了
cat: /etc/sysconfig/kubelet: No such file or directory
/etc/systemd/system/kubelet.service.d/20-custom.conf
也不存在,所以我不确定您在做什么。如果您说的是正确的,那么似乎配置土豆的游戏仍在继续。
我可以在这里找到kubelet配置的另一个位置:
/etc/default/kubelet
对于未来的旅行者(至少在接下来的一周内),这似乎有效:
显然,您需要将IP更改为该特定节点上的IP。
免责声明:我只是在检查Kubernetes,所以我不保证这不会做得很糟糕。 虽然
/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
确实指向/etc/default/kubelet
,所以我想这是正确的做法。