Istio:Google、IBM 和 Lyft 聯合開源的微服務 Service Mesh 框架

Istio是Google、IBM和Lyft聯合開源的微服務Service Mesh框架,旨在解決大量微服務的發現、連接、管理、監控以及安全等問題。

Istio的主要特性包括:

  • HTTP、gRPC和TCP網路流量的自動負載均衡
  • 豐富的路由規則,細粒度的網路流量行為控制
  • 流量加密、服務間認證,以及強身份聲明
  • 全範圍(Fleet-wide)策略執行
  • 深度遙測和報告

原理

Istio從邏輯上可以分為數據平面和控制平面:

  • 數據平面主要由一系列的智能代理(Envoy)組成,管理微服務之間的網路通信
  • 控制平面負責管理和配置這些智能代理,並動態執行策略

Istio架構可以如下圖所示

主要由以下組件構成

  • Envoy:Lyft開源的高性能代理匯流排,支持動態服務發現、負載均衡、TLS終止、HTTP/2和gPRC代理、健康檢查、性能測量等功能。Envoy以sidecar的方式部署在相關的服務的Pod中。
  • Mixer:負責訪問控制、執行策略並從Envoy代理中收集遙測數據。Mixer支持靈活的插件模型,方便擴展
  • Pilot:用戶和Istio的介面,驗證用戶提供的配置和路由策略並發送給Istio組件,管理Envoy示例的生命周期
  • Istio-Auth:提供服務間和終端用戶的認證機制

安裝

Istio目前僅支持Kubernetes,在部署Istio之前需要先部署好Kubernetes集群並配置好kubectl客戶端。

下載Istio

curl -L https://git.io/getIstio | sh -ncd istio-0.1.6/ncp bin/istioctl /usr/local/bin/n

創建RBAC角色和綁定

$ kubectl apply -f install/kubernetes/istio-rbac-beta.yamlnclusterrole "istio-pilot" creatednclusterrole "istio-ca" creatednclusterrole "istio-sidecar" creatednrolebinding "istio-pilot-admin-role-binding" creatednrolebinding "istio-ca-role-binding" creatednrolebinding "istio-ingress-admin-role-binding" creatednrolebinding "istio-sidecar-role-binding" createdn

如果碰到下面的錯誤

Error from server (Forbidden): error when creating "install/kubernetes/istio-rbac-beta.yaml": clusterroles.rbac.authorization.k8s.io "istio-pilot" is forbidden: attempt to grant extra privileges: [{[*] [istio.io] [istioconfigs] [] []} {[*] [istio.io] [istioconfigs.istio.io] [] []} {[*] [extensions] [thirdpartyresources] [] []} {[*] [extensions] [thirdpartyresources.extensions] [] []} {[*] [extensions] [ingresses] [] []} {[*] [] [configmaps] [] []} {[*] [] [endpoints] [] []} {[*] [] [pods] [] []} {[*] [] [services] [] []}] user=&{user@example.org [...]n

需要給用戶授予admin許可權

kubectl create clusterrolebinding myname-cluster-admin-binding --clusterrole=cluster-admin --user=myname@example.orgn

部署Istio核心服務

兩種方式(選擇其一執行)

  • 禁止Auth:kubectl apply -f install/kubernetes/istio.yaml
  • 啟用Auth:kubectl apply -f install/kubernetes/istio-auth.yaml

部署Prometheus、Grafana和Zipkin插件

kubectl apply -f install/kubernetes/addons/prometheus.yamlnkubectl apply -f install/kubernetes/addons/grafana.yamlnkubectl apply -f install/kubernetes/addons/servicegraph.yamlnkubectl apply -f install/kubernetes/addons/zipkin.yamln

等一會所有Pod啟動後,可以通過NodePort或負載均衡服務的外網IP來訪問這些服務。比如通過NodePort方式,先查詢服務的NodePort

$ kubectl get svc grafana -o jsonpath={.spec.ports[0].nodePort}n32070n$ kubectl get svc servicegraph -o jsonpath={.spec.ports[0].nodePort}n31072n$ kubectl get svc zipkin -o jsonpath={.spec.ports[0].nodePort}n30032n$ kubectl get svc prometheus -o jsonpath={.spec.ports[0].nodePort}n30890n

通過http://<kubernetes-ip>:32070/dashboard/db/istio-dashboard訪問Grafana服務

通過http://<kubernetes-ip>:31072/dotviz訪問ServiceGraph服務,展示服務之間調用關係圖

通過http://<kubernetes-ip>:30032訪問Zipkin跟蹤頁面

通過http://<kubernetes-ip>:30890訪問Prometheus頁面

部署示例應用

在部署應用時,需要通過istioctl kube-inject給Pod自動插入Envoy容器,即

kubectl create -f <(istioctl kube-inject -f <your-app-spec>.yaml)n

比如Istio提供的BookInof示例:

kubectl apply -f <(istioctl kube-inject -f samples/apps/bookinfo/bookinfo.yaml)n

原始應用如下圖所示

istioctl kube-inject在原始應用的每個Pod中插入了一個Envoy容器

服務啟動後,可以通過Ingress地址http://<ingress-address>/productpage來訪問BookInfo應用

$ kubectl describe ingressnName: gatewaynNamespace: defaultnAddress: 192.168.0.77nDefault backend: default-http-backend:80 (10.8.0.4:8080)nRules:n Host Path Backendsn ---- ---- --------n *n /productpage productpage:9080 (<none>)n /login productpage:9080 (<none>)n /logout productpage:9080 (<none>)nAnnotations:nEvents: <none>n

本文來自開源書《Kubernetes指南》,歡迎關注和參與。


推薦閱讀:

Kubernetes v1.7新特性解析-本地數據卷
容器編排之Kubernetes安裝與配置
kubernetes的網路實現

TAG:Kubernetes | Docker | 微服务架构 |