溫馨提示×

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

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

istio組件介紹和啟動(dòng)流程

發(fā)布時(shí)間:2020-10-06 11:00:04 來(lái)源:網(wǎng)絡(luò) 閱讀:1716 作者:酥心糖 欄目:云計(jì)算

Istio各個(gè)Deployment包含的容器組件

Deployment 名稱(chēng) Container和Port Container和Port
istio-pilot pilot: 8080,15010 proxyv2: 15003,15005,15007
istio-galley galley: 443,9093
istio-egressgateway proxyv2: 80,443,15090
istio-ingressgateway proxyv2: 80,443,31400,15011,8060,853,15030,15031,15090
grafana grafana: 3000
istio-policy mixer: 9093,42422 proxyv2: 9091,15004,15090
istio-telemetry mixer: 9093,42422 proxyv2: 9091,15004,15090
prometheus prometheus: 9090
istio-citadel citadel: 8086
istio-sidecar-injector sidecar-injector
istio-tracing jaegertracing/all-in-one: 9411,16686 UDP:5775,6832,6831
istio-ingress proxyv2: 80,443

其中,流量的走向如下圖所示:

istio組件介紹和啟動(dòng)流程

說(shuō)明:紅色線(xiàn)表示控制流,黑色線(xiàn)表示數(shù)據(jù)流,藍(lán)色部分為Envoy和pilot相關(guān)組件

Istio核心組件與功能

istio主要有兩部分組成: 控制面和數(shù)據(jù)面。

  • 數(shù)據(jù)面被稱(chēng)為Sidecar: 會(huì)在業(yè)務(wù)Pod中注入一個(gè)容器,劫持業(yè)務(wù)應(yīng)用容器的流量,并接受控制組件的控制,同時(shí)會(huì)向控制組件輸出日志,跟蹤及監(jiān)控?cái)?shù)據(jù)。
  • 控制面是Istio的核心,管理Istio的所有功能。

Pilot: Istio的核心流量控制組件,主要負(fù)責(zé)流量管理。Pilot管理了所有Envoy的代理實(shí)例(Sidecar),主要有以下功能:

  • 從K8S或者其它平臺(tái)注冊(cè)中心回去服務(wù)信息,完成服務(wù)發(fā)現(xiàn)
  • 讀取Istio的各項(xiàng)控制配置,在進(jìn)行裝換后將其發(fā)給數(shù)據(jù)組件進(jìn)行實(shí)施。
  • 數(shù)據(jù)組件Sidecar根據(jù)Pilot指令,完成 路由、服務(wù)、監(jiān)聽(tīng)、集群等配置。

Mixer: 主要是預(yù)檢查和匯報(bào)工作,策略控制,監(jiān)控,和日志收集等。主要工作流程如下:

  • 用戶(hù)將Mixer配置發(fā)送到Kubernetes集群中
  • Mixer通過(guò)對(duì)集群資源的監(jiān)聽(tīng),獲取配置的變化。
  • 網(wǎng)格中的服務(wù)每次在調(diào)用前,都會(huì)向Mixer發(fā)出預(yù)檢請(qǐng)求,查看是否允許執(zhí)行。在服務(wù)完成調(diào)用后,會(huì)向Mixer發(fā)出報(bào)告信息,匯報(bào)在調(diào)用過(guò)程中產(chǎn)生的監(jiān)控跟蹤數(shù)據(jù)。
  • Mixer 中包含多個(gè)Adapter的組件,這些組件來(lái)處理在Mixer中接收的預(yù)檢報(bào)告數(shù)據(jù),完成Mixer的各項(xiàng)功能。

Citadel: 主要用于證書(shū)管理和身份認(rèn)證。

Sidecar(Envoy): Istio中的數(shù)據(jù)面,負(fù)責(zé)控制對(duì)服務(wù)網(wǎng)格控制的實(shí)際執(zhí)行。

  • Istio中默認(rèn)的Sidecar是由Envoy派生出的,實(shí)際理論上只要支持Envoy的xDS協(xié)議(x descovery service 各類(lèi)服務(wù)發(fā)現(xiàn)的總稱(chēng)),其他類(lèi)似的反向代理軟件就能替代Envoy來(lái)?yè)?dān)當(dāng)此角色。
  • Istio 利用istio-init初始化容器中的iptables指令,對(duì)所在Pod的流量進(jìn)行劫持,從而接管Pod應(yīng)用中的通信。
  • Sidecar在注入到Pod之后,將原有的源容器 -> 目標(biāo)容器的通信方式改變?yōu)?源容器 -> Sidecar -> Sidecar -> 目標(biāo)容器。

數(shù)據(jù)面組件

Istio通過(guò)K8s的Admission webhook[9]機(jī)制實(shí)現(xiàn)了sidecar的自動(dòng)注入,Mesh中的每個(gè)微服務(wù)pod會(huì)被加入Envoy相關(guān)的容器。
除了微服務(wù)自身的容器外,istio還在Pod中注入proxy_initproxyv2 兩個(gè)容器。其中proxyv2容器中運(yùn)行的兩個(gè)進(jìn)程是數(shù)據(jù)面的核心。

