我想在KVM VM中设置一个kubernetes集群,该集群使用平面DHCP网络进行所有通信。
将要成为kube-master和kube-worker的VM的VNIC桥接起来,以使用现有的物理DHCP网络。
我想知道是否有可能使kubernetes对POD和kubernetes内部使用相同的物理DHCP网络。有人知道如何配置吗?
我试图在/etc/cni/net.d中配置一个桥接网络,但是它不起作用。我必须尝试IPVLAN还是其他?
谢谢
答案 0 :(得分:2)
我建议阅读Kubernetes关于Cluster Networking的文档。
您可以使用Multus(一个多网络插件)。使用CNI,可以将多个网络接口附加到Kubernetes中的Pod。
Multus是一个Multi CNI插件,可使用Kubernetes中基于CRD的网络对象来支持Kubernetes中的Multi Networking功能。
Multus支持所有实现CNI规范的reference plugins(例如Flannel,DHCP,Macvlan)和第三方插件(例如Calico, Weave,Cilium,Contiv)。除此之外,Multus在Kubernetes中还支持Kubernetes中的SRIOV,DPDK,OVS-DPDK & VPP工作负载,并在Kubernetes中支持云原生和基于NFV的应用程序。
使用它,您可以使用dhcp plugin
使用dhcp插件,容器可以获取由网络上已在运行的DHCP服务器分配的IP。这对于诸如macvlan之类的插件类型尤其有用。由于必须在容器生命周期内定期续订DHCP租约,因此需要运行单独的守护程序。相同的插件二进制文件也可以在守护程序模式下运行。
此部署使用了多个kubernetes功能,这些功能主要是由旧的isc-dhcpd的假设和限制驱动的。关键点是:
- Isc-dhcpd必须在配置时知道其自身及其故障转移对等方的地址,这显然与kubernetes pod寻址和自我修复功能冲突,但是isc-dhcpd确实允许这些值的DNS解析,因此我们使用kubernetes { {3}}克服这些困难
- Isc-dhcpd将其dhcp租约存储在一个文件中,但它不会在启动时自动创建该文件。为确保此操作始终按预期工作,我们使用dns records for pods and services在启动dhcpd本身之前先触摸文件
- 尽管Pod可以通过DNS查询其自己的FQDN来查找自己的IP,但无法按其FQDN查询其他Pod的IP,这使该过程花费了一段时间,但实际上可以通过制作init container来解决,它将通过DNS公开其Pod的IP地址。
- 部署和服务实际上分为两部分;小学和中学。这是一个变通办法,因为dhcpd要求每个实例的配置略有不同,因此我们通过拥有全部两个来完成此操作,仍然进行部署的好处是我们得到了一个复制控制器来启动替代品一个失败的实例。
- 这两个部署共享它们的大部分配置,除了一些细节之外,因此我们可以在共享配置中使用一个kubernetes headless service,然后在该容器上安装几个kubernetes细节。小学和中学的位置相同。
- 由于我们有两个部署,因此我们要确保它们不会部署在集群中的同一物理节点上,为此,我们使用configmap,因此kubernetes倾向于将其放置在单独的节点上。 / li>
- 使用新的anti-affinity可能会更干净,因此我们可以避免重复部署,这是NPF 2018的考虑事项。我们不支持PersistentVolumeClaims,但仅支持PersistentVolumes iSCSI SAN,使用statefulsets atm可能有点困难。
更新
statefulset,我认为这可能是最适合您的解决方案。
您在bridget.yaml
中拥有整个部署,该部署正在创建DeamonSet](Simple bridge network for kubernetes),因此它将在所有(或某些)节点上运行,并运行Pod的副本。
bridget-这是一个简短的shell脚本,可帮助您为Kubernetes组织简单的桥接网络。没有叠加,没有政治。跨所有主机和Pod的扁平L2网络。
此外,bridget可以为此自动配置VLAN和网桥接口。见图:
https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/
bridget自动从您的Pod网络中检索节点cidr,并配置cni以供使用。