如何在入口中为包含的 url 规则设置基本身份验证?

How to setup basic auth in ingress for included url rules?

我有一个关于 k8s 的项目,其中包含 3 项服务,我想用基本身份验证覆盖它,还有 1 项我想成为的服务 public。 在入口 4 中,服务由 url 规则划分,具有不同的前缀。 我在所有规则的入口中找到了关于基本身份验证设置的教程,但没有关于排除的教程,包括 urls.

很遗憾GCP Ingress没有提供basic auth authentication as this feature is specific for Nginx Ingress

作为 GCP Ingressbasic auth 的解决方法,您可以使用 IAP。详细的How To信息可以在Enabling IAP for GKE文章中找到。

如果您仍想使用 Nginx Ingress basic auth,可以在 GKE 上使用,但您需要指定 nginx 注释。

metadata:
  name: foo
  annotations:
    kubernetes.io/ingress.class: "nginx"

关于仅在四分之一的服务上使用 basic auth,您可以创建 2 个 Ingress。在另一个 Whosebug 线程中讨论了非常相似的问题,其中包含很好的解决方案 - Nginx-ingress Kubernetes routing with basic auth.

基本身份验证入口

第一个 Ingress 应该没有注释:

  • nginx.ingress.kubernetes.io/auth-type
  • nginx.ingress.kubernetes.io/auth-secret
  • nginx.ingress.kubernetes.io/auth-realm

第二个 Ingress 应该包含正确的注释并且看起来应该类似于下面的 YAML。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: auth-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/auth-type: basic
    nginx.ingress.kubernetes.io/auth-secret: basic-auth
    nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required'
    #cert-manager.io/cluster-issuer: if you would use cert manager like letsencrypt
spec:
  tls:
    - hosts:
        - example.com
      secretName: example-tls
  rules:
    - host: example.com
      http:
        paths:
          - path: /auth
            backend:
              serviceName: auth-service
              servicePort: <auth-service-port>

附加信息

有一个选项可以拒绝所有流量到特定路径。可以通过configuration-snippet注解来实现。

   annotations:
      nginx.ingress.kubernetes.io/configuration-snippet: |

      location /specificpath {

           deny all;  
      }