天天看點

使用traefik作為istio流量入口,并在traefik上實作流量控制

背景

在生産環境中使用rancher2.0來操作k8s平台,并啟用了istio做灰階釋出。由于在灰階釋出中需要頻繁修改virtualservice,故沒有使用istio-gateway做為流量入口(使用istio-gateway作為流量入口,需要在virtualservice中配置url路由比對規則),而是使用traefik做為流量入口。traefik做url路由比對,istio做流量政策,避免在釋出中頻繁修改virtualservice出現url路由未配置而導緻的事故。當使用traefik作為流量入口時,又出現了另外一個問題,traefik是通過ingress規則來擷取pod的ip作為upstream,進而外部的流量會被traefik直接代理到對應的pod,進而繞過istio規則,導緻istio流量控制不能生效。

解決方案

通過在網上查閱資料發現,istio可以根據http請求中的host字段來比對流量控制政策,故在traefik文中中發現使用middleware可以對ingress添加自定義headers。例如在namespace為test的service名稱為web。

添加traefik.ingress.kubernetes.io/router.middlewares: test-web-header@kubernetescrd這個annotations來将ingress和middleware進行關聯。test-web-heare=namespace-middlewarename。

???? 一個ingress隻能配置一個svc,不能配置多個否則會出現通路錯誤,但是可以通過多個ingress來配置多個svc(域名相同也可以配置多個ingress,但是需要url不一緻)。