无法使用Google Kubernetes Engien Nginx入口控制器获得HTTP基本身份验证

时间:2018-07-27 14:17:46

标签: docker authentication nginx kubernetes

根据Kubernetes文档,Nginx Ingress Controller支持添加基本身份验证。我要设置的必需的Ingress注释是:

nginx.ingress.kubernetes.io/auth-type: basic
nginx.ingress.kubernetes.io/auth-secret: namespace/secret
nginx.ingress.kubernetes.io/auth-realm: "Authentication Required"

我的入口控制器图片是:gcr.io/google_containers/nginx-ingress-controller:0.9.0-beta.11

我无法从入口控制器中找到任何表明错误的日志,但是不存在基本身份验证。万一有问题,我正在使用cert-manager来配置让我们加密TLS证书,效果很好。

2 个答案:

答案 0 :(得分:1)

您使用了错误的控制器/注释。这些注释适用于拥有该官方https://github.com/kubernetes/ingress-nginximage

您有有关如何部署控制器here的示例

如果您要使用gcr.io/google_containers/nginx-ingress-controller:0.9.0-beta.11,则注释为:

ingress.kubernetes.io/auth-type: basic
ingress.kubernetes.io/auth-secret: basic-auth
ingress.kubernetes.io/auth-realm: "Authentication Required"

答案 1 :(得分:0)

您可以找到完整的文章herehere

要在Nginx Ingress上配置基本身份验证,应该有两件事:
(我假设您已经在集群上运行了入口控制器)

  1. 应该存在一个秘密,该秘密的名称和内容以base64编码的行形式包含用户名/密码: (在此示例中,名称“ basic-auth”用作密钥的名称,但您可以选择所需的任何有效名称。)

    $ htpasswd -c auth foo
    New password: <bar>
    New password:
    Re-type new password:
    Adding password for user foo
    
    $ kubectl create secret generic basic-auth --from-file=auth
    secret "basic-auth" created
    
    $ kubectl get secret basic-auth -o yaml
    apiVersion: v1
    data:
      auth: Zm9vOiRhcHIxJE9GRzNYeWJwJGNrTDBGSERBa29YWUlsSDkuY3lzVDAK
    kind: Secret
    metadata:
      name: basic-auth
      namespace: default
    type: Opaque
    
  2. Ingress对象应该与Secret位于同一命名空间中:
    (这里我们为Ingress和Secret使用默认的名称空间)

    echo "
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: ingress-with-auth
      annotations:
        # type of authentication
        nginx.ingress.kubernetes.io/auth-type: basic
        # name of the secret that contains the user/password definitions
        nginx.ingress.kubernetes.io/auth-secret: basic-auth
        # message to display with an appropriate context why the authentication is required
        nginx.ingress.kubernetes.io/auth-realm: \"Authentication Required - foo\"
    spec:
      rules:
      - host: foo.bar.com
        http:
          paths:
          - path: /
            backend:
              serviceName: <your_backend_service_name>
              servicePort: <your_backend_service_port>
    " | kubectl create -f -
    

要使用GET请求(带有或不带有身份验证)来验证您的配置检查回复,
30xxx-从命令kubectl get svc --all-namespaces | grep ingress-nginx | grep NodePort的输出中获取端口号)

$ curl -v http://cluster.node.ip.address:30xxx/ -H 'Host: foo.bar.com'
...
< HTTP/1.1 401 Unauthorized
...

$ curl -v http://cluster.node.ip.address:30xxx/ -H 'Host: foo.bar.com' -u 'foo:bar'
...
< HTTP/1.1 200 OK
...

如果工作正常,则可以将SSL或TLS配置添加到Ingress对象。