proxy_init

proxy_init是一個(gè)initContainer, 主要用于在啟動(dòng)Pod前做一些初始化的工作,只有當(dāng)InitContainer執(zhí)行成功之后,才會(huì)啟動(dòng)Pod中的其他container。

可以通過(guò)docker inspect 命令,來(lái)獲取此容器鏡像的元數(shù)據(jù):

...
           "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) COPY file:1e5fc95e10f8888f4cae33f7e0ea42b5aff9d18d36280ae288a0fee948dc18e1 in / "
            ],
            "ArgsEscaped": true,
            "Image": "sha256:e261e1418e2ed94d1de1742d80997cc58f96aa3c4bfc56cd50e7f2848bf5bcf6",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": [
                "/usr/local/bin/istio-iptables.sh"
            ],

...

從上面的命令行輸出可以看到,Proxy_init中執(zhí)行的命令是istio-iptables.sh腳本,腳本具體內(nèi)容可以直接從已存在的容器拷貝出來(lái)進(jìn)行查看:

docker cp cbbaf5413d04:/usr/local/bin/istio-iptables.sh ./

這個(gè)腳本主要設(shè)置了Istio sidecar的iptables端口轉(zhuǎn)發(fā)規(guī)則。

proxyv2

伴隨著業(yè)務(wù)容器長(zhǎng)久運(yùn)行的注入容器是istio-proxy,這個(gè)容器負(fù)責(zé)截取POD中所有流入流出的流量。
通過(guò)如下命令,可以看到在此容器中運(yùn)行的進(jìn)程:

[root@k8s-node-1 ~]# kubectl exec reviews-v3-748456d47b-6jvsp -c istio-proxy -- ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
istio-p+     1     0  0 02:26 ?        00:00:00 /usr/local/bin/pilot-agent proxy sidecar --configPath /etc/istio/proxy --binaryPath /usr/local/bin/envoy --serviceCluster reviews --drainDuration 45s --parentShutdownDuration 1m0s --discoveryAddress istio-pilot.istio-system:15007 --discoveryRefreshDelay 1s --zipkinAddress zipkin.istio-system:9411 --connectTimeout 10s --proxyAdminPort 15000 --controlPlaneAuthPolicy NONE
istio-p+    16     1  0 02:26 ?        00:03:37 /usr/local/bin/envoy -c /etc/istio/proxy/envoy-rev0.json --restart-epoch 0 --drain-time-s 45 --parent-shutdown-time-s 60 --service-cluster reviews --service-node sidecar~10.2.53.61~reviews-v3-748456d47b-6jvsp.default~default.svc.cluster.local --max-obj-name-len 189 --allow-unknown-fields -l warn --v2-config-only
istio-p+    39     0  0 13:07 ?        00:00:00 ps -ef

這個(gè)容器中主要運(yùn)行了兩個(gè)進(jìn)程:

  • pilot-agent: 負(fù)責(zé)生成Envoy啟動(dòng)所需的配置文件,指定了連接istio控制面的服務(wù)和端口,并負(fù)責(zé)啟動(dòng)Envoy進(jìn)程。
  • envoy:其中指定的/etc/istio/proxy/envoy-rev0.json文件是當(dāng)前pod的網(wǎng)絡(luò)流量的核心配置,通過(guò)此文件獲取pilot的地址,其中記錄了當(dāng)前的POD信息和流量的轉(zhuǎn)發(fā)規(guī)則,pilot會(huì)與其建立長(zhǎng)連接,并向其推送最新更新的網(wǎng)絡(luò)策略。

通過(guò)對(duì)envoy-rev0.json文件進(jìn)行分析,我們可以發(fā)現(xiàn)其主要包含了如下幾個(gè)部分:

  • node: 包含了當(dāng)前Pod信息,包括ID,IP,servicename,namespace等。
  • stats_config:定義了一些命名規(guī)則和對(duì)應(yīng)的正則參數(shù)
  • admin:給出了一組本地IP 127.0.0.1和15000管理端口,可以登錄此容器執(zhí)行curl http://127.0.0.1:15000/help 獲取當(dāng)前POD的接口和狀態(tài)信息
  • dynamic_resources:定義了xDS的服務(wù)發(fā)現(xiàn)配置
  • static_resources:定義了連接控制面的信息,包括連接pilot組件的服務(wù)地址,以及超時(shí)時(shí)間設(shè)置和連接數(shù)限制等配置信息。
  • tracing:主要定義了zipkin的接口等信息,用于追蹤業(yè)務(wù)流量的走向。

登錄istio-proxy查看監(jiān)聽(tīng)的端口,其中80端口為業(yè)務(wù)容器提供服務(wù)的端口:

$ netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:15001           0.0.0.0:*               LISTEN      13/envoy        
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      -               
tcp        0      0 0.0.0.0:15090           0.0.0.0:*               LISTEN      13/envoy        
tcp        0      0 127.0.0.1:15000         0.0.0.0:*               LISTEN      13/envoy        
tcp6       0      0 :::15020                :::*                    LISTEN      1/pilot-agent  
  • 15001: Envoy的入口監(jiān)聽(tīng)器,iptable會(huì)將pod的流量導(dǎo)入該端口中由Envoy進(jìn)行處理
  • 15000: Envoy管理端口,該端口綁定在本地環(huán)回地址上,只能在Pod內(nèi)訪(fǎng)問(wèn)。
數(shù)據(jù)面組件啟動(dòng)流程

流程圖示:

istio組件介紹和啟動(dòng)流程

  1. initContainer執(zhí)行初始化腳本,為Pod添加iptables規(guī)則
  2. Pilot-agent根據(jù)啟動(dòng)參數(shù)和K8S API Server中的配置信息生成Envoy的初始配置文件envoy-rev0.json,該文件告訴Envoy從xDS server中獲取動(dòng)態(tài)配置信息,并配置了xDS server的地址信息,即控制面的Pilot。
  3. Pilot-agent使用envoy-rev0.json啟動(dòng)Envoy進(jìn)程。
  4. Envoy根據(jù)初始配置獲得Pilot地址,采用xDS接口從Pilot獲取到Listener,Cluster,Route等d動(dòng)態(tài)配置信息。
  5. Envoy根據(jù)獲取到的動(dòng)態(tài)配置啟動(dòng)Listener,并根據(jù)Listener的配置,結(jié)合Route和Cluster對(duì)攔截到的流量進(jìn)行處理。
Envoy配置文件結(jié)構(gòu)

Envoy中實(shí)際生效的配置是由初始化配置文件中的靜態(tài)配置和從Pilot獲取的動(dòng)態(tài)配置一起組成的。因此只對(duì)envoy-rev0 .json進(jìn)行分析并不能看到Mesh中流量管理的全貌。那么有沒(méi)有辦法可以看到Envoy中實(shí)際生效的完整配置呢?答案是可以的,我們可以通過(guò)Envoy的管理接口來(lái)獲取Envoy的完整配置:

 kubectl -n yak exec yak-files-7d48cd48f-tf75f -c istio-proxy curl http://127.0.0.1:15000/config_dump > config_dump

查看此文件的結(jié)構(gòu):

{
    "configs":[
        {
            "@type":"type.googleapis.com/envoy.admin.v2alpha.BootstrapConfigDump",
            "bootstrap":Object{...},
            "last_updated":"2019-05-08T08:07:28.221Z"
        },
        {
            "@type":"type.googleapis.com/envoy.admin.v2alpha.ClustersConfigDump",
            "version_info":"2019-05-09T08:36:01Z/4",
            "static_clusters":Array[3],
            "dynamic_active_clusters":Array[96]
        },
        {
            "@type":"type.googleapis.com/envoy.admin.v2alpha.ListenersConfigDump",
            "version_info":"2019-05-09T08:36:01Z/4",
            "static_listeners":Array[1],
            "dynamic_active_listeners":Array[57]
        },
        {
            "@type":"type.googleapis.com/envoy.admin.v2alpha.RoutesConfigDump",
            "static_route_configs":Array[3],
            "dynamic_route_configs":Array[17]
        }
    ]
}

配置中主要包含了如下幾部分:

  • bootstrap:文件中的內(nèi)容和之前介紹的envoy-rev0.json是一致的
  • clusters: 是一個(gè)服務(wù)集群,包含一個(gè)到多個(gè)endpoint,每個(gè)endpoint都可以提供服務(wù),Envoy根據(jù)負(fù)載均衡算法將請(qǐng)求發(fā)送到這些endpoint中。
    • static_clusters: 是來(lái)自于envoy-rev0.json的xDS server和zipkin server信息。
    • dynamic_active_clusters : 是通過(guò)xDS接口從Istio控制面獲取的動(dòng)態(tài)服務(wù)信息。
  • listeners: Envoy采用listener來(lái)接收并處理downstream發(fā)過(guò)來(lái)的請(qǐng)求,listener的處理邏輯是插件式的,可以通過(guò)配置不同的filter來(lái)插入不同的處理邏輯。
    • static_listeners
    • dynamic_active_listeners
  • routes: 配置Envoy的路由規(guī)則。Istio下發(fā)的缺省路由規(guī)則中對(duì)每個(gè)端口設(shè)置了一個(gè)路由規(guī)則,根據(jù)host來(lái)對(duì)請(qǐng)求進(jìn)行路由分發(fā)。
    • static_route_configs
    • dynamic_route_configs

官方bookinfo服務(wù)調(diào)用示意圖:

istio組件介紹和啟動(dòng)流程

參考鏈接:https://zhaohuabing.com/post/2018-09-25-istio-traffic-management-impl-intro/

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

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guā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