目录

TraefikIngressRoute配置

https://tc.ctq6.cn/tc/overview.png

使用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仪表盘

https://tc.ctq6.cn/tc/traefik.png

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已经正常访问 https://tc.ctq6.cn/tc/743072421.png

路由匹配规则

  • 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

因为不是正常的证书,所以访问过不去

https://tc.ctq6.cn/tc/4030331602.png