Kubernetes与Traefik进行基本身份验证

Asi*_*mez 5 kubernetes traefik kubernetes-ingress

我正在尝试使用Traefik作为Ingress控制器在Nginx示例上配置基本身份验证.

我只是"mypasswd"在Kubernetes 的秘密上创造了秘密.

这是我正在使用的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
Run Code Online (Sandbox Code Playgroud)

我检查了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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

d0b*_*bry 20

使用基本身份验证很受欢迎.在参考Kubernetes文档时,您应该能够使用以下步骤保护对Traefik的访问:

  1. 使用htpasswd工具创建验证文件.系统会要求您输入密码:

htpasswd -c ./auth

  1. 现在用于使用 kubectl 创建的文件在监视命名空间中创建一个秘密 htpasswd.

kubectl创建秘密通用mysecret --from-file auth --namespace = monitoring

  1. 通过将注释附加到Ingress对象来启用基本身份验证:

ingress.kubernetes.io/auth-type:"basic"

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
Run Code Online (Sandbox Code Playgroud)
  1. 您可以按如下方式应用示例:

kubectl create -f prometheus-ingress.yaml -n monitoring

这应该没有任何问题.

  • 另外,请记住,除非另有说明,Traefik 会将“Authorization”请求标头转发到后端应用程序。其中一些对此很敏感,在这种情况下您可能会收到错误消息(Grafana 就是一个例子)。使用此注释“ingress.kubernetes.io/auth-remove-header: true”不将授权标头传递到后端。 (3认同)
  • 这些注释似乎没有任何作用。我正在使用 K3s v1.21.5+k3s2 和 Traefik 2。入口可以工作,但从不要求输入密码。 (3认同)
  • 面临同样的问题@rudolfbyker (2认同)

bzt*_*tes 8

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
Run Code Online (Sandbox Code Playgroud)

第 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

Run Code Online (Sandbox Code Playgroud)

然后当然应用配置

kubectl apply -f my-ingress.yaml
Run Code Online (Sandbox Code Playgroud)

参考文献: