Istio

什麼是Istio

Istio是Service Mesh(服務網格)的主流實現方案。該方案下降了與微服務架構相關的複雜性,並提供了負載均衡、服務發現、流量管理、斷路器、監控、故障注入和智能路由等功能特性。html

其中,Sidecar模式是一種將應用功能從應用自己剝離出來做爲單獨進程的方式。該模式容許咱們嚮應用無侵入添加多種功能,避免了爲知足第三方組件需求而嚮應用添加額外的配置代碼。從某種意義上來講,服務對於網絡是無感知的,只知道所附加的sidecar代理,它將網絡依賴抽象成了Sidecar。node

在Service Mesh中,咱們須要瞭解Data Plane和Control Plane兩個概念:linux

  • Data Plane:做用是處理網格內服務間的通訊,並完成服務發現、負載均衡、流量管理、健康檢查等功能;
  • Control Plane:做用是管理和配置策略用於路由流量,同時也在運行期執行策略。

Istio核心組件git

  • Envoy:Istio 使用 Envoy調解服務網格中全部服務的入站和出站流量。屬於數據平面。
  • Mixer:負責在服務網格上執行訪問控制和使用策略,以及收集從Envoy和其餘服務自動監控到的數據。
  • Pilot:爲 Envoy sidecar 提供服務發現功能,爲智能路由(例如 A/B 測試、金絲雀部署等)和彈性(超時、重試、熔斷器等)提供流量管理功能。屬於控制平面。
  • Citadel:提供訪問控制和用戶身份認證功能。

Istio可視化管理組件github

其中,Kiali、Jaeger、prometheus、grafana管理工具,將和Istio一併部署。瀏覽器

使用Helm部署Istio

依賴環境
Helm > 2.10
Kubernetes > 1.9性能優化

下載並解壓縮istio的發佈包

1
2
3
wget https://github.com/istio/istio/releases/download/1.0.6/istio-1.0.6-linux.tar.gz
tar -zxvf istio-1.0.6-linux.tar.gz
cd istio-1.0.6

 

Istio的Chart在istio-1.0.6/install/kubernetes/helm目錄中,這個Chart包含了下面的代碼文件

1
2
3
4
# tree install/kubernetes/helm/istio
......
......
31 directories, 139 files

 

若是安裝的Helm版本高於2.10,就再也不須要手動使用kubectl安裝Istio的CRD。反之,則須要執行以下命令安裝

1
kubectl apply -f install/kubernetes/helm/istio/templates/crds.yaml

 

查看安裝的CRD

1
kubectl get CustomResourceDefinition

 

經過各個組件在vaule file的enabled flag啓用或禁用,下面建立名稱爲istio.yaml的vaule file,將幾個默認禁用的組件也啓用

1
2
3
4
5
6
7
8
tracing:
enabled: true
servicegraph:
enabled: true
kiali:
enabled: true
grafana:
enabled: true

 

首先,建立名稱爲kiali的secret。

1
2
# echo -n 'admin' | base64
YWRtaW4=

 

1
2
# echo -n '1f2d1e2e67df' | base64
MWYyZDFlMmU2N2Rm
1
2
3
4
5
6
7
8
9
10
11
12
13
# cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
name: kiali
namespace: istio-system
labels:
app: kiali
type: Opaque
data:
username: YWRtaW4=
passphrase: MWYyZDFlMmU2N2Rm
EOF

執行helm安裝命令

1
helm install install/kubernetes/helm/istio --name istio --namespace istio-system -f istio.yaml

 

