在没有云提供商的负载均衡器的情况下将 kubernetes 集群暴露给 "the world"

Exposing kubernetes clusteer to "the world" without Load Balancer of cloud provider

到目前为止,我已经设置了一个运行我的 NodeJS 部署的 kubernetes 集群。我现在准备好将它公开给 "the world",在阅读了相关服务之后,我相信它们都需要一个负载均衡器。通常这些负载均衡器是由托管 kubernetes 的云提供商创建的。我遇到了一些限制,有些价格很高,有些有连接限制等...

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

这是我当前的清单,就将其暴露给 public 而言,我应该从哪里开始,最好使用允许 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

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

然后对于所有后端 pods 只需创建 clusterIP 服务和入口资源以将其暴露给外界。

要实现高可用性,您可以将相同的设置复制到多个 kubernetes 节点。

解决问题的方法有以下几种:

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

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

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