根据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证书,效果很好。
答案 0 :(得分:1)
您使用了错误的控制器/注释。这些注释适用于拥有该官方https://github.com/kubernetes/ingress-nginx的image
您有有关如何部署控制器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)
要在Nginx Ingress上配置基本身份验证,应该有两件事:
(我假设您已经在集群上运行了入口控制器)
应该存在一个秘密,该秘密的名称和内容以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
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对象。