Теория перехвата трафика Istio и анализ отладки — борьба с бизнес-средой Istio

Istio

Сосредоточьтесь на расшифровке больших данных и основных технологиях контейнерного облака. Если у вас есть какие-либо академические обмены, пожалуйста, не стесняйтесь обращаться к нам. Для получения дополнительной информации, пожалуйста, обратите внимание на общедоступную учетную запись «Сообщества облачных технологий данных» или перешлите электронное письмо по адресу1120746959@qq.com.

1 Общие навыки эксплуатации и обслуживания Istio

  • Pilot-discovery предоставляет службы управляющей информации для уровня данных (прокси-компоненты, такие как Envoy, работающие в sidecar), что является так называемой службой обнаружения или службой xds. Здесь x — местоимение, похожее на XaaS в облачных вычислениях, которое может относиться к IaaS, PaaS, SaaS и т. д.

  • В Istio xds включает в себя cds (службу обнаружения кластеров),

  • lds (служба обнаружения слушателей),

  • rds (сервис обнаружения маршрутов),

  • eds (служба обнаружения конечных точек),

  • А реклама (агрегированный сервис обнаружения) — это унифицированная инкапсуляция этих сервисов.

获取 ingress IP 地址:
$ export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
$ export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}')
$ export INGRESS_HOST=$(kubectl get po -l istio=ingressgateway -n istio-system -o 'jsonpath={.items[0].status.hostIP}')

服务网关设置:
kubectl get configmap istio -n istio-system -o yaml | sed 's/mode: ALLOW_ANY/mode: REGISTRY_ONLY/g'|kubectl replace -n istio-system -f -
kubectl get configmap istio -n istio-system -o yaml | sed 's/mode: REGISTRY_ONLY/mode: ALLOW_ANY/g'|kubectl replace -n istio-system -f -

手动注入代理:
istioctl kube-inject -f nginx-istio-test.yaml | kubectl apply -f - -n jiuxi


hub配置:

{
   "registry-mirrors": ["http://10.180.210.37","http://10.180.210.196","https://docker.mirrors.ustc.edu.cn"],
   "insecure-registries": ["10.180.210.37","10.180.210.196","docker.mirrors.ustc.edu.cn"]
}

sudo systemctl daemon-reload
sudo systemctl restart docker

Envoy 是 Istio 数据面的核心组件,已Sidecar的模式同应用部署在一个Pod中。
下图展示了Envoy配置流程:
Pilot-agent负责Envoy生命周期管理。它根据启动参数和K8S API Server中的配置信息生成Envoy的初始配置文件envoy-rev0.json,该文件告诉Envoy从xDS server中获取动态配置信息,并配置了xDS server的地址信息,即控制面的Pilot。
Pilot-agent使用envoy-rev0.json启动Envoy进程。
Envoy根据初始配置获得Pilot地址,采用xDS接口从Pilot获取到Listener,Cluster,Route等动态配置信息。
Envoy根据获取到的动态配置启动Listener,并根据Listener的配置,结合Route和Cluster对拦截到的流量进行处理。

Envoy通过xDS API进行动态配置。xDS是一类发现服务的总称,包含LDS、RDS、CDS、EDS及SDS。

LDS:Listener发现服务。Listener监听器控制Envoy启动端口监听(目前只支持TCP),并配置 L3或L4层过滤器,在网络连接到达后,由网络过滤器堆栈开始处理。
RDS:Route发现服务,用于Envoy HTTP连接管理器动态获取路由配置。路由配置包含HTTP头修改(增加、删除HTTP头键值)、Virtual Hosts(虚拟主机)及Virtual Hosts定义的各个路由条目。
CDS:Cluster发现服务,用于动态获取Cluster信息。Envoy Cluster管理器管理着所有的上游Cluster。Envoy从Listener(针对TCP协议)或Route(针对HTTP)中抽象出上游Cluster,作为流量转发目标。
EDS:Endpoint发现服务。对于每个Cluster,Envoy通过EDS API动态获取Endpoint。
SDS:Secret发现服务,用于在运行时动态获取TLS证书。

