实战:Traefik 高级配置3-2022.1.23

image-20220118204531997

目录

实验环境

实验环境:
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/16F9vmarQGQXFYNTfWXpa8w
提取码:i9ri

2022.1.23-33.Traefik高级配置3

1、灰度发布

Traefik2.0 的一个更强大的功能就是灰度发布,灰度发布我们有时候也会称为金丝雀发布(Canary),主要就是让一部分测试的服务也参与到线上去,经过测试观察看是否符号上线要求。

注意:ingress-nginx中通过annotations也可以做灰度发布,但是在校验方面还是比较麻烦的,但traefik在校验方面会容易一些;

canary deployment

比如现在我们有两个名为 appv1appv2 的服务,我们希望通过 Traefik 来控制我们的流量,将 3⁄4 的流量路由到 appv1,¼ 的流量路由到 appv2 去,这个时候就可以利用 Traefik2.0 中提供的**带权重的轮询(WRR)**来实现该功能。

中间是一个LB,你也可以认为中间是一个traefik;

📍 演示1:traefik实现灰度发布(成功测试)

首先在 Kubernetes 集群中部署上面的两个服务,为了对比结果我们这里提供的两个服务一个是 whoami,一个是 nginx,方便测试。

🍀 本次测试实验路径如下:

[root@master1 ~]#mkdir canary
[root@master1 ~]#cd canary/

🍀 2个服务的资源清单文件如下

appv1 服务的资源清单如下所示:

[root@master1 canary]#vim appv1.yaml
# appv1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: appv1
spec:
  selector:
    matchLabels:
      app: appv1
  template:
    metadata:
      labels:
        use: test #这里只需要注意下这2个deployment的label就好!
        app: appv1
    spec:
      containers:
      - name: whoami
        image: containous/whoami
        ports:
        - containerPort: 80
          name: portv1
---
apiVersion: v1
kind: Service
metadata:
  name: appv1
spec:
  selector:
    app: appv1
  ports:
  - name: http
    port: 80
    targetPort: portv1

appv2 服务的资源清单如下所示:

[root@master1 canary]#vim appv2.yaml
# appv2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: appv2
spec:
  selector:
    matchLabels:
      app: appv2
  template:
    metadata:
      labels:
        use: test
        app: appv2
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
          name: portv2
---
apiVersion: v1
kind: Service
metadata:
  name: appv2
spec:
  selector:
    app: appv2
  ports:
  - name: http
    port: 80
    targetPort: portv2

直接创建上面两个服务:

[root@master1 canary]#kubectl apply -f appv1.yaml 
deployment.apps/appv1 created
service/appv1 created
[root@master1 canary]#kubectl apply -f appv2.yaml 
deployment.apps/appv2 created
service/appv2 created

# 通过下面的命令可以查看服务是否运行成功
[root@master1 canary]#kubectl get pods -l use=test
NAME                     READY   STATUS    RESTARTS   AGE
appv1-87c57677b-fkwdp    1/1     Running   0          28s
appv2-68c4857c4b-nztwj   1/1     Running   0          24s

🍀 在 Traefik2.1 中新增了一个 TraefikService 的 CRD 资源,我们可以直接利用这个对象来配置 WRR,之前的版本需要通过 File Provider,比较麻烦,新建一个描述 WRR 的资源清单:

#查看traefikservices这种CRD资源
[root@master1 canary]#kubectl get crd
NAME                                    CREATED AT
ingressroutes.traefik.containo.us       2022-01-17T13:03:35Z
ingressroutetcps.traefik.containo.us    2022-01-17T13:03:35Z
ingressrouteudps.traefik.containo.us    2022-01-17T13:03:35Z
middlewares.traefik.containo.us         2022-01-17T13:03:35Z
middlewaretcps.traefik.containo.us      2022-01-17T13:03:35Z
serverstransports.traefik.containo.us   2022-01-17T13:03:35Z
tlsoptions.traefik.containo.us          2022-01-17T13:03:36Z
tlsstores.traefik.containo.us           2022-01-17T13:03:36Z
traefikservices.traefik.containo.us     2022-01-17T13:03:36Z #这个

#查看traefikservice的一些帮助信息
[root@master1 canary]# kubectl explain traefikservice.spec.weighted.services
[root@master1 canary]#vim wrr.yaml
# wrr.yaml 
apiVersion: traefik.containo.us/v1alpha1
kind: TraefikService
metadata:
  name: app-wrr
spec:
  weighted:
    services: #定义带权重的轮询服务
      - name: appv1
        weight: 3  # 定义权重
        port: 80
        kind: Service  # 可选,默认就是 Service
      - name: appv2
        weight: 1
        port: 80

🍀 然后为我们的灰度发布的服务创建一个 IngressRoute 资源对象:

[root@master1 canary]#vim wrr-ingressroute.yaml
# wrr-ingressroute.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: wrr-ingressroute
  namespace: default
spec:
  entryPoints:
    - web
  routes:
  - match: Host(`wrr.qikqiak.com`)
    kind: Rule #这个地方不再是直接的一个k8s的service了;
    services:
    - name: app-wrr
      kind: TraefikService

直接部署:

[root@master1 canary]#kubectl apply -f wrr.yaml 
traefikservice.traefik.containo.us/app-wrr created
[root@master1 canary]#kubectl apply -f wrr-ingressroute.yaml 
ingressroute.traefik.containo.us/wrr-ingressroute created

再做下域名解析:

#在自己pc笔记本上做下域名解析:C:\WINDOWS\System32\drivers\etc\hosts
172.29.9.52 wrr.qikqiak.com

🍀 不过需要注意的是现在我们配置的 Service 不再是直接的 Kubernetes 对象了,而是上面我们定义的 TraefikService 对象,直接创建上面的两个资源对象,这个时候我们对域名 wrr.qikqiak.com 做上解析,去浏览器中连续访问 4 次,我们可以观察到 appv1 这应用会收到 3 次请求,而 appv2 这个应用只收到 1 次请求,符合上面我们的 3:1 的权重配置。

traefik wrr demo

现象相同,完美!

测试结束。😘

🍀 注意:traefik目前好像只支持基于权重的

image-20220123211826916

2、流量复制

除了灰度发布之外,Traefik 2.0 还引入了流量镜像服务,是一种可以将流入流量复制并同时将其发送给其他服务的方法,镜像服务可以获得给定百分比的请求同时也会忽略这部分请求的响应。(这个功能还是比较好用的,用于测试场景,bug定位)

traefik mirror

📍 演示1:traefik实现流量复制(成功测试)

🍀 本次测试实验路径如下:

[root@master1 ~]#mkdir mirror

#记得删除下刚才创建的资源:
[root@master1 ~]#kubectl delete -f canary/
deployment.apps "appv1" deleted
service "appv1" deleted
deployment.apps "appv2" deleted
service "appv2" deleted
ingressroute.traefik.containo.us "wrr-ingressroute" deleted
traefikservice.traefik.containo.us "app-wrr" deleted

🍀 现在我们部署两个ngninx的服务,资源清单文件如下所示:

[root@master1 ~]#vim mirror/mirror.yaml

apiVersion: v1
kind: Service
metadata:
  name: v1
spec:
  ports:
    - protocol: TCP
      name: web
      port: 80
  selector:
    app: v1
---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: v1
  labels:
    app: v1
spec:
  selector:
    matchLabels:
      app: v1
  template:
    metadata:
      labels:
        app: v1
    spec:
      containers:
        - name: v1
          image: nginx
          ports:
            - name: web
              containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
  name: v2
spec:
  ports:
    - protocol: TCP
      name: web
      port: 80
  selector:
    app: v2
---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: v2
  labels:
    app: v2
spec:
  selector:
    matchLabels:
      app: v2
  template:
    metadata:
      labels:
        app: v2
    spec:
      containers:
        - name: v2
          image: nginx
          ports:
            - name: web
              containerPort: 80

直接创建上面的资源对象:

[root@master1 ~]#kubectl apply -f mirror/
service/v1 created
deployment.apps/v1 created
service/v2 created
deployment.apps/v2 created
[root@master1 ~]#kubectl get po
NAME                  READY   STATUS    RESTARTS   AGE
v1-5bbd58797f-5828g   1/1     Running   0          22s
v2-869fdc648c-xlxzd   1/1     Running   0          22s
[root@master1 ~]#kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
……
v1           ClusterIP   10.109.206.100   <none>        80/TCP    25s
v2           ClusterIP   10.109.54.76     <none>        80/TCP    25s

🍀 现在我们创建一个 IngressRoute 对象,将服务 v1 的流量复制 50% 到服务 v2,如下资源对象所示:

[root@master1 ~]#vim mirror/mirror-ingress-route.yaml

# mirror-ingress-route.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: TraefikService
metadata:
  name: app-mirror
spec:
  mirroring:
    kind: Service #可选的,默认就是k8s的service
    name: v1 # 直接发送 100% 的请求到 K8S 的 Service "v1"
    port: 80
    mirrors:
    - name: v2 # 然后复制 50% 的请求到 v2
      percent: 50
      port: 80
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: mirror-ingress-route
  namespace: default
spec:
  entryPoints:
  - web
  routes:
  - match: Host(`mirror.qikqiak.com`)
    kind: Rule
    services:
    - name: app-mirror
      kind: TraefikService # 使用声明的 TraefikService 服务,而不是 K8S 的 Service

然后直接创建这个资源对象即可:

[root@master1 ~]#kubectl apply -f mirror/
traefikservice.traefik.containo.us/app-mirror unchanged
ingressroute.traefik.containo.us/mirror-ingress-route created
service/v1 unchanged
deployment.apps/v1 unchanged
service/v2 unchanged
deployment.apps/v2 unchanged

#在自己pc笔记本上做下域名解析:C:\WINDOWS\System32\drivers\etc\hosts
172.29.9.52 mirror.qikqiak.com

🍀 这个时候我们在浏览器中去连续访问4次 mirror.qikqiak.com 可以发现有一半的请求也出现在了 v2 这个服务中:

我们可以同事打开2个终端,查看2个pod的日志:

traefik mirror demo

image-20220119221834980

现象符合预期效果,实验结束,完美😘。

3、TCP

另外 Traefik2.X 已经支持了 TCP 服务的,下面我们以 mongo 为例来了解下 Traefik 是如何支持 TCP 服务得。

⚠️ 记得在ingress-nginx里是通过configmap来支持TCP功能的,这个方式不是很方便。而在traefike这里,是直接通过CRD这种方式来实现的。

[root@master1 ~]#kubectl get crd
NAME                                    CREATED AT
……
ingressroutetcps.traefik.containo.us    2022-01-19T12:50:35Z
ingressrouteudps.traefik.containo.us    2022-01-19T12:50:36Z

1.简单 TCP 服务

📍 演示1:简单的TCP服务(成功测试)

🍀 同样,在测试之前,我们把环境清理干净

[root@master1 ~]#kubectl delete -f mirror/
traefikservice.traefik.containo.us "app-mirror" deleted
ingressroute.traefik.containo.us "mirror-ingress-route" deleted
service "v1" deleted
deployment.apps "v1" deleted
service "v2" deleted
deployment.apps "v2" deleted
[root@master1 ~]#mkdir tcp

🍀 首先部署一个普通的 mongo 服务,资源清单文件如下所示:(mongo.yaml)

[root@master1 ~]#vim tcp/mongo.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mongo-traefik
  labels:
    app: mongo-traefik
spec:
  selector:
    matchLabels:
      app: mongo-traefik
  template:
    metadata:
      labels:
        app: mongo-traefik
    spec:
      containers:
      - name: mongo
        image: mongo:4.0
        ports:
        - containerPort: 27017
---
apiVersion: v1
kind: Service
metadata:
  name: mongo-traefik
spec:
  selector:
    app: mongo-traefik
  ports:
  - port: 27017

直接创建 mongo 应用:

[root@master1 ~]#kubectl apply -f tcp/
deployment.apps/mongo-traefik created
service/mongo-traefik created

[root@master1 ~]#kubectl get po -l app=mongo-traefik
NAME                             READY   STATUS    RESTARTS   AGE
mongo-traefik-58c6cf4bfc-xc687   1/1     Running   0          3m49s

