使用 MetalLB 将公共 IP 添加到 Nginx Ingress 控制器

Try*_*est 6 kubernetes kubernetes-ingress nginx-ingress metallb

我的集群中有三个节点,它们位于我无法控制的防火墙后面。该防火墙有一个连接到它的公共 IP,可以将流量转发到我的 kubernetes 节点。它向我的节点开放了端口 80 和 443。

最初,我在 MetalLB 配置中使用公共 IP,如下所示:

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 186.xx.xx.xx-186.xx.xx.xx

Run Code Online (Sandbox Code Playgroud)

但在阅读了另一个问题的答案后,我猜测它是无效的,因为 MetalLB 使用的 IP 需要与节点位于同一子网中?而且他们都使用私有IP。

当我在本地测试侦听端口 80 的 HTTP 服务器并在实际节点(不在集群中)上运行它时,我能够从网络外部的公共 IP 上获得响应。

所以我的问题是: 如何让 MetalLB 或 Nginx 入口控制器在端口 80 和 443 上侦听传入请求?

当使用curl 186.xx.xx.xx:80集群中的节点时,我会收到来自 nginx 入口控制器的响应。但在节点外部执行此操作时则不然。

Daw*_*ruk 14

回答问题:

\n
\n

如何使用 Kubernetes 集群和单独的防火墙创建设置,以允许用户连接到我的Nginx Ingress公开我的应用程序的控制器。

\n
\n

假设设置基于内部网络中配置的 Kubernetes 集群,并且集群和“互联网”之间有防火墙,则应解决以下几点(可能会有一些衍生问题,我将解决):

\n
    \n
  • Metallb在 Kubernetes 集群上配置(假设它是裸机自我管理解决方案)
  • \n
  • Nginx Ingress控制器经过修改Service
  • \n
  • Port-forwarding在防火墙上设置
  • \n
\n
\n

ServiceLoadbalancer大多数类型(有一些例外)是一种资源,需要云提供商为External IP您的Service.

\n
\n

附注!

\n

更多参考可以在这里找到:

\n\n
\n

对于基于前提的解决方案,有一个名为的工具metallb

\n
\n

Kubernetes 不为裸机集群提供网络负载均衡器(LoadBalancer 类型的服务)的实现。Kubernetes 附带的网络 LB 的实现都是调用各种 IaaS 平台(GCP、AWS、Azure\xe2\x80\xa6)的粘合代码。如果\xe2\x80\x99 未在受支持的 IaaS 平台(GCP、AWS、Azure\xe2\x80\xa6)上运行,则 LoadBalancer 在创建时将无限期地保持在 \xe2\x80\x9cpending\xe2\x80\x9d 状态。

\n

裸机集群运营商只剩下两个较小的工具来将用户流量引入其集群:\xe2\x80\x9cNodePort\xe2\x80\x9d 和 \xe2\x80\x9cexternalIPs\xe2\x80\x9d 服务。这两种选择对于生产使用都有很大的缺点,这使得裸机集群成为 Kubernetes 生态系统中的二等公民。

\n

MetalLB 旨在通过提供与标准网络设备集成的网络 LB 实现来纠正这种不平衡,以便裸机集群上的外部服务也能尽可能地工作。

\n

金属宇宙.tf

\n
\n

按照Metallb 安装/配置指南,将配置防火墙将流量发送到的单个内部 IP 地址:

\n
apiVersion: v1\nkind: ConfigMap\nmetadata:\n  namespace: metallb-system\n  name: config\ndata:\n  config: |\n    address-pools:\n    - name: single-ip # <-- HERE\n      protocol: layer2\n      addresses:\n      - 10.0.0.100/32 # <-- HERE\n
Run Code Online (Sandbox Code Playgroud)\n

该 IP 地址将与控制器的Service类型相关联。LoadBalancerNginx Ingress

\n
\n

清单所需的更改Nginx IngressService部分):

\n\n
# Source: ingress-nginx/templates/controller-service.yaml\napiVersion: v1\nkind: Service\nmetadata:\n  annotations:\n    metallb.universe.tf/address-pool: single-ip # <-- IMPORTANT\n  labels:\n    # <-- OMMITED --> \n  name: ingress-nginx-controller\n  namespace: ingress-nginx\nspec:\n  type: LoadBalancer\n  externalTrafficPolicy: Local\n  ports:\n    - name: http\n      port: 80\n      protocol: TCP\n      targetPort: http\n    - name: https\n      port: 443\n      protocol: TCP\n      targetPort: https\n  selector:\n    # <-- OMMITED --> \n
Run Code Online (Sandbox Code Playgroud)\n

清单中的上述更改YAML将确保 a 中配置的地址metallb ConfigMap将与Service.

\n
\n

附注!

\n

您可以省略 themetallb并使用Serviceof 类型Nodeport,但这会带来一些缺点。

\n
\n
\n

最后一部分是在防火墙上设置端口转发。规则应如下:

\n
    \n
  • FIREWALL_IP:80->SINGLE_IP:80
  • \n
  • FIREWALL_IP:443->SINGLE_IP:443
  • \n
\n

之后,您应该能够Nginx Ingress通过以下方式与控制器进行通信:

\n
    \n
  • $ curl FIREWALL_IP:80
  • \n
\n
\n

其他资源:

\n\n