微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决使用 MetalLB 将公共 IP 添加到 Nginx 入口控制器

我的集群中有三个节点位于我无法控制的防火墙后面。这个防火墙有一个连接到它的公共 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

但是在阅读 this answer of another question 之后,我猜它是无效的,因为 MetalLB 使用的 IP 需要与节点位于同一子网上?而且他们都在使用私有 IP。

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

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

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

解决方法

回答问题:

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

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

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

类型为 Service

Loadbalancer 在大多数情况下(有一些排除)是一种资源,需要云提供商为其分配 External IP 地址你的Service

附注!

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

对于基于本地的解决方案,有一个名为 metallb 的工具:

Kubernetes 不为裸机集群提供网络负载平衡器(LoadBalancer 类型的服务)的实现。 Kubernetes 附带的 Network LB 的实现都是调用各种 IaaS 平台(GCP、AWS、Azure...)的胶水代码。如果您没有在受支持的 IaaS 平台(GCP、AWS、Azure...)上运行,LoadBalancers 在创建时将无限期地保持在“待处理”状态。

裸机集群运营商只剩下两个较小的工具来将用户流量引入他们的集群,“NodePort”和“externalIPs”服务。这两种选择在生产使用中都有明显的缺点,这使得裸机集群成为 Kubernetes 生态系统中的二等公民。

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

Metallb.universe.tf

按照 installation/configuration of metallb 上的指南,将配置单个内部 IP 地址,防火墙会将流量发送至:

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: single-ip # <-- HERE
      protocol: layer2
      addresses:
      - 10.0.0.100/32 # <-- HERE

此 IP 地址将与 Service 控制器的 LoadBalancer 类型的 Nginx Ingress 相关联。


Nginx Ingress 清单(Service 部分)所需的更改:

# Source: ingress-nginx/templates/controller-service.yaml
apiVersion: v1
kind: Service
metadata:
  annotations:
    metallb.universe.tf/address-pool: single-ip # <-- IMPORTANT
  labels:
    # <-- OMMITED --> 
  name: ingress-nginx-controller
  namespace: ingress-nginx
spec:
  type: LoadBalancer
  externalTrafficPolicy: Local
  ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: http
    - name: https
      port: 443
      protocol: TCP
      targetPort: https
  selector:
    # <-- OMMITED --> 

YAML 清单中的上述更改将确保 metallb ConfigMap 中配置的地址将与 Service 一起使用。

附注!

您可以省略 metallb 并使用 Service 类型的 Nodeport,但这有一些缺点。


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

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

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

  • $ curl FIREWALL_IP:80

其他资源:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。