安裝完成後確認各個組件的Pod正常運行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# kubectl get pod -n istio-system
NAME READY STATUS RESTARTS AGE
grafana-59b8896965-5f9j2 1/1 Running 0 23m
istio-citadel-6f444d9999-s9jrc 1/1 Running 0 23m
istio-egressgateway-6d79447874-ssbc4 1/1 Running 0 23m
istio-galley-685bb48846-mvf5w 1/1 Running 0 23m
istio-grafana-post-install-6m256 0/1 Completed 0 23m
istio-ingressgateway-5b64fffc9f-mrl9t 1/1 Running 0 23m
istio-pilot-8645f5655b-k6fcz 2/2 Running 0 23m
istio-policy-547d64b8d7-6dgkp 2/2 Running 0 23m
istio-sidecar-injector-5d8dd9448d-zfdsb 1/1 Running 0 23m
istio-telemetry-c5488fc49-qwwcv 2/2 Running 0 23m
istio-tracing-6b994895fd-4vjfx 1/1 Running 0 23m
kiali-5f9ffff7cf-jqk8p 1/1 Running 0 23m
prometheus-76b7745b64-xjzmm 1/1 Running 0 23m
servicegraph-cb9b94c-mlhjm 1/1 Running 0 23m

 

Istio 以一個項目的形式部署到 Kubernetes 集羣中。咱們能夠看到,部署好的 pods 中,除了有 istio-citadel、istio-egressgateway、istio-ingressgateway、istio-pilot 等 Istio 自己的功能組件,還集成了微服務相關的監控工具,如:grafana、jaeger-agent、kiali、prometheus。正是這些功能豐富且強大的監控工具,幫助 Istio實現了微服務的可視化管理。

運行示例Bookinfo

您能夠部署本身的應用或者示例應用程序如 Bookinfo。 注意:應用程序必須使用 HTTP/1.1 或 HTTP/2.0 協議來傳遞 HTTP 流量,由於 HTTP/1.0 已經再也不支持。

若是運行 Pod 的 namespace 被標記爲 istio-injection=enabled 的話,Istio-Initializer 會嚮應用程序的 Pod 中自動注入 Envoy 容器:

1
2
kubectl label namespace <namespace> istio-injection=enabled
kubectl create -n <namespace> -f <your-app-spec>.yaml

 

若是您沒有安裝 Istio-initializer-injector 的話,您必須使用 istioctl kube-inject 命令在部署應用以前嚮應用程序的 Pod 中手動注入 Envoy 容器:

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

 

Bookinfo 應用由四個單獨的微服務構成,用來演示多種 Istio 特性,包含:

  • productpage :productpage 微服務會調用 details 和 reviews 兩個微服務,用來生成頁面。
  • details :這個微服務包含了書籍的信息。
  • reviews :這個微服務包含了書籍相關的評論。它還會調用 ratings 微服務。
  • ratings :ratings 微服務中包含了由書籍評價組成的評級信息。

reviews 微服務有 3 個版本:

  • v1 版本不會調用 ratings 服務。
  • v2 版本會調用 ratings 服務,並使用 1 到 5 個黑色星形圖標來顯示評分信息。
  • v3 版本會調用 ratings 服務,並使用 1 到 5 個紅色星形圖標來顯示評分信息。

下圖展現了這個應用的端到端架構。
image

運行示例bookinfo,並開啓Sidecar自動注入。

1
2
3
4
# kubectl label namespace default istio-injection=enabled
# kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
# kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
# kubectl apply -f samples/bookinfo/platform/consul/destination-rule-all.yaml

 

訪問productpage
http://172.16.0.180:31380/productpage
image

31380端口能夠經過命令獲取

1
kubectl -n istio-system get svc istio-ingressgateway -o jsonpath='{.spec.ports[0].nodePort}'

 

使用Ingress暴露管理服務

完成Istio的安裝後,能夠看到安裝的組件除了Istio架構中的數據平面和控制平面的各個核心組件,還部署了Prometheus、Grafana、Jaeger、Kiali等輔助組件。 在雲原生生態中,咱們已經對這些組件很熟悉了。

  • Prometheus:監控系統,收集Istio的監控數據
  • Grafana:監控信息的圖表展示,Istio部署的Grafana爲咱們內置了各個組件相關的Dashboard
  • Jaeger:分佈式跟蹤系統,Istio中集成Jaeger能夠對基於Istio的微服務實現調用鏈跟蹤、依賴分析,爲性能優化和故障排查提供支持
  • kiali:kiali做爲Istio的可視化管理工具,能夠認爲是Istio的UI,能夠展示服務的網絡拓撲、服務的容錯狀況(超時、重試、短路等)、分佈式跟蹤等

