我有一个运行在家庭服务器上的单节点kubernetes部署,我在该服务器上运行了多个服务。由于这是一个小型局域网,因此我想屏蔽我的其余设备用于Pod ip的一部分本地地址范围,然后直接路由到它们。
例如,如果我有一个运行中的Web服务器,而不是将端口80公开为外部端口,而是将端口从我的路由器转发到工作节点,则可以直接将其转发到Pod ip。
尽管我没有太多运气找到有关如何执行此操作的信息,这可能吗?
我是kubernetes的新手,所以我确定我遗漏了重要信息,请告诉我,以便我更新问题。
我通过使用reference plugins中的macvlan CNI插件来完成这项工作。使用kubeadm设置集群,这些插件已经安装,集群将配置为使用它们。唯一要做的是放入cni.conf(在/etc/cni/net.d
中)。我的看起来像这样
{
"name": "net",
"type": "macvlan",
"mode": "bridge",
"master": "eno1",
"ipam": {
"type": "host-local",
"ranges": [[{
"subnet": "10.0.0.0/8",
"gateway": "10.0.0.1",
"rangeStart": "10.0.10.2",
"rangeEnd": "10.0.10.254"
}]],
"routes": [
{ "dst": "0.0.0.0/0" }
]
}
}
将其放置在适当位置是coredns启动所需要的,并且您运行的任何Pod都将具有配置中定义的范围内的ip。由于它与局域网的其余部分位于同一子网中,因此我可以自由地ping这些容器,并且路由器甚至可以让我使用它们的设置,因为它们具有mac地址(如果您不希望使用ipvlan而不是macvlan,则可以仍然能够ping和端口转发以及所有其他功能,您的路由器将不会枚举所有设备,因为它们没有硬件地址。
警告:
由于服务都是“伪造的”,因此它们将无法工作(例如,它们没有使所有iptables起作用的接口)。可能有一种使它们起作用的方法,但是对于我的用例而言,这是不值得的
无论出于何种原因,DNS服务器都会继续使用10.96.0.1。我不知道它从何处获得该地址,但是我一直在通过定义dnsPolicy: None
并将dnsConfig.nameservers[0]
设置为路由器IP来解决该问题。可能有一个更好的解决方案。
您应该使用--service-cidr 10.0.10.0/24 --pod-network-cidr 10.0.10.0/24
运行kubeadm,否则kubelet(或其他东西)似乎不知道如何与Pod对话。我实际上不知道--service-cidr
是否重要,但这似乎是个好主意
开箱即用,您的Pod将无法与主设备对话,因为它们使用的Macvlan设备从属于其以太网,并且无论出于什么原因,Macvlan都不会让您在主机和来宾设备之间进行对话。您可以想象这不是一件好事。解决方案是在与Pod相同子网的主机上手动添加macvlan设备。
看来,即使您没有从Pod暴露的端口也可以从lan设备使用(这很酷),这可能是因为iptables规则认为lan上的任何内容都是群集内部的。我没有花很多时间来调试它。
对于习惯于在生产中使用kubernetes的人们来说,这可能是一种主要的罪过,但是它对于家庭设置很酷并且很有用,尽管有时确实感觉像是黑客。