溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

istio基本功能有哪些

發(fā)布時(shí)間:2021-12-24 09:56:32 來源:億速云 閱讀:200 作者:iii 欄目:云計(jì)算

本篇內(nèi)容主要講解“istio基本功能有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“istio基本功能有哪些”吧!

一、背景

隨著單片應(yīng)用程序向分布式微服務(wù)架構(gòu)過渡 ,特別是服務(wù)之間呈現(xiàn)拓?fù)錉畹膹?fù)雜關(guān)系,service mesh的提出就是為了簡(jiǎn)化管理微服務(wù)之間的通信問題。為了實(shí)現(xiàn)微服務(wù) Service Mesh 模式和諸多理念,Google , IBM 和 Lyft 這三家公司協(xié)同研發(fā),并于 2017 年 6 月 8 日( 根據(jù) Github 最后一次提交的時(shí)間 )發(fā)布了 Istio 的第一個(gè)發(fā)行版——Istio 0.1 版本。

二、istio架構(gòu)

istio分為控制面和數(shù)據(jù)面

  • 數(shù)據(jù)面:由一組sidecar組成,對(duì)應(yīng)具體的組件為envoy;通過給每個(gè)應(yīng)用啟動(dòng)一個(gè)輕量級(jí)的網(wǎng)絡(luò)代理,來執(zhí)行對(duì)網(wǎng)絡(luò)通信的控制和調(diào)整,Sidecar和外圍代理,實(shí)現(xiàn)客戶端和服務(wù)器之間的安全通信;

  • 控制面:負(fù)責(zé)管理和配置代理流量。具體通過mixer組件下發(fā)策略給envoy,執(zhí)行策略并對(duì)各個(gè)sidecar收集數(shù)據(jù)。 Citadel用于密鑰和證書管理;pilot將身份驗(yàn)證策略和安全命名信息分發(fā)到代理;mixer用于管理授權(quán)和審核。

三、核心功能

流量管理:

下圖顯示了pilot的服務(wù)發(fā)現(xiàn)過程。

istio根據(jù)Kubernetes的適配器發(fā)現(xiàn)并注冊(cè)service后,流量規(guī)則會(huì)由pilot解析成envoy理解的格式傳送給Sidecar,進(jìn)而控制服務(wù)間的流量和 API 調(diào)用。Istio 簡(jiǎn)化了斷路器、超時(shí)和重試等服務(wù)級(jí)別屬性的配置,并且可以輕松設(shè)置 A/B 測(cè)試、金絲雀部署和基于百分比的流量分割的分階段部署等重要任務(wù)。

安全:

Istio提供底層安全通信通道,使開發(fā)人員可以專注于應(yīng)用程序級(jí)別的安全,并提供大規(guī)模管理服務(wù)通信的身份驗(yàn)證、授權(quán)和加密。使用Istio,服務(wù)通信在默認(rèn)情況下是安全的,可以跨不同的協(xié)議和運(yùn)行時(shí)一致地實(shí)施策略,所有這些都只需很少或根本不需要更改應(yīng)用程序。

安全涉及的幾個(gè)組件及架構(gòu)如下所示:
 Citadel:用于密鑰和證書管理。

Sidecar和外圍代理:實(shí)現(xiàn)客戶端和服務(wù)器之間的安全通信。

pilot:將身份驗(yàn)證策略和安全命名信息分發(fā)到代理。

mixer:用于管理授權(quán)和審核。

策略定制: 為應(yīng)用程序配置自定義策略,以在運(yùn)行時(shí)強(qiáng)制執(zhí)行規(guī)則,如動(dòng)態(tài)限制服務(wù)的通信量,通過名單限制對(duì)服務(wù)的訪問,也可以創(chuàng)建自己的策略適配器,添加自定義授權(quán)行為。

可觀察性: Istio強(qiáng)大的跟蹤、監(jiān)控和日志記錄功能可讓人深入了解服務(wù)網(wǎng)格的部署。通過Istio的監(jiān)控功能,可以真正了解服務(wù)性能對(duì)上下游的影響,同時(shí)其定制的儀表盤可查看所有服務(wù)的性能,并了解該性能對(duì)其他流程有何影響。

四、基本功能驗(yàn)證

本環(huán)境基于Kubernets1.14和istio1.13版本進(jìn)行驗(yàn)證。其中下面的例子都在官方鏈接的samples目錄中,官方鏈接[1]istio官方例子

1、流量管理:

