Istio 流量攔截理論及調試分析-Istio商業環境實戰

專一於大數據及容器雲核心技術解密,若有任何學術交流,可隨時聯繫。更多內容請關注《數據雲技術社區》公衆號,或請轉發郵件至1120746959@qq.comnode

1 Istio 經常使用運維技巧

  • pilot-discovery 爲數據面(運行在 sidecar 中的 Envoy 等 proxy 組件)提供控制信息服務,也就是所謂的 discovery service 或者 xds 服務。這裏的 x 是一個代詞,相似雲計算裏的 XaaS 能夠指代 IaaS、PaaS、SaaS 等。nginx

  • 在 Istio 中,xds 包括 cds(cluster discovery service)、docker

  • lds(listener discovery service)、json

  • rds(route discovery service)、api

  • eds(endpoint discovery service),markdown

  • 而 ads(aggregated discovery service) 是對這些服務的一個統一封裝。網絡

獲取 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 inbound 與outbound流量轉移

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.comapp

相關文章
相關標籤/搜索