在没有云提供商的Load Balancer的情况下将kubernetes集群暴露给“世界”

时间:2020-05-17 11:52:24

标签: kubernetes load-balancing kubernetes-ingress

到目前为止,我已经建立了一个运行NodeJS部署的kubernetes集群。我现在准备将其公开给“世界”,并在阅读了做到这一点的服务之后,我相信所有这些都需要负载均衡器。通常,这些负载均衡器是由托管kubernetes的云提供商创建的。我遇到了这些限制,一些定价很高,一些在连接方面有限制,等等。

我现在试图找出如何避免这些负载均衡器并公开我的kubernetes集群的方法,但要以一种高效,安全和可管理的方式进行。我浏览了文档,似乎提到了NodePortIngress之类的东西。据我了解,NodePort仅适用于群集中的一台计算机?并且Ingress仍然需要流量来自某个地方,通常是负载均衡器。

这是我目前的清单,从公开的角度来看,我应该从这里出发,理想情况下,该方法应采用允许SSL证书,速率限制等...生产中常用的东西

development.yaml

---
# ClusterIP
apiVersion: v1
kind: Service
metadata:
  name: development-actions-cip
spec:
  type: ClusterIP
  selector:
    app: development-actions
  ports:
    - protocol: TCP
      port: 80
      targetPort: 4000
---
# Actions NodeJS server
apiVersion: apps/v1
kind: Deployment
metadata:
  name: development-actions
spec:
  replicas: 1
  selector:
    matchLabels:
      app: development-actions
  template:
    metadata:
      labels:
        app: development-actions
    spec:
      containers:
        - image: my-image/latest
          name: development-actions
          ports:
            - containerPort: 4000
              protocol: TCP

2 个答案:

答案 0 :(得分:2)

要解决此问题,可以采用以下几种方法:

  1. 您可以使用称为MetalLB的服务,该服务通常用于裸机部署。它提供了网络负载平衡器。
  2. 如果您不想使用云提供商提供的负载均衡器,则可以在反向代理(可能是Nginx服务)的帮助下创建自定义负载均衡器。该计算机可以是专用实例,只能使用路由和负载平衡功能进行加载。在此之后创建的入口控制器可以被允许从该计算机获取流量。这是用户定义的边缘创建。
  3. 如上述解决方案中所述,您可以将hostNetwork:true与nginx-ingress Pods配合使用,以便可以通过计算机网络直接访问这些计算机。
  4. 您可以将外部IP直接与nginx入口Pod一起使用,您可以在其中直接为服务分配公共IP并通过Internet连接服务。

有关更多信息和设置细节,请访问Nginx入口的官方文档:https://kubernetes.github.io/ingress-nginx/deploy/baremetal/#over-a-nodeport-service

我已经尝试了所有这些选项来部署应用程序,我的建议是,如果您正在使用某些云服务来部署集群,请使用云服务提供商的负载均衡器,因为它更加安全,高度可用且可靠。 。我在内部部署中使用用户定义的边缘创建或MetalLB服务

答案 1 :(得分:0)

您可以使用hostNetwork: true在选定的专用kubernetes节点中部署nginx入口控制器。这意味着nginx将侦听主机VM网络上的端口80443。为虚拟机分配浮动的公共IP。将虚拟机的公共IP作为A record添加到DNS提供商配置中,以将您的域的流量路由到虚拟机。

然后为所有后端Pod只需创建clusterIP服务和入口资源即可将其公开给外界。

要使其具有高可用性,您可以将同一设置复制到多个kubernetes节点上。