traefik 高级用法
通过路径的路由
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: cheeses annotations: kubernetes.io/ingress.class: traefik traefik.frontend.rule.type: PathPrefixStrip spec: rules: - host: cheeses.minikube http: paths: - path: /stilton backend: serviceName: stilton servicePort: http - path: /cheddar backend: serviceName: cheddar servicePort: http - path: /wensleydale backend: serviceName: wensleydale servicePort: http
以这个Ingress为例,我们分别定义了3个路径对应3个服务( /stilton对应stilton,/cheddar对应cheddar,/wensleydale对应wensleydale) ,但值得注意的一点,cheses.minikube/stilton会将/stilton传到容器中,也就是说必须增加转发的回写,否则容器中的程序必须存放在/stilton路径下才能得以访问,这里使用traefik.frontend.rule.type的注释从url路径中去掉转发的路径到容器中。
指定路由优先级
有时您需要为入口路由指定优先级,尤其是在处理通配符路由时。这可以通过添加 traefik.frontend.priority 注释来完成,即:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: wildcard-cheeses annotations: kubernetes.io/ingress.class: traefik traefik.frontend.priority: "1" spec: rules: - host: *.minikube http: paths: - path: / backend: serviceName: stilton servicePort: http kind: Ingress metadata: name: specific-cheeses annotations: kubernetes.io/ingress.class: traefik traefik.frontend.priority: "2" spec: rules: - host: specific.minikube http: paths: - path: / backend: serviceName: stilton servicePort: http
禁止Ingress 传递主机头
要禁用每个入口资源传递主机标头traefik.frontend.passHostHeader,请将入口上的注释设置为"false"。
这是一个示例定义:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: example annotations: kubernetes.io/ingress.class: traefik traefik.frontend.passHostHeader: "false" spec: rules: - host: example.com http: paths: - path: /static backend: serviceName: static servicePort: https
以及一个示例服务定义:
apiVersion: v1 kind: Service metadata: name: static spec: ports: - name: https port: 443 type: ExternalName externalName: static.otherdomain.com
如果您要访问example.com/static该请求,那么将传递给static.otherdomain.com/static,static.otherdomain.com并将收到带有Host头的请求static.otherdomain.com。
流量分流
可以使用服务权重在多个部署之间以细粒度方式拆分Ingress流量。
一个规范用例是canary版本,其中代表较新版本的部署将随着时间的推移接收最初较小但不断增加的请求部分。在Traefik中可以这样做的方法是指定应该进入每个部署的请求的百分比。
例如,假设一个应用程序my-app在版本1中运行。较新的版本2即将发布,但对生产中运行的新版本的稳健性和可靠性的信心只能逐渐获得。因此,my-app-canary创建新部署并将其缩放到足以获得1%流量份额的副本计数。与此同时,像往常一样创建一个Service对象。
Ingress规范看起来像这样:
apiVersion: extensions/v1beta1 kind: Ingress metadata:
annotations: traefik.ingress.kubernetes.io/service-weights: | my-app: 99% my-app-canary: 1% name: my-app
spec:
rules: - http: paths: - backend: serviceName: my-app servicePort: 80 path: / - backend: serviceName: my-app-canary servicePort: 80 path: /
记下traefik.ingress.kubernetes.io/service-weights注释:它指定引用的后端服务之间的请求分配,my-app以及my-app-canary。根据这一定义,Traefik将99%的请求路由到my-app部署支持的pod ,并将1%的请求路由到支持的pod my-app-canary。随着时间的推移,该比例可能会慢慢转向金丝雀部署,直到它被认为取代之前的主要应用程序,步骤如5%/ 95%,10%/ 90%,50%/ 50%,最后100%/ 0%。
必须满足一些条件才能正确应用服务权重:
关联的服务后端必须共享相同的路径和主机。 所有服务后端共享的总百分比必须达到100%(但请参阅省略最终服务的部分)。 百分比值被解释为浮点数到支持的精度,如注释文档中所定义。