這些輔助組件都有本身的web界面,這裏咱們使用ingress的方式將這些組件暴露到集羣外,以便在集羣外部訪問。Istio支持使用自帶的istio-ingressgateway將服務暴露到集羣外部,這個和Kubernetes中暴露Ingress Controller相似,有不少種方式,如NodePort,LoadBalancer,或直接開啓hostNetwork: true等等。爲了便於統一管理K8s集羣中的服務暴露,筆者更傾向使用Traefik Ingress。

使用Ingress暴露istio服務
編寫ingress yaml文件,以下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# cat istio-ingress.yaml 
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: jaeger-query
namespace: istio-system
annotations:
kubernetes.io/ingress.class: traefik
spec:
rules:
- host: istio.jaeger-query.com
http:
paths:
- path: /
backend:
serviceName: jaeger-query
servicePort: 16686

---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: prometheus
namespace: istio-system
annotations:
kubernetes.io/ingress.class: traefik
spec:
rules:
- host: istio.prometheus.com
http:
paths:
- path: /
backend:
serviceName: prometheus
servicePort: 9090

---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: grafana
namespace: istio-system
annotations:
kubernetes.io/ingress.class: traefik
spec:
rules:
- host: istio.grafana.com
http:
paths:
- path: /
backend:
serviceName: grafana
servicePort: 3000

---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: kiali
namespace: istio-system
annotations:
kubernetes.io/ingress.class: traefik
spec:
rules:
- host: istio.kiali.com
http:
paths:
- path: /
backend:
serviceName: kiali
servicePort: 20001

 

執行部署命令

1
kubectl apply -f istio-ingress.yaml

 

外部客戶端,配置hosts地址解析,以下

1
2
3
4
172.16.0.180 istio.prometheus.com
172.16.0.180 istio.jaeger-query.com
172.16.0.180 istio.grafana.com
172.16.0.180 istio.kiali.com

 

訪問jaeger
瀏覽器訪問Jaeger以前能夠屢次刷新productpage頁面以便產生訪問請求等。選擇productpage.default能夠查看整個調用鏈。使用istio.jaeger-query.com域名訪問,結果展現:
image

訪問kiali
使用域名istio.kiali.com訪問kiali頁面。用戶名admin,密碼1f2d1e2e67df。
image

訪問prometheus
使用域名istio.prometheus.com訪問prometheus頁面。
image

訪問grafana
使用域名istio.grafana.com訪問prometheus頁面。
image

Istio 對 Pod 和服務的要求

要成爲服務網格的一部分,Kubernetes 集羣中的 Pod 和服務必須知足如下幾個要求:

  • 須要給端口正確命名:服務端口必須進行命名。端口名稱只容許是<協議>[-<後綴>-]模式;
  • Pod必須關聯到 Kubernetes服務:若是一個 Pod 屬於多個服務,這些服務不能再同一端口上使用不一樣協議,例如 HTTP 和 TCP。
  • Deployment應帶有app以及version標籤:每一個 Deployment 都應該有一個有意義的 app 標籤和一個用於標識 Deployment 版本的 version 標籤。Istio 會用 app 和 version 標籤來給監控指標數據加入上下文信息。

總結

本文實踐了使用istio官方提供的helm chart在Kubernetes上部署Istio 1.0.6的過程,並使用traefik ingress將Istio集成的Prometheus、Grafana、Jaeger、Kiali等輔助組件暴露到集羣外部,並對進入集羣的流量進行管理。

在生產環境中,若是是基於公有云,如阿里雲、AWS等運行Istio,建議Ingress的IP地址使用ELB地址;若是是自建的平臺,則建議使用HAproxy+Keepalived提供的VIP地址,做爲Ingress的IP地址,實現高可用。

若是Ingress服務,須要暴露在公網,應當使用CA認證機構頒發的證書https化(如使用cert-manager)。此外建議使用NFS、Ceph等方案實現Istio監控以及微服務應用的數據持久化存儲。

相關文章
相關標籤/搜索