Deployment 名稱 | 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 |
其中,流量的走向以下圖所示:node
說明:紅色線表示控制流,黑色線表示數據流,藍色部分爲Envoy和pilot相關組件web
istio主要有兩部分組成: 控制面和數據面。算法
Pilot: Istio的核心流量控制組件,主要負責流量管理。Pilot管理了全部Envoy的代理實例(Sidecar),主要有如下功能:docker
Mixer: 主要是預檢查和彙報工做,策略控制,監控,和日誌收集等。主要工做流程以下:json
Citadel: 主要用於證書管理和身份認證。bootstrap
Sidecar(Envoy): Istio中的數據面,負責控制對服務網格控制的實際執行。api
Istio經過K8s的Admission webhook[9]機制實現了sidecar的自動注入,Mesh中的每一個微服務pod會被加入Envoy相關的容器。
除了微服務自身的容器外,istio還在Pod中注入proxy_init
和proxyv2
兩個容器。其中proxyv2容器中運行的兩個進程是數據面的核心。網絡
proxy_init是一個initContainer, 主要用於在啓動Pod前作一些初始化的工做,只有當InitContainer執行成功以後,纔會啓動Pod中的其餘container。負載均衡
能夠經過docker inspect
命令,來獲取此容器鏡像的元數據:curl
... "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中執行的命令是istio-iptables.sh腳本,腳本具體內容能夠直接從已存在的容器拷貝出來進行查看:
docker cp cbbaf5413d04:/usr/local/bin/istio-iptables.sh ./
這個腳本主要設置了Istio sidecar的iptables端口轉發規則。
伴隨着業務容器長久運行的注入容器是istio-proxy,這個容器負責截取POD中全部流入流出的流量。
經過以下命令,能夠看到在此容器中運行的進程:
[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
這個容器中主要運行了兩個進程:
經過對envoy-rev0.json文件進行分析,咱們能夠發現其主要包含了以下幾個部分:
curl http://127.0.0.1:15000/help
獲取當前POD的接口和狀態信息登陸istio-proxy查看監聽的端口,其中80端口爲業務容器提供服務的端口:
$ 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
流程圖示:
Envoy中實際生效的配置是由初始化配置文件中的靜態配置和從Pilot獲取的動態配置一塊兒組成的。所以只對envoy-rev0 .json進行分析並不能看到Mesh中流量管理的全貌。那麼有沒有辦法能夠看到Envoy中實際生效的完整配置呢?答案是能夠的,咱們能夠經過Envoy的管理接口來獲取Envoy的完整配置:
kubectl -n yak exec yak-files-7d48cd48f-tf75f -c istio-proxy curl http://127.0.0.1:15000/config_dump > config_dump
查看此文件的結構:
{ "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] } ] }
配置中主要包含了以下幾部分:
官方bookinfo服務調用示意圖:
參考連接:https://zhaohuabing.com/post/2018-09-25-istio-traffic-management-impl-intro/