如何将自定义端口加入nginx ingress白名单

5
我在Kubernetes中有一个nginx ingress,它既有白名单(由nginx.ingress.kubernetes.io/whitelist-source-range注释处理),又有自定义端口映射(通过--tcp-services-configmap configmap将SFTP服务器端口22暴露出来)。白名单对于80和443端口运作良好,但是对于22端口不起作用。如何将我的自定义端口加入白名单?
配置大致如下:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-ingress-controller
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  ...
    spec:
      serviceAccountName: nginx-ingress-serviceaccount
      containers:
        - name: nginx-ingress-controller
          image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.33.0
          args:
            - /nginx-ingress-controller
            - --configmap=$(POD_NAMESPACE)/nginx-configuration
            - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
            - --udp-services-configmap=$(POD_NAMESPACE)/udp-services
            - --publish-service=$(POD_NAMESPACE)/ingress-nginx
            - --annotations-prefix=nginx.ingress.kubernetes.io
          ports:
            - name: http
              containerPort: 80
            - name: https
              containerPort: 443
            - name: sftp
              containerPort: 22
        ...

kind: Ingress
metadata:
  name: {{ .controllerName }}
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/whitelist-source-range: {{ .ipAllowList }}

kind: ConfigMap
apiVersion: v1
metadata:
  name: tcp-services
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
data:
  22: "default/sftp:22"

更新

感谢 @jordanm 的提示,我发现我可以通过负载均衡器中的 loadBalancerSourceRanges 来限制所有端口的IP地址,而不是使用 nginx:

kind: Service
apiVersion: v1
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  externalTrafficPolicy: Local
  type: LoadBalancer
  loadBalancerIP: {{ .loadBalancerIp }}
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
  ports:
    - name: http
      port: 80
      targetPort: http
    - name: https
      port: 443
      targetPort: https
    - name: sftp
      port: 22
      targetPort: sftp
  loadBalancerSourceRanges:
    {{ .ipAllowList }}

1
你的入口前面有负载均衡器吗?负载均衡器是否支持非HTTP协议? - jordanm
@jordanm:是的,在前面有一个负载均衡器服务。有没有更好的方法来设置允许列表? - Lee Richardson
负载均衡器是否支持TCP服务,还是仅限于HTTP(S)? - jordanm
2
@jordanm 我公开了我所需的端口:80、443和22。在您的帮助下,我发现了 loadBalancerSourceRanges 设置,虽然它没有回答我的确切问题,但解决了我的问题,所以谢谢您! - Lee Richardson
1
很高兴你解决了问题。我很开心能够帮到你。 - jordanm
1个回答

2
首先看一下这个问题:ip-whitelist-support

对于TCP服务,IP地址没有被列入白名单,一个替代方法是为TCP服务创建一个单独的防火墙,并在防火墙级别上将IP地址列入白名单。

针对特定位置{{$path}},我们已经定义了{{if isLocationAllowed $location}}。

查看官方Ingress文档:ingress-kubernetes

Ingress将集群内服务的HTTP和HTTPS路由暴露给集群外部。流量路由由在Ingress资源上定义的规则控制。

Ingress不会公开任意端口或协议。公开除HTTP和HTTPS之外的服务通常使用类型为Service.Type=NodePort或Service.Type=LoadBalancer的服务。

要满足Ingress,您必须拥有一个Ingress控制器。仅创建Ingress资源没有任何效果。

在这种情况下,Ingress资源指示ingress-controller如何处理http/https请求。在这种方法中,nginx-ingress控制器作为软件(引入层-7功能/负载平衡)。

如果您对nginx ingress tcp支持感兴趣:

Ingress不支持TCP或UDP服务。因此,该Ingress控制器使用--tcp-services-configmap和--udp-services-configmap标志。

参见:暴露TCP/UDP服务

如果您希望在处理TCP服务时检查更细粒度的配置,应考虑使用云提供商提供的L4负载平衡/防火墙设置。


请注意,我不认为这是对我的问题的实际回答,这就是为什么我在问题中发布了我的回复。它确实解决了我的问题,因为我碰巧正在使用负载均衡器,但它并没有回答如何允许通过nginx ingress自定义端口的问题。 - Lee Richardson
我已经编辑了我的回答,请看一下。 - Malgorzata

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接