Traefik 是一个边缘路由器,是你整个平台的大门,拦截并路由每个传入的请求:它知道所有的逻辑和规则,这些规则确定哪些服务处理哪些请求;传统的反向代理需要一个配置文件,其中包含路由到你服务的所有可能路由,而 Traefik 会实时检测服务并自动更新路由规则,可以自动服务发现。
1 |
首先,当启动 Traefik 时,需要定义 entrypoints(入口点web,websecure等等),然后,根据连接到这些 entrypoints 的路由来分析传入的请求,来查看他们是否与一组规则相匹配,如果匹配,则路由可能会将请求通过一系列中间件转换过后再转发到你的服务上去。在了解 Traefik 之前有几个核心概念我们必须要了解: |
Providers
用来自动发现平台上的服务,可以是编排工具、容器引擎或者 key-value 存储等,比如 Docker、Kubernetes、FileEntrypoints
监听传入的流量(端口等…),是网络入口点,它们定义了接收请求的端口(HTTP 或者 TCP)。Routers
分析请求(host, path, headers, SSL, …),负责将传入请求连接到可以处理这些请求的服务上去。Services
将请求转发给你的应用(load balancing, …),负责配置如何获取最终将处理传入请求的实际服务。Middlewares
中间件,用来修改请求或者根据请求来做出一些判断(authentication, rate limiting, headers, …),中间件被附件到路由上,是一种在请求发送到你的服务之前(或者在服务的响应发送到客户端之前)调整请求的一种方法。
1.安装:
1 |
由于 Traefik 2.X 版本和之前的 1.X 版本不兼容,我们这里选择功能更加强大的 2.X 版本来和大家进行讲解,我们这里使用的镜像是 traefik:2.3 |
在 Traefik 中的配置可以使用两种不同的方式:
- 动态配置:完全动态的路由配置
- 静态配置:启动配置
1 2 3 |
静态配置中的元素(这些元素不会经常更改)连接到 providers 并定义 Treafik 将要监听的 entrypoints 在 Traefik 中有三种方式定义静态配置:在配置文件中、在命令行参数中、通过环境变量传递 动态配置包含定义系统如何处理请求的所有配置内容,这些配置是可以改变的,而且是无缝热更新的,没有任何请求中断或连接损耗。 |
安装 Traefik 到 Kubernetes 集群中的资源清单文件我这里提前准备好了,直接执行下面的安装命令即可:
1 |
创建之前 |
deployment.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 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
apiVersion: apps/v1 kind: Deployment metadata: name: traefik namespace: kube-system labels: app: traefik spec: selector: matchLabels: app: traefik strategy: type: Recreate template: metadata: labels: app: traefik spec: serviceAccountName: traefik-ingress-controller #tolerations: #- operator: "Exists" #nodeSelector: # kubernetes.io/hostname: ydzs-master volumes: - name: acme hostPath: path: /data/k8s/traefik/acme containers: - image: traefik:2.3 name: traefik ports: - name: web containerPort: 80 hostPort: 80 - name: websecure containerPort: 443 hostPort: 443 - name: admin containerPort: 8080 hostPort: 8080 - name: mongo containerPort: 27017 hostPort: 27017 args: - --log.level=INFO - --accesslog - --entryPoints.web.address=:80 - --entryPoints.websecure.address=:443 - --entryPoints.mongo.address=:27017 - --api=true - --api.dashboard=true - --ping=true # - --providers.kubernetesingress - --providers.kubernetescrd - --serversTransport.insecureSkipVerify=true #- --experimental.pilot.token=81aaa5f4-54ac-45e5-91a4-d567c3a4bb8e # - --providers.file.filename=/config/traefik-tls.toml # 使用 dns 验证方式 #- --certificatesResolvers.ali.acme.dnsChallenge.provider=alidns # 邮箱配置 #- --certificatesResolvers.ali.acme.email=tuobalongshen@126.com # 保存 ACME 证书的位置 #- --certificatesResolvers.ali.acme.storage=/etc/acme/acme.json # 下面是用于测试的ca服务,如果https证书生成成功了,则移除下面参数 # - --certificatesresolvers.ali.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory #envFrom: #- secretRef: # name: traefik-alidns-secret # ALICLOUD_ACCESS_KEY # ALICLOUD_SECRET_KEY # ALICLOUD_REGION_ID volumeMounts: - name: acme mountPath: /etc/acme # - name: config # mountPath: /config # - name: certs # mountPath: /certs resources: requests: cpu: "50m" memory: "50Mi" limits: cpu: "200m" memory: "100Mi" securityContext: allowPrivilegeEscalation: true capabilities: drop: - ALL add: - NET_BIND_SERVICE readinessProbe: httpGet: path: /ping port: 8080 failureThreshold: 1 initialDelaySeconds: 10 periodSeconds: 10 successThreshold: 1 timeoutSeconds: 2 livenessProbe: httpGet: path: /ping port: 8080 failureThreshold: 3 initialDelaySeconds: 10 periodSeconds: 10 successThreshold: 1 timeoutSeconds: 2 |
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 36 37 38 39 |
简单说说 args: - --log.level=INFO - --accesslog - --entryPoints.web.address=:80 - --entryPoints.websecure.address=:443 - --entryPoints.mongo.address=:27017 - --api=true - --api.dashboard=true - --ping=true # - --providers.kubernetesingress - --providers.kubernetescrd - --serversTransport.insecureSkipVerify=true #- --experimental.pilot.token=81aaa5f4-54ac-45e5-91a4-d567c3a4bb8e # - --providers.file.filename=/config/traefik-tls.toml # 使用 dns 验证方式 #- --certificatesResolvers.ali.acme.dnsChallenge.provider=alidns # 邮箱配置 #- --certificatesResolvers.ali.acme.email=tuobalongshen@126.com # 保存 ACME 证书的位置 #- --certificatesResolvers.ali.acme.storage=/etc/acme/acme.json # 下面是用于测试的ca服务,如果https证书生成成功了,则移除下面参数 # - --certificatesresolvers.ali.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory #envFrom: #- secretRef: # name: traefik-alidns-secret # ALICLOUD_ACCESS_KEY # ALICLOUD_SECRET_KEY # ALICLOUD_REGION_ID 这里很多我都注释了,因为当前我根本用不到,这里着重要介绍的就是这个 - --entryPoints.web.address=:80 - --entryPoints.websecure.address=:443 - --entryPoints.mongo.address=:27017 这三项是来定义 web 和 websecure 和 mongo 这三个入口点的,当然你也可以继续添加如: - --entryPoints.grafana.address=:3000 等等,这样就又多了一个entryPoints, route当中就可以使用新的匹配项。 --api=true 开启,=,就会创建一个名为 api@internal 的特殊 service,在 dashboard 中可以直接使用这个 service 来访问,然后其他比较重要的就是开启 kubernetesingress 和 kubernetescrd 这两个 provider。 |
Dashboard-Route.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 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
apiVersion: traefik.containo.us/v1alpha1 kind: Middleware metadata: name: redirect-https namespace: kube-system spec: redirectScheme: scheme: https apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata: name: traefik-dashboard namespace: kube-system spec: entryPoints: - web routes: - match: Host(`traefik.9l988.com`) kind: Rule services: - name: api@internal kind: TraefikService middlewares: - name: redirect-https --- apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata: name: traefik-dashboard-tls namespace: kube-system spec: entryPoints: - websecure routes: - match: Host(`traefik.9l988.com`) kind: Rule services: - name: api@internal kind: TraefikService tls: secretName: who-tls certResolver: ali domains: - main: "*.9l988.com" # tls: # secretName: who-tls # --- # apiVersion: traefik.containo.us/v1alpha1 # kind: Middleware # metadata: # name: auth # spec: # basicAuth: # secret: secretName # Kubernetes secret named "secretName" |
1 2 3 4 5 6 7 8 9 |
如果我们需要用 HTTPS 来访问我们这个应用的话,就需要监听 websecure 这个入口点,也就是通过 443 端口来访问,同样用 HTTPS 访问应用必然就需要证书,这里我们用 openssl 来创建一个自签名的证书: openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=traefik.9l988.com" #然后通过 Secret 对象来引用证书文件: # 要注意证书文件名称必须是 tls.crt和tls.key,而且必须和Route在同一个命名空间下 kubectl create secret tls who-tls --cert=tls.crt --key=tls.key secret/who-tls created -n kube-system |
rabc.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 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
--- kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: traefik-ingress-controller rules: - apiGroups: - "" resources: - services - endpoints - secrets verbs: - get - list - watch - apiGroups: - extensions resources: - ingresses - ingressclasses verbs: - get - list - watch - apiGroups: - extensions resources: - ingresses/status verbs: - update - apiGroups: - traefik.containo.us resources: - middlewares - ingressroutes - traefikservices - ingressroutetcps - ingressrouteudps - tlsoptions - tlsstores verbs: - get - list - watch --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: traefik-ingress-controller roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: traefik-ingress-controller subjects: - kind: ServiceAccount name: traefik-ingress-controller namespace: kube-system --- kind: ServiceAccount apiVersion: v1 metadata: name: traefik-ingress-controller namespace: kube-system |
crd.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 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: ingressroutes.traefik.containo.us spec: group: traefik.containo.us version: v1alpha1 names: kind: IngressRoute plural: ingressroutes singular: ingressroute scope: Namespaced --- apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: middlewares.traefik.containo.us spec: group: traefik.containo.us version: v1alpha1 names: kind: Middleware plural: middlewares singular: middleware scope: Namespaced --- apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: ingressroutetcps.traefik.containo.us spec: group: traefik.containo.us version: v1alpha1 names: kind: IngressRouteTCP plural: ingressroutetcps singular: ingressroutetcp scope: Namespaced --- apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: ingressrouteudps.traefik.containo.us spec: group: traefik.containo.us version: v1alpha1 names: kind: IngressRouteUDP plural: ingressrouteudps singular: ingressrouteudp scope: Namespaced --- apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: tlsoptions.traefik.containo.us spec: group: traefik.containo.us version: v1alpha1 names: kind: TLSOption plural: tlsoptions singular: tlsoption scope: Namespaced --- apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: tlsstores.traefik.containo.us spec: group: traefik.containo.us version: v1alpha1 names: kind: TLSStore plural: tlsstores singular: tlsstore scope: Namespaced --- apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: traefikservices.traefik.containo.us spec: group: traefik.containo.us version: v1alpha1 names: kind: TraefikService plural: traefikservices singular: traefikservice scope: Namespaced |
svc.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 25 |
apiVersion: v1 kind: Service metadata: labels: k8s-app: traefik name: traefik namespace: kube-system spec: type: NodePort ports: - protocol: TCP name: web port: 80 - protocol: TCP name: admin port: 8080 - protocol: TCP name: websecure port: 443 nodePort: 443 - protocol: TCP name: http-metrics port: 8082 selector: app: traefik |
traefik是通过IngressRoute来定义访问入口匹配的(定义路由后即可通过路由中定义的域名访问)。并不需要再去创建ingress域名规则。
部署完成后我们可以通过在本地 /etc/hosts 中添加上域名 traefik.9l988.com 的映射即可访问 Traefik 的 Dashboard 页面了:
1 |
traefik.9l988.com |

