网上搜不到资料,反复尝试才确认 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 开箱即用的组件,有很不错的前景。