$ 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创建完成后将这个 Secret 通过环境变量配置到 Traefik 的应用中 。还有一个值得注意的是验证通过的证书我们这里存到 /etc/acme/acme.json 文件中,我们一定要将这个文件持久化,否则每次 Traefik 重建后就需要重新认证,而 Let’s Encrypt 本身校验次数是有限制的 。最后我们这里完整的 Traefik 的配置资源清单如下所示:
apiVersion: apps/v1kind: Deploymentmetadata:name: traefiknamespace: kube-systemlabels:app: traefikspec:selector:matchLabels:app: traefiktemplate:metadata:labels:app: traefikspec:serviceAccountName: traefikterminationGracePeriodSeconds: 60tolerations:- operator: "Exists"nodeSelector:kubernetes.io/hostname: ydzs-mastervolumes:- name: acmehostPath:path: /data/k8s/traefik/acmecontainers:- image: traefik:2.1.1name: traefikports:- name: webcontainerPort: 80hostPort: 80- name: websecurecontainerPort: 443hostPort: 443args:- --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/directoryenvFrom:- secretRef:name: traefik-alidns-secret# ALICLOUD_ACCESS_KEY# ALICLOUD_SECRET_KEY# ALICLOUD_REGION_IDvolumeMounts:- name: acmemountPath: /etc/acmeresources:requests:cpu: "50m"memory: "50Mi"limits:cpu: "200m"memory: "100Mi"securityContext:allowPrivilegeEscalation: truecapabilities:drop:- ALLadd:- NET_BIND_SERVICEreadinessProbe:httpGet:path: /pingport: 8080failureThreshold: 1initialDelaySeconds: 10periodSeconds: 10successThreshold: 1timeoutSeconds: 2livenessProbe:httpGet:path: /pingport: 8080failureThreshold: 3initialDelaySeconds: 10periodSeconds: 10successThreshold: 1timeoutSeconds: 2直接更新 Traefik 应用即可 。更新完成后现在我们来修改上面我们的 whoami 应用:
apiVersion: traefik.containo.us/v1alpha1kind: IngressRoutemetadata:name: ingressroutetlsspec:entryPoints:- websecureroutes:- match: Host(`who.qikqiak.com`) && PathPrefix(`/tls`)kind: Ruleservices:- name: whoamiport: 80tls:certResolver: alidomains:- main: "*.qikqiak.com"其他的都不变,只需要将 tls 部分改成我们定义的 ali 这个证书解析器,如果我们想要生成一个通配符的域名证书的话可以定义 domains 参数来指定,然后更新 IngressRoute 对象,这个时候我们再去用 HTTPS 访问我们的应用(当然需要将域名在阿里云 DNS 上做解析):

文章插图
traefik wildcard domain
我们可以看到访问应用已经是受浏览器信任的证书了,查看证书我们还可以发现该证书是一个通配符的证书 。
中间件中间件是 Traefik2.0 中一个非常有特色的功能,我们可以根据自己的各种需求去选择不同的中间件来满足服务,Traefik 官方已经内置了许多不同功能的中间件,其中一些可以修改请求,头信息,一些负责重定向,一些添加身份验证等等,而且中间件还可以通过链式组合的方式来适用各种情况 。

文章插图
【一文搞懂 Traefik2.1 的使用】traefik middleware overview
同样比如上面我们定义的 whoami 这个应用,我们可以通过 https://who.qikqiak.com/tls 来访问到应用,但是如果我们用 http 来访问的话呢就不行了,就会404了,因为我们根本就没有简单80端口这个入口点,所以要想通过 http 来访问应用的话自然我们需要监听下 web 这个入口点:
apiVersion: traefik.containo.us/v1alpha1kind: IngressRoutemetadata:name: ingressroutetls-httpspec:entryPoints:- webroutes:- match: Host(`who.qikqiak.com`) && PathPrefix(`/tls`)kind: Ruleservices:- name: whoamiport: 80注意这里我们创建的 IngressRoute 的 entryPoints 是 web,然后创建这个对象,这个时候我们就可以通过 http 访问到这个应用了 。但是我们如果只希望用户通过 https 来访问应用的话呢?按照以前的知识,我们是不是可以让 http 强制跳转到 https 服务去,对的,在 Traefik 中也是可以配置强制跳转的,只是这个功能现在是通过中间件来提供的了 。如下所示,我们使用 redirectScheme 中间件来创建提供强制跳转服务:
推荐阅读
- 5分钟!彻底搞懂MyBatis插件+PageHelper原理
- 彻底搞懂 Netty 线程模型
- 一文读懂 Java操作Elasticsearch
- 一文讲透FTP和SFTP的区别
- 一文搞懂分类算法中常用的评估指标
- 一文了解高并发限流算法
- 一文领略 HTTP 的前世今生
- 看了两天HashMap源码,终于把红黑树插入平衡规则搞懂了
- 一文学懂递归和动态规划
- 一文读懂阿里云之VPC概念及实战
