网上搜不到资料,反复尝试才确认 Traefik 2.x 版本做 ingress 配置 basic authorization 的正确方式。

1. 创建 Middleware

Ref.

https://doc.traefik.io/traefik/v2.4/middlewares/basicauth/

参考下面 yaml 创建用于验证的用户列表,用户密码生成方法使用:htpasswd -nb user password | openssl base64

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# Declaring the user list
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: httppasswd
spec:
  basicAuth:
  # 指定使用的密码文件,k8s 内使用 secret
    secret: httppasswd
  # 不传入后端服务
    removeHeader: true
  # 可选,不必要的配置
  # headerField: X-WebAuth-User
  # realm: MyRealm

---
# Note: in a kubernetes secret the string (e.g. generated by htpasswd) must be base64-encoded first.
# To create an encoded user:password pair, the following command can be used:
# htpasswd -nb user password | openssl base64

apiVersion: v1
kind: Secret
metadata:
  name: httppasswd
  namespace: default

data:
# 可以存在很多个,按行区分
  users: |
        dXNlcjokYXByMSRncEhhOEdRTyR2TzNTTDZlcmRFRE81SGRmckh1OEowCgo=

2. 创建 Ingress 并启用 Middleware

traefik 在单独当作网关转发时,有自己独立的语法,如果作为 Ingress 存在,可以添加annotations 实现配置

Ingress 创建参考:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: gotour
  annotations:
    kubernetes.io/ingress.class: traefik
    traefik.ingress.kubernetes.io/router.priority: "40"
    # 填入要启用的 Middleware,格式为 {namespace}-{Middleware name}@kubernetescrd
    # 如果不确定,可以登陆 traefik:9000/dashboard/ 里查看名称。
    traefik.ingress.kubernetes.io/router.middlewares: default-httppasswd@kubernetescrd
spec:
  rules:
  - host: "gotour.epurs.com"
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: gotour
            port:
              number: 9999
  tls:
    - secretName: epurs-com

最后

apply 上面两个文件,使生效就可以了。

traefik ingress 相比于 nginx ingress 缺少了很多 web 服务器的高级特性,但作为 k3s 开箱即用的组件,有很不错的前景。