【问题标题】:Kubernetes basic authentication with Traefik使用 Traefik 进行 Kubernetes 基本身份验证
【发布时间】: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

【问题讨论】:

    标签: kubernetes traefik kubernetes-ingress


    【解决方案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
    

    参考:

    【讨论】:

      【解决方案2】:

      使用基本身份验证很流行。参考Kubernetes documentation,您应该能够使用以下步骤保护对 Traefik 的访问:

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

      htpasswd -c ./auth

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

      kubectl create secret generic mysecret --from-file auth --namespace=监控

      1. 通过将注释附加到 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
      
      1. 您可以应用以下示例:

      kubectl create -f prometheus-ingress.yaml -n 监控

      这应该没有任何问题。

      【讨论】:

      • 非常感谢!我忘记添加加密密码了。
      • 另外,请记住,除非另有说明,否则 Traefik 会将 Authorization 请求标头转发到后端应用程序。其中一些对它很敏感,在这种情况下,您可能会收到一条错误消息(Grafana 就是一个例子)。使用此注解ingress.kubernetes.io/auth-remove-header: true 不向后端传递授权标头。
      • 这些注解似乎没有任何作用。我正在使用带有 Traefik 2 的 K3s v1.21.5+k3s2。入口有效,但从不要求输入密码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-12
      • 2017-06-13
      • 2013-05-30
      • 2017-11-10
      • 1970-01-01
      • 2016-05-31
      • 2017-10-06
      相关资源
      最近更新 更多