2 Анализ принципа перезаписи трафика Istio

2.1 Теория перехвата трафика Istio

2.2 Передача входящего и исходящего трафика Istio

3 Envoy

配置了一个 envoy实例,监听 127.0.0.1:10000,支持 http 协议访问,http 访问域名为:http://example.com。接收到的所有http流量,
转发给 127.0.0.2:1234 的服务。这个例子中 some_service 这个cluster中 hosts 是固定的(127.0.0.2:1234),不利于扩展。
admin:
  access_log_path: /tmp/admin_access.log
  address:
    socket_address: { address: 127.0.0.1, port_value: 9901 }

static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address: { address: 127.0.0.1, port_value: 10000 }
    filter_chains:
    - filters:
      - name: envoy.http_connection_manager
        config:
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: local_service
              domains: ["example.com"]
              routes:
              - match: { prefix: "/" }
                route: { cluster: some_service }
          http_filters:
          - name: envoy.router
  clusters:
  - name: some_service
    connect_timeout: 0.25s
    type: STATIC
    lb_policy: ROUND_ROBIN
    hosts: [{ socket_address: { address: 127.0.0.2, port_value: 1234 }}]

admin:
  access_log_path: /tmp/admin_access.log
  address:
    socket_address: { address: 127.0.0.1, port_value: 9901 }

dynamic_resources:
  lds_config:
    api_config_source:
      api_type: GRPC
      cluster_names: [xds_cluster]
  cds_config:
    api_config_source:
      api_type: GRPC
      cluster_names: [xds_cluster]

static_resources:
  clusters:
  - name: xds_cluster
    connect_timeout: 0.25s
    type: STATIC
    lb_policy: ROUND_ROBIN
    http2_protocol_options: {}
    hosts: [{ socket_address: { address: 127.0.0.3, port_value: 5678 }}]
    
LDS服务的响应格式如下:
version_info: "0"
resources:
- "@type": type.googleapis.com/envoy.api.v2.Listener
  name: listener_0
  address:
    socket_address:
      address: 127.0.0.1
      port_value: 10000
  filter_chains:
  - filters:
    - name: envoy.http_connection_manager
      config:
        stat_prefix: ingress_http
        codec_type: AUTO
        rds:
          route_config_name: local_route
          config_source:
            api_config_source:
              api_type: GRPC
              cluster_names: [xds_cluster]
        http_filters:
        - name: envoy.router
        
RDS 服务的响应格式如下:        
version_info: "0"
resources:
- "@type": type.googleapis.com/envoy.api.v2.RouteConfiguration
  name: local_route
  virtual_hosts:
  - name: local_service
    domains: ["*"]
    routes:
    - match: { prefix: "/" }
      route: { cluster: some_service }
      
CDS 服务的响应如下:  
version_info: "0"
resources:
- "@type": type.googleapis.com/envoy.api.v2.Cluster
  name: some_service
  connect_timeout: 0.25s
  lb_policy: ROUND_ROBIN
  type: EDS
  eds_cluster_config:
    eds_config:
      api_config_source:
        api_type: GRPC
        cluster_names: [xds_cluster]
        
EDS 服务的响应如下:
version_info: "0"
resources:
- "@type": type.googleapis.com/envoy.api.v2.ClusterLoadAssignment
  cluster_name: some_service
  endpoints:
  - lb_endpoints:
    - endpoint:
        address:
          socket_address:
            address: 127.0.0.2
            port_value: 1234
            
https://www.jianshu.com/p/73b8ba769274 Envoy 学习笔记之创建 EDS 动态配置
https://www.jianshu.com/p/90f9ee98ce70  Envoy 实践
https://www.jianshu.com/p/ac9b99b37cd1

Сосредоточьтесь на расшифровке больших данных и основных технологиях контейнерного облака. Если у вас есть какие-либо академические обмены, пожалуйста, не стесняйтесь обращаться к нам. Для получения дополнительной информации, пожалуйста, обратите внимание на общедоступную учетную запись «Сообщества облачных технологий данных» или перешлите электронное письмо по адресу1120746959@qq.com.