🍀 创建成功后就可以来为 mongo 服务配置一个路由了。由于 Traefik 中使用 TCP 路由配置需要 SNI,而 SNI 又是依赖 TLS 的,所以我们需要配置证书才行,如果没有证书的话,我们可以使用通配符 * (适配ip的)进行配置,我们这里创建一个 IngressRouteTCP 类型的 CRD 对象(前面我们就已经安装了对应的 CRD 资源):

[root@master1 ~]#vim tcp/mongo-ingressroute-tcp.yaml

# mongo-ingressroute-tcp.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRouteTCP
metadata:
  name: mongo-traefik-tcp
spec:
  entryPoints: #入口点定义,就相当于我们想通过什么端口去访问mongo
    - mongo #这个时候就需要单独去定义一个mongo的入口点
  routes: #redis->如果需要指定一个特定的域名,则需要配置对应的tls证书
  - match: HostSNI(`*`)
    services:
    - name: mongo-traefik
      port: 27017

要注意的是这里的 entryPoints 部分,是根据我们启动的 Traefik 的静态配置中的 entryPoints 来决定的,我们当然可以使用前面我们定义得 80 和 443 这两个入口点,但是也可以可以自己添加一个用于 mongo 服务的专门入口点,更新 values-prod.yaml 文件,新增 mongo 这个入口点:

[root@master1 ~]#vim traefik/ci/deployment-prod.yaml
……
ports:
  web:
    port: 8000
    hostPort: 80
  websecure:
    port: 8443
    hostPort: 443
  mongo:
    port: 27017 #新增一个用于暴露mongo服务的入口点。
    hostPort: 27017

然后更新 Traefik 即可:

[root@master1 ~]#helm upgrade --install traefik --namespace=kube-system ./traefik -f ./traefik/ci/deployment-prod.yaml
Release "traefik" has been upgraded. Happy Helming!
NAME: traefik
LAST DEPLOYED: Thu Jan 20 12:34:53 2022
NAMESPACE: kube-system
STATUS: deployed
REVISION: 2
TEST SUITE: None

这里给入口点添加 hostPort 是为了能够通过节点的端口访问到服务,关于 entryPoints 入口点的更多信息,可以查看文档 entrypoints 了解更多信息。

然后更新 Traefik 后我们就可以直接创建上面的资源对象:

[root@master1 ~]#kubectl apply -f tcp/mongo-ingressroute-tcp.yaml 
ingressroutetcp.traefik.containo.us/mongo-traefik-tcp created
[root@master1 ~]#kubectl get ingressroutetcp
NAME                AGE
mongo-traefik-tcp   30s

🍀 创建完成后,同样我们可以去 Traefik 的 Dashboard 页面上查看是否生效:(这个符合预期效果)

image-20220120124225480

image-20220120124236661

🍀 然后我们配置一个域名 mongo.local 解析到 Traefik 所在的节点,然后通过 27017 端口来连接 mongo 服务:

➜ mongo --host traefik.qikqiak.com/node1 --port 27017
mongo(75243,0x1075295c0) malloc: *** malloc_zone_unregister() failed for 0x7fffa56f4000
MongoDB shell version: 2.6.1
connecting to: mongo.local:27017/test
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB

到这里我们就完成了将 mongo(TCP)服务暴露给外部用户了。

⚠️ 注意:这边用任何可以解析mongo所在节点的域名都是可以访问的哦.

mongo --host traefik.qikqiak.com --port 27017

#在自己pc笔记本上做下域名解析:C:\WINDOWS\System32\drivers\etc\hosts
172.29.9.52 traefik.qikqiak.com

注意:这个本地是要有mongo命令的。

[root@master1 tcp]#mongo --host node1 --port 27017
-bash: mongo: command not found
[root@master1 tcp]#mongo --host traefik.qikqiak.com --port 27017
-bash: mongo: command not found
[root@master1 tcp]#
# 注意:这个是要本地先安装好mongo服务的才行。自己这里就先不安装了,因为没安装过哈哈……

image-20220120130137108

2.带 TLS 证书的 TCP

📍 演示1:带 TLS 证书的 TCP(成功测试)

