回答问题:
如何使用 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
相关联。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
将确保在 a 中配置的地址metallb
ConfigMap
将与Service
.
旁注!
您可以省略metallb
and 使用Service
of 类型Nodeport
,但这有一些缺点。
最后一部分是在防火墙上设置端口转发。规则应如下:
FIREWALL_IP:80
->SINGLE_IP:80
FIREWALL_IP:443
->SINGLE_IP:443
之后,您应该能够通过以下方式与Nginx Ingress
控制器通信:
其他资源: