(之後補充)node
Istio核心組件及功能python
Pilotweb
Pilot是Istio主要控制點,Istio流量由Pilot管理由Sidecar執行完成.shell
Mixerjson
主要功能:flask
Mixer中包含多個adapter來處理預檢和報告.後端
Citadelapi
早期版本稱之爲istio-CA,因此它就是用於管理證書的.在集羣中啓用了服務之間加密後,負責爲集羣中各個服務在統一CA條件下生成證書,並下發給各個服務中的Sidecar.數組
SideCar(Envoy)安全
核心配置對象
Istio安裝過程當中會進行CRD初始化,在k8s集羣中註冊一系列的CRD.用戶利用istio控制微服務間通訊就是經過向k8s提交CRD資源方式完成的.
istio中的資源:
networking.istio.io
流量管理功能的執行者.
如下爲最經常使用的對象:
config.istio.io
該對象用於爲mixer組件提供配置.Mixer對數據的處理過程以下
Rule:Mixer入口,包含一個match成員和一個邏輯表達式,只有符合表達式判斷的數據纔會交給action處理.邏輯表達式中變動稱爲attribute,其中內容來自Envoy提交的數據
Action:將符合入口標準的數據,在用什麼方式加工以後,交給哪一個適配器進行處理.
Handler:表明一個適配器實例,用於接收處理後的數據
Instance:用於爲進入的數據選擇一個模板,並在數據中抽取某些字段做爲模板的參數,傳輸給模板進行處理.
通過Handler實例化以後的Adapter,就具有了工做功能,有自身實現(listcheck,memquota)也有第三方實現(prometheus,datadog).Envoy傳出數據將會經過具體的Adapter處理,獲得預檢結果,或者輸出各類監控,日誌及跟蹤數據.
Template:用於對接收到的數據進行再加工.用戶編制模板對象後,通過模板處理原始數據會被轉換成符合適配器輸入要求的數據格式,就能夠在Instance字段中引用.
Mixer管理了全部第三方資源接入,大大擴展了Istio的做用範圍,但應用難度系統增高.
authentication.istio.io
用於定義認證策略.在網格級別,命名空間級別以及服務級別都提供了認證策略的要求.要求在內容中包含服務間通訊認證,及基於JWT的終端認證.
rbac.istio.io
用於基於RBAC(基於角色)訪問控制系統
環境介紹
對kubernets的環境要求以下:
快速部署Istio
下載過程略
下載安裝包解壓後,進入 安裝目錄,將bin目錄中的istioctl複製到PATH路徑中,而後開始部署istio
kubectl apply -f install/kubernetes/istio-demo.yaml
運行以下命令,查看istio-system namespace中pod啓動情況 ,-w 用於持續查詢Pod狀態的變化
kubectl get pods -n istio-system -w
部署兩個版本的服務
#!/usr/bin/env python3 from flask import Flask,request import os import urllib.request app = Flask( name ) @app.route('/env/<env>') def show_env(env) : return os.environ . get(env) @app.route('/fetch') def fetch_env() : url = request.args.get('url','') with urllib.request.urlopen(url) as response: return response.read() if __name__ =="__main__": app.run(host="0.0.0.0",port=80,debug=True)
咱們爲這個App建立兩個Deployment,將其分別命名爲flaskapp-v1,flaskapp-v2,同時建立一個service,命名爲flaskapp.
建立flaskapp.istio.yaml
apiVersion: v1 kind: Service metadata: name: flaskapp lables: app: flaskapp spec: selector: app:flaskapp ports: -name: http port: 80 --- apiVersion: extensions/v1beta1 kind: Deployment metadata: name: flaskapp-v1 spec: replicas: 1 template: metadata: lables: app: flaskapp version: v1 spec: containers: name: flaskapp image: distise/flashapp imagePullPolicy: IfNotPresent env: name: version value: v1 --- apiVersion: extensions/v1beta1 kind: Deployment metadata: name: flaskapp-v2 spec: replicas: 1 template: metadata: lables: app: flaskapp version: v2 spec: containers: name: flaskapp image: distise/flashapp imagePullPolicy: IfNotPresent env: name: version value: v2
接下來使用istio進行注入.istioctl,基本做用是修改kubernetes Deployment.在Pod中注入前面提到的Sidecar 容器,並使用管道命令,將yaml文件經過istioctl處理以後 經過管道輸出給kubectl.最終提交到Kuernetes集羣
istioctl kube-inject -f flask.istio.yaml |kuberctl apply -f -service/flaskapp created #建立以後可看建立出來的Pod kubectl get po -w #也可使用kubectl describe po查看Pod容器 kubectl describe po flaskapp-v1-6647dd84b9-2ndf4
部署客戶端服務
驗證服務
建立目標規則和默認路由
小結
本章實踐了一個較爲典型的Istio服務上線流程:注入-->部署-->建立目標規則-->建立默認路由.絕大多數istio網格應用都會遵循這一流程進行上線.
經過前面知識咱們瞭解到,Istio由多個組件構成,而且能夠經過kubectl命令在Kubernetes集羣上進行部署,部署時會在Kubernetes集羣上建立大量對象,Istio與Kubernetes進行了深度集成,構成Istio的組件都以Deployment形式在Kubernetes中運行,並在運行過程當中所需的配置數據也須要依賴各類CRD及ConfigMap,Secret來進行存儲.
這種包含複雜依賴關係的應用部署過程,須要由功能足夠強大的模板系統來提供支持,Istio官方推薦使用Helm對istio進行部署.
Istio Chart概述
Istio Chart是一個總分結構,其分級結構和設計結構是一致的.
Chart.yml:chart基礎信息文件,包含版本號,名稱,關鍵字等元數據信息.
values-*.yml:
requirements.yaml
該文件用於管理對子Chart的依賴關係,並定義了一系列形狀變量.
templates/_affinity.yaml:
生成一組節點新和或互斥元素,供各個組件在渲染yaml時使用,定義一系列變量用於控制Istio組件節點親和性.
templates/sidecar-injector-configmap.yaml
用於生成一個Configmap對象,在該對象中保存的配置數據被用於進行Sidecar注入.
templates/configmap.yaml:
也生成一個ConfigMap,名稱爲istio,用於爲Pilot提供啓動配置數據.
templates.crds.yaml:
包含Istio所需CRD定義,部署方式以下:
charts:
這個目錄中的子目錄就是Istio的組件:
全局變量介紹
咱們使用Chart時,一般不會修改Chart本體,僅經過對變量的控制來實現對部署過程的定製.Istio Helm Chart提供了大量變量來幫助用戶對Istio進行定製.
hub&tag
對內網部署很是有必要,將Istio鏡像Pull並推送到私庫後,只要在values.yaml修改就能夠將Istio所需鏡像的引用指向內網私庫.
多數狀況下這兩個變量表明全部鏡像地址,具體名稱通常{{.Values.global.hub}}/[component]/:{{.Values.global.tag}}拼接而成.
在proxy_init,mixer,grafana,polit的Deployment模板中,一量在其image變量中包含路徑符/,則會棄用global.hub,直接採用image的定義
{{- if contains "/".Values.image}} image: "{{.Values.image}}" {{- else}} image: "{{.Values.global.hub}}/{{.Values.image}}:{{.Values.global.tag}}" {{- end}}
ingress.enabled:
用來控制是否啓用Istio的Ingress Controller,若是設置爲True,就會啓用Kubernetes Ingress資源的支持,Istio並不推薦Ingress方式,建議使用Ingress Gateway取代它.
Proxy relation args:
在values.yaml定義了一級proxy變量,用於對Sidecar進行控制
proxy_init.image
網格中的服務Pod在啓前,首先會運行一個初始化鏡像來完成流量工做,這個變量能夠用於指定初始化容器鏡像
imagePullPolicy:
鏡像摘取策略,default is IfNotPresent
controlPlaneSecurityEnabled
指定是否在Istio控制面組件上啓用mTLS通訊.啓用後哦組件包括Ingress,Mixer,Pilot,Sidecar
disablePolicyChecks:
設置爲True,會禁用Mixer的預檢功能.預檢功能是一個同步過程,有可能由於預檢緩慢形成業務應用的阻塞.
enableTracing:
是否啓用分佈式跟蹤,default is True
mtls.enabled:
服務之間是否默認啓用mTLS,若是設置爲True,則網格內服務間的通訊 都會使用mTLS進行安全加固.這一設置是全局的,對每一個服務還能夠單獨使用目標規則或服務註解的方式,自行決定是否採用mTLS加固
imagPullSecrets:
用於爲ServiceAccount分配鏡像拉取過程當中的所需的認證憑據.默認爲空
arch:
在設置Istio組件的節點親和性過程當中,會使用這個變量的列表內容來肯定可用於部署的節點範圍 ,並按照不一樣的服務器架構設置了優先順序,它默認的列表內容以下:
amd64: 2 s390x: 2 ppc64ie: 2
oneNamespace:
默認爲false.若是設置爲true,則會在Polit的服務發現參數中加入-a,此時Pilot只會對Istio組件所在的命名空間進行監控.
configValidation:
用於配置是否開啓服務端的配置驗證,默認爲true.該選項開啓後,會生成一個ValidatingWebhookConfiguration對象,並被包含到Galley配置中,從而啓用校驗功能.
meshExpansion:
要將服務網格擴展到物理或虛擬機上,會使用到,默認爲false.若是設置爲true,則會在Ingress Gateway上公開Pilot,Citadel的服務
meshExpansionILB:
是否在內部網狀中公開Pilot和Citadel端口,默認爲false.
defaultResources:
爲全部istio組件都提供一個最小資源限制.默認狀況下只設置一個請求10mCPU資源的值,能夠在各個Chart局部變量中分別設置資源需求
hyperkube:
priotyClassname
默認爲空,可選值包括system-cluster-critical,system-node-critical
crds
該變量用於決定是否包含CRD定義.若是使用helm template,或2.10後的版本helm install ,就將其設置爲true.不然在安裝以前首先要執行kubectl apply -f install/kubernetes/helm/istio/templates/crds.yaml.並將該變量設置爲false.
Istio安裝清單的生成和部署
編輯values.yaml
若是是內網部署,首先要解決鏡像地址問題,通常在具有外網鏈接的服務器上拉取所需鏡像,而後導出鏡像,將其推送到本地私有鏡像庫,
若是咱們想獲取其中使用的鏡像名稱,就能夠用grep方便過濾出來
grep -r image:istio-demo.yaml|egrep -o -e "image:."| sort |uniq
獲得這些鏡像名稱以後,就進行鏡像的拉取和推送.根據入私庫地址,修改values.yaml中各個鏡像地址,生成新的安裝清單文件,而後從新用上述命令進行檢查.
根據實際狀況調整各個組件的資源分配.默認設置是很是保守的.
Istio的istio-ingressgateway服務的默認類型是Loadbalncer,若是在部署的Kubernetes集羣中沒有lb支持,就須要對服務類型進行修改.
在Istio中包含的Prometheus,Grafana,Kiali等可視化組件,在默認狀態下都是ClusterIP類型,要順利使用,則可能須要爲其分配Ingress或者修改服務類型
生成部署清單
使用helm template 生成最終部署清單.
helm template install/kubernetes/helm/listio --name istio --namespace istio-system -f my-values.yaml > my-istio.yaml
命令完成後打開my-istio.yaml文件,檢查其中內容是否符合預期.
部署Istio
上面生成的my-istio.yaml是要求部署到istio-system命名空間的,使用命令以下
kubectl create ns istio-system
kubectl apply -f my-istio.yaml
命令運行完成後可用使用命令來查看Pod運行狀況,直至所有Pod成功進入Running或Completed狀態,Istio安裝部署工做就完成了
kubectl get po -n istio-system -w
在網格中部署應用
istioctl kube-inject -f flash.istio.yaml -o flask.istio.injected.yaml
打開文件後發現Deployment對象有很大改變,多出了一個sidecar容器,並出現了一個初始化容器istio-init.
對工做負載的要求
使用自動注入
準備測試應用
略
修改Istio配置
略
使用Istio Dashboard
提供了條形圖,餅圖,表格,拆線圖等豐富的可視化組件.且對其中的數據源和可視化組件均可以二次開發.
啓用Grafana
默認未啓用grafana.啓動命令以下
helm template istio --name istio --set grafana.enabled=true --namespace istio-system > default-grafana.yaml ###### kubectl apply -f default-grafana.yaml
訪問Grafana
kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=grafana -o jsonpath-'{.items[0].metadata.name}') 3000:3000 &
接下來打開 browser,type http://localhost:3000/ ,單擊左上角Home連接.打開Istio內置的Dashboard.
開放Grafana服務
kubectl端口轉發方式不是很穩定,要長期使用的話,對grafana進行定製.
security.enabled=true並設置用戶名和密碼.
使用Prometheus
訪問prometheus
默認是開啓的.
開放prometheus服務
prometheus的Service經過values.yaml定製對服務開放方式
學習和定製
略
使用Jaeger
用於分佈式跟蹤的開源軟件.提供了原生的OpenTracing支持,向下兼容Zipkin,同時支持多種存儲後端.
啓用Jaeger
默認未啓用
helm template istio --name istio --set tracing.enabled=true --namespace istio-system > default-tracing.yaml ######### kubectl apply -f default-tracing.yaml ######### kubectl get po -w istio-system
訪問Jaeger:
kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=jaeger -o jsonpath='{.items[0].metadata.name}') 16686:16686
browser,type
跟蹤參數的傳遞:
(之後有時間再補充)
開放Jaeger服務
使用Kiali
是用於Istio可視化軟件,它除了提供監控,可視化及跟蹤外還提供了Iistio配置驗證,健康評估等高級功能
啓用kiali
將kiali.enabled:true便可
訪問kiali
kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=kiali -o jsonpath='{.items[0].metadata.name}') 20001:20001
browser,type http://localhost:20001
tips:default username,password is admin:admin.
開放kiali服務
參考jaeger.
定義目標規則
當Kubernetes訪問一個服務時,須要指定其協議,服務名和端口,Istio的服務網格中對服務進行了進一步抽象
Kubernetes中,Service和Deployment或其餘工做負載關係是一對一.以下圖所示:
而在Istio中,Service常常會對應不一樣的Deployment,以下圖所示:
定義默認路由
Istio建議爲每一個服務都建立一個默認路由,在訪問某一服務時若是沒有特定的路由規則,則使用默認路由規則來訪問指定的子集,以此來確保服務在默認狀況下的行爲穩定性.
流量的拆分和遷移
經過設置權重來拆分流量
若是不聲明權重,其默認爲100
流量分配是有權重的,且權重總和必須是100
金絲雀部署
定義:
根據來源服務進行路由
根據不一樣版本的服務訪問不一樣版本的目標服務.
在上面的VirtualService定義裏,用sourceLabels對來源路由進行了匹配.
對URI進行重定向
根據URL進行重定向對目標路由進行分流 .
通訊超時控制
故障重試控制
入口流量管理
Kubernetes爲第三方廠商提供了Ingress Controler規範,用於入站流量管理.而Istio推出了Gateway,用於在網絡邊緣進行入站和出站的流量管理.
Ingress Gateway在邏輯上是至關於網絡邊緣上的一個負載均衡器,用於接收和處理網格邊緣出站和入門的網絡鏈接.
在前面流量管理中使用VirtualService對象,都默認包含gateways字段,若是沒有指定,則默認值爲:mesh.全部網格內部服務間互相通訊,都是經過這個網關進行的.若是要對外提供服務,須要定義Gateway對象,並在gateways字段中進行賦值.一量在gateways中填寫了mesh以外的對象名稱,就要繼續對內部通訊進行流量控制,並必須顯式地將內置的mesh對象名稱也加入列表中.
使用Gateway開放服務
apiVersion:networking.istio.io/v1alpha3 kind:Gateway metadata: name: example-gateway spec: selector: istio: ingressgateway servers: port: number: 80 name: http protocol: HTTP hosts: "*.microservice.rocks" "*.microservice.xyz"
selector其實是一個標籤選擇器,用於指定哪些Gateway Pod負責這個Gateway對象的運行
hosts字段用了一個通配符來指明這個gateway可能要負責的主機名.可使用kubectl get svc -n istio-system istio-ingressgateway 查看該服務的IP,並將測試域名映射這個IP
將配置文件提交給Kubernetes集羣
kubectl apply -f example.gateway.yaml ############ http flaskapp.microservice.rocks
訪問結果是404.回來發現並無指定負責響應請求的服務.咱們須要對路由規則進行修改
爲Gateway添加證書支持
使用過程當中能夠直接查如何使用,此處略
爲Gateway添加多個證書支持
使用過程當中能夠直接查如何使用,此處略
配置入口流量的路由
使用過程當中能夠直接查如何使用,此處略
出口流量管理
默認狀況下網格內部沒法對外網網絡請求,但Istio提供瞭如下幾種方式用於網格外部通訊
設置Sidecar的流量劫持範圍
流量支持由istio-init容器完成.
設置ServiceEntry
能夠爲外部服務設置ServiceEntry,至關於外部服務在網格內部進行了註冊,相對於使用CIDR白名單方式,這種方式讓Istio對外部訪問有了更大的管理能力.
新建Gateway控制器
略
設置服務熔斷
故障注入測試
微服務測試過程當中,每每須要對網絡故障場景進行模擬,Istio提供瞭如下兩種故障注入能力:
流量複製
導入markdown文件時,圖片丟失,請下載附件PDF文件查看.