使用 Traefik 进行 Kubernetes 基本身份验证
Posted
技术标签:
【中文标题】使用 Traefik 进行 Kubernetes 基本身份验证【英文标题】:Kubernetes basic authentication with Traefik 【发布时间】:2018-10-12 08:04:33 【问题描述】:我正在尝试在使用 Traefik 作为 Ingress 控制器的 nginx 示例上配置基本身份验证。
我只是在 Kubernetes 秘密上创建秘密 "mypasswd"
。
这是我正在使用的 Ingress:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginxingress
annotations:
ingress.kubernetes.io/auth-type: basic
ingress.kubernetes.io/auth-realm: traefik
ingress.kubernetes.io/auth-secret: mypasswd
spec:
rules:
- host: nginx.mycompany.com
http:
paths:
- path: /
backend:
serviceName: nginxservice
servicePort: 80
我查看 Traefik 仪表板,如果我访问 nginx.mycompany.com,我可以查看 Nginx 网页,但没有基本身份验证。
这是我的 nginx 部署:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
Nginx 服务:
apiVersion: v1
kind: Service
metadata:
labels:
name: nginxservice
name: nginxservice
spec:
ports:
# The port that this service should serve on.
- port: 80
# Label keys and values that must match in order to receive traffic for this service.
selector:
app: nginx
type: ClusterIP
【问题讨论】:
【参考方案1】:Kubernetes 和 Traefik 2 的基本身份验证配置似乎略有变化。我花了一些时间找到解决方案,这就是我想分享它的原因。顺便说一句,我用的是 k3s。
步骤 1 + 2 与 @d0bry 所写的相同,创建秘密:
printf "my-username:`openssl passwd -apr1`\n" >> my-auth
kubectl create secret generic my-auth --from-file my-auth --namespace my-namespace
第 3 步是创建入口对象并应用处理身份验证的中间件
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: my-auth-middleware
namespace: my-namespace
spec:
basicAuth:
removeHeader: true
secret: my-auth
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
namespace: my-namespace
annotations:
kubernetes.io/ingress.class: traefik
traefik.ingress.kubernetes.io/router.middlewares: my-namespace-my-auth-middleware@kubernetescrd
spec:
rules:
- host: my.domain.net
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service
port:
number: 8080
然后当然是应用配置
kubectl apply -f my-ingress.yaml
参考:
https://doc.traefik.io/traefik/routing/providers/kubernetes-ingress/ https://doc.traefik.io/traefik/middlewares/http/basicauth/【讨论】:
【参考方案2】:使用基本身份验证很流行。参考Kubernetes documentation,您应该能够使用以下步骤保护对 Traefik 的访问:
-
使用
htpasswd
工具创建身份验证文件。系统会要求您输入用户密码:
htpasswd -c ./auth
-
现在使用
kubectl
使用htpasswd
创建的文件在监控命名空间中创建一个秘密。
kubectl create secret generic mysecret --from-file auth --namespace=监控
-
通过将注释附加到 Ingress 对象来启用基本身份验证:
ingress.kubernetes.io/auth-type: "基本"
ingress.kubernetes.io/auth-secret: "mysecret"
因此,基本身份验证的完整示例配置如下所示:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: prometheus-dashboard
namespace: monitoring
annotations:
kubernetes.io/ingress.class: traefik
ingress.kubernetes.io/auth-type: "basic"
ingress.kubernetes.io/auth-secret: "mysecret"
spec:
rules:
- host: dashboard.prometheus.example.com
http:
paths:
- backend:
serviceName: prometheus
servicePort: 9090
-
您可以应用以下示例:
kubectl create -f prometheus-ingress.yaml -n 监控
这应该没有任何问题。
【讨论】:
非常感谢!我忘记添加加密密码了。 另外,请记住,除非另有说明,否则 Traefik 会将Authorization
请求标头转发到后端应用程序。其中一些对它很敏感,在这种情况下,您可能会收到一条错误消息(Grafana 就是一个例子)。使用此注解ingress.kubernetes.io/auth-remove-header: true
不向后端传递授权标头。
这些注解似乎没有任何作用。我正在使用带有 Traefik 2 的 K3s v1.21.5+k3s2。入口有效,但从不要求输入密码。以上是关于使用 Traefik 进行 Kubernetes 基本身份验证的主要内容,如果未能解决你的问题,请参考以下文章