Kubernetes Ingress 控制器 Traefik2 的部署及中间件配置

一、简介


从 2019年 Traefik 正式推出 v2.0 版本开始,已经过了很多年。笔者一直在用 Traefik v1.7 没有升级,但由于公司业务的增长,在灰度发布、熔断和限流方面的需求愈发的强烈,原来 1.7 版本的功能已经无法满足当下的需求。

对比了同类型的 ingress controller 组件,例如 istio、kong、traefik2,结合业务改造的难易程度,在综合评估后决升级现有traefik到2.9版本。

Traefik v2.0 版本相较于 1.0+ 版本增加了许多功能,例如:


为了帮助用户可以从 1.x 版本过度到新版本,官方提供了迁移指南:https://doc.traefik.io/traefik/migration/v1-to-v2/

对于 kubernetes 用户,还提供了迁移工具来帮助将 Ingress 对象转换成新的 IngressRoute 格式,工具地址:https://github.com/traefik/traefik-migration-tool

二、安装 Traefik

支持多种方式安装 Traefik:

官方文档:https://doc.traefik.io/traefik/getting-started/install-traefik/

https://github.com/traefik/traefik-helm-chart

使用 Helm 安装的时候需要注意 helm version 的版本 Helm v3 > 3.9.0


本文以 kubernetes yaml 为例,讲解 Traefik v2 的安装。

2.1 创建 CRD 资源

在 traefik v2.0 版本后,开始使用 CRD(Custom Resource Definition)来完成路由配置等,所以需要提前创建 CRD 资源。

shell> kubectl apply -f http://dlsw.maoxj.com.cn/yaml/k8s/traefik/v2.9/kubernetes-crd-definition-v1.yml

2.2 创建 RBAC 权限

Kubernetes 在 1.6 版本中引入了基于角色的访问控制(RBAC)策略,方便对 Kubernetes 资源和 API 进行颗粒度的控制。

shell> kubectl apply -f http://dlsw.maoxj.com.cn/yaml/k8s/traefik/v2.9/kubernetes-crd-rbac.yml

2.3 创建 ConfigMap 配置文件

如果需要对 Traefik 配置的参数较多,通过 CLI 定义很不方便,会将其选项放在配置文件中写到 ConfigMap 中,然后再将其挂载到 traefik 容器中。

不过一般情况下通过静态参数配置的已经够用,根据实际情况自行决定。

shell> kubectl apply -f http://dlsw.maoxj.com.cn/yaml/k8s/traefik/v2.9/traefik-configmap.yaml

2.4 部署 Traefik

Traefik 可以使用 Deployment 和 DaemonSet 两种方式部署,为了便于扩展这里以 DaemonSet 为例说明。

shell> kubectl apply -f http://dlsw.maoxj.com.cn/yaml/k8s/traefik/v2.9/traefik-ds.yml
shell> kubectl apply -f http://dlsw.maoxj.com.cn/yaml/k8s/traefik/v2.9/traefik-svc.yml

Ingress 是 1.0+ 版本中的使用方式,虽然 2.0 版本向下兼容,但建议在新版本中使用 IngressRoute 的 Ingress Controller 的实现方式。

# 基于 Ingress 的 Traefik 配置方式
shell> kubectl apply -f http://dlsw.maoxj.com.cn/yaml/k8s/traefik/v2.9/traefik-ingress-ui.yml

# 基于 IngressRoute 的 Traefik 配置方式
shell> kubectl apply -f http://dlsw.maoxj.com.cn/yaml/k8s/traefik/v2.9/traefik-ingressroute-ui.yml

2.5 添加 IP 白名单

为提高安全性,通常情况下一些后台地址会设置 IP 访问白名单,只希望个别用户可以访问,例如 traefik 的 dashboard url,这个时候就可以使用 traefik 中的 IPWhiteList 中间件来完成。

# 定义 IP 访问白名单的中间件 IPWhiteList,指定可以访问的 IP 列表
shell> cat ip-while-middleware.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: ip-while-list-middleware
  namespace: kube-system