🍀 上面我们部署的 mongo 是一个普通的服务,然后用 Traefik 代理的,但是有时候为了安全 mongo 服务本身还会使用 TLS 证书的形式提供服务,下面是用来生成 mongo tls 证书的脚本文件:(generate-certificates.sh)

#!/bin/bash
#
# From https://medium.com/@rajanmaharjan/secure-your-mongodb-connections-ssl-tls-92e2addb3c89

set -eu -o pipefail

DOMAINS="${1}"
CERTS_DIR="${2}"
[ -d "${CERTS_DIR}" ]
CURRENT_DIR="$(cd "$(dirname "${0}")" && pwd -P)"

GENERATION_DIRNAME="$(echo "${DOMAINS}" | cut -d, -f1)"

rm -rf "${CERTS_DIR}/${GENERATION_DIRNAME:?}" "${CERTS_DIR}/certs"

echo "== Checking Requirements..."
command -v go >/dev/null 2>&1 || echo "Golang is required"
command -v minica >/dev/null 2>&1 || go get github.com/jsha/minica >/dev/null

echo "== Generating Certificates for the following domains: ${DOMAINS}..."
cd "${CERTS_DIR}"
minica --ca-cert "${CURRENT_DIR}/minica.pem" --ca-key="${CURRENT_DIR}/minica-key.pem" --domains="${DOMAINS}"
mv "${GENERATION_DIRNAME}" "certs"
cat certs/key.pem certs/cert.pem > certs/mongo.pem

echo "== Certificates Generated in the directory ${CERTS_DIR}/certs"

❓证书生成要这么麻烦吗……,记得之前不是几条命令的事儿吗……(这个证书估计是针对mongodb的)

🍀 将上面证书放置到 certs 目录下面,然后我们新建一个 02-tls-mongo 的目录,在该目录下面执行如下命令来生成证书:

bash ../certs/generate-certificates.sh mongo.local .
== Checking Requirements...
== Generating Certificates for the following domains: mongo.local...

image-20220120184451980

最后的目录如下所示,在 02-tls-mongo 目录下面会生成包含证书的 certs 目录:

➜ tree .
.
├── 01-mongo
│   ├── mongo-ingressroute-tcp.yaml
│   └── mongo.yaml
├── 02-tls-mongo
│   └── certs
│       ├── cert.pem
│       ├── key.pem
│       └── mongo.pem
└── certs
    ├── generate-certificates.sh
    ├── minica-key.pem
    └── minica.pem

🍀 在 02-tls-mongo/certs 目录下面执行如下命令通过 Secret 来包含证书内容:

➜ kubectl create secret tls traefik-mongo-certs --cert=cert.pem --key=key.pem
secret/traefik-mongo-certs created

🍀 然后重新更新 IngressRouteTCP 对象,增加 TLS 配置:

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRouteTCP
metadata:
  name: mongo-traefik-tcp
spec:
  entryPoints:
    - mongo
  routes:
  - match: HostSNI(`mongo.local`)
    services:
    - name: mongo-traefik
      port: 27017
  tls:
    secretName: traefik-mongo-certs

以上步骤都是没问题的,就是自己本地没有mongo服务,这里以老师课件为主。

🍀 同样更新后,现在我们直接去访问应用就会被 hang 住,因为我们没有提供证书:

➜ mongo --host mongo.local --port 27017
MongoDB shell version: 2.6.1
connecting to: mongo1.local:27017/test

这个时候我们可以带上证书来进行连接:

➜ mongo --host mongo.local --port 27017 --ssl --sslCAFile=../certs/minica.pem --sslPEMKeyFile=./certs/mongo.pem
MongoDB shell version v4.0.3
connecting to: mongodb://mongo.local:27017/
Implicit session: session { "id" : UUID("e7409ef6-8ebe-4c5a-9642-42059bdb477b") }
MongoDB server version: 4.0.14
......
> show dbs;
admin   0.000GB
config  0.000GB
local   0.000GB

可以看到现在就可以连接成功了,这样就完成了一个使用 TLS 证书代理 TCP 服务的功能,这个时候如果我们使用其他的域名去进行连接就会报错了,因为现在我们指定的是特定的 HostSNI:

