使用helm安装traefik
添加traefik仓库
1
2
|
helm repo add traefik https://helm.traefik.io/traefik
helm repo update
|
安装traefik
1
2
|
kubectl create ns traefik-v2
helm upgrade --install -n kube-system traefik traefik/traefik
|
暴露traefik的dashboard
端口说明:
8080是dashboard
80是http入口
443是https入口
通过配置traefik ui配置dashboard
配置traefik webui为IngressRoute资源, 配置文件文件的如下(traefik-ui.yaml):
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: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: traefik-webui-tls
namespace: kube-system
spec:
entryPoints:
- websecure # 注意这里是websecure这个entryPoint,监控443端口
tls:
certResolver: foo
domains:
- main: "ctq6.cn"
sans:
- "*.ctq6.cn"
passthrough: false
options:
name: tlsoption
namespace: kube-system
routes:
- match: Host(`traefik-uat.`) && PathPrefix(`/`)
kind: Rule
services:
- name: traefik
port: 8080
|
直接执行下面命令创建资源:
1
|
kubectl apply -f traefik-ui.yaml
|
通过域名访问traefik仪表盘
Traefik IngressRoute 资源配置
下面有一个nginx应用
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
31
32
33
34
35
|
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-test
namespace: kube-system
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx-test
ports:
- name: http
containerPort: 80
image: nginx
---
apiVersion: v1
kind: Service
metadata:
name: nginx-test
namespace: kube-system
spec:
selector:
app: nginx
test: "true"
type: ClusterIP
ports:
- name: web
port: 80
targetPort: http
|
让我们通过IngressRoute来配置一个规则
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: nginx-test
namespace: kube-system
spec:
entryPoints:
# 指定入口点为web。这里的web就是traefik静态配置(启动参数)中的 --entryPoints.web.address=:8080,通过仪表盘也可以看到
- web
routes:
- kind: Rule
match: Host(`localhost.cluster`) # 匹配规则,第三部分说明
services:
- name: nginx-test
port: 80
|
现在将入口web暴露出来,通过8080端口访问:
1
|
kubectl port-forward --address=0.0.0.0 -n traefik-v2 $(kubectl get pods -n traefik-v2 --selector "app.kubernetes.io/name=traefik" --output=name) 8080:8080
|
在本地做host解析
x.x.x.x localhost.cluster
现在可以直接打开localhost.cluster:8080, 可以看到nginx已经正常访问
路由匹配规则
- Headers(
key
, value
): 判断请求头是否存在,key是请求头名称,value是值
- HeadersRegexp(
key
, regexp
): 同上,可以使用正则来匹配
- Host(
example.com
, …): 检查请求Host请求头,判断其值是否为给定之一
- HostHeader(
example.com
, …): 同上
- HostRegexp(
example.com
, {subdomain:[a-z]+}.example.com
, …): 同上,可以使用正则
- Method(
GET
, …): 检查请求方法是否为给定的一个methods(GET,POST,PUT,DELETE,PATCH)
- Path(
/path
, /articles/{cat:[a-z]+}/{id:[0-9]+}
, …): 匹配确切的请求路径。接受正则表达式
- PathPrefix(
/products/
, /articles/{cat:[a-z]+}/{id:[0-9]+}
): 匹配请求前缀路径。接受正则表达式
- Query(
foo=bar
, bar=baz
): 匹配查询字符串参数
注意点:
1
2
3
|
为了与Host和Path表达式一起使用正则表达式,必须声明一个任意命名的变量,后跟用冒号分隔的正则表达式,所有这些都用花括号括起来。例如/posts/{id:[0-9]+},id为变量名
您可以使用AND(&&)和OR(||)运算符组合多个匹配器。您也可以使用括号。
规则评估后可以使用中间件,在请求被转发到服务之前对规则进行评估
|
https配置
生成证书secret
1
|
kubectl create secret tls nginx-test --cert=tls.crt --key=tls.key
|
修改之前的IngressRoute
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: nginx-test
namespace: kube-system
spec:
entryPoints:
# 指定入口点为web。这里的web就是traefik静态配置(启动参数)中的 --entryPoints.web.address=:8080,通过仪表盘也可以看到
- web
routes:
- kind: Rule
match: Host(`localhost.cluster`) # 匹配规则,第三部分说明
services:
- name: nginx-test
port: 80
tls:
secretName: nginx-test
|
因为不是正常的证书,所以访问过不去