在没有云提供商的负载均衡器的情况下将 kubernetes 集群暴露给 "the world"
Exposing kubernetes clusteer to "the world" without Load Balancer of cloud provider
到目前为止,我已经设置了一个运行我的 NodeJS 部署的 kubernetes 集群。我现在准备好将它公开给 "the world",在阅读了相关服务之后,我相信它们都需要一个负载均衡器。通常这些负载均衡器是由托管 kubernetes 的云提供商创建的。我遇到了一些限制,有些价格很高,有些有连接限制等...
我现在正试图弄清楚如何避免这些负载均衡器并公开我的 kubernetes 集群,但要以一种高性能、安全和可管理的方式。我查看了文档,似乎提到了 NodePort
和 Ingress
之类的东西。据我了解 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 网络上的端口 80
和 443
。为 VM 分配浮动 public IP。将 VM 的 public IP 作为 A record
添加到您的 DNS 提供商配置中,以将您域的流量路由到 VM。
然后对于所有后端 pods 只需创建 clusterIP 服务和入口资源以将其暴露给外界。
要实现高可用性,您可以将相同的设置复制到多个 kubernetes 节点。
解决问题的方法有以下几种:
- 您可以使用称为 MetalLB 的服务,该服务常用于裸机部署。它提供了一个网络负载平衡器。
- 如果您不想使用云提供商提供的负载均衡器,您可以借助反向代理(可能是 Nginx 服务)创建您的自定义负载均衡器。这台机器可以是一个专用实例,只能加载路由和负载均衡能力。您在此之后创建的入口控制器可以被允许从这台机器获取流量。这是用户定义的边缘创建。
- 如上面的解决方案所述,您可以将
hostNetwork:true
与 nginx-ingress Pods 一起使用,以便可以通过机器网络直接访问这些机器。
- 您可以直接将外部 IP 与 nginx 入口 pods 一起使用,您可以在其中直接为服务分配 public IP 并通过互联网连接服务。
有关更多信息和设置细节,请访问 Nginx ingress 的官方文档:https://kubernetes.github.io/ingress-nginx/deploy/baremetal/#over-a-nodeport-service
我已经尝试了所有这些选项来部署我的应用程序,我的建议是,如果您使用某些云服务来部署您的集群,请使用云服务提供商的负载均衡器,因为它更安全、可用性更高,可靠。我使用的是本地部署,用于用户定义的边缘创建或 MetalLB 服务
到目前为止,我已经设置了一个运行我的 NodeJS 部署的 kubernetes 集群。我现在准备好将它公开给 "the world",在阅读了相关服务之后,我相信它们都需要一个负载均衡器。通常这些负载均衡器是由托管 kubernetes 的云提供商创建的。我遇到了一些限制,有些价格很高,有些有连接限制等...
我现在正试图弄清楚如何避免这些负载均衡器并公开我的 kubernetes 集群,但要以一种高性能、安全和可管理的方式。我查看了文档,似乎提到了 NodePort
和 Ingress
之类的东西。据我了解 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 网络上的端口 80
和 443
。为 VM 分配浮动 public IP。将 VM 的 public IP 作为 A record
添加到您的 DNS 提供商配置中,以将您域的流量路由到 VM。
然后对于所有后端 pods 只需创建 clusterIP 服务和入口资源以将其暴露给外界。
要实现高可用性,您可以将相同的设置复制到多个 kubernetes 节点。
解决问题的方法有以下几种:
- 您可以使用称为 MetalLB 的服务,该服务常用于裸机部署。它提供了一个网络负载平衡器。
- 如果您不想使用云提供商提供的负载均衡器,您可以借助反向代理(可能是 Nginx 服务)创建您的自定义负载均衡器。这台机器可以是一个专用实例,只能加载路由和负载均衡能力。您在此之后创建的入口控制器可以被允许从这台机器获取流量。这是用户定义的边缘创建。
- 如上面的解决方案所述,您可以将
hostNetwork:true
与 nginx-ingress Pods 一起使用,以便可以通过机器网络直接访问这些机器。 - 您可以直接将外部 IP 与 nginx 入口 pods 一起使用,您可以在其中直接为服务分配 public IP 并通过互联网连接服务。
有关更多信息和设置细节,请访问 Nginx ingress 的官方文档:https://kubernetes.github.io/ingress-nginx/deploy/baremetal/#over-a-nodeport-service
我已经尝试了所有这些选项来部署我的应用程序,我的建议是,如果您使用某些云服务来部署您的集群,请使用云服务提供商的负载均衡器,因为它更安全、可用性更高,可靠。我使用的是本地部署,用于用户定义的边缘创建或 MetalLB 服务