Traefik

05 代理缓存 阅读更多

Buffering中间件可以控制在将请求发送到服务之前如何读取请求。 使用Buffering,Traefik将整个请求读入内存(可能将大请求缓冲到磁盘),并拒绝超过指定限制的请求。 这可以帮助服务处理大数据(例如,multipart/form-data),并可以最大程度地减少将数据发送到服务所花费的时间。 配置选项 maxRequestBodyBytes 用maxRequestBodyBytes选项,可以配置请求的最大允许body大小(以字节为单位)。 如果请求超出允许的大小,则不会将其转发到服务,并且客户端会收到413(请求实体太大)响应。 # Sets the maximum request body to 2Mb apiVersion: traefik.containo.us/v1alpha1 kind: Middleware metadata: name: limit spec: buffering: maxRequestBodyBytes: 2000000 memRequestBodyBytes 使用memRequestBodyBytes选项配置一个阈值(以字节为单位),超过该阈值将请求缓存到磁盘上而不是内存中。 apiVersion: traefik.containo.us/v1alpha1 kind: Middleware metadata: name: limit spec: buffering: memRequestBodyBytes: 2000000 maxResponseBodyBytes 使用maxResponseBodyBytes选项,可以配置服务允许的最大响应大小(以字节为单位)。 如果响应超过允许的大小,则不会转发给客户端。客户端改为收到413(请求实体太大)响应。 apiVersion: traefik.containo.us/v1alpha1 kind: Middleware metadata: name: limit spec: buffering: maxResponseBodyBytes: 2000000 memResponseBodyBytes 使用memResponseBodyBytes选项配置一个阈值(以字节为单位),超过该阈值将响应缓存在磁盘上而不是内存中。 apiVersion: traefik.containo.us/v1alpha1 kind: Middleware metadata: name: limit spec: buffering: memResponseBodyBytes: 2000000 retryExpression 使用retryExpression选项的使Buffering中间件重试请求。 apiVersion: traefik.containo.us/v1alpha1 kind: Middleware metadata: name: limit spec: buffering: retryExpression: "IsNetworkError() && Attempts() < 2" 重试表达式定义为以与运算符AND(&&&)和OR(||)的逻辑组合。至少需要一个功能: Attempts() 尝试次数(第一个计数) ResponseCode() 服务的响应码 IsNetworkError() 如果响应代码与网络错误有关

04 HTTPS & TLS 阅读更多

0.1. 总览 0.2. TLS 0.2.1. 证书定义 0.2.1.1. Traefik自定执行 0.2.1.2. 用户自定义 0.2.2. 证书存储 0.2.3. 默认证书 0.2.4. TLS选项 0.2.4.1. TLS最低版本 0.2.4.2. TLS最高版本 0.2.4.3. 密码套件 0.2.4.4. 曲线首选项 0.2.4.5. 严格的SNI检查 0.2.4.6. 首选服务器密码套件 0.2.4.7. 客户端身份验证(mTLS) 0.3. 实战操作 0.3.1. 定义IngressRoute 0.3.2. 定义Services 0.3.3. 定义Deployments 0.3.4. 转发端口 0.3.5. Traefik Routers¶ 0.1. 总览 Traefik支持HTTPS和TLS,这涉及配置的两个部分:路由器和TLS连接(及其基础证书)。 当路由器必须处理HTTPS流量时,应该在路由器定义中使用tls字段指定它。下面几部分将说明如何配置TLS连接,包括: 如何获取TLS证书: 通过动态配置中的定义 通过Let's Encrypt(ACME) 如何配置TLS选项和证书存储 0.2. TLS Transport Layer Security 0.2.1. 证书定义 0.2.1.1. Traefik自定执行 使用Let's Encrypt(ACME)。 0.2.1.2. 用户自定义 即使Traefik已经处于运行状态,也可以在动态配置的tls.certificates字段进行添加或删除TLS证书的操作。 # Dynamic configuration tls: certificates: - certFile: /path/to/domain.cert keyFile: /path/to/domain.key - certFile: /path/to/other-domain.cert keyFile: /path/to/other-domain.key 注意:在上面的例子中,使用file provider来处理这些定义。这是配置证书(以及选项和存储)的唯一可用方法。但是,在Kubernetes中者当属必须是通过secret对象提供的。 0.2.2. 证书存储 在Traefik中,按照证书存储区进行分组存储,例如下面的定义: # Dynamic configuration tls: stores: default: {} 注意:除了默认定义(命名为default)以外的任何存储定义都将被忽略,因此,只有一个全局可用的TLS存储。 在tls.certificates字段中,可以指定存储列表以指示证书的存储位置: # Dynamic configuration tls: certificates: - certFile: /path/to/domain.cert keyFile: /path/to/domain.key stores: - default # Note that since no store is defined, # the certificate below will be stored in the `default` store. - certFile: /path/to/other-domain.cert keyFile: /path/to/other-domain.key 注意:stores字段的列表中的内容会被忽略,然后被自动设置为default 0.2.3. 默认证书 对于没有SNI(Server Name Indication,服务器名称指示)或没有匹配域名的连接,Traefik可以使用默认证书。此默认证书应在TLS存储中定义: # Dynamic configuration tls: stores: default: defaultCertificate: certFile: path/to/cert.crt keyFile: path/to/cert.key 如果未提供默认证书,则Traefik会生成并使用自签名证书。 SNI是TLS的一个扩展协议,在该协议下,在握手过开始时客户端告诉它症状连接的服务器要连接的主机名称。这允许服务器在相同的IP地址和TCP端口号上呈现多个证书,并且因此允许在相同的IP地址上提供多个安全(HTTPS)网站(或其他任何基于TLS的服务),而不需要所有这些站点使用相同的证书。它与HTTP/1.1基于名称的虚拟主机的概念相同,但是用于HTTPS。所需的主机名未加密,因此窃听者可以查看请求的网站。 为了使SNI协议起作用,绝大多数访问者必须使用实现它的Web浏览器。使用未实现SNI浏览器的用户将被提供默认证书,因此很可能会收到证书警告。 0.2.4. TLS选项 TLS选项允许配置TLS连接的某些参数。 0.2.4.1. TLS最低版本 # Dynamic configuration tls: options: default: minVersion: VersionTLS12 mintls13: minVersion: VersionTLS13 --- # kubernetes apiVersion: traefik.containo.us/v1alpha1 kind: TLSOption metadata: name: default namespace: default spec: minVersion: VersionTLS12 --- apiVersion: traefik.containo.us/v1alpha1 kind: TLSOption metadata: name: mintls13 namespace: default spec: minVersion: VersionTLS13 0.2.4.2. TLS最高版本 不推荐使用此设置来禁用TLS1.3。正确的方法是更新客户端以支持TLS1.3。 # Dynamic configuration tls: options: default: maxVersion: VersionTLS13 maxtls12: maxVersion: VersionTLS12 --- # kubernetes apiVersion: traefik.containo.us/v1alpha1 kind: TLSOption metadata: name: default namespace: default spec: maxVersion: VersionTLS13 --- apiVersion: traefik.containo.us/v1alpha1 kind: TLSOption metadata: name: maxtls12 namespace: default spec: maxVersion: VersionTLS12 0.2.4.3. 密码套件 Traefik使用Golang编写,更多支持的密码套件可以查看crypto/tls库,点这里。 # Dynamic configuration tls: options: default: cipherSuites: - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 --- # kubernetes apiVersion: traefik.containo.us/v1alpha1 kind: TLSOption metadata: name: default namespace: default spec: cipherSuites: - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 注意: 为TLS 1.2及以下版本定义的密码套件不能在TLS 1.3中使用,反之亦然。 使用TLS 1.3,密码套件不可配置(在这种情况下,所有受支持的密码套件都是安全的)。 0.2.4.4. 曲线首选项 此选项允许以特定顺序设置首选椭圆曲线。 可以使用由crypto库定义的曲线名称(例如CurveP521)和RFC定义的名称(例如secp521r1)。 有关更多信息,请参见CurveID类型定义。 # Dynamic configuration tls: options: default: curvePreferences: - CurveP521 - CurveP384 --- # kubernetes apiVersion: traefik.containo.us/v1alpha1 kind: TLSOption metadata: name: default namespace: default spec: curvePreferences: - CurveP521 - CurveP384 0.2.4.5. 严格的SNI检查 通过严格的SNI检查,Traefik不拒绝来自未指定server_name扩展名或与tlsOption上配置的任何证书都不匹配的客户端发起的连接。 # Dynamic configuration tls: options: default: sniStrict: true --- # kubernetes apiVersion: traefik.containo.us/v1alpha1 kind: TLSOption metadata: name: default namespace: default spec: sniStrict: true 0.2.4.6. 首选服务器密码套件 此选项允许服务器选择它最喜欢的密​​码套件,而不是客户端的密码套件。请注意,设置minVersion或maxVersion后,此功能会自动启用。 # Dynamic configuration tls: options: default: preferServerCipherSuites: true --- # kubernetes apiVersion: traefik.containo.us/v1alpha1 kind: TLSOption metadata: name: default namespace: default spec: preferServerCipherSuites: true 0.2.4.7. 客户端身份验证(mTLS) Traefik通过clientAuth字段支持客户端和服务器的认证。 对于需要验证客户端证书的身份验证策略,应在clientAuth.caFiles中设置证书的证书颁发机构。 clientAuth.clientAuthType选项控制行为,如下所示: NoClientCert:忽略任何客户端证书。 RequestClientCert:要求提供证书,但是如果没有提供证书,则继续进行。 RequireAnyClientCert:需要证书,但不验证它是否由clientAuth.caFiles中列出的CA签名。 VerifyClientCertIfGiven:如果提供了证书,则验证它是否由clientAuth.caFiles中列出的CA签名。否则继续进行,无需任何证书。 RequireAndVerifyClientCert:需要证书,该证书必须由clientAuth.caFiles中列出的CA签名。 # Dynamic configuration tls: options: default: clientAuth: # in PEM format. each file can contain multiple CAs. caFiles: - tests/clientca1.crt - tests/clientca2.crt clientAuthType: RequireAndVerifyClientCert --- # kubernetes apiVersion: traefik.containo.us/v1alpha1 kind: TLSOption metadata: name: default namespace: default spec: clientAuth: # the CA certificate is extracted from key `tls.ca` of the given secrets. secretNames: - secretCA clientAuthType: RequireAndVerifyClientCert 0.3. 实战操作 0.3.1. 定义IngressRoute 首先,定义IngressRoute和Middleware。另请注意RBAC授权资源;稍后将通过部署的serviceAccountName引用它们。 apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: ingressroutes.traefik.containo.us spec: group: traefik.containo.us version: v1alpha1 names: kind: IngressRoute plural: ingressroutes singular: ingressroute scope: Namespaced --- apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: middlewares.traefik.containo.us spec: group: traefik.containo.us version: v1alpha1 names: kind: Middleware plural: middlewares singular: middleware scope: Namespaced --- apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: ingressroutetcps.traefik.containo.us spec: group: traefik.containo.us version: v1alpha1 names: kind: IngressRouteTCP plural: ingressroutetcps singular: ingressroutetcp scope: Namespaced --- apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: ingressrouteudps.traefik.containo.us spec: group: traefik.containo.us version: v1alpha1 names: kind: IngressRouteUDP plural: ingressrouteudps singular: ingressrouteudp scope: Namespaced --- apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: tlsoptions.traefik.containo.us spec: group: traefik.containo.us version: v1alpha1 names: kind: TLSOption plural: tlsoptions singular: tlsoption scope: Namespaced --- apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: tlsstores.traefik.containo.us spec: group: traefik.containo.us version: v1alpha1 names: kind: TLSStore plural: tlsstores singular: tlsstore scope: Namespaced --- apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: traefikservices.traefik.containo.us spec: group: traefik.containo.us version: v1alpha1 names: kind: TraefikService plural: traefikservices singular: traefikservice scope: Namespaced --- kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: traefik-ingress-controller rules: - apiGroups: - "" resources: - services - endpoints - secrets verbs: - get - list - watch - apiGroups: - extensions resources: - ingresses verbs: - get - list - watch - apiGroups: - extensions resources: - ingresses/status verbs: - update - apiGroups: - traefik.containo.us resources: - middlewares - ingressroutes - traefikservices - ingressroutetcps - ingressrouteudps - tlsoptions - tlsstores verbs: - get - list - watch --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: traefik-ingress-controller roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: traefik-ingress-controller subjects: - kind: ServiceAccount name: traefik-ingress-controller namespace: default 0.3.2. 定义Services 然后,定义Services: 一个用于Traefik本身 另一个用于其路由的应用程序,即本例中的演示HTTP服务器:whoami apiVersion: v1 kind: Service metadata: name: traefik spec: ports: - protocol: TCP name: web port: 8000 - protocol: TCP name: admin port: 8080 - protocol: TCP name: websecure port: 4443 selector: app: traefik --- apiVersion: v1 kind: Service metadata: name: whoami spec: ports: - protocol: TCP name: web port: 80 selector: app: whoami 0.3.3. 定义Deployments 接下来,定义Deployment,即服务背后实际运行的Pod。同样: 一个是Traefik的pod 另一个是whoami应用程序的pod apiVersion: v1 kind: ServiceAccount metadata: namespace: default name: traefik-ingress-controller --- kind: Deployment apiVersion: apps/v1 metadata: namespace: default name: traefik labels: app: traefik spec: replicas: 1 selector: matchLabels: app: traefik template: metadata: labels: app: traefik spec: serviceAccountName: traefik-ingress-controller containers: - name: traefik image: traefik:v2.2 args: - --api.insecure - --accesslog - --entrypoints.web.Address=:8000 - --entrypoints.websecure.Address=:4443 - --providers.kubernetescrd - --certificatesresolvers.myresolver.acme.tlschallenge - --certificatesresolvers.myresolver.acme.email=foo@you.com - --certificatesresolvers.myresolver.acme.storage=acme.json # Please note that this is the staging Let's Encrypt server. # Once you get things working, you should remove that whole line altogether. - --certificatesresolvers.myresolver.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory ports: - name: web containerPort: 8000 - name: websecure containerPort: 4443 - name: admin containerPort: 8080 --- kind: Deployment apiVersion: apps/v1 metadata: namespace: default 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: web containerPort: 80 0.3.4. 转发端口 请注意,不应让下面的ingressRoute资源自动应用于集群。 因为,一旦Traefik的ACME提供者检测到拥有TLS路由器,它将尝试为相应域生成证书。 但是的Traefik pod无法从外部到达,这将使ACME TLS challenge失败。 因此,为了使整个工作正常进行,必须延迟应用ingressRoute资源,直到正确设置了端口转发为止。 kubectl port-forward --address 0.0.0.0 service/traefik 8000:8000 8080:8080 443:4443 -n default 请注意,由于Linux上特权端口的限制,上述命令可能无法在端口443上进行侦听。在这种情况下,您以使用一些技巧,例如使用以下命令提高kubectl的上限 setcaps,使用authbind或在主机和WAN之间设置NAT。 0.3.5. Traefik Routers¶ 现在,可以应用实际的ingressRoutes了: apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata: name: simpleingressroute namespace: default spec: entryPoints: - web routes: - match: Host(`your.example.com`) && PathPrefix(`/notls`) kind: Rule services: - name: whoami port: 80 --- apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata: name: ingressroutetls namespace: default spec: entryPoints: - websecure routes: - match: Host(`your.example.com`) && PathPrefix(`/tls`) kind: Rule services: - name: whoami port: 80 tls: certResolver: myresolver 给它几秒钟的时间来完成ACME TLS challenge,然后您可以从外部访问whoami pod(通过Traefik路由)。 curl [-k] https://your.example.com/tls curl http://your.example.com:8000/notls 请注意,只要使用的是Let's Encrypt的服务器,就必须使用-k参数,因为它不是一个被认证的CA只是在系统上手动添加的自认证机构。

03 路由和负载均衡 阅读更多

0.1. 明确职责 0.2. 文件提供者示例 0.2.1. HTTP / TCP 0.3. 传输配置 0.3.1. insecureSkipVerify 0.3.2. rootCAs 0.3.3. maxIdleConnsPerHost 0.3.4. forwardingTimeouts 0.3.4.1. forwardingTimeouts.dialTimeout` 0.3.4.2. forwardingTimeouts.idleConnTimeout` 让我们放大 Traefik 的体系结构,并讨论支持创建路由的组件。 首先,在启动 Traefik 时,定义入口点(在它们最基本的形式中,它们是端口号)。 然后,连接到这些入口点,路由器分析传入的请求,看它们是否匹配一组规则。 如果匹配到规则,路由器可能会使用中间件转换请求,然后再将它们转发到处理请求的服务。 0.1. 明确职责 提供者(Providers)发现基础设施上的服务(他们的 IP,健康,...) 入口点(Entrypoints)监听传入通信(端口,...) 路由器(Routers)分析请求(主机,路径,请求头,SSL,...) 服务(Services)将请求转发给服务(负载平衡,...) 中间件(Middleware)可以更新请求或根据请求做出决定(身份验证,速率限制,请求头,...) 0.2. 文件提供者示例 下面是一个文件提供者的完整配置文件的例子,这个文件提供者可以将 http://domain/whoami/ 请求转发到 http://private/whoami-service/ 上可访问的服务。 在此过程中,Traefik 将确保对用户进行身份验证(使用 BasicAuth 中间件)。 静态配置: entryPoints: web: # Listen on port 8081 for incoming requests address: :8081 providers: # Enable the file provider to define routers / middlewares / services in a file file: filename: dynamic_conf.yml 动态配置: # http routing section http: routers: # Define a connection between requests and services to-whoami: rule: "Host(`domain`) && PathPrefix(`/whoami/`)" # If the rule matches, applies the middleware middlewares: - test-user # If the rule matches, forward to the whoami service (declared below) service: whoami middlewares: # Define an authentication mechanism test-user: basicAuth: users: - test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/ services: # Define how to reach an existing service on our infrastructure whoami: loadBalancer: servers: - url: http://private/whoami-service 在本例中,我们使用文件提供者。 即使它是配置 Traefik 的最不神奇的方法之一,它也明确地描述了每一个可用的概念。 0.2.1. HTTP / TCP 在这个例子中,我们只为 http 请求定义了路由规则。 Traefik 还支持 TCP 请求。 要添加 TCP 路由器和 TCP 服务,请在 TCP 部分中声明它们,如下所示。 静态配置: entryPoints: web: # Listen on port 8081 for incoming requests address: :8081 providers: # Enable the file provider to define routers / middlewares / services in a file file: filename: dynamic_conf.yml 动态配置: # http routing section http: routers: # Define a connection between requests and services to-whoami: rule: Host(`domain`) && PathPrefix(`/whoami/`) # If the rule matches, applies the middleware middlewares: - test-user # If the rule matches, forward to the whoami service (declared below) service: whoami middlewares: # Define an authentication mechanism test-user: basicAuth: users: - test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/ services: # Define how to reach an existing service on our infrastructure whoami: loadBalancer: servers: - url: http://private/whoami-service tcp: routers: to-whoami-tcp: service: whoami-tcp rule: HostSNI(`whoami-tcp.traefik.io`) services: whoami-tcp: loadBalancer: servers: - address: xx.xx.xx.xx:xx 0.3. 传输配置 客户端和 Traefik 之间的连接,以及 Traefik 和后端服务之间的连接,大部分都是通过入口点和路由器配置的。 此外,还有一些参数专门用于在全局范围内配置 Traefik 和后端之间的连接。 这是通过配置serversTransport 完成的,它提供了以下选项: 0.3.1. insecureSkipVerify 禁用 SSL 证书验证。可选,默认为false ## Static configuration serversTransport: insecureSkipVerify: true 0.3.2. rootCAs 当使用自签名 TLS 证书时,rootCAs就是证书列表(作为文件路径或数据字节)将会被设置为根证书授权。可选 ## Static configuration serversTransport:yaml rootCAs: - foo.crt - bar.crt 0.3.3. maxIdleConnsPerHost 可选,默认为2,如果非零,maxidlecon/nsperhost控制每个主机保持的最大空闲(keep-alive)连接。 ## Static configuration serversTransport: maxIdleConnsPerHost: 7 0.3.4. forwardingTimeouts Forwardingtimeouts 与向后端服务转发请求时的大量超时有关。 0.3.4.1. forwardingTimeouts.dialTimeout` 可选。默认为30s Dialtimeout 是建立到后端服务的连接所允许的最大持续时间。 零意味着没有超时。 ## Static configuration serversTransport: forwardingTimeouts: dialTimeout: 1s 0.3.4.2. forwardingTimeouts.idleConnTimeout` 可选。默认90s Idlekonntimeout,是空闲(keep-alive)连接在关闭自身之前保持空闲的最大时间量。 零意味着没有限制。 ## Static configuration serversTransport: forwardingTimeouts: idleConnTimeout: 1s

