将服务/豆荚加入本地网络

时间:2018-07-19 01:40:14

标签: kubernetes

我有一个运行在家庭服务器上的单节点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和端口转发以及所有其他功能,您的路由器将不会枚举所有设备,因为它们没有硬件地址。

警告:

  1. 由于服务都是“伪造的”,因此它们将无法工作(例如,它们没有使所有iptables起作用的接口)。可能有一种使它们起作用的方法,但是对于我的用例而言,这是不值得的

  2. 无论出于何种原因,DNS服务器都会继续使用10.96.0.1。我不知道它从何处获得该地址,但是我一直在通过定义dnsPolicy: None并将dnsConfig.nameservers[0]设置为路由器IP来解决该问题。可能有一个更好的解决方案。

  3. 您应该使用--service-cidr 10.0.10.0/24 --pod-network-cidr 10.0.10.0/24运行kubeadm,否则kubelet(或其他东西)似乎不知道如何与Pod对话。我实际上不知道--service-cidr是否重要,但这似乎是个好主意

  4. 开箱即用,您的Pod将无法与主设备对话,因为它们使用的Macvlan设备从属于其以太网,并且无论出于什么原因,Macvlan都不会让您在主机和来宾设备之间进行对话。您可以想象这不是一件好事。解决方案是在与Pod相同子网的主机上手动添加macvlan设备。

  5. 看来,即使您没有从Pod暴露的端口也可以从lan设备使用(这很酷),这可能是因为iptables规则认为lan上的任何内容都是群集内部的。我没有花很多时间来调试它。

对于习惯于在生产中使用kubernetes的人们来说,这可能是一种主要的罪过,但是它对于家庭设置很酷并且很有用,尽管有时确实感觉像是黑客。

1 个答案:

答案 0 :(得分:2)

我相信您的问题的答案是将dhcp IPAM插件用于CNI,但请注意Pod地址回收。我说要小心,因为除非您具有高频Pod端接,否则它可能无关紧要,但是,另一方面,如果Pod IP为IP,我不确定它在Well That's Unfortunate™频谱中的位置在集群中回收。

坏消息是,我对这些替代性CNI插件没有任何经验,无法与他们需要牢记的尖锐语言进行交流,因此希望其他人能够加入。