理解Istio中的Sidecar注入及流量劫持Part2
上接理解Istio中的Sidecar注入及流量劫持Part1
查看 Envoy 运行状态
首先查看 proxyv2 镜像的 Dockerfile。
FROM istionightly/base_debug
ARG proxy_version
ARG istio_version
?
# 安装 Envoy
ADD envoy /usr/local/bin/envoy
?
# 使用环境变数的方式明文指定 proxy 的版本/功能
ENV ISTIO_META_ISTIO_PROXY_VERSION "1.1.0"
# 使用环境变数的方式明文指定 proxy 明确的 sha,用于指定版本的配置和调试
ENV ISTIO_META_ISTIO_PROXY_SHA $proxy_version
# 环境变数,指定明确的构建号,用于调试
ENV ISTIO_META_ISTIO_VERSION $istio_version
?
ADD pilot-agent /usr/local/bin/pilot-agent
?
ADD envoy_pilot.yaml.tmpl /etc/istio/proxy/envoy_pilot.yaml.tmpl
ADD envoy_policy.yaml.tmpl /etc/istio/proxy/envoy_policy.yaml.tmpl
ADD envoy_telemetry.yaml.tmpl /etc/istio/proxy/envoy_telemetry.yaml.tmpl
ADD istio-iptables.sh /usr/local/bin/istio-iptables.sh
?
COPY envoy_bootstrap_v2.json /var/lib/istio/envoy/envoy_bootstrap_tmpl.json
?
RUN chmod 755 /usr/local/bin/envoy /usr/local/bin/pilot-agent
?
# 将 istio-proxy 用户加入 sudo 许可权以允许执行 tcpdump 和其他调试命令
RUN useradd -m --uid 1337 istio-proxy &&
echo "istio-proxy ALL=NOPASSWD: ALL" >> /etc/sudoers &&
chown -R istio-proxy /var/lib/istio
?
# 使用 pilot-agent 来启动 Envoy
ENTRYPOINT ["/usr/local/bin/pilot-agent"]
该容器的启动入口是 pilot-agent 命令,根据 YAML 配置中传递的参数,详细的启动命令入下:
/usr/local/bin/pilot-agent proxy sidecar --configPath /etc/istio/proxy --binaryPath /usr/local/bin/envoy --serviceCluster productpage --drainDuration 45s --parentShutdownDuration 1m0s --discoveryAddress istio-pilot.istio-system:15007 --discoveryRefreshDelay 1s --zipkinAddress zipkin.istio-system:9411 --connectTimeout 10s --statsdUdpAddress istio-statsd-prom-bridge.istio-system:9125 --proxyAdminPort 15000 --controlPlaneAuthPolicy NONE
主要配置了 Envoy 二进位文件的位置、服务发现地址、服务集群名、监控指标上报地址、Envoy 的管理埠、热重启时间等,详细用法请参考 Istio官方文档 pilot-agent 的用法。
pilot-agent 是容器中 PID 为 1 的启动进程,它启动时又创建了一个 Envoy 进程,如下:
/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 productpage --service-node sidecar~172.33.78.10~productpage-v1-745ffc55b7-2l2lw.default~default.svc.cluster.local --max-obj-name-len 189 -l warn --v2-config-only
我们分别解释下以上配置的意义。
- -c /etc/istio/proxy/envoy-rev0.json:配置文件,支持 .json、.yaml、.pb 和 .pb_text 格式,pilot-agent 启动的时候读取了容器的环境变数后创建的。
- --restart-epoch 0:Envoy 热重启周期,第一次启动默认为 0,每热重启一次该值加 1。
- --drain-time-s 45:热重启期间 Envoy 将耗尽连接的时间。
- --parent-shutdown-time-s 60: Envoy 在热重启时关闭父进程之前等待的时间。
- --service-cluster productpage:Envoy 运行的本地服务集群的名字。
- --service-node sidecar~172.33.78.10~productpage-v1-745ffc55b7-2l2lw.default~default.svc.cluster.local:定义 Envoy 运行的本地服务节点名称,其中包含了该 Pod 的名称、IP、DNS 域等信息,根据容器的环境变数拼出来的。
- -max-obj-name-len 189:cluster/route_config/listener 中名称栏位的最大长度(以位元组为单位)
- -l warn:日志级别
- --v2-config-only:只解析 v2 引导配置文件
详细配置请参考 Envoy 的命令行选项。
查看 Envoy 的配置文件 /etc/istio/proxy/envoy-rev0.json。
{
"node": {
"id": "sidecar~172.33.78.10~productpage-v1-745ffc55b7-2l2lw.default~default.svc.cluster.local",
"cluster": "productpage",
?
"metadata": {
"INTERCEPTION_MODE": "REDIRECT",
"ISTIO_PROXY_SHA": "istio-proxy:6166ae7ebac7f630206b2fe4e6767516bf198313",
"ISTIO_PROXY_VERSION": "1.0.0",
"ISTIO_VERSION": "1.0.0",
"POD_NAME": "productpage-v1-745ffc55b7-2l2lw",
"istio": "sidecar"
}
},
"stats_config": {
"use_all_default_tags": false
},
"admin": {
"access_log_path": "/dev/stdout",
"address": {
"socket_address": {
"address": "127.0.0.1",
"port_value": 15000
}
}
},
"dynamic_resources": {
"lds_config": {
"ads": {}
},
"cds_config": {
"ads": {}
},
"ads_config": {
"api_type": "GRPC",
"refresh_delay": {"seconds": 1, "nanos": 0},
"grpc_services": [
{
"envoy_grpc": {
"cluster_name": "xds-grpc"
}
}
]
}
},
"static_resources": {
"clusters": [
{
"name": "xds-grpc",
"type": "STRICT_DNS",
"connect_timeout": {"seconds": 10, "nanos": 0},
"lb_policy": "ROUND_ROBIN",
?
"hosts": [
{
"socket_address": {"address": "istio-pilot.istio-system", "port_value": 15010}
}
],
"circuit_breakers": {
"thresholds": [
{
"priority": "default",
"max_connections": "100000",
"max_pending_requests": "100000",
"max_requests": "100000"
},
{
"priority": "high",
"max_connections": "100000",
"max_pending_requests": "100000",
"max_requests": "100000"
}]
},
"upstream_connection_options": {
"tcp_keepalive": {
"keepalive_time": 300
}
},
"http2_protocol_options": { }
}
?
?
,
{
"name": "zipkin",
"type": "STRICT_DNS",
"connect_timeout": {
"seconds": 1
},
"lb_policy": "ROUND_ROBIN",
"hosts": [
{
"socket_address": {"address": "zipkin.istio-system", "port_value": 9411}
}
]
}
?
]
},
?
"tracing": {
"http": {
"name": "envoy.zipkin",
"config": {
"collector_cluster": "zipkin"
}
}
},
?
?
"stats_sinks": [
{
"name": "envoy.statsd",
"config": {
"address": {
"socket_address": {"address": "10.254.109.175", "port_value": 9125}
}
}
}
]
?
}
下图是使用 Istio 管理的 bookinfo 示例的访问请求路径图。