LAN 的 Kubernetes Ingress 白名单源范围

ccl*_*oyd 5 nginx kubernetes

我们的集群上有一个 Kubernetes 入口。我们希望限制只有那些从我们的 LAN ( ) 内访问它的人才能访问它10.0.0.0/16。所以在入口注释中,我有nginx.ingress.kubernetes.io/whitelist-source-range: "10.0.0.0/16".

但这仍然允许来自任何地方的流量。将其设置为10.0.0.0/24(我们的 DHCP 范围),它根本不允许任何流量。

当我检查 nginx-ingress-controller 日志时,我看到

10.0.10.1 - - [15/Oct/2019:05:40:46 +0000] “GET / HTTP/2.0” 200 2073 “-” “curl/7.54.0” 38 0.019 [wfs-ipa-8443] [] 10.0.1.2:8443 2073 0.020 200 a2d2053149dd26a490251439629134ff

这表明它将源 IP 视为入口控制器 Pod 当前正在运行的节点。我怎样才能让它将源IP视为他们的LAN IP或我们拥有的单个WAN IP?

编辑:

ingress.yml:

---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ipa
  namespace: wfs
  annotations:
    kubernetes.io/ingress.class: "nginx"
    certmanager.k8s.io/cluster-issuer: "letsencrypt-prod"
    ingress.kubernetes.io/secure-backends: "true"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/use-proxy-protocol: "true"
    nginx.ingress.kubernetes.io/auth-tls-verify-client: "off"
    nginx.ingress.kubernetes.io/whitelist-source-range: "10.0.0.0/16"

spec:
  tls:
    - hosts:
        - ipa.example.com
      secretName: ipa-tls
  rules:
    - host: ipa.example.com
      http:
        paths:
          - backend:
              serviceName: ipa
              servicePort: 8443
            path: /
Run Code Online (Sandbox Code Playgroud)

mat*_*t_j 5

这是一个老问题,可能由作者解决,但对于其他社区成员,我决定提供一个带有一些解释的答案。


中看到的源IPNGINX Ingress Controller Container并不是客户端的原始源IP。要启用在服务配置文件中设置的客户端 IP 的保留(请参阅service.spec.externalTrafficPolicy保留客户端源 IP 文档)。Local

如果您已经部署了kubernetes/ingress-nginx,您可以使用以下命令来配置此字段:

$ kubectl patch svc <INGRESS_CONTROLLER_SERVICE_NAME> -p '{"spec":{"externalTrafficPolicy":"Local"}}'
Run Code Online (Sandbox Code Playgroud)

如果您想在安装kubernetes/ingress-nginx期间启用客户端源 IP 保留,请添加--set controller.service.externalTrafficPolicy=Local到 Helm install 命令中。

此外,您还可以在此Kubernetes 文档中找到有用的信息。