➜ mongo --host mongo.k8s.local --port 27017 --ssl --sslCAFile=../certs/minica.pem --sslPEMKeyFile=./certs/mongo.pem
MongoDB shell version v4.0.3
connecting to: mongodb://mongo.k8s.local:27017/
2019-12-29T15:03:52.424+0800 E NETWORK  [js] SSL peer certificate validation failed: Certificate trust failure: CSSMERR_TP_NOT_TRUSTED; connection rejected
2019-12-29T15:03:52.429+0800 E QUERY    [js] Error: couldn't connect to server mongo.qikqiak.com:27017, connection attempt failed: SSLHandshakeFailed: SSL peer certificate validation failed: Certificate trust failure: CSSMERR_TP_NOT_TRUSTED; connection rejected :
connect@src/mongo/shell/mongo.js:257:13
@(connect):1:6
exception: connect failed

⚠️ 注意:

以前的redis不支持tls,现在的版本支持tls了;
mongo本身是支持tls的;

测试结束😘

4、UDP

📍 演示1:UDP测试(成功测试)

此外 Traefik2.3.x 版本也已经提供了对 UDP 的支持,所以我们可以用于诸如 DNS 解析的服务提供负载。(coredns用的这个协议就是udp的。)

本次测试环境如下:

[root@master1 ~]#mkdir udp
[root@master1 ~]#cd udp/

🍀 同样首先部署一个如下所示的 UDP 服务:

[root@master1 udp]#vim udp.yaml

apiVersion: v1
kind: Service
metadata:
  name: whoamiudp
spec:
  ports:
  - protocol: UDP #注意:这里的协议是UDP
    name: udp
    port: 8080
  selector:
    app: whoamiudp
---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: whoamiudp
  labels:
    app: whoamiudp
spec:
  replicas: 2
  selector:
    matchLabels:
      app: whoamiudp
  template:
    metadata:
      labels:
        app: whoamiudp
    spec:
      containers:
        - name: whoamiudp
          image: containous/whoamiudp
          ports:
            - name: udp
              containerPort: 8080

直接部署上面的应用:

[root@master1 ~]#kubectl apply -f udp/
service/whoamiudp created
deployment.apps/whoamiudp created
[root@master1 ~]#kubectl get po
NAME                             READY   STATUS    RESTARTS       AGE
whoamiudp-d884bdb64-nkw7p        1/1     Running   0              60s
whoamiudp-d884bdb64-xfkcd        1/1     Running   0              60s

🍀 部署完成后我们需要在 Traefik 中定义一个 UDP 的 entryPoint 入口点,修改我们部署 Traefik 的 deployment-prod.yaml 文件,增加 UDP 协议的入口点:

[root@master1 ~]#vim traefik/ci/deployment-prod.yaml

# Configure ports
ports:
  web:
    port: 8000
    hostPort: 80
  websecure:
    port: 8443
    hostPort: 443
  mongo:
    port: 27017
    hostPort: 27017
  udpep:
    port: 18080
    hostPort: 18080
    protocol: UDP #这里需要指定要暴露的协议

我们这里定义了一个名为 udpep 的入口点,但是 protocol 协议是 UDP(此外 TCP 和 UDP 共用同一个端口也是可以的,但是协议一定要声明为不一样)。

然后重新更新 Traefik:

[root@master1 ~]#helm upgrade --install traefik --namespace=kube-system ./traefik -f ./traefik/ci/deployment-prod.yaml
Release "traefik" has been upgraded. Happy Helming!
NAME: traefik
LAST DEPLOYED: Sat Jan 22 18:43:58 2022
NAMESPACE: kube-system
STATUS: deployed
REVISION: 3
TEST SUITE: None

更新完成后我们可以导出 Traefik 部署的资源清单文件来检测是否增加上了 UDP 的入口点:

➜ kubectl get deploy traefik -n kube-system -o yaml
......
containers:
- args:
  - --entryPoints.mongo.address=:27017/tcp
  - --entryPoints.traefik.address=:9000/tcp
  - --entryPoints.udpep.address=:18080/udp
  - --entryPoints.web.address=:8000/tcp
  - --entryPoints.websecure.address=:8443/tcp
  - --api.dashboard=true
  - --ping=true
  - --providers.kubernetescrd
  - --providers.kubernetesingress
