服務網格ASM提供了訪問外部服務的三種方式,包含設置外部服務訪問策略、配置ServiceEntry和設置攔截對外訪問的網段。本文介紹如何在服務網格ASM上訪問外部服務。
設置外部服務訪問策略
您可以在服務網格ASM中設置對外部服務的訪問策略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代理直接訪問目標服務。
您可以在服務網格ASM中配置攔截對外訪問的地址范圍,設置流量被攔截的IP范圍,通常設置為所管理的Kubernetes集群的Service CIDR。即訪問集群內目標服務需要經過服務網格內的Sidecar代理進行流量攔截,非集群內目標則繞過服務網格內的Sidecar代理。
登錄ASM控制臺。
在左側導航欄,選擇 。
在網格管理頁面,找到待配置的實例,單擊實例的名稱或在操作列中單擊管理。
在網格詳情頁面左側導航欄,選擇 。
在Sidecar代理配置頁面全局頁簽下,單擊按端口或地址來啟用/禁用Sidecar代理,在攔截對外訪問的地址范圍文本框中設置攔截的網段,然后單擊更新設置。
您也可以在不攔截對外訪問的地址范圍文本框中設置不攔截的網段,那么除了設置的不攔截的網段,其他網段都將被攔截。
說明攔截對外訪問的地址范圍默認為*,表示對所有的IP網段進行攔截。可以根據實際需要設置攔截的IP網段,一般情況下可以設置為Kubernetes集群的Service CIDR。