Traefikmesh是一个轻量级的服务网格,实现简单,易于安装,易于使用。Traefikmesh建立在Traefik之上,适用于符合最新网络接口规范SMI的Kubernetes集群。Traefikmesh最大的特点是非侵入性,即使用Traefikmesh不会改变你现有的Kubernetes对象。非侵入式服务网格Traefikmesh不使用任何sidecar模式,它的路由处理是通过运行在每个节点上的代理来完成的。网格控制器还通过一个单独的Pod运行,并处理代理节点的所有配置分析和部署。使用Traefikmesh后,逻辑如下。Traefikmesh不会拦截或修改sidecar形式的流量。这是如何实现的?它实际上使用了CoreDNS,它允许用户通过修改CoreDNS中的少量配置来使用Mesh端点而不是标准的Kubernetes端点。Mesh端点和服务并行运行,用户可以选择是否使用。安装前提:Kubernetes1.11+CoreDNS1.3+Helmv3Traefikmesh安装非常简单,使用Helm可以实现快速安装。(1)添加Helm仓库helmrepoaddtraefik-meshhttps://helm.traefik.io/meshhelmrepoupdate(2)下载Chart包helmpulltraefik-mesh/traefik-mesh(3)解压Chart包tarxftraefik-mesh-3.0.6。tgzTraefikmesh会部署4个服务,它们是:controller:Mesh控制器,负责代理节点的所有配置分析和配置proxy:Mesh代理,负责处理每个节点的流量proxy:跟踪配置metrics:监控配置(4)安装traefikmeshhelminstalltraefik-mesh.traefikmesh需要coredns的配合,主要变化如下:####BeginMaeshBlockmaesh:53{errorsrewritecontinue{nameregex([a-zA-Z0-9-_]*)\.([a-zv0-9-_]*)\.maeshdefault-{1}-6d61657368-{2}.default.svc.cluster.localanswernamedefault-([a-zA-Z0-9-_]*)-6d61657368-([a-zA-Z0-9-_]*)\.default\.svc\.cluster\.local{1}.{2}.maesh}kubernetescluster.localin-addr.arpaip6.arpa{podsinsecureupstreamfallthroughin-addr。arpaip6.arpa}forward./etc/resolv.confcache30loopreloadloadbalance}####EndMaeshBlock####BeginTraefikMeshBlocktraefik.mesh:53{errorsrewritecontinue{nameregex([a-zA-Z0-9-_]*)\.([a-zv0-9-_]*)\.traefik.meshdefault-{1}-6d61657368-{2}.default.svc.cluster.localanswernamedefault-([a-zA-Z0-9-_]*)-6d61657368-([a-zA-Z0-9-_]*)\.default\.svc\.cluster\.local{1}.{2}.traefik.mesh}kubernetescluster.localin-addr.arpaip6.arpa{podsinsecureupstreamfallthroughin-addr.arpaip6.arpa}forward./etc/resolv.confcache30loopreloadloadbalance}####EndTraefikMeshBlock如果部署时,coredns报如下错误:plugin/forward:thisplugincanonlybeusedonceperServerBlock请查看coredns的configMap配置,看DNS下是否有两个forward配置。Traefikmesh的配置分为静态配置和动态配置。静态配置可以手动指定controller镜像版本,Traefik镜像版本可以配置controller的日志级别和格式,proxies可以配置mesh模式,默认是HTTP可以开启tracing功能可以开启ACL权限控制功能,配置以ACL模式运行的Traefik网格,禁止所有流量,除非明确允许通过SMI流量目标动态配置在Kubernetes服务上使用注释和SMI对象为TraefikMesh提供动态配置。支持的动态配置参数主要包括:Traffic-TypeSchemeRetryCircuit-BreakerRate-LimitTraffic-SplitTraffic-Targe这里简单介绍一下如何在Kubernetes服务中使用注解进行配置。(1)Traffic-Type主要用于配置流量类型。您可以配置三种类型:tcp、udp和http。如果不配置,默认使用http类型。配置如下:mesh.traefik.io/traffic-type:"http"(2)Scheme主要配置请求的协议,可以配置http、https、h2c三种。配置如下:mesh.traefik.io/scheme:"h2c"(3)Retry主要配置重试次数。当网络等异常情况时,会根据用户配置发起多次重试,如果仍然失败,则返回失败,配置如下:mesh.traefik.io/retry-attempts:"2"(4)cricuitbreak主要用于配置断线流量转发,当系统健康时,默认关闭。如果系统异常,则开启,不再向异常系统转发流量。配置如下:mesh.traefik.io/circuit-breaker-expression:"Expression"(5)Ratelimit主要用于配置限流,单位是请求数/秒,可以配置平均请求和突发请求,配置如下:mesh.traefik.io/ratelimit-average:"100"mesh.traefik.io/ratelimit-burst:"200"(6)Accesscontrol主要用于配置权限控制,其中可以配置应用程序允许哪些客户端访问。例如,定义以下路由:---apiVersion:specs.smi-spec.io/v1alpha3kind:HTTPRouteGroupmetadata:name:server-routesnamespace:serverspec:matches:-name:apipathRegex:/apimethods:["*"]-name:metricspathRegex:/metricsmethods:["GET"]表示/api路径可以通过任何方式访问,只允许GET方式访问/metrics路径。仅仅定义路线是不够的。默认情况下,所有流量都将被拒绝访问。如果要授予客户端访问权限,需要配置TrafficTarget,如下:---apiVersion:access.smi-spec.io/v1alpha2kind:TrafficTargetmetadata:name:client-server-targetnamespace:serverspec:destination:kind:ServiceAccountname:servernamespace:serverrules:-kind:HTTPRouteGroupname:server-routesmatches:-apisources:-kind:ServiceAccountname:clientnamespace:client这个配置表示允许运行在clientnamespace下所有以sa为client的pod访问api路由。(7)TrafficSplit主要用于流量拆分,在做金丝雀发布时特别有用,比如如下配置:apiVersion:split.smi-spec.io/v1alpha3kind:TrafficSplitmetadata:name:server-splitnamespace:serverspec:service:serverbackends:-service:server-v1weight:80-service:server-v2weight:20表示将80%的流量转发给server-v1,20%的流量转发给server-v2。示例上面已经安装部署好Traefikmesh,下面使用官方示例进行简单测试。(1)部分应用apiVersion:v1kind:Namespacemetadata:name:whoami---apiVersion:v1kind:ServiceAccountmetadata:name:whoami-servernamespace:whoami--apiVersion:v1kind:ServiceAccountmetadata:name:whoami-clientnamespace:whoami---kind:DeploymentapiVersion:apps/v1metadata:name:whoaminamespace:whoamispec:replicas:2selector:matchLabels:app:whoamitemplate:metadata:labels:app:whoamispec:serviceAccount:whoami-servercontainers:-name:whoamiimage:traefik/whoami:v1.6.0imagePullPolicy:IfNotPresent---kind:DeploymentapiVersion:apps/v1metadata:name:whoami-tcpnamespace:whoamispec:replicas:2selector:matchLabels:app:whoami-tcptemplate:metadata:labels:app:whoami-tcpspec:serviceAccount:whoami-servercontainers:-名称:whoami-tcpimage:traefik/whoamitcp:v0.1.0imagePullPolicy:IfNotPresent---apiVersion:v1kind:Servicemetadata:name:whoaminamespace:whoamilabels:app:whoamispec:type:ClusterIPports:-port:80name:whoamiselector:app:whoami---apiVersion:v1kind:Servicemetadata:name:whoami-tcpnamespace:whoamilabels:app:whoami-tcpspec:type:ClusterIPports:-port:8080name:whoami-tcpselector:app:whoami-tcp---apiVersion:v1kind:Podmetadata:name:whoami-clientnamespace:whoamispec:serviceAccountName:whoami-clientcontainers:-name:whoami-clientimage:giantswarm/tiny-tools:3.9command:-"sleep"-"3600"上面部署了两个应用,一个http类型的应用,一个tcp类型的应用,可以通过以下命名查看应用程序启动状态kubectlgetall-nwhoami.然后可以测试以下应用的连通性,如下:#kubectl-nwhoamiexecwhoami-client--curl-swhoami.whoami.svc.cluster.localHostname:whoami-576cb59fd-qvnl7IP:127.0.0.1IP:172.16.235.193RemoteAddr:172.16.7.181:33150GET/HTTP/1.1Host:whoami.whoami.svc.cluster.localUser-Agent:curl/7.64.0Accept:*/*#kubectl-nwhoamiexec-tiwhoami-client--ncwhoami-tcp.whoami.svc。cluster.local8080mydataReceived:mydataReceived:eeeReceived:eeeeeeReceived:eee如果现在要为以上服务配置Traefikmesh,只需要更改这两个服务的服务,添加mesh.traefik.io/traffic-type的注解:"http"到http类型应用的service,在tcp类型应用的service添加mesh.traefik.io/traffic-type:"tcp"的注解,如下:---apiVersion:v1kind:Servicemetadata:名称:whoaminamespace:whoamilabels:app:whoamiannotations:mesh.traefik.io/traffic-type:“http”mesh.traefik.io/retry-attempts:“2”spec:type:ClusterIPports:-port:80name:whoamiselector:app:whoami---apiVersion:v1kind:Servicemetadata:name:whoami-tcpnamespace:whoamilabels:app:whoami-tcpannotations:mesh.traefik.io/traffic-type:"tcp"spec:type:ClusterIPports:-port:8080name:whoami-tcpselector:app:whoami-tcp现在访问服务,只要把svc.cluster.local改成traefik.mesh即可,比如之前访问方法如下:kubectl-nwhoamiexecwhoami-client--curl-swhoami.whoami.svc.cluster.local添加traefikmesh后就是:kubectl-nwhoamiexecwhoami-client--curl-swhoami.whoami.traefik.mesh当然,之前的访问方式仍然存在,使用方式由用户自己决定。脚注[1]https://traefik.io/traefik/[2]https://smi-spec.io/[3]https://coredns.io/
