Traefik mesh:更简单的服务网格

运维 系统运维
Traefik mesh不使用任何sidecar模式,其路由处理是通过运行在每个节点的proxy完成。网格控制器也是通过单独的Pod运行,负责处理代理节点的所有配置分析和部署。

[[395512]]

Traefik mesh是一款轻量级的服务网格,它简单易行,易于安装并且易于使用。

Traefik mesh建立在Traefik之上,适合于符合最新网络接口规范SMI的Kubernetes集群。

Traefik mesh的最大特点就是非侵入性,也就是使用Traefik mesh并不会改变你现有的Kubernetes对象。

非侵入性服务网格

Traefik mesh不使用任何sidecar模式,其路由处理是通过运行在每个节点的proxy完成。网格控制器也是通过单独的Pod运行,负责处理代理节点的所有配置分析和部署。

使用Traefik mesh之后,其逻辑如下。

Traefik mesh没有通过sidecar的形式进行流量拦截或者修改,那是怎么实现的呢?

它其实是借助于CoreDNS,它通过修改CoreDNS的少量配置,让用于允许使用Mesh端点而不是标准的Kubernetes端点,Mesh端点和用于服务并行运行,用户可以选择是否使用它。

安装

  • 前提:
  • Kubernetes 1.11+
  • CoreDNS 1.3+
  • Helm v3

Traefik mesh的安装很简单,使用Helm即可实现快速的安装。

(1)添加Helm仓库

helm repo add traefik-mesh https://helm.traefik.io/mesh 
helm repo update 
  • 1.
  • 2.

(2)下载Chart包

helm pull traefik-mesh/traefik-mesh 
  • 1.

(3)解压Chart包

tar xf traefik-mesh-3.0.6.tgz 
  • 1.

Traefik mesh会部署4个服务,它们分别是:

  • controller:Mesh的控制器,负责代理节点的所有配置分析和配置
  • proxy:Mesh的代理,负责处理每个节点的流量代理
  • tracing:跟踪配置
  • metrics:监控配置

(4)安装traefik mesh

helm install traefik-mesh . 
  • 1.

traefik mesh需要coredns的配合,主要改动部分如下:

#### Begin Maesh Block 
maesh:53 { 
    errors 
    rewrite continue { 
        name regex ([a-zA-Z0-9-_]*)\.([a-zv0-9-_]*)\.maesh default-{1}-6d61657368-{2}.default.svc.cluster.local 
        answer name default-([a-zA-Z0-9-_]*)-6d61657368-([a-zA-Z0-9-_]*)\.default\.svc\.cluster\.local {1}.{2}.maesh 
    } 
    kubernetes cluster.local in-addr.arpa ip6.arpa { 
        pods insecure 
        upstream 
        fallthrough in-addr.arpa ip6.arpa 
    } 
    forward . /etc/resolv.conf 
    cache 30 
    loop 
    reload 
    loadbalance 

#### End Maesh Block 
 
#### Begin Traefik Mesh Block 
traefik.mesh:53 { 
    errors 
    rewrite continue { 
        name regex ([a-zA-Z0-9-_]*)\.([a-zv0-9-_]*)\.traefik.mesh default-{1}-6d61657368-{2}.default.svc.cluster.local 
        answer name default-([a-zA-Z0-9-_]*)-6d61657368-([a-zA-Z0-9-_]*)\.default\.svc\.cluster\.local {1}.{2}.traefik.mesh 
    } 
    kubernetes cluster.local in-addr.arpa ip6.arpa { 
        pods insecure 
        upstream 
        fallthrough in-addr.arpa ip6.arpa 
    } 
    forward . /etc/resolv.conf 
    cache 30 
    loop 
    reload 
    loadbalance 

#### End Traefik Mesh Block 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.

如果在部署过程中,coredns报以下错误:

plugin/forward: this plugin can only be used once per Server Block 
  • 1.

请检查coredns的configMap配置,看DNS下是否有两个forward。

配置

Traefik mesh的配置分为静态配置和动态配置。

静态配置

  • 可以手动指定controller镜像版本和Traefik镜像版本
  • 可以配置controller和proxies的日志级别和格式
  • 可以配置mesh的模式,默认是HTTP
  • 可以打开tracing功能
  • 可以开启ACL权限控制功能,这配置了 Traefik 网格以 ACL 模式运行,除非通过 SMI流量目标明确允许,否则禁止所有流量

动态配置

在Kubernetes service上使用annotations 和 SMI 对象可向 Traefik Mesh 提供动态配置。支持的动态配置参数主要有:

  • Traffic-Type
  • Scheme
  • Retry
  • Circuit-Breaker
  • Rate-Limit
  • Traffic-Split
  • Traffic-Targe

这里简单介绍如何在Kubernetes的service中使用annotations进行配置。

(1)Traffic-Type主要用于配置流量类型,可以配置tcp,udp,http三种类型,如果没有配置,默认使用http类型,配置如下:

mesh.traefik.io/traffic-type: "http" 
  • 1.

(2)Scheme主要配置请求的协议,可以配置http,https,h2c三种类型,配置如下:

mesh.traefik.io/scheme: "h2c" 
  • 1.

(3)Retry主要配置重试次数,当网络等异常情况下,会根据用户配置发起几次重试,如果还是失败,则返回失败,配置如下:

mesh.traefik.io/retry-attempts: "2" 
  • 1.

(4)Cricuit break主要用于配置断开流量转发,当系统处于健康的情况下,默认是关闭的,如果系统异常,则会打开,不再转发流量到异常的系统中,配置如下:

mesh.traefik.io/circuit-breaker-expression: "Expression" 
  • 1.

(5)Rate limit主要用于配置限流,单位是请求次数/秒,可以配置平均请求和突发请求,配置如下:

mesh.traefik.io/ratelimit-average: "100" 
mesh.traefik.io/ratelimit-burst: "200" 
  • 1.
  • 2.

(6)Access control主要用于配置权限控制,可以配置应用允许哪些客户端访问。比如定义如下路由:

--- 
apiVersion: specs.smi-spec.io/v1alpha3 
kind: HTTPRouteGroup 
metadata: 
  name: server-routes 
  namespace: server 
spec: 
  matches: 
    - name: api 
      pathRegex: /api 
      methods: ["*"
    - name: metrics 
      pathRegex: /metrics 
      methods: ["GET"
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

它表示可以通过任何方法访问/api路径,只允许使用GET方法访问/metrics路径。定义好路由还不够,在默认情况下,所有的流量都会被拒绝访问,如果要授予客户端访问权限,需要配置TrafficTarget,如下:

--- 
apiVersion: access.smi-spec.io/v1alpha2 
kind: TrafficTarget 
metadata: 
  name: client-server-target 
  namespace: server 
spec: 
  destination: 
    kind: ServiceAccount 
    name: server 
    namespace: server 
  rules: 
    - kind: HTTPRouteGroup 
      name: server-routes 
      matches: 
        - api 
  sources: 
    - kind: ServiceAccount 
      name: client 
      namespace: client 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.

该配置表示允许运行在client namespace下的具有sa为client的所有pod访问api路由。

(7)Traffic Split主要用于流量拆分,特别是在做金丝雀发布的时候特别有用,比如如下配置:

apiVersion: split.smi-spec.io/v1alpha3 
kind: TrafficSplit 
metadata: 
  name: server-split 
  namespace: server 
spec: 
  service: server 
  backends: 
    - service: server-v1 
      weight: 80 
    - service: server-v2 
      weight: 20 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

其表示将80%的流量转发到server-v1,20%的流量转发到server-v2。

例子

上面已经安装部署好Traefik mesh,下面以官方的例子来进行简单的测试。(1)部署应用

apiVersion: v1 
kind: Namespace 
metadata: 
  name: whoami 
 
--- 
apiVersion: v1 
kind: ServiceAccount 
metadata: 
  name: whoami-server 
  namespace: whoami 
 
--- 
apiVersion: v1 
kind: ServiceAccount 
metadata: 
  name: whoami-client 
  namespace: whoami 
--- 
kind: Deployment 
apiVersion: apps/v1 
metadata: 
  name: whoami 
  namespace: whoami 
spec: 
  replicas: 2 
  selector: 
    matchLabels: 
      app: whoami 
  template: 
    metadata: 
      labels: 
        app: whoami 
    spec: 
      serviceAccount: whoami-server 
      containers: 
        - name: whoami 
          image: traefik/whoami:v1.6.0 
          imagePullPolicy: IfNotPresent 
 
--- 
kind: Deployment 
apiVersion: apps/v1 
metadata: 
  name: whoami-tcp 
  namespace: whoami 
spec: 
  replicas: 2 
  selector: 
    matchLabels: 
      app: whoami-tcp 
  template: 
    metadata: 
      labels: 
        app: whoami-tcp 
    spec: 
      serviceAccount: whoami-server 
      containers: 
        - name: whoami-tcp 
          image: traefik/whoamitcp:v0.1.0 
          imagePullPolicy: IfNotPresent 
 
--- 
apiVersion: v1 
kind: Service 
metadata: 
  name: whoami 
  namespace: whoami 
  labels: 
    app: whoami 
spec: 
  type: ClusterIP 
  ports: 
    - port: 80 
      name: whoami 
  selector: 
    app: whoami 
 
--- 
apiVersion: v1 
kind: Service 
metadata: 
  name: whoami-tcp 
  namespace: whoami 
  labels: 
    app: whoami-tcp 
spec: 
  type: ClusterIP 
  ports: 
    - port: 8080 
      name: whoami-tcp 
  selector: 
    app: whoami-tcp 
 
--- 
apiVersion: v1 
kind: Pod 
metadata: 
  name: whoami-client 
  namespace: whoami 
spec: 
  serviceAccountName: whoami-client 
  containers: 
    - name: whoami-client 
      image: giantswarm/tiny-tools:3.9 
      command: 
        - "sleep" 
        - "3600" 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.

上面部署了两个应用,一个http类型应用,一个是tcp类型应用。

可以通过以下命名查看应用启动情况kubectl get all -n whoami。

然后可以测试以下应用连通性,如下:

# kubectl -n whoami exec whoami-client -- curl -s whoami.whoami.svc.cluster.local 
Hostname: whoami-576cb59fd-qvnl7 
IP: 127.0.0.1 
IP: 172.16.235.193 
RemoteAddr: 172.16.7.181:33150 
GET / HTTP/1.1 
Host: whoami.whoami.svc.cluster.local 
User-Agent: curl/7.64.0 
Accept: */* 
 
# kubectl -n whoami exec -ti whoami-client -- nc whoami-tcp.whoami.svc.cluster.local 8080 
my data 
Received: my data 
 
Received:  
eee 
Received: eee 
eee 
Received: eee 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.

如果现在要为上面的服务配置Traefik mesh,只需要更改这两个服务的service,http类型应用的service加mesh.traefik.io/traffic-type: "http"的annotations,tcp类型应用的service加mesh.traefik.io/traffic-type: "tcp"的annotations,如下:

--- 
apiVersion: v1 
kind: Service 
metadata: 
  name: whoami 
  namespace: whoami 
  labels: 
    app: whoami 
  annotations: 
    mesh.traefik.io/traffic-type: "http" 
    mesh.traefik.io/retry-attempts: "2" 
spec: 
  type: ClusterIP 
  ports: 
    - port: 80 
      name: whoami 
  selector: 
    app: whoami 
 
--- 
apiVersion: v1 
kind: Service 
metadata: 
  name: whoami-tcp 
  namespace: whoami 
  labels: 
    app: whoami-tcp 
  annotations: 
    mesh.traefik.io/traffic-type: "tcp" 
spec: 
  type: ClusterIP 
  ports: 
    - port: 8080 
      name: whoami-tcp 
  selector: 
    app: whoami-tcp 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.

现在访问服务,只需将svc.cluster.local改为traefik.mesh即可。比如之前访问方式如下:

kubectl -n whoami exec whoami-client -- curl -s whoami.whoami.svc.cluster.local 
  • 1.

加了traefik mesh之后,即为:

kubectl -n whoami exec whoami-client -- curl -s whoami.whoami.traefik.mesh 
  • 1.

 当然之前的访问方式依然存在,用什么样的方式由用户自己决定。

脚注

【1】https://traefik.io/traefik/

【2】https://smi-spec.io/

【3】https://coredns.io/

 

责任编辑:姜华 来源: 运维开发故事
相关推荐

2021-06-05 10:16:55

Linkerd 服务网格Kubernetes

2023-11-07 17:32:31

Istiok8s

2023-06-18 19:21:04

技术架构服务网格

2022-11-24 14:21:27

微服务ISTIO

2021-07-21 05:23:06

Linkerd Emoji.voto服务网格

2020-11-15 23:48:57

服务网格微服务网络网络技术

2020-01-07 09:25:02

服务网格微服务Kubernetes

2022-05-16 08:00:00

服务网格架构Kuma

2019-08-29 08:00:00

微服务架构服务网格

2020-07-13 07:00:03

微服务服务网格架构

2020-10-21 13:31:53

服务网格开源微服务

2020-08-26 05:45:40

服务网格DevOps开发

2022-08-09 08:00:00

服务网格云原生工具

2022-07-06 08:25:17

服务网格Kubernetes

2021-04-02 22:00:50

服务网格微服务

2022-09-06 10:46:34

服务网格可观测性微服务

2021-08-27 11:42:51

Nacos云原生阿里云

2024-09-27 10:05:02

2022-08-02 16:37:32

服务网格网络服务

2020-11-30 13:50:13

服务网格微服务数据
点赞
收藏

51CTO技术栈公众号