......

🍀 UDP 的入口点增加成功后。接下来我们可以创建一个 IngressRouteUDP 类型的资源对象,用来代理 UDP 请求:

[root@master1 ~]#vim udp/udp-traefik.yaml

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRouteUDP
metadata:
  name: whoamiudp
spec:
  entryPoints:
  - udpep
  routes:
  - services:
    - name: whoamiudp
      port: 8080

#部署
[root@master1 ~]#kubectl apply -f udp/udp-traefik.yaml 
ingressrouteudp.traefik.containo.us/whoamiudp created

#查看创建好的ingressrouteudp
[root@master1 ~]#kubectl get ingressrouteudp
NAME        AGE
whoamiudp   56s

🍀 创建成功后我们首先在集群上通过 Service 来访问上面的 UDP 应用

[root@master1 ~]#kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP    83d
whoamiudp    ClusterIP   10.108.35.104   <none>        8080/UDP   13m

[root@master1 ~]#echo "WHO" | socat - udp4-datagram:10.108.35.104:8080
Hostname: whoamiudp-d884bdb64-xfkcd
IP: 127.0.0.1
IP: ::1
IP: 10.244.2.209
IP: fe80::2484:e8ff:fe48:6b71
[root@master1 ~]#echo "WHO123" | socat - udp4-datagram:10.108.35.104:8080
Received: WHO123
[root@master1 ~]#

我们这个应用当我们输入 WHO 的时候,就会打印出访问的 Pod 的 Hostname 这些信息,如果不是则打印接收到字符串。

🍀 现在我们通过 Traefik 所在节点的 IP(10.151.30.11)与 18080 端口来访问 UDP 应用进行测试:

[root@master1 ~]#echo "WHO" | socat - udp4-datagram:172.29.9.52:18080
Hostname: whoamiudp-d884bdb64-nkw7p
IP: 127.0.0.1
IP: ::1
IP: 10.244.2.208
IP: fe80::b03a:1ff:fead:69fb
[root@master1 ~]#echo "WHO123" | socat - udp4-datagram:172.29.9.52:18080
Received: WHO123

我们可以看到测试成功了,证明我就用 Traefik 来代理 UDP 应用成功了。

除此之外 Traefik 还有很多功能,特别是强大的中间件和自定义插件的功能,为我们提供了不断扩展其功能的能力,我们完成可以根据自己的需求进行二次开发。

测试结束😘

5、多控制器

有的业务场景下可能需要在一个集群中部署多个 traefik,不同的实例控制不同的 IngressRoute 资源对象,要实现该功能有两种方法:

第一种方法:通过 annotations 注解筛选:

  • 首先在 traefik 中增加启动参数 --providers.kubernetescrd.ingressclass=traefik-in
  • 然后在 IngressRoute 资源对象中添加 kubernetes.io/ingress.class: traefik-in 注解即可

第二种方法:通过标签选择器进行过滤:

  • 首先在 traefik 中增加启动参数 --providers.kubernetescrd.labelselector=ingressclass=traefik-out
  • 然后在 IngressRoute 资源对象中添加 ingressclass: traefik-out 这个标签即可

关于我

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

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

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

    image-20211002091450217

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

    image-20211002092057988

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

    image-20211002141739664

  4. 个人csdn

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

    image-20211002092344616

  5. 个人已开源干货😘

    01 实战:打造一款王者云笔记:typora+坚果云+阿里云oss https://www.jianguoyun.com/p/DXS6qiIQvPWVCRiS0qoE
    02 实战:定制宇宙中最美的typora主题皮肤 https://www.jianguoyun.com/p/DeUK9u0QvPWVCRib0qoE
    03 玩转vscode https://www.jianguoyun.com/p/DZe8gmsQvPWVCRid0qoE
    04 陈果的幸福哲学课 https://pan.baidu.com/s/1-slSPCX4wRXw0FvNSolm8w?pwd=i3v2

最后

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

image-20220123213817303

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值