您好,登錄后才能下訂單哦!
本篇內容主要講解“istio基本功能有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“istio基本功能有哪些”吧!
隨著單片應用程序向分布式微服務架構過渡 ,特別是服務之間呈現拓撲狀的復雜關系,service mesh的提出就是為了簡化管理微服務之間的通信問題。為了實現微服務 Service Mesh 模式和諸多理念,Google , IBM 和 Lyft 這三家公司協同研發,并于 2017 年 6 月 8 日( 根據 Github 最后一次提交的時間 )發布了 Istio 的第一個發行版——Istio 0.1 版本。
istio分為控制面和數據面
數據面:由一組sidecar組成,對應具體的組件為envoy;通過給每個應用啟動一個輕量級的網絡代理,來執行對網絡通信的控制和調整,Sidecar和外圍代理,實現客戶端和服務器之間的安全通信;
控制面:負責管理和配置代理流量。具體通過mixer組件下發策略給envoy,執行策略并對各個sidecar收集數據。 Citadel用于密鑰和證書管理;pilot將身份驗證策略和安全命名信息分發到代理;mixer用于管理授權和審核。
流量管理:
下圖顯示了pilot的服務發現過程。
istio根據Kubernetes的適配器發現并注冊service后,流量規則會由pilot解析成envoy理解的格式傳送給Sidecar,進而控制服務間的流量和 API 調用。Istio 簡化了斷路器、超時和重試等服務級別屬性的配置,并且可以輕松設置 A/B 測試、金絲雀部署和基于百分比的流量分割的分階段部署等重要任務。
安全:
Istio提供底層安全通信通道,使開發人員可以專注于應用程序級別的安全,并提供大規模管理服務通信的身份驗證、授權和加密。使用Istio,服務通信在默認情況下是安全的,可以跨不同的協議和運行時一致地實施策略,所有這些都只需很少或根本不需要更改應用程序。
安全涉及的幾個組件及架構如下所示:
Citadel:用于密鑰和證書管理。
Sidecar和外圍代理:實現客戶端和服務器之間的安全通信。
pilot:將身份驗證策略和安全命名信息分發到代理。
mixer:用于管理授權和審核。
策略定制: 為應用程序配置自定義策略,以在運行時強制執行規則,如動態限制服務的通信量,通過名單限制對服務的訪問,也可以創建自己的策略適配器,添加自定義授權行為。
可觀察性: Istio強大的跟蹤、監控和日志記錄功能可讓人深入了解服務網格的部署。通過Istio的監控功能,可以真正了解服務性能對上下游的影響,同時其定制的儀表盤可查看所有服務的性能,并了解該性能對其他流程有何影響。
本環境基于Kubernets1.14和istio1.13版本進行驗證。其中下面的例子都在官方鏈接的samples目錄中,官方鏈接[1]istio官方例子
1、流量管理:
為了填充自己的服務注冊表,Istio連接到服務發現系統,而在Kubernetes集群上安裝了Istio,Istio會自動檢測該集群中的服務和端點,使用此服務注冊表,代理就可以將流量定向到相關服務。默認情況下同一工作負載多個實例,流量會平均分發,而作為A/B測試的一部分,也可以將特定百分比的流量定向到服務的新版本,或者對特定服務實例子集的流量應用不同的負載平衡策略。還可以對進出Mesh的流量應用特殊規則,或者將Mesh的外部依賴項添加到服務注冊表。
以官方的bookinfo為例,使用對同一程序多版本的流量管理,具體配置如下:
自注入使能
kubectl label namespace default istio-injection=enabled
部署bookinfo到default namespaces,bookinfo服務之間默認的調用關系如下圖:
可創建virtualService全部流量導向reviews-v1,yaml文件中host指向的是reviews service,只指定了v1版本,因此流量全導向reviews v1。
virtualService yaml如下:
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: reviews spec: hosts: - reviews http: - route: - destination: host: reviews subset: v1
2、安全,主要提供服務網格之間安全訪問,這里以enable TLS為例。
創建meshPolicy全局enable tls
kubectl apply -f - <<EOF apiVersion: "authentication.istio.io/v1alpha1" kind: "MeshPolicy" metadata: name: "default" spec: peers: - mtls: {} EOF
因為使能了TLS,所以不帶證書訪問會報錯,直接http訪問結果如下:
for from in "foo">
創建 destination rules使能TLS,目標是所有的集群內部的服務,然后服務之間就可以正常的訪問了,使能TLS的操作如下:
kubectl apply -f - <<EOF apiVersion: "networking.istio.io/v1alpha3" kind: "DestinationRule" metadata: name: "default" namespace: "istio-system" spec: host: "*.local" trafficPolicy: tls: mode: ISTIO_MUTUAL EOF
根據destination rules,訪問所有集群內部服務都會帶上TLS證書進行訪問,使能TLS的訪問結果:
for from in "foo" "bar"; do for to in "foo" "bar"; do kubectl exec $(kubectl get pod -l app=sleep -n ${from} -o jsonpath={.items..metadata.name}) -c sleep -n ${from} -- curl "http://httpbin.${to}:8000/ip" -s -o /dev/null -w "sleep.${from} to httpbin.${to}: %{http_code}\n"; done; done sleep.foo to httpbin.foo: 200 sleep.foo to httpbin.bar: 200 sleep.bar to httpbin.foo: 200 sleep.bar to httpbin.bar: 200
除了全局指定tls,也可以單獨指定namespace使能TLS,操作如下:
kubectl apply -f - <<EOF apiVersion: "authentication.istio.io/v1alpha1" kind: "Policy" metadata: name: "default" namespace: "foo" spec: peers: - mtls: {} EOF kubectl apply -f - <<EOF apiVersion: "networking.istio.io/v1alpha3" kind: "DestinationRule" metadata: name: "default" namespace: "foo" spec: host: "*.foo.svc.cluster.local" trafficPolicy: tls: mode: ISTIO_MUTUAL EOF
指定特定service tls,操作如下:
cat <<EOF | kubectl apply -n bar -f - apiVersion: "authentication.istio.io/v1alpha1" kind: "Policy" metadata: name: "httpbin" spec: targets: - name: httpbin peers: - mtls: {} EOF cat <<EOF | kubectl apply -n bar -f - apiVersion: "networking.istio.io/v1alpha3" kind: "DestinationRule" metadata: name: "httpbin" spec: host: "httpbin.bar.svc.cluster.local" trafficPolicy: tls: mode: ISTIO_MUTUAL EOF
3、策略
這里還是以官方的bookinfo為例,指定應用拒絕訪問。
首先修改istio configmap修改disablePolicyChecks為false,使能policy;然后制定策略拒絕v3版本的訪問版本,匹配源為reviews v3和目的ratings制定rule對應handler為拒絕訪問,yaml如下:
apiVersion: "config.istio.io/v1alpha2" kind: handler metadata: name: denyreviewsv3handler spec: compiledAdapter: denier params: status: code: 7 message: Not allowed --- apiVersion: "config.istio.io/v1alpha2" kind: instance metadata: name: denyreviewsv3request spec: compiledTemplate: checknothing --- apiVersion: "config.istio.io/v1alpha2" kind: rule metadata: name: denyreviewsv3 spec: match: destination.labels["app"] == "ratings" && source.labels["app"]=="reviews" && source.labels["version"] == "v3" actions: - handler: denyreviewsv3handler instances: [ denyreviewsv3request ]
4、可觀察性
Istio為網格內的所有服務通信生成詳細的telemetry信息。此telemetry提供服務行為的可觀察性,使運維人員能夠對應用程序進行故障排除、維護和優化, 具體通過三個方面表現,第一個是metrics即指標,Istio根據監控的四個維度(延遲、流量、錯誤和飽和度)生成一組服務指標,暴露給proetheus。第二個是訪問日志,當流量流入網格內的服務時,Istio可以生成每個請求的完整記錄,包括源和目標元數據。此信息使操作員能夠審核服務行為,直至各個工作負載實例級別。 第三個是分布式跟蹤, Istio提供了一種通過監視流經網格的各個請求來監視和了解行為的方法,了解服務網狀網內的服務依賴關系和延遲來源。
以bookinfo為例,配置istio自動收集服務指標,每次調用網格內的服務,都會有相應的指標生成。
配置收集metrics的yaml文件如下:
# Configuration for metric instances apiVersion: config.istio.io/v1alpha2 kind: instance metadata: name: doublerequestcount namespace: istio-system spec: compiledTemplate: metric params: value: "2" # count each request twice dimensions: reporter: conditional((context.reporter.kind | "inbound") == "outbound", "client", "server") source: source.workload.name | "unknown" destination: destination.workload.name | "unknown" message: '"twice the fun!"' monitored_resource_type: '"UNSPECIFIED"' --- # Configuration for a Prometheus handler apiVersion: config.istio.io/v1alpha2 kind: handler metadata: name: doublehandler namespace: istio-system spec: compiledAdapter: prometheus params: metrics: - name: double_request_count # Prometheus metric name instance_name: doublerequestcount.instance.istio-system # Mixer instance name (fully-qualified) kind: COUNTER label_names: - reporter - source - destination - message --- # Rule to send metric instances to a Prometheus handler apiVersion: config.istio.io/v1alpha2 kind: rule metadata: name: doubleprom namespace: istio-system spec: actions: - handler: doublehandler instances: [ doublerequestcount ]
在prometheus graph界面搜索istio_double_request_count
日志功能,使用資源instance,handler,rule創建,具體內容如下:
# Configuration for logentry instances apiVersion: config.istio.io/v1alpha2 kind: instance metadata: name: newlog namespace: istio-system spec: compiledTemplate: logentry params: severity: '"warning"' timestamp: request.time variables: source: source.labels["app"] | source.workload.name | "unknown" user: source.user | "unknown" destination: destination.labels["app"] | destination.workload.name | "unknown" responseCode: response.code | 0 responseSize: response.size | 0 latency: response.duration | "0ms" monitored_resource_type: '"UNSPECIFIED"' --- # Configuration for a stdio handler apiVersion: config.istio.io/v1alpha2 kind: handler metadata: name: newloghandler namespace: istio-system spec: compiledAdapter: stdio params: severity_levels: warning: 1 # Params.Level.WARNING outputAsJson: true --- # Rule to send logentry instances to a stdio handler apiVersion: config.istio.io/v1alpha2 kind: rule metadata: name: newlogstdio namespace: istio-system spec: match: "true">
訪問productpage,可以看到有對應的日志生成,操作如下:
kubectl logs -n istio-system -l istio-mixer-type=telemetry -c mixer | grep "newlog" | grep -v '"destination":"telemetry"' | grep -v '"destination":"pilot"' | grep -v '"destination":"policy"' | grep -v '"destination":"unknown"' {"level":"warn","time":"2019-12-16T16:45:53.950607Z","instance":"newlog.instance.istio-system","destination":"ratings","latency":"1.494269ms","responseCode":200,"responseSize":48,"source":"reviews","user":"unknown"}
分布式跟蹤,使用jaeger進行trace, 默認采樣率為1%。至少需要發送100個請求,才能看到一個跟蹤,訪問productpage操作:
for i in `seq 1 100`; do curl -s -o /dev/null http://$GATEWAY_URL/productpage; done
到此,相信大家對“istio基本功能有哪些”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。