02 配置发现 阅读更多

0.1. 协调器 0.2. 支持的提供者 0.2.1. 配置重载频率 0.3. 限制服务发现的范围 0.3.1. exposedByDefault 和 traefik.enable 0.3.2. 约束条件 0.4. Kubernetes IngressRoute 0.4.1. 资源配置 0.4.2. 提供者配置 0.4.2.1. endpoint 0.4.2.2. token 0.4.2.3. certAuthFilePath 0.4.2.4. namespaces 0.4.2.5. labelselector 0.4.2.6. ingressClass 0.4.2.7. throttleDuration Traefik 的配置发现是通过提供者实现的。 提供者是现有的基础设施组件,无论是协调器、容器引擎、云供应商还是键值存储。 整体思路是 Traefik 将查询提供者的 API,以找到有关路由的相关信息,每次 Traefik 检测到一个变化,它动态更新路由。 部署然后忘记是 Traefik 的信条。 0.1. 协调器 即使每个提供者是不同的,也可以将它们分为四组: 基于标签(每个部署的容器都有一组标签附加到它上面) 基于键值(每个部署的容器用相关信息更新一个键值存储) 基于注释(一个单独的对象,带有注释,定义容器的特征) 基于文件(一个很好的旧的配置文件) 0.2. 支持的提供者 以下是 Traefik 目前支持的提供者名单。 Provider Type Configuration Type Docker Orchestrator Lable Kubernetes Orchestrator Custom Resource Marathon Orchestrator Label Rancher Orchestrator label File Manual TOML/YAML format 当前版本的 Traefik 并不支持所有的提供者。 有关更多提供者,请参阅以前的版本(v1.7)。 0.2.1. 配置重载频率 在某些情况下,一些提供者可能会突然发生大量的更改,这将产生大量的配置更改事件。 如果 Traefik 将它们都考虑在内,那么将触发更多的配置重载,而不是必需的,甚至不是有用的。 为了减轻这种情况,可以设置 providers.providersThrottleDuration 选项。 这是 Traefik 在重新加载配置之后,在考虑任何新的配置刷新事件之前等待的持续时间。 如果任何事件在此期间到达,则只考虑最近的事件,并删除所有以前的事件。 不能为每个提供者设置此选项,但节流算法独立应用于每个提供者。 默认为2秒。 providers: providersThrottleDuration: 10s 0.3. 限制服务发现的范围 默认情况下,Traefik 将为所有检测到的容器创建路由。 如果你想限制 Traefik 的服务发现范围,比如不允许为某些容器创建路由,可以通过两种不同的方式来实现: 要么使用通用配置选项 exposedByDefault 要么使用基于约束的更细粒度机制 0.3.1. exposedByDefault 和 traefik.enable 支持此特性的提供者: Docker Rancher Marathon 0.3.2. 约束条件 支持此特性的提供者: Docker Rancher Marathon Kubernetes CRD Kubernetes Ingress 0.4. Kubernetes IngressRoute Traefik 过去只通过 Kubernetes Ingress 提供者支持 Kubernetes,严格意义上就是 Kubernetes Ingress 控制器。 然而,由于社区表示需要从 Traefik 特性中获益,而不需要求助于(大量)注释,我们最终为 IngressRoute 类型编写了一个自定义资源定义(下文中的别名 CRD) ,以便提供更好的方式来配置对 Kubernetes 集群的访问。 0.4.1. 资源配置 请参阅路由中的专用部分。 0.4.2. 提供者配置 0.4.2.1. endpoint 可选,默认为empty providers: kubernetesCRD: endpoint = "http://localhost:8080" # ... Kubernetes服务的端点作为 URL。 部署到 Kubernetes 后,Traefik 将读取环境变量 KUBERNETES_SERVICE_HOST 和 KUBERNETES_SERVICE_PORT 或 KUBECONFIG 来构造端点。 访问令牌将在 /var/run/secrets/kubernetes.io/serviceaccount/token 中查找,SSL CA 证书将在 /var/run/secrets/kubernetes.io/serviceaccount/CA 中查找。在部署到kubernetes集群中时,两者都会自动挂载。 可以指定端点来重写群集内的环境变量值。 当找不到环境变量时,Traefik 将尝试使用集群外的客户端连接到 Kubernetes API 服务器。 在这种情况下,端点是必须的。 具体来说,可以将它设置为 kubectl proxy 使用的 URL,以使用授予的相关 kubeconfig 的身份验证和授权连接到 Kubernetes 集群。 0.4.2.2. token 可选,默认为empty providers: kubernetesCRD: token = "mytoken" # ... 用于 Kubernetes 客户端配置的承载令牌。 0.4.2.3. certAuthFilePath 可选,默认为empty providers: kubernetesCRD: certAuthFilePath: "/my/ca.crt" # ... 证书颁发机构文件的路径。用于 Kubernetes 客户端配置。 0.4.2.4. namespaces 可选,默认为all namespaces(一个空的数组) providers: kubernetesCRD: namespaces: - "default" - "production" # ... 要监视的namespace数组。 0.4.2.5. labelselector 可选,默认为empty(处理所有的Ingresses) providers: kubernetesCRD: labelselector: "A and not B" # ... 默认情况下,Traefik 处理已配置namespace中的所有Ingress对象。 可以定义一个标签选择器,以便只对特定的Ingress对象进行筛选。 0.4.2.6. ingressClass 可选,默认为empty providers: kubernetesCRD: ingressClass: "traefik-internal" # ... 标识要处理的Ingress对象的 kubernetes.io/Ingress.class 注释值。 如果参数是非空的,则只处理包含具有相同值的注释的Ingress。 否则,将处理没有注释、具有空值或值为traefik的Ingress。 0.4.2.7. throttleDuration 可选,默认为0(不节流) providers: kubernetesCRD: throttleDuration: "10s" # ...

