我安装了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,我看不到外部服务的流量,因此能够检测网络中的问题。
我正在将适当的标头转发到外部服务(x-request-id,x-b3-traceid,x-b3-spanid,b3-parentspanid,x-b3采样,x-b3-flags,x -ot-span-context)
这是正确的行为吗? 怎么了? 我只能统计内部通话吗? 如何获得出口流量的统计信息?
答案 0 :(得分:1)
假设您的服务是在Istio的内部服务注册表中定义的。如果没有,请按照说明service-defining
进行配置。
在HTTPS中,所有与HTTP相关的信息(例如方法,URL路径,响应代码)都已加密,因此Istio 无法查看并且无法监视该信息以获取HTTPS。 如果需要在访问外部HTTPS服务时监视与HTTP相关的信息,则可能希望让您的应用程序发出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。
希望对您有帮助。