istio - 跟踪出口流量
istio - tracing egress traffic
我安装了 Istio
gateways.istio-egressgateway.enabled = true
我有一个使用外部服务的服务,所以我定义了以下出口规则。
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: external-service1
spec:
hosts:
- external-service1.com
ports:
- number: 80
name: http
protocol: HTTP
- number: 443
name: https
protocol: HTTPS
resolution: DNS
location: MESH_EXTERNAL
但是使用 Jaeger 我看不到外部服务的流量,因此能够检测网络中的问题。
我正在将适当的 headers 转发到外部服务(x-request-id、x-b3-traceid、x-b3-spanid、b3-parentspanid、x-b3-sampled、x -b3-标志,x-ot-span-context)
这是正确的行为吗?
怎么了?
可以只统计内部调用吗?
如何获得出口流量的统计信息?
假设您的服务定义在 Istio 的内部服务注册表中。如果不是请按照说明配置service-defining
.
在 HTTPS 中,所有 HTTP-related 信息,如方法、URL 路径、响应代码,都是加密的,因此 Istio 无法 查看和监控该信息HTTPS。
如果您需要监控访问外部 HTTPS 服务的 HTTP-related 信息,您可能希望让您的应用程序发出 HTTP 请求并配置 Istio 以执行 TLS 发起。
首先,您必须重新定义您的 ServiceEntry 并创建 VirtualService 以重写 HTTP 请求端口并添加 DestinationRule 以执行 TLS 发起。
kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: external-service1
spec:
hosts:
- external-service1.com
ports:
- number: 80
name: http-port
protocol: HTTP
- number: 443
name: http-port-for-tls-origination
protocol: HTTP
resolution: DNS
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: external-service1
spec:
hosts:
- external-service1.com
http:
- match:
- port: 80
route:
- destination:
host: external-service1.com
port:
number: 443
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: external-service1
spec:
host: external-service1.com
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
portLevelSettings:
- port:
number: 443
tls:
mode: SIMPLE # initiates HTTPS when accessing external-service1.com
EOF
VirtualService 将端口 80 上的 HTTP 请求重定向到端口 443,然后相应的 DestinationRule 执行 TLS 发起。与之前的 ServiceEntry 不同,这次 443 端口上的协议是 HTTP,而不是 HTTPS,因为客户端只会发送 HTTP 请求,Istio 会将连接升级为 HTTPS。
希望对您有所帮助。
我安装了 Istio
gateways.istio-egressgateway.enabled = true
我有一个使用外部服务的服务,所以我定义了以下出口规则。
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: external-service1
spec:
hosts:
- external-service1.com
ports:
- number: 80
name: http
protocol: HTTP
- number: 443
name: https
protocol: HTTPS
resolution: DNS
location: MESH_EXTERNAL
但是使用 Jaeger 我看不到外部服务的流量,因此能够检测网络中的问题。
我正在将适当的 headers 转发到外部服务(x-request-id、x-b3-traceid、x-b3-spanid、b3-parentspanid、x-b3-sampled、x -b3-标志,x-ot-span-context)
这是正确的行为吗? 怎么了? 可以只统计内部调用吗? 如何获得出口流量的统计信息?
假设您的服务定义在 Istio 的内部服务注册表中。如果不是请按照说明配置service-defining
.
在 HTTPS 中,所有 HTTP-related 信息,如方法、URL 路径、响应代码,都是加密的,因此 Istio 无法 查看和监控该信息HTTPS。 如果您需要监控访问外部 HTTPS 服务的 HTTP-related 信息,您可能希望让您的应用程序发出 HTTP 请求并配置 Istio 以执行 TLS 发起。
首先,您必须重新定义您的 ServiceEntry 并创建 VirtualService 以重写 HTTP 请求端口并添加 DestinationRule 以执行 TLS 发起。
kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: external-service1
spec:
hosts:
- external-service1.com
ports:
- number: 80
name: http-port
protocol: HTTP
- number: 443
name: http-port-for-tls-origination
protocol: HTTP
resolution: DNS
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: external-service1
spec:
hosts:
- external-service1.com
http:
- match:
- port: 80
route:
- destination:
host: external-service1.com
port:
number: 443
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: external-service1
spec:
host: external-service1.com
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
portLevelSettings:
- port:
number: 443
tls:
mode: SIMPLE # initiates HTTPS when accessing external-service1.com
EOF
VirtualService 将端口 80 上的 HTTP 请求重定向到端口 443,然后相应的 DestinationRule 执行 TLS 发起。与之前的 ServiceEntry 不同,这次 443 端口上的协议是 HTTP,而不是 HTTPS,因为客户端只会发送 HTTP 请求,Istio 会将连接升级为 HTTPS。
希望对您有所帮助。