舍得

V1

2022/01/19阅读:85主题:草原绿

实战:Traefik 高级配置2-2022.1.18

image-20220109164500924
image-20220109164500924

目录

实验环境

实验环境:
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 的功能了。

pilot
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 进行操作。

Pilot UI
Pilot UI

🍀 登录完成后,Traefik Pilot 会生成一个新实例的令牌,我们需要将这个 Token 令牌添加到 Traefik 静态配置中。

Pilot 配置
Pilot 配置

🍀 我们这里就是在 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 相关的信息了。

更新完成
更新完成
image-20220116115832921
image-20220116115832921

🍀 接下来我们就可以在 Traefik Pilot 的插件页面选择我们想要使用的插件,比如我们这里使用 Demo Plugin 这个插件。

Demo 插件
Demo 插件

点击右上角的 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。

自定义插件显示
自定义插件显示

个人实验现象也成功了:

image-20220116130556424
image-20220116130556424

测试结束。😘完美

🍀 当然除了使用 Traefik Pilot 上开发者提供的插件之外,我们也可以根据自己的需求自行开发自己的插件,可以自行参考文档:https://doc.traefik.io/traefik-pilot/plugins/plugin-dev/。

🍀 plugin demo插件介绍

image-20220116123229582
image-20220116123229582
image-20220116123320398
image-20220116123320398
image-20220116123350864
image-20220116123350864
image-20220116123409854
image-20220116123409854

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

:warning: 我这里先直接用老师的镜像,后面再研究这个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
image-20220117222831340
image-20220117222831340

实验结束,完美😘。

🍀 最后,本实验完整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

关于我

我的博客主旨:我希望每一个人拿着我的博客都可以做出实验现象,先把实验做出来,然后再结合理论知识更深层次去理解技术点,这样学习起来才有乐趣和动力。并且,我的博客内容步骤是很完整的,也分享源码和实验用到的软件,希望能和大家一起共同进步!

各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人免费帮您解决问题:

  1. 个人微信二维码:x2675263825 (舍得), qq:2675263825。

    image-20211002091450217
    image-20211002091450217
  2. 个人博客地址:www.onlyonexl.cn

    image-20211002092057988
    image-20211002092057988
  3. 个人微信公众号:云原生架构师实战

    image-20211002141739664
    image-20211002141739664
  4. 个人github

    https://github.com/OnlyOnexl

    image-20220105203338290
    image-20220105203338290
  5. 个人csdn

    https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421

    image-20211002092344616
    image-20211002092344616

最后

​ 好了,关于Traefik 高级配置2实验就到这里了,感谢大家阅读,最后贴上我女神的photo,祝大家生活快乐,每天都过的有意义哦,我们下期见!

image-20211108223350304
image-20211108223350304

分类:

后端

标签:

后端

作者介绍

舍得
V1