如何仅将 kubernetes nginx 入口控制器中的一个路径列入白名单

Rol*_*ron 8 kubernetes nginx-ingress

使用 Nginx Ingress Controller,我们希望公开 Kubernetes 服务的不同路径,具有不同的安全要求。

  1. /向公众开放

  2. /white-list只允许来自特定 IP 地址的连接

  3. /need-key需要 API 密钥

我在 AWS EKS 中运行。Kubernetes 版本如下v1.12.6-eks-d69f1b

如果我们使用注释,它们将应用于整个服务。理想情况下,我只想将注释应用于路径。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-myServiceA
  annotations:
    # use the shared ingress-nginx
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: myServiceA.foo.org
    http:
      paths:
      - path: /
        backend:
          serviceName: myServiceA
          servicePort: 80
      - path: /white-list
        backend:
          serviceName: myServiceA
          servicePort: 80
          **NEED SOMETHING HERE TO WHITELIST**
      - path: /need-key
        backend:
          serviceName: myServiceA
          servicePort: 80
          **NEED SOMETHING HERE TO USE API-KEY**
Run Code Online (Sandbox Code Playgroud)

我得到的结果最终适用于所有路径。我可以在没有 API-Key 的情况下生活,因为我可以将其编码出来,但理想情况下,我宁愿将其在容器外部进行管理。

有人用 NGINX Ingress 控制器完成了这个任务吗?

Fei*_*Fei 8

要为每个路径应用注释,您可以ingress为要应用的每个路径编写一条规则。Nginx Ingress Controller 将ingress自行收集这些规则并相应地应用。

例如:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-myServiceA-root
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: myServiceA.foo.org
    http:
      paths:
      - path: /
        backend:
          serviceName: myServiceA
          servicePort: 80
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-myServiceA-white-list
  annotations:
    kubernetes.io/ingress.class: "nginx"
    ingress.kubernetes.io/whitelist-source-range: X.X.X.X/32
spec:
  rules:
  - host: myServiceA.foo.org
    http:
      paths:
      - path: /white-list
        backend:
          serviceName: myServiceA
          servicePort: 80
...
Run Code Online (Sandbox Code Playgroud)