4

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

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

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

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

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

4

1 回答 1

9

回答问题:

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

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

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

Metallb.universe.tf

按照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相关联。LoadBalancerNginx 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将确保在 a 中配置的地址metallb ConfigMap将与Service.

旁注!

您可以省略metallband 使用Serviceof 类型Nodeport,但这有一些缺点。


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

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

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

  • $ curl FIREWALL_IP:80

其他资源:

于 2021-02-21T12:33:30.650 回答