在本文中,我將向您展現一些基本和更高級的示例,說明如何使用Istio平臺來提供部署在Kubernetes上的微服務之間的通訊。按照Istio網站上的描述,它是:java
一個開放的平臺,用於鏈接,管理和保護微服務。Istio提供了一種經過負載平衡,服務到服務身份驗證,監控等建立已部署服務網絡的簡便方法,無需更改服務代碼。git
Istio提供流量管理機制,如請求路由,發現,負載平衡,處理故障和故障注入。此外,您能夠啓用istio-auth,它提供RBAC(基於角色的訪問控制)和相互TLS身份驗證。在本文中,咱們將僅討論流量管理機制。github
在Kubernetes上測試Istio最溫馨的方法是經過Minikube。我已經在本文中描述瞭如何在本地計算機上配置Minikube: 使用Kubernetes和Docker的微服務。在Minikube上安裝Istio時,首先應該在啓動時啓用一些Minikube的插件。docker
1api |
|
Istio安裝在名爲的專用命名空間中istio-system
,但可以管理來自全部其餘命名空間的服務。首先,您應該去發佈頁面並下載與您的操做系統相對應的安裝文件。對我而言,它是Windows,全部後續步驟都將在假設咱們正在使用此操做系統的狀況下進行描述。在運行Minikube以後,在Minikube的VM上啓用Docker會頗有用。多虧了你,你將可以執行docker
命令。網絡
1架構 |
|
如今,將Istio文件提取到本地文件系統。文件istioctl.exe
,這是在現有${ISTIO_HOME}/bin
的目錄應該被添加到您的PATH。Istio包含一些Kubernetes平臺的安裝文件 ${ISTIO_HOME}/install/kubernetes
。要在Minikube上安裝Istio的核心組件,只需應用如下YAML定義文件。wordpress
1 |
|
如今,您已在Minikube實例上部署了Istio的核心組件。這些組件是:
Envoy - 它是一個開源邊緣和服務代理,專爲雲原生應用程序而設計。Istio使用Envoy代理的擴展版本。若是您對Envoy和微服務的一些細節感興趣,請閱讀個人文章 Envoy Proxy with Microservices,它描述瞭如何將Envoy網關與服務發現集成。
混合器 - 它是一個獨立於平臺的組件,負責跨服務網格實施訪問控制和使用策略。
Pilot - 它爲Envoy邊車提供服務發現,爲智能路由和彈性提供流量管理功能。
istio.yaml
定義文件中提供的配置部署了與上述組件相關的一些pod和服務。您可使用kubectl
命令驗證安裝,也能夠在執行命令後訪問Web Dashboard minikube dashboard
。
在咱們開始使用Istio配置任何流量規則以前,咱們須要建立將相互通訊的示例應用程序。這些都是很是簡單的服務。這些應用程序的源代碼能夠在個人GitHub賬戶中的repository sample-istio-services中找到。有兩種服務:caller-service
和callme-service
。它們都暴露了端點ping,它打印了應用程序的名稱和版本。這兩個值都取自Spring Boot build-info
文件,該文件是在應用程序構建期間生成的。這是端點的實現GET /callme/ping
。
1 2 3 4 五 6 7 8 9 10 11 12 13 14 15 16 |
|
這裏是端點的實現GET /caller/ping
。它GET /callme/ping
使用Spring 調用端點RestTemplate
。咱們假設callme-service
能夠在callme-service:8091
Kubernetes的地址下找到。此服務將在端口8091下的Minikube節點內公開。
1 2 3 4 五 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
必須在Docker容器上啓動示例應用程序。這是Dockerfile,負責使用caller-service
應用程序構建映像。
1 2 3 4 五 6 7 8 |
|
相似Dockerfile
的可用callme-service
。如今,咱們惟一須要的是構建Docker鏡像。
1 2 |
|
還有一個版本2.0.0-SNAPSHOT
的callme-service
可用分支v2
。切換到此分支,構建整個應用程序,而後使用2.0
標記構建docker鏡像。爲何咱們須要2.0版本?我將在下一節中對其進行描述。
1 |
|
在咱們開始在Minikube上部署應用程序以前,讓咱們看看下圖中可見的示例系統架構。咱們將部署callme-service
兩個版本:1.0
和2.0
。應用程序caller-service
只是調用callme-service,因此我對目標服務的不一樣版本一無所知。若是咱們想callme-service
在20%到80%的兩個版本之間路由流量,咱們必須配置正確的Istio路由器。還有一件事。因爲Minikube不支持Istio Ingress,咱們將只提供Kubernetes服務。若是咱們須要在Minikube集羣以外公開它,咱們應該將類型設置爲 NodePort
。
讓咱們進入部署階段。這是callme-service
版本中的部署定義1.0
。
1 2 3 4 五 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 三十 31 32 |
|
在Minikube上部署它以前,咱們必須注入一些Istio屬性。下面顯示的命令打印了一個富含Istio配置的新版本的部署定義。咱們能夠複製它並保存爲deployment-with-istio.yaml
文件。
1 |
|
如今,讓咱們將配置應用於Kubernetes。
1 |
|
一樣的步驟應進行caller-service
換版,而且還2.0
的callme-service
。全部YAML配置文件都與應用程序一塊兒提交,而且位於每一個應用程序模塊的根目錄中。若是您已成功部署了全部必需的組件,則應在Minikube的儀表板中看到如下元素。
Istio提供了一種簡單的特定於域的語言(DSL),容許您配置一些有趣的規則來控制請求在服務網格中的路由方式。我將向您展現如下規則:
如下是示例路由規則定義callme-service
。它在服務的版本1.0和2.0之間以20:80的比例分割流量。它還在10%的請求中增長了3秒的延遲,併爲10%的請求返回HTTP 500錯誤代碼。
1 2 3 4 五 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
讓咱們爲Kubernetes應用新的路線規則。
1 |
|
如今,咱們能夠經過執行命令輕鬆驗證該規則 istioctl get routerule
。
在咱們開始測試以前,讓咱們在Minikube上部署Zipkin。Istio zipkin.yaml
在目錄中提供部署定義文件${ISTIO_HOME}/install/kubernetes/addons
。
1 |
|
咱們來看看Minikube上部署的服務列表。應用程序調用者服務提供的API在端口30873下 可用。
咱們能夠經過調用URL http://192.168.99.100:30873/caller/ping輕鬆測試Web瀏覽器的服務 。它打印服務的名稱和版本,以及調用者服務調用的callme-service的名稱和版本。因爲80%的流量路由到2.0版的callme-service,您可能會看到如下響應。
可是,有時可能會調用1.0版的callme-service ...
在本文中,我將向您展現一些基本和更高級的示例,說明如何使用Istio平臺來提供部署在Kubernetes上的微服務之間的通訊。按照Istio網站上的描述,它是:
一個開放的平臺,用於鏈接,管理和保護微服務。Istio提供了一種經過負載平衡,服務到服務身份驗證,監控等建立已部署服務網絡的簡便方法,無需更改服務代碼。
Istio提供流量管理機制,如請求路由,發現,負載平衡,處理故障和故障注入。此外,您能夠啓用istio-auth,它提供RBAC(基於角色的訪問控制)和相互TLS身份驗證。在本文中,咱們將僅討論流量管理機制。
在Kubernetes上測試Istio最溫馨的方法是經過Minikube。我已經在本文中描述瞭如何在本地計算機上配置Minikube: 使用Kubernetes和Docker的微服務。在Minikube上安裝Istio時,首先應該在啓動時啓用一些Minikube的插件。
1 |
|
Istio安裝在名爲的專用命名空間中istio-system
,但可以管理來自全部其餘命名空間的服務。首先,您應該去發佈頁面並下載與您的操做系統相對應的安裝文件。對我而言,它是Windows,全部後續步驟都將在假設咱們正在使用此操做系統的狀況下進行描述。在運行Minikube以後,在Minikube的VM上啓用Docker會頗有用。多虧了你,你將可以執行docker
命令。
1 |
|
如今,將Istio文件提取到本地文件系統。文件istioctl.exe
,這是在現有${ISTIO_HOME}/bin
的目錄應該被添加到您的PATH。Istio包含一些Kubernetes平臺的安裝文件 ${ISTIO_HOME}/install/kubernetes
。要在Minikube上安裝Istio的核心組件,只需應用如下YAML定義文件。
1 |
|
如今,您已在Minikube實例上部署了Istio的核心組件。這些組件是:
Envoy - 它是一個開源邊緣和服務代理,專爲雲原生應用程序而設計。Istio使用Envoy代理的擴展版本。若是您對Envoy和微服務的一些細節感興趣,請閱讀個人文章 Envoy Proxy with Microservices,它描述瞭如何將Envoy網關與服務發現集成。
混合器 - 它是一個獨立於平臺的組件,負責跨服務網格實施訪問控制和使用策略。
Pilot - 它爲Envoy邊車提供服務發現,爲智能路由和彈性提供流量管理功能。
istio.yaml
定義文件中提供的配置部署了與上述組件相關的一些pod和服務。您可使用kubectl
命令驗證安裝,也能夠在執行命令後訪問Web Dashboard minikube dashboard
。
在咱們開始使用Istio配置任何流量規則以前,咱們須要建立將相互通訊的示例應用程序。這些都是很是簡單的服務。這些應用程序的源代碼能夠在個人GitHub賬戶中的repository sample-istio-services中找到。有兩種服務:caller-service
和callme-service
。它們都暴露了端點ping,它打印了應用程序的名稱和版本。這兩個值都取自Spring Boot build-info
文件,該文件是在應用程序構建期間生成的。這是端點的實現GET /callme/ping
。
1 2 3 4 五 6 7 8 9 10 11 12 13 14 15 16 |
|
這裏是端點的實現GET /caller/ping
。它GET /callme/ping
使用Spring 調用端點RestTemplate
。咱們假設callme-service
能夠在callme-service:8091
Kubernetes的地址下找到。此服務將在端口8091下的Minikube節點內公開。
1 2 3 4 五 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
必須在Docker容器上啓動示例應用程序。這是Dockerfile,負責使用caller-service
應用程序構建映像。
1 2 3 4 五 6 7 8 |
|
相似Dockerfile
的可用callme-service
。如今,咱們惟一須要的是構建Docker鏡像。
1 2 |
|
還有一個版本2.0.0-SNAPSHOT
的callme-service
可用分支v2
。切換到此分支,構建整個應用程序,而後使用2.0
標記構建docker鏡像。爲何咱們須要2.0版本?我將在下一節中對其進行描述。
1 |
|
在咱們開始在Minikube上部署應用程序以前,讓咱們看看下圖中可見的示例系統架構。咱們將部署callme-service
兩個版本:1.0
和2.0
。應用程序caller-service
只是調用callme-service,因此我對目標服務的不一樣版本一無所知。若是咱們想callme-service
在20%到80%的兩個版本之間路由流量,咱們必須配置正確的Istio路由器。還有一件事。因爲Minikube不支持Istio Ingress,咱們將只提供Kubernetes服務。若是咱們須要在Minikube集羣以外公開它,咱們應該將類型設置爲 NodePort
。
讓咱們進入部署階段。這是callme-service
版本中的部署定義1.0
。
1 2 3 4 五 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 三十 31 32 |
|
在Minikube上部署它以前,咱們必須注入一些Istio屬性。下面顯示的命令打印了一個富含Istio配置的新版本的部署定義。咱們能夠複製它並保存爲deployment-with-istio.yaml
文件。
1 |
|
如今,讓咱們將配置應用於Kubernetes。
1 |
|
一樣的步驟應進行caller-service
換版,而且還2.0
的callme-service
。全部YAML配置文件都與應用程序一塊兒提交,而且位於每一個應用程序模塊的根目錄中。若是您已成功部署了全部必需的組件,則應在Minikube的儀表板中看到如下元素。
Istio提供了一種簡單的特定於域的語言(DSL),容許您配置一些有趣的規則來控制請求在服務網格中的路由方式。我將向您展現如下規則:
如下是示例路由規則定義callme-service
。它在服務的版本1.0和2.0之間以20:80的比例分割流量。它還在10%的請求中增長了3秒的延遲,併爲10%的請求返回HTTP 500錯誤代碼。
1 2 3 4 五 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
讓咱們爲Kubernetes應用新的路線規則。
1 |
|
如今,咱們能夠經過執行命令輕鬆驗證該規則 istioctl get routerule
。
在咱們開始測試以前,讓咱們在Minikube上部署Zipkin。Istio zipkin.yaml
在目錄中提供部署定義文件${ISTIO_HOME}/install/kubernetes/addons
。
1 |
|
咱們來看看Minikube上部署的服務列表。應用程序調用者服務提供的API在端口30873下 可用。
咱們能夠經過調用URL http://192.168.99.100:30873/caller/ping輕鬆測試Web瀏覽器的服務 。它打印服務的名稱和版本,以及調用者服務調用的callme-service的名稱和版本。因爲80%的流量路由到2.0版的callme-service,您可能會看到如下響應。
可是,有時可能會調用1.0版的callme-service ...
...或Istio能夠模擬HTTP 500代碼。
您可使用Zipkin控制檯輕鬆分析流量統計信息。
或者只是看看pod生成的日誌。
...或Istio能夠模擬HTTP 500代碼。
您可使用Zipkin控制檯輕鬆分析流量統計信息。
或者只是看看pod生成的日誌。
https://github.com/xiaomin0322/sample-istio-services