ACME
Traefik 通过扩展 CRD 的方式来扩展 Ingress 的功能,除了默认的用 Secret 的方式可以支持应用的 HTTPS 之外,还支持自动生成 HTTPS 证书。
示例1:
比如现在我们有一个如下所示的 whoami 应用:
定义svc和pod
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 |
apiVersion: v1 kind: Service metadata: name: whoami spec: ports: - protocol: TCP name: web port: 80 selector: app: whoami --- kind: Deployment apiVersion: apps/v1 metadata: name: whoami labels: app: whoami spec: replicas: 2 selector: matchLabels: app: whoami template: metadata: labels: app: whoami spec: containers: - name: whoami image: containous/whoami ports: - name: web containerPort: 80 |
定义访问路由
1 2 3 4 5 6 7 8 9 10 11 12 13 |
apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata: name: simpleingressroute spec: entryPoints: - web routes: - match: Host(`who.qikqiak.com`) && PathPrefix(`/notls`) kind: Rule services: - name: whoami port: 80 |
1 2 3 |
通过 entryPoints 指定了我们这个应用的入口点是 web,也就是通过 80 端口访问,然后访问的规则就是要匹配 who.qikqiak.com 这个域名,并且具有 /notls 的路径前缀的请求才会被 whoami 这个 Service 所匹配。我们可以直接创建上面的几个资源对象,然后对域名做对应的解析后,就可以访问应用了: 注意:traefik路由需要和匹配的svc在同一namespace下,否则不能访问 |
注意:traefik路由需要和匹配的svc在同一namespace下,否则不能访问
然后用who.qikqiak.com访问