spec:
  ipWhiteList:
    sourceRange:
      - 127.0.0.1/32
      - 10.200.11.95
    ipStrategy:
      depth: 1
shell> cat traefik-ui-ingress.yaml 
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: traefik-dashboard-route
  namespace: kube-system
spec:
  entryPoints:
  - web
  routes:
  - kind: Rule
    match: Host(`traefik.k8s.91donkey.com`) && PathPrefix(`/api`, `/dashboard`,`/`)
    services:
    - kind: TraefikService
      name: api@internal
    middlewares:
      - name: ip-while-list-middleware
curl -I http://traefik.k8s.91donkey.com/dashboard

```1) 修改 traefik daemonset,增加 forwarded header 参数```

- --entrypoints.web.forwardedheaders.insecure
# - --entrypoints.websecure.forwardedheaders.insecure # 启用 https 的转发 header

```2) 检查 nginx vhost,确保 proxy_set_header 与下列一致```

server {
    server_name *.traefik.k8s.91donkey.com traefik.k8s.91donkey.com;
    location / {
       proxy_pass http://kubernetes_backend_traefik;
       proxy_set_header Host $http_host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
    }
}

```3) 检查 iptables SNAT 规则```

2.6 熔断


服务熔断的作用类似于我们家用的保险丝,当某服务出现不可用或响应超时的情况时,为了防止整个系统出现雪崩,暂时停止该服务的调用。


2.7 限流

2.8 灰度发布

Traefik 支持灰度发布,有时候也会成为 金丝雀发布(Canary),就是让一部分测试的服务也参与到线上去,测试观察是否符合上线要求。


但 Traefik 不支持将自定义的请求头信息流量转发到指定的后端服务上。Traefik 支持的 Header 路由转发,只能对 Header 添加 / 更新头信息。因此,Traefik 的灰度发布实际上只是基于权重轮询(WRR)的路由转发方式。

shell> kubectl create deployment nginx-demo1 --image=nginx:1.18.0 
shell> kubectl expose deployment nginx-demo1 --port=80

shell> kubectl create deployment nginx-demo2 --image=nginx:1.18.0 
shell> kubectl expose deployment nginx-demo2 --port=80
shell> cat traefik-service.yaml 
apiVersion: traefik.containo.us/v1alpha1
kind: TraefikService
metadata:
  name: nginx-wrr
spec:
  weighted:
    services:
      - name: nginx-demo1
        weight: 5        # 定义权重
        port: 80
        kind: Service        # 可选,默认就是 Service
      - name: nginx-demo2
        weight: 1
        port: 80
        kind: Service
shell> cat ingressroute.yaml 
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: wrr-ingress-route
  namespace: default
spec:
  entryPoints:
  - web
  routes:
  - kind: Rule
    match: Host(`nginx.demo.91donkey.com`) && PathPrefix(`/`)
    services:
    - name: nginx-wrr
      kind: TraefikService

2.9 基于 Header 的路由检查

在 IngressRoute 对象中定义了一些匹配规则:


# 检查域名的 Header 中是否包含指定的头信息,如果匹配则,则转发至后端服务上,反之,返回404状态码。
shell> cat ingress-route.yaml 
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: nginx-demo-route
  namespace: default
spec:
  entryPoints:
  - web
  routes:
  - kind: Rule
    match: Host(`nginx.demo.91donkey.com`) && Headers(`x-poc-sn`,'MP203L6B')
    services:
    - port: 80
      name: nginx-demo



# 验证,当匹配时返回200
shell> curl -I -H "x-poc-sn: MP203L6B" nginx.demo.91donkey.com   
HTTP/1.1 200 OK
Server: openresty
Date: Mon, 23 Oct 2023 09:31:36 GMT
Content-Type: text/html
Content-Length: 641
Connection: keep-alive
Accept-Ranges: bytes
Etag: "6535d8f7-281"
Last-Modified: Mon, 23 Oct 2023 02:22:47 GMT
X-Via-Svr: x2q-devk8s-proxy0211.k8s.host.com
展开阅读全文

页面更新:2024-02-08

标签:中间件   灰度   断路器   资源配置   路由   控制器   定义   状态   版本   方式   资源

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top