01 简介 阅读更多

0.1. 简介 0.2. 概念 0.2.1. 边缘路由 0.2.2. 自动服务发现 0.2.2.1. 许多不同的规则 0.2.2.2. 更新请求 0.2.2.3. Traefik如何发现服务 0.3. 配置 0.3.1. 动态配置 0.3.2. 静态配置 0.3.2.1. 配置文件 0.3.2.2. 命令行参数 0.3.2.3. 环境变量 0.3.3. 可用的配置选项 0.4. 部署Traefik 0.4.1. 使用Docker官方镜像 0.4.1.1. 注意 0.4.2. 使用二进制发行版 0.4.3. 从源码编译二进制文件 0.1. 简介 Traefik是开源的边缘路由器,使发布服务变得有趣而轻松。它代表您的系统接收请求,并找出负责处理这些请求的组件。 Traefik 的与众不同之处在于,除了它的许多特性之外,它还能自动为您的服务发现正确的配置。 当 Traefik 检查您的基础设施时,它会发现相关的信息,并发现哪个服务为哪个请求服务。 Traefik本身就兼容所有主流的集群技术,例如Kubernetes,Docker,Docker Swarm,AWS,Mesos,Marathon,名单还在继续增加,并且可以同时处理多个(它甚至适用于在裸机上运行的旧版软件。) 使用 Traefik,不需要维护和同步一个单独的配置文件: 一切都是自动发生的,是实时的(没有重新启动,没有连接中断)。 使用 Traefik,您将时间花费在开发和部署系统的新特性,而不是配置和维护系统的正常工作状态。 开发Traefik,我们的主要目标是使其易于使用,我们相信您会喜欢的。 --- Traefik维护团队 0.2. 概念 0.2.1. 边缘路由 Traefik 是一个边缘路由器,这意味着它是通往平台的大门,它拦截并路由每一个传入的请求: 它知道所有的逻辑和每一个规则,这些逻辑和规则决定哪些服务处理哪些请求(基于路径、主机、请求头等等)。 0.2.2. 自动服务发现 传统上,边缘路由器(或反向代理)需要一个配置文件,其中包含通往服务的所有可能路由,而Traefik则从服务本身获取它们。部署服务时,附加一些信息,来告诉 Traefik 后台服务可以处理的请求的特征。 这意味着在部署服务时,Traefik 会立即检测到该服务,并实时更新路由规则。 反之亦然: 当从基础设施中移除一项服务时,该路由将相应地消失。 您不再需要用 IP 地址或其他规则混乱地创建和同步配置文件。 0.2.2.1. 许多不同的规则 在上面的示例中,我们使用请求路径来确定由哪个服务负责,当然也可以使用许多其他不同的规则。 0.2.2.2. 更新请求 在中间件部分,可以了解如何在将请求转发到服务之前更新请求。 0.2.2.3. Traefik如何发现服务 Traefik 能够使用集群 API 发现服务并读取附加信息。 在 Traefik,这些连接器被称为提供者,因为它们向 Traefik 提供配置。 要了解更多关于它们的信息,请阅读提供者概述部分。 0.3. 配置 Traefik 的配置可以指两件不同的事情: 完全动态路由配置(称为动态配置) 启动配置(称为静态配置) 动态配置包含定义系统如何处理请求的所有内容。 这种配置可以改变,并且是无缝热重加载,没有任何请求中断或连接丢失。 静态配置中的元素设置与提供者的连接,并定义 Traefik 将监听的入口点(这些元素不经常更改)。 不兼容的配置:请注意,Traefik v1.x 的旧配置现在不兼容 v2.x 配置。 如果您运行的是 v2,请确保您使用的是 v2配置。 0.3.1. 动态配置 Traefik 从提供者获得其动态配置: 无论是协调器、服务注册中心还是普通的旧配置文件。 由于此配置特定于您的基础结构选择,因此我们邀请您参考本文档的专门部分。 Https 证书也属于动态配置。 您可以添加 / 更新 / 删除它们,而无需重新启动 Traefik 实例。 0.3.2. 静态配置 在 Traefik 定义静态配置选项时有三种不同的、相互排斥的方法(同一时间只能使用一种) : 配置文件 命令行参数 环境变量 这些方法按照上面列出的顺序进行评估。 如果没有为给定的选项提供值,则应用默认值。 此外,如果一个选项具有子选项,而且没有指定这些子选项中的任何一个,那么也将应用一个默认值。 例如,--providers.docker 选项本身就足以启用 docker提供者,即使存在 --providers.docker.endpoint 之类的子选项。 一旦设置,此选项将设置(并重置) --providers.docker 的子选项的所有默认值。 0.3.2.1. 配置文件 在启动时,Traefik 在以下位置搜索名为 traefik.toml (或 traefik.yml 或 traefik.yaml)的文件: /etc/Traefik/ $XDG_CONFIG_HOME/ $HOME/.config / . (工作目录) 可以使用 configFile 参数覆盖它。 Traefik --configFile=foo/bar/myconfigfile.toml 0.3.2.2. 命令行参数 要获取所有可用参数的列表: traefik --help # or docker run traefik[:version] --help # ex: docker run traefik:2.0 --help 所有可用的参数也可以在这里找到。 0.3.2.3. 环境变量 所有可用的环境变量都可以在这里找到。 0.3.3. 可用的配置选项 所有的配置选项都记录在它们的相关章节中。 可以浏览菜单、提供者或路由部分中的可用特性,以查看它们的实际操作。 0.4. 部署Traefik 您可以使用以下方式安装 Traefik: 使用官方 Docker 镜像 使用二进制发行版 从源代码中编译二进制文件 0.4.1. 使用Docker官方镜像 选择一个官方的 Docker 映像,并使用示例配置文件运行它: docker run -d -p 8080:8080 -p 80:80 -v $PWD/traefik.toml:/etc/traefik/traefik.toml traefik:v2.0 有关详细信息,请参阅 Docker 提供者文档。 0.4.1.1. 注意 更喜欢一个固定的版本,而不是最新的,可能是一个意外的版本。 例如:traefik:v2.0.0 Docker镜像是基于Alpine Linux的官方镜像 所有的协调器使用docker镜像可以获取官方 Traefik docker镜像 0.4.2. 使用二进制发行版 从发布页面获取最新的二进制文件。 检查下载文件的完整性 # Compare this value to the one found in traefik-${traefik_version}_checksums.txt sha256sum ./traefik_${traefik_version}_linux_${arch}.tar.gz 提取下载的文件 tar -zxvf traefik_${traefik_version}_linux_${arch}.tar.gz 然后运行它 ./traefik --help 0.4.3. 从源码编译二进制文件 所有详情请参阅参考指南。