istio-跟踪出口流量

 收藏

我安装了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-跨上下文)

这是正确的行为吗? 怎么了? 我只能统计内部通话吗? 如何获得出口流量的统计信息?

回复
  • luyao 回复

    Assuming that your services are defined in Istio’s internal service registry. If not please configure it according to instruction 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。

    希望对您有所帮助。