本篇文章為大家展示了如何理解更簡單的服務網格Traefik mesh,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
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
(2)下載Chart包
helm pull traefik-mesh/traefik-mesh
(3)解壓Chart包
tar xf traefik-mesh-3.0.6.tgz
Traefik mesh會部署4個服務,它們分別是:
controller:Mesh的控制器,負責代理節點的所有配置分析和配置
proxy:Mesh的代理,負責處理每個節點的流量代理
tracing:跟蹤配置
metrics:監控配置
(4)安裝traefik mesh
helm install traefik-mesh .
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
如果在部署過程中,coredns報以下錯誤:
plugin/forward: this plugin can only be used once per Server Block
請檢查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"
(2)Scheme主要配置請求的協議,可以配置http,https,h3c三種類型,配置如下:
mesh.traefik.io/scheme: "h3c"
(3)Retry主要配置重試次數,當網絡等異常情況下,會根據用戶配置發起幾次重試,如果還是失敗,則返回失敗,配置如下:
mesh.traefik.io/retry-attempts: "2"
(4)Cricuit break主要用于配置斷開流量轉發,當系統處于健康的情況下,默認是關閉的,如果系統異常,則會打開,不再轉發流量到異常的系統中,配置如下:
mesh.traefik.io/circuit-breaker-expression: "Expression"
(5)Rate limit主要用于配置限流,單位是請求次數/秒,可以配置平均請求和突發請求,配置如下:
mesh.traefik.io/ratelimit-average: "100" mesh.traefik.io/ratelimit-burst: "200"
(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"]
它表示可以通過任何方法訪問/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
該配置表示允許運行在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
其表示將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"
上面部署了兩個應用,一個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
如果現在要為上面的服務配置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
現在訪問服務,只需將svc.cluster.local改為traefik.mesh即可。比如之前訪問方式如下:
kubectl -n whoami exec whoami-client -- curl -s whoami.whoami.svc.cluster.local
加了traefik mesh之后,即為:
kubectl -n whoami exec whoami-client -- curl -s whoami.whoami.traefik.mesh
當然之前的訪問方式依然存在,用什么樣的方式由用戶自己決定。
上述內容就是如何理解更簡單的服務網格Traefik mesh,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。