為了填充自己的服務(wù)注冊(cè)表,Istio連接到服務(wù)發(fā)現(xiàn)系統(tǒng),而在Kubernetes集群上安裝了Istio,Istio會(huì)自動(dòng)檢測(cè)該集群中的服務(wù)和端點(diǎn),使用此服務(wù)注冊(cè)表,代理就可以將流量定向到相關(guān)服務(wù)。默認(rèn)情況下同一工作負(fù)載多個(gè)實(shí)例,流量會(huì)平均分發(fā),而作為A/B測(cè)試的一部分,也可以將特定百分比的流量定向到服務(wù)的新版本,或者對(duì)特定服務(wù)實(shí)例子集的流量應(yīng)用不同的負(fù)載平衡策略。還可以對(duì)進(jìn)出Mesh的流量應(yīng)用特殊規(guī)則,或者將Mesh的外部依賴項(xiàng)添加到服務(wù)注冊(cè)表。

以官方的bookinfo為例,使用對(duì)同一程序多版本的流量管理,具體配置如下:

自注入使能

kubectl label namespace default istio-injection=enabled

部署bookinfo到default namespaces,bookinfo服務(wù)之間默認(rèn)的調(diào)用關(guān)系如下圖:

可創(chuàng)建virtualService全部流量導(dǎo)向reviews-v1,yaml文件中host指向的是reviews service,只指定了v1版本,因此流量全導(dǎo)向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、安全,主要提供服務(wù)網(wǎng)格之間安全訪問,這里以enable TLS為例。

創(chuàng)建meshPolicy全局enable tls

kubectl apply -f - <<EOF
apiVersion: "authentication.istio.io/v1alpha1"
kind: "MeshPolicy"
metadata:
  name: "default"
spec:
  peers:
  - mtls: {}
EOF

因?yàn)槭鼓芰薚LS,所以不帶證書訪問會(huì)報(bào)錯(cuò),直接http訪問結(jié)果如下:

for from in "foo">

創(chuàng)建 destination rules使能TLS,目標(biāo)是所有的集群內(nèi)部的服務(wù),然后服務(wù)之間就可以正常的訪問了,使能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

根據(jù)destination rules,訪問所有集群內(nèi)部服務(wù)都會(huì)帶上TLS證書進(jìn)行訪問,使能TLS的訪問結(jié)果:

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,也可以單獨(dú)指定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為例,指定應(yīng)用拒絕訪問。

首先修改istio configmap修改disablePolicyChecks為false,使能policy;然后制定策略拒絕v3版本的訪問版本,匹配源為reviews v3和目的ratings制定rule對(duì)應(yīng)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為網(wǎng)格內(nèi)的所有服務(wù)通信生成詳細(xì)的telemetry信息。此telemetry提供服務(wù)行為的可觀察性,使運(yùn)維人員能夠?qū)?yīng)用程序進(jìn)行故障排除、維護(hù)和優(yōu)化, 具體通過三個(gè)方面表現(xiàn),第一個(gè)是metrics即指標(biāo),Istio根據(jù)監(jiān)控的四個(gè)維度(延遲、流量、錯(cuò)誤和飽和度)生成一組服務(wù)指標(biāo),暴露給proetheus。第二個(gè)是訪問日志,當(dāng)流量流入網(wǎng)格內(nèi)的服務(wù)時(shí),Istio可以生成每個(gè)請(qǐng)求的完整記錄,包括源和目標(biāo)元數(shù)據(jù)。此信息使操作員能夠?qū)徍朔?wù)行為,直至各個(gè)工作負(fù)載實(shí)例級(jí)別。 第三個(gè)是分布式跟蹤, Istio提供了一種通過監(jiān)視流經(jīng)網(wǎng)格的各個(gè)請(qǐng)求來監(jiān)視和了解行為的方法,了解服務(wù)網(wǎng)狀網(wǎng)內(nèi)的服務(wù)依賴關(guān)系和延遲來源。

以bookinfo為例,配置istio自動(dòng)收集服務(wù)指標(biāo),每次調(diào)用網(wǎng)格內(nèi)的服務(wù),都會(huì)有相應(yīng)的指標(biāo)生成。

配置收集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創(chuàng)建,具體內(nèi)容如下:

# 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,可以看到有對(duì)應(yīng)的日志生成,操作如下:

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進(jìn)行trace, 默認(rèn)采樣率為1%。至少需要發(fā)送100個(gè)請(qǐng)求,才能看到一個(gè)跟蹤,訪問productpage操作:

for i in `seq 1 100`; do curl -s -o /dev/null http://$GATEWAY_URL/productpage; done

到此,相信大家對(duì)“istio基本功能有哪些”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI