Service MeshASM提供了訪問外部服務的三種方式,包含設定外部服務存取原則、配置ServiceEntry和設定攔截對外訪問的網段。本文介紹如何在Service MeshASM上訪問外部服務。
設定外部服務存取原則
您可以在Service MeshASM中設定對外部服務的存取原則OutboundTrafficPolicy,用於配置對外部服務(即未在Istio的內部服務註冊表中定義的服務)的存取原則。
登入ASM控制台,單擊目標執行個體名稱,在左側導覽列選擇,查看Istio的內部服務註冊表中定義的服務。
如果該選項設定為ALLOW_ANY,則Sidecar代理允許對未知服務的透傳通過。優點是直接透傳對外部服務的訪問,缺點是失去了對外部服務流量的網格層面的監視和控制。
重要在ALLOW_ANY出口策略下,如果沒有為外部服務定義ServiceEntry,Envoy代理將允許TCP流量離開網格到任何IP和連接埠。然而,這種方式缺乏明確的流量控制,可能導致意外的流量行為,尤其是當多個服務監聽同一個連接埠時。對於訪問外部服務(例如資料庫),強烈不建議使用該方式,避免造成存取違規。
建議您為外部服務定義ServiceEntry,顯式地控制流程量的目的地並避免潛在的問題和衝突。
如果該選項設定為REGISTRY_ONLY,則Sidecar代理將阻止任何沒有在網格中定義了HTTP服務或叢集外服務的主機。
登入ASM控制台。
在左側導覽列,選擇。
在網格管理頁面,找到待配置的執行個體,單擊執行個體的名稱或在操作列中單擊管理。
在網格詳情頁面左側導覽列,選擇。
在Sidecar代理配置頁面全域頁簽下,單擊外部服務存取原則,設定對外部服務的存取原則OutboundTrafficPolicy為ALLOW_ANY,單擊更新設定。
在注入了Sidecar代理的應用程式容器中,運行curl命令請求訪問外部HTTP或HTTPS服務,可以看到正常返回結果。
訪問外部HTTP服務
curl -I http://www.aliyun.com/預期輸出:
HTTP/1.1 301 Moved Permanently server: envoy date: Mon, 07 Sep 2020 09:28:54 GMT content-type: text/html content-length: 239 location: https://www.aliyun.com/ eagleeye-traceid: 0be3e0a615994709353116335ea5ea timing-allow-origin: * x-envoy-upstream-service-time: 67訪問外部HTTPS服務
curl -I https://www.aliyun.com/預期輸出:
HTTP/2 200 server: Tengine date: Mon, 07 Sep 2020 09:16:31 GMT content-type: text/html; charset=utf-8 vary: Accept-Encoding vary: Accept-Encoding strict-transport-security: max-age=31536000 x-download-options: noopen x-content-type-options: nosniff x-xss-protection: 1; mode=block x-readtime: 0 eagleeye-traceid: 0b57ff8715994701916963132ec7ad strict-transport-security: max-age=0 timing-allow-origin: *
配置叢集外服務(ServiceEntry)
如果設定對外部服務的存取原則OutboundTrafficPolicy為REGISTRY_ONLY,在注入了Sidecar代理的應用程式容器中,運行curl命令請求訪問外部HTTP或HTTPS服務,可以看到不能正常返回結果。
訪問外部HTTP服務。
curl -I http://www.aliyun.com/預期輸出:
HTTP/1.1 502 Bad Gateway date: Mon, 07 Sep 2020 09:25:58 GMT server: envoy transfer-encoding: chunked訪問外部HTTPS服務。
curl -I https://www.aliyun.com/預期輸出:
curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to www.aliyun.com:443
您可以使用叢集外服務(ServiceEntry)配置,從網格內訪問網格外部的可公開訪問的服務,同時保留Istio的流量監視和控制功能,實現對外部服務的受控訪問。
建立叢集外服務。
登入ASM控制台。
在左側導覽列,選擇。
在網格管理頁面,找到待配置的執行個體,單擊執行個體的名稱或在操作列中單擊管理。
在網格詳情頁面左側導覽列,選擇,然後在右側頁面,單擊使用YAML建立。
選擇命名空間,將以下內容複寫到文字框中,然後單擊建立。
根據實際需求設定hosts,在本樣本中hosts為www.aliyun.com。
apiVersion: networking.istio.io/v1alpha3 kind: ServiceEntry metadata: name: aliyun-com-ext spec: hosts: - 'www.aliyun.com' ports: - number: 80 name: http protocol: HTTP - number: 443 name: https protocol: HTTPS resolution: DNS location: MESH_EXTERNAL
訪問外部HTTP或HTTPS服務,可以看到正常返回結果。
訪問外部HTTP服務。
curl -I http://www.aliyun.com/預期輸出:
HTTP/1.1 301 Moved Permanently server: envoy date: Mon, 07 Sep 2020 09:49:17 GMT content-type: text/html content-length: 239 location: https://www.aliyun.com/ eagleeye-traceid: 0be3e0a915994721583014504e7b31 timing-allow-origin: * x-envoy-upstream-service-time: 66訪問外部HTTPS服務。
curl -I https://www.aliyun.com/預期輸出:
HTTP/2 200 server: Tengine date: Mon, 07 Sep 2020 09:49:31 GMT content-type: text/html; charset=utf-8 vary: Accept-Encoding vary: Accept-Encoding strict-transport-security: max-age=31536000 x-download-options: noopen x-content-type-options: nosniff x-xss-protection: 1; mode=block x-readtime: 1 eagleeye-traceid: 0be3e0b115994721709577294ed9e8 strict-transport-security: max-age=0 timing-allow-origin: *
建立虛擬服務。
登入ASM控制台。
在左側導覽列,選擇。
在網格管理頁面,找到待配置的執行個體,單擊執行個體的名稱或在操作列中單擊管理。
在網格詳情頁面左側導覽列,選擇,然後在右側頁面,單擊使用YAML建立。
選擇命名空間,將以下內容複寫到文字框中,然後單擊建立。
為使用叢集外服務(ServiceEntry)配置訪問的外部服務設定路由規則。在本樣本中,對www.aliyun.com服務的調用注入了延遲時間fixedDelay的規則。
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: aliyun-com-ext spec: hosts: - 'www.aliyun.com' http: - fault: delay: percent: 100 fixedDelay: 5s route: - destination: host: www.aliyun.com weight: 100
查看定義的路由規則是否生效。
返回結果中real的時間為5.07s,說明路由規則已生效。
time curl -o /dev/null -s -w "%{http_code}\n" http://www.aliyun.com/預期輸出:
301 real 0m 5.07s user 0m 0.00s sys 0m 0.00s
設定網格攔截指定位址範圍
設定指定的網格攔截IP範圍,使得未被指定的其他IP範圍不被網格內的Sidecar代理流量攔截,從而可以繞過Sidecar代理直接存取目標服務。
您可以在Service MeshASM中配置攔截對外訪問的位址範圍,設定流量被攔截的IP範圍,通常設定為所管理的Kubernetes叢集的Service CIDR。即訪問叢集內目標服務需要經過Service Mesh內的Sidecar代理進行流量攔截,非叢集內目標則繞過Service Mesh內的Sidecar代理。
登入ASM控制台。
在左側導覽列,選擇。
在網格管理頁面,找到待配置的執行個體,單擊執行個體的名稱或在操作列中單擊管理。
在網格詳情頁面左側導覽列,選擇。
在Sidecar代理配置頁面全域頁簽下,單擊按連接埠或地址來啟用/禁用Sidecar代理,在攔截對外訪問的位址範圍文字框中設定攔截的網段,然後單擊更新設定。
您也可以在不攔截對外訪問的位址範圍文字框中設定不攔截的網段,那麼除了設定的不攔截的網段,其他網段都將被攔截。
說明攔截對外訪問的位址範圍預設為*,表示對所有的IP網段進行攔截。可以根據實際需要設定攔截的IP網段,一般情況下可以設定為Kubernetes叢集的Service CIDR。