我打算在我的本地网络上部署一个 k8s + Rancher 集群,但我的环境有多个 VLAN,pfSense 充当这些 VLAN 之间的防火墙和路由器。
我的集群作为虚拟机管理程序驻留在 XCP-NG 中,我将通知它应该传递给集群节点的 VLAN。
我打算将一些服务放在不同的 VLAN 中,因为我有用于开发、DMZ、生产、管理等的 VLAN,我想知道在部署 K8s + Rancher 时是否必须根据我的环境采取不同的方法?
要部署一个可在多个 VLAN 上与 Pod 协同工作的集群,集群节点是否必须具有多个 NIC,每个 NIC 都在我打算使用的 VLAN 上?
例如,如果我的集群有 6 个节点,3 个主节点和 3 个工作节点,它们必须在同一个 VLAN 中吗,还是它们在不同的 VLAN 中,并且它们之间进行通信就足够了?
如果我想在开发 VLAN 上部署一个 pod,并且我的集群位于管理 VLAN 上,这样可以吗?
在此先感谢您的帮助。
答案1
如果我想在开发 VLAN 上部署一个 pod,并且我的集群位于管理 VLAN 上,这样可以吗?
这是不可能的,kubernetes 集群有自己的内部网络。该网络与您的本地网络完全隔离。
在部署您的 kubernetes 集群时(无论是 rancher 还是任何其他内部部署 kubernetes 集群),您都可以定义您的集群将位于哪个 CIDR 上。
您可能会想:如果 kubernetes 有自己的网络,我如何与集群中部署的应用程序通信?
您可以使用服务或入口来公开您的资源。例如:当您使用服务创建服务时,type: LoadBalancer
您的服务将分配一个可从内部网络访问的外部或公共 IP 地址(端点)。
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
custom-nginx-svc LoadBalancer 10.0.10.18 104.155.87.232 80:31549/TCP 11d
echo-svc LoadBalancer 10.0.10.14 23.251.138.185 80:30668/TCP 11d
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 11d
nginx-ing-nginx-ingress-controller NodePort 10.0.9.184 <none> 80:31745/TCP,443:31748/TCP 25h
nginx-ing-nginx-ingress-default-backend ClusterIP 10.0.1.169 <none> 80/TCP 25h
从上面的例子中可以看出,有两个定义了外部IP的服务。
在您的场景中,您需要将这些外部 IP 设置为来自本地网络的 IP。这可以使用 MetalLB 来实现。
在 MetalLB 中,您可以定义将使用本地网络中的哪些 IP。例如,以下配置使 MetalLB 能够控制从 到192.168.1.240
的IP 192.168.1.250
:
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: default
protocol: layer2
addresses:
- 192.168.1.240-192.168.1.250
这会将 MetalLB 绑定到一个范围,而这并不是您所需要的。因此,请查看这文章中解释了如何创建 IPPools 并使用它们。