实战:Traefik 高级配置2-2022.1.18
目录文章目录目录实验环境实验软件1、Traefik Pilot???? 演示1:traefik使用Traefik Pilot(成功测试)2、私有插件???? 演示1:traefik私有插件(成功测试)关于我最后实验环境实验环境:1、win10,vmwrokstation虚机;2、k8s集群:3台centos7.6 1810虚机,1个master节点,2个node节点k8s version:v1.2
目录
文章目录
实验环境
实验环境:
1、win10,vmwrokstation虚机;
2、k8s集群:3台centos7.6 1810虚机,1个master节点,2个node节点
k8s version:v1.22.2
containerd://1.5.5
实验软件
链接:https://pan.baidu.com/s/1N9RYHNJofTimb6q7esnkcg
提取码:apnz
–来自百度网盘超级会员V6的分享
2022.1.18-32.Traefik高级配置2
1、Traefik Pilot
虽然 Traefik 已经默认实现了很多中间件,可以满足大部分我们日常的需求,但是在实际工作中,用户仍然还是有自定义中间件的需求,这就是 Traefik Pilot 的功能了。
Traefik Pilot 是一个 SaaS 平台,和 Traefik 进行链接来扩展其功能,它提供了很多功能,通过一个全局控制面板和 Dashboard 来增强对 Traefik 的观测和控制:
- Traefik 代理和代理组的网络活动的指标
- 服务健康问题和安全漏洞警报
- 扩展 Traefik 功能的插件
📍 演示1:traefik使用Traefik Pilot(成功测试)
在 Traefik 可以使用 Traefik Pilot
的功能之前,必须先连接它们,我们只需要对 Traefik 的静态配置进行少量更改即可。
Traefik 代理必须要能访问互联网才能连接到
Traefik Pilot
,通过 HTTPS 在 443 端口上建立连接。
🍀 首先我们需要在 Traefik Pilot
主页上(https://pilot.traefik.io/)创建一个帐户,注册新的 Traefik
实例并开始使用 Traefik Pilot
。登录后,可以通过选择 Register New Traefik Instance
来创建新实例。
这边我们在之前的traefik-dashboard
功能基础上,直接点击右边连接traefik pilot进行登录就好:
另外,当我们的 Traefik 尚未连接到 Traefik Pilot
时,Traefik Web UI 中将出现一个响铃图标,我们可以选择 Connect with Traefik Pilot
导航到 Traefik Pilot UI 进行操作。
🍀 登录完成后,Traefik Pilot
会生成一个新实例的令牌,我们需要将这个 Token 令牌添加到 Traefik 静态配置中。
🍀 我们这里就是在 ci/deployment-prod.yaml
文件中启用 Pilot 的配置:
[root@master1 ~]#vim traefik/ci/deployment-prod.yaml
# Activate Pilot integration
pilot:
enabled: true
token: "e079ea6e-536a-48c6-b3e3-f7cfaf94f477"
然后重新更新 Traefik:
[root@master1 ~]#helm upgrade --install traefik ./traefik -f ./traefik/ci/deployment-prod.yaml --namespace kube-system
Release "traefik" has been upgraded. Happy Helming!
NAME: traefik
LAST DEPLOYED: Sun Jan 16 11:55:13 2022
NAMESPACE: kube-system
STATUS: deployed
REVISION: 2
TEST SUITE: None
更新完成后,我们在 Traefik 的 Web UI 中就可以看到 Traefik Pilot UI 相关的信息了。
🍀 接下来我们就可以在 Traefik Pilot 的插件页面选择我们想要使用的插件,比如我们这里使用 Demo Plugin 这个插件。
点击右上角的 Install Plugin
按钮安装插件会弹出一个对话框提示我们如何安装。
首先我们需要将当前 Traefik 注册到 Traefik Pilot(已完成),然后需要以静态配置的方式添加这个插件到 Traefik 中,这里我们同样更新 ci/deployment-prod.yaml
文件中的 Values 值即可:
[root@master1 ~]#vim traefik/ci/deployment-prod.yaml
# Activate Pilot integration
pilot:
enabled: true
token: "43644c57-f40f-4159-a3a5-5e6e40db1a29"
additionalArguments:
# 添加 demo plugin 的支持
- --experimental.plugins.plugindemo.modulename=github.com/traefik/plugindemo
- --experimental.plugins.plugindemo.version=v0.2.1
# 其他配置
#特别注意:这里还是需要做持久化配置的,否则会报错
[root@master1 32.Traefik]#cat pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: traefik
spec:
accessModes:
- ReadWriteOnce
capacity:
storage: 128Mi
hostPath:
path: /data/k8s/traefik
[root@master1 ~]#cat traefik/ci/deployment-prod.yaml
……
persistence:
enabled: true # 开启持久化
accessMode: ReadWriteOnce
size: 128Mi
path: /data
# 由于上面持久化了ACME的数据,需要重新配置下面的安全上下文
securityContext:
readOnlyRootFilesystem: false
runAsGroup: 0
runAsUser: 0
runAsNonRoot: false
……
同样重新更新 Traefik:
[root@master1 ~]#helm upgrade --install traefik ./traefik -f ./traefik/ci/deployment-prod.yaml --namespace kube-system
Release "traefik" has been upgraded. Happy Helming!
NAME: traefik
LAST DEPLOYED: Sun Jan 16 12:51:42 2022
NAMESPACE: kube-system
STATUS: deployed
REVISION: 3
TEST SUITE: None
更新完成后创建一个如下所示的 Middleware 对象:
[root@master1 32.Traefik]#vim who.yaml
……
apiVersion: traefik.containo.us/v1alpha1 #注意,我这里直接把这个yaml内容放到who.yaml应用里面去
kind: Middleware
metadata:
name: myplugin
spec:
plugin:
plugindemo: # 插件名
Headers:
X-Demo: test
Foo: bar
然后添加到上面的 whoami 应用的 IngressRoute 对象中去:
[root@master1 32.Traefik]#vim who.yaml
……
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: ingressroute-demo
namespace: default
spec:
entryPoints:
- web
routes:
- match: Host(`who.qikqiak.com`) && PathPrefix(`/notls`)
kind: Rule
services:
- name: whoami # K8s Service
port: 80
middlewares:
- name: myplugin # 使用上面新建的 middleware
#kubectl apply -f 32.Traefik/who.yaml
🍀 更新完成后,当我们去访问 http://who.qikqiak.com/notls
的时候就可以看到新增了两个上面插件中定义的两个 Header。
个人实验现象也成功了:
测试结束。😘完美
🍀 当然除了使用 Traefik Pilot 上开发者提供的插件之外,我们也可以根据自己的需求自行开发自己的插件,可以自行参考文档:https://doc.traefik.io/traefik-pilot/plugins/plugin-dev/。
🍀 plugin demo插件介绍
2、私有插件
上面我们介绍了可以使用 Traefik Pilot 来使用插件,但是这是一个 SaaS 服务平台,对于大部分企业场景下面不是很适用,我们更多的场景下需要在本地环境加载插件,为解决这个问题,在 Traefik v2.5 版本后,就提供了一种直接从本地存储目录加载插件的新方法,不需要启用 Traefik Pilot,只需要将插件源码放入一个名为 /plugins-local
的新目录,相对于当前工作目录去创建这个目录,比如我们直接使用的是 traefik 的 docker 镜像,则入口点则是根目录 /
,Traefik 本身会去构建你的插件,所以我们要做的就是编写源代码,并把它放在正确的目录下,让 Traefik 来加载它即可。
需要注意的是由于在每次启动的时候插件只加载一次,所以如果我们希望重新加载你的插件源码的时候需要重新启动 Traefik。
下面我们使用一个简单的自定义插件示例来说明如何使用私有插件。
📍 演示1:traefik私有插件(成功测试)
前面几个步骤是如何构建并转存对象的步骤:
🍀 首先我们定义一个名为 Dockerfile.demo
的 Dockerfile 文件,先从 git 仓库中克隆插件源码,然后以 traefik:v2.5
为基础镜像,将插件源码拷贝到 /plugins-local
目录,如下所示:
FROM alpine:3
ARG PLUGIN_MODULE=github.com/traefik/plugindemo
ARG PLUGIN_GIT_REPO=https://github.com/traefik/plugindemo.git
ARG PLUGIN_GIT_BRANCH=master
RUN apk add --update git && \
git clone ${PLUGIN_GIT_REPO} /plugins-local/src/${PLUGIN_MODULE} \
--depth 1 --single-branch --branch ${PLUGIN_GIT_BRANCH}
FROM traefik:v2.5
COPY --from=0 /plugins-local /plugins-local
我们这里使用的演示插件和上面 Pilot 中演示的是同一个插件,我们可以通过该插件去自定义请求头信息。
🍀 然后在 Dockerfile.demo
目录下面,构建镜像:
➜ docker build -f Dockerfile.demo -t cnych/traefik-private-demo-plugin:2.5.4 .
# 推送到镜像仓库
➜ docker push cnych/traefik-private-demo-plugin:2.5.4
⚠️ 我这里先直接用老师的镜像,后面再研究这个katacoda网站无法打开问题。
🍀 镜像构建完成后就可以使用这个镜像来测试 demo 插件了,同样我们这里直接去覆盖的 Values 文件,更新 ci/deployment-prod.yaml
文件中的 Values 值,将镜像修改成上面我们自定义的镜像地址:
# ci/deployment-prod.yaml
image:
name: cnych/traefik-private-demo-plugin
tag: 2.5.4
# 其他省略
# 不需要开启 pilot 了
pilot:
enabled: false
additionalArguments:
# 添加 demo plugin 的本地支持
- --experimental.localPlugins.plugindemo.moduleName=github.com/traefik/plugindemo
# 其他省略
注意上面我们添加 Traefik 的启动参数的时候使用的 --experimental.localPlugins
。
🍀 然后重新更新 Traefik:
[root@master1 ~]#helm upgrade --install traefik --namespace=kube-system ./traefik -f ./traefik/ci/deployment-prod.yaml
🍀 更新完成后就可以使用我们的私有插件来创建一个 Middleware 对象了:
[root@master1 ~]#vim who.yaml
……
---
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: my-private-plugin
spec:
plugin:
plugindemo: # 插件名
Headers:
X-Demo: private-demo
Foo: bar
然后添加到上面的 whoami 应用的 IngressRoute 对象中去:
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: ingressroute-demo
namespace: default
spec:
entryPoints:
- web
routes:
- match: Host(`who.qikqiak.com`) && PathPrefix(`/notls`)
kind: Rule
services:
- name: whoami # K8s Service
port: 80
middlewares:
- name: my-private-plugin # 使用上面新建的 middleware
🍀 更新上面的资源对象后,我们再去访问 http://who.qikqiak.com/notls
就可以看到新增了两个上面插件中定义的两个 Header,证明我们的私有插件配置成功了:
[root@master1 ~]#kubectl apply -f who.yaml
service/whoami created
deployment.apps/whoami created
ingressroute.traefik.containo.us/ingressroute-demo created
middleware.traefik.containo.us/my-private-plugin created
实验结束,完美😘。
🍀 最后,本实验完整yaml文件内容如下:
[root@master1 ~]# cat traefik/ci/deployment-prod.yaml
# ci/deployment-prod.yaml #我们用如下文件覆盖掉默认values.yaml文件内容。
deployment:
enabled: true
kind: Deployment
image:
name: cnych/traefik-private-demo-plugin
tag: 2.5.4
# 使用 IngressClass. Traefik 版本<2.3 或者 Kubernetes 版本 < 1.18.x 会被忽略
ingressClass:
# 还没有进行完整的单元测试,pending https://github.com/rancher/helm-unittest/pull/12
enabled: true
isDefaultClass: false
ingressRoute: # 不用自动创建,我们自己处理
dashboard:
enabled: false
#
# 配置 providers
#
providers:
kubernetesCRD: # 开启 crd provider
enabled: true
allowCrossNamespace: true # 是否允许跨命名空间
allowExternalNameServices: true # 是否允许使用 ExternalName 的服务
kubernetesIngress: # 开启 ingress provider
enabled: true
allowExternalNameServices: true
logs:
general:
# format: json
level: DEBUG
access:
enabled: true
ports:
web:
port: 8000
hostPort: 80 # 使用 hostport 模式
websecure:
port: 8443
hostPort: 443 # 使用 hostport 模式
metrics:
port: 9100
hostPort: 9101
service: # host 模式就不需要创建 Service 了,云端环境可以用 Service 模式
enabled: false
resources:
requests:
cpu: "100m"
memory: "100Mi"
limits:
cpu: "100m"
memory: "100Mi"
# tolerations: # kubeadm 安装的集群默认情况下master是有污点,如果需要安装在master节点需要添加容忍
# - key: "node-role.kubernetes.io/master"
# operator: "Equal"
# effect: "NoSchedule"
nodeSelector: # 固定到node1这个边缘节点
kubernetes.io/hostname: "node1"
pilot:
enabled: false
additionalArguments:
# 添加 demo plugin 的本地支持
- --experimental.localPlugins.plugindemo.moduleName=github.com/traefik/plugindemo
# 其他省略
[root@master1 ~]# cat who.yaml
#who.yaml
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: wen
containerPort: 80
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: ingressroute-demo
spec:
entryPoints:
- web
routes:
- match: Host(`who.qikqiak.com`) && PathPrefix(`/notls`)
kind: Rule
services:
- name: whoami
port: 80
middlewares:
- name: my-private-plugin # 使用上面新建的 middleware
---
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: my-private-plugin
spec:
plugin:
plugindemo: # 插件名
Headers:
X-Demo: private-demo
Foo: bar
关于我
我的博客主旨:我希望每一个人拿着我的博客都可以做出实验现象,先把实验做出来,然后再结合理论知识更深层次去理解技术点,这样学习起来才有乐趣和动力。并且,我的博客内容步骤是很完整的,也分享源码和实验用到的软件,希望能和大家一起共同进步!
各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人免费帮您解决问题:
-
个人微信二维码:x2675263825 (舍得), qq:2675263825。
-
个人博客地址:www.onlyonexl.cn
-
个人微信公众号:云原生架构师实战
-
个人github
https://github.com/OnlyOnexl
-
个人csdn
https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421
最后
好了,关于Traefik 高级配置2实验就到这里了,感谢大家阅读,最后贴上我女神的photo,祝大家生活快乐,每天都过的有意义哦,我们下期见!
更多推荐
所有评论(0)