示例2:
再定义一个访问本地grafana的路由
1 |
grafana默认使用的是3000端口,首先修改traefik deploy 添加新的entryPoints |

然后定义路由ingressRoute
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata: name: grafana namespace: monitoring #路由必须和他匹配的svc在同一namespace下 spec: entryPoints: - grafana routes: - match: Host(`grafana.9l988.com`) kind: Rule services: - name: grafana port: 3000 |
1 |
通过 entryPoints 指定了我们这个应用的入口点是 grafana,也就是通过 3000 端口访问,然后访问的规则就是要匹配 grafana.9l988.com 这个域名的请求才会被 grafana 这个 Service 所匹配。我们可以直接创建上面的几个资源对象,然后对域名做对应的解析后,就可以访问应用了。对了还需要对外暴露端口 |
修改ingress-svc, 对外暴露3000端口

1 |
访问:grafana.9l988.com |

在 IngressRoute 对象中我们定义了一些匹配规则,这些规则在 Traefik 中有如下定义方式:

1 |
如果我们需要用 HTTPS 来访问我们这个应用的话,就需要监听 websecure 这个入口点,也就是通过 443 端口来访问,同样用 HTTPS 访问应用必然就需要证书,这里我们用 openssl 来创建一个自签名的证书: |
1 |
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=who.9l988.com" |
然后通过 Secret 对象来引用证书文件:
1 2 |
# 要注意证书文件名称必须是 tls.crt 和 tls.key 必须在Route同一命名空间下,否则你默认使用的是traefik自动生成的证书 $ kubectl create secret tls who-tls --cert=tls.crt --key=tls.key -n kube-system |
这个时候我们就可以创建一个 HTTPS 访问应用的 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: ingressroutetls spec: entryPoints: - websecure routes: - match: Host(`who.qikqiak.com`) && PathPrefix(`/tls`) kind: Rule services: - name: whoami port: 80 tls: secretName: who-tls |
创建完成后就可以通过 HTTPS 来访问应用了,由于我们是自签名的证书,所以证书是不受信任的

1 |
除了手动提供证书的方式之外 Traefik 还支持使用 Let’s Encrypt 自动生成证书,要使用 Let’s Encrypt 来进行自动化 HTTPS,就需要首先开启 ACME,开启 ACME 需要通过静态配置的方式,也就是说可以通过环境变量、启动参数等方式来提供,我们这里还是直接使用启动参数的形式来开启,在 Traefik 的部署文件中添加如下命令行参数: |
1 2 3 4 5 6 7 8 |
args: ...... # 使用 dns 验证方式 - --certificatesResolvers.ali.acme.dnsChallenge.provider=alidns # 邮箱配置 - --certificatesResolvers.ali.acme.email=ych_1024@163.com # 保存 ACME 证书的位置 - --certificatesResolvers.ali.acme.storage=/etc/acme/acme.json |
1 2 |
ACME 有多种校验方式 tlsChallenge、httpChallenge 和 dnsChallenge 三种验证方式,之前更常用的是 http 这种验证方式,关于这几种验证方式的使用可以查看文档:https://www.qikqiak.com/traefik-book/https/acme/ 了解他们之间的区别。要使用 tls 校验方式的话需要保证 Traefik 的 443 端口是可达的,dns 校验方式可以生成通配符的证书,只需要配置上 DNS 解析服务商的 API 访问密钥即可校验。我们这里用 DNS 校验的方式来为大家说明如何配置 ACME。 |
1 |
上面我们通过设置 --certificatesResolvers.ali.acme.dnsChallenge.provider=alidns 参数来指定指定阿里云的 DNS 校验,要使用阿里云的 DNS 校验我们还需要配置3个环境变量:ALICLOUD_ACCESS_KEY、ALICLOUD_SECRET_KEY、ALICLOUD_REGION_ID,分别对应我们平时开发阿里云应用的时候的密钥,可以登录阿里云后台获取,由于这是比较私密的信息,所以我们用 Secret 对象来创建: |
1 |
kubectl create secret generic traefik-alidns-secret --from-literal=ALICLOUD_ACCESS_KEY=<aliyun ak> --from-literal=ALICLOUD_SECRET_KEY=<aliyun sk>--from-literal=ALICLOUD_REGION_ID=cn-beijing -n kube-system |
1 |
创建完成后将这个 Secret 通过环境变量配置到 Traefik 的应用中。还有一个值得注意的是验证通过的证书我们这里存到 /etc/acme/acme.json 文件中,我们一定要将这个文件持久化,否则每次 Traefik 重建后就需要重新认证,而 Let’s Encrypt 本身校验次数是有限制的。最后我们这里完整的 Traefik 的配置资源清单如下所示: |
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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
apiVersion: apps/v1 kind: Deployment metadata: name: traefik namespace: kube-system labels: app: traefik spec: selector: matchLabels: app: traefik template: metadata: labels: app: traefik spec: serviceAccountName: traefik terminationGracePeriodSeconds: 60 tolerations: - operator: "Exists" nodeSelector: kubernetes.io/hostname: ydzs-master volumes: - name: acme hostPath: path: /data/k8s/traefik/acme containers: - image: traefik:2.1.1 name: traefik ports: - name: web containerPort: 80 hostPort: 80 - name: websecure containerPort: 443 hostPort: 443 args: - --entryPoints.web.address=:80 - --entryPoints.websecure.address=:443 - --api=true - --api.dashboard=true - --ping=true - --providers.kubernetesingress - --providers.kubernetescrd - --log.level=INFO - --accesslog # 使用 dns 验证方式 - --certificatesResolvers.ali.acme.dnsChallenge.provider=alidns # 邮箱配置 - --certificatesResolvers.ali.acme.email=ych_1024@163.com # 保存 ACME 证书的位置 - --certificatesResolvers.ali.acme.storage=/etc/acme/acme.json # 下面是用于测试的ca服务,如果https证书生成成功了,则移除下面参数 # - --certificatesresolvers.ali.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory envFrom: - secretRef: name: traefik-alidns-secret # ALICLOUD_ACCESS_KEY # ALICLOUD_SECRET_KEY # ALICLOUD_REGION_ID volumeMounts: - name: acme mountPath: /etc/acme resources: requests: cpu: "50m" memory: "50Mi" limits: cpu: "200m" memory: "100Mi" securityContext: allowPrivilegeEscalation: true capabilities: drop: - ALL add: - NET_BIND_SERVICE readinessProbe: httpGet: path: /ping port: 8080 failureThreshold: 1 initialDelaySeconds: 10 periodSeconds: 10 successThreshold: 1 timeoutSeconds: 2 livenessProbe: httpGet: path: /ping port: 8080 failureThreshold: 3 initialDelaySeconds: 10 periodSeconds: 10 successThreshold: 1 timeoutSeconds: 2 |
直接更新 Traefik 应用即可。更新完成后现在我们来修改上面我们的 whoami 应用:
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: ingressroutetls spec: entryPoints: - websecure routes: - match: Host(`who.9l988.com`) && PathPrefix(`/tls`) kind: Rule services: - name: whoami port: 80 tls: certResolver: ali domains: - main: "*.9l988.com" |
1 |
其他的都不变,只需要将 tls 部分改成我们定义的 ali 这个证书解析器,如果我们想要生成一个通配符的域名证书的话可以定义 domains 参数来指定,然后更新 IngressRoute 对象,这个时候我们再去用 HTTPS 访问我们的应用(当然需要将域名在阿里云 DNS 上做解析): |
中间件
中间件是 Traefik2.0 中一个非常有特色的功能,我们可以根据自己的各种需求去选择不同的中间件来满足服务,Traefik 官方已经内置了许多不同功能的中间件,其中一些可以修改请求,头信息,一些负责重定向,一些添加身份验证等等,而且中间件还可以通过链式组合的方式来适用各种情况。
同样比如上面我们定义的 whoami 这个应用,我们可以通过 https://who.9l988.com/tls 来访问到应用,但是如果我们用 http 来访问的话呢就不行了,就会404了,因为我们根本就没有简单80端口这个入口点,所以要想通过 http 来访问应用的话自然我们需要监听下 web 这个入口点:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata: name: ingressroutetls-http spec: entryPoints: - web routes: - match: Host(`who.qikqiak.com`) && PathPrefix(`/tls`) kind: Rule services: - name: whoami port: 80 |
1 2 3 |
注意这里我们创建的 IngressRoute 的 entryPoints 是 web,然后创建这个对象,这个时候我们就可以通过 http 访问到这个应用了。 但是我们如果只希望用户通过 https 来访问应用的话呢?按照以前的知识,我们是不是可以让 http 强制跳转到 https 服务去,对的,在 Traefik 中也是可以配置强制跳转的,只是这个功能现在是通过中间件来提供的了。如下所示,我们使用 redirectScheme 中间件来创建提供强制跳转服务: |
强制跳转服务:http跳转https
1 2 3 4 5 6 7 |
apiVersion: traefik.containo.us/v1alpha1 kind: Middleware metadata: name: redirect-https spec: redirectScheme: scheme: https |
然后将这个中间件附加到 http 的服务上面去,因为 https 的不需要跳转:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata: name: ingressroutetls-http spec: entryPoints: - web routes: - match: Host(`who.9l988.com`) && PathPrefix(`/tls`) kind: Rule services: - name: whoami port: 80 middlewares: - name: redirect-https |
这个时候我们再去访问 http 服务可以发现就会自动跳转到 https 去了。关于更多中间件的用法可以查看文档 Traefik Docs。
1 |
原文链接:https://zhuanlan.zhihu.com/p/111267604 还没有实践完 做个标记 |
1 |
https://zhuanlan.zhihu.com/p/111267604 |
- 本文固定链接: https://www.yoyoask.com/?p=4649
- 转载请注明: shooter 于 SHOOTER 发表