Istio實踐(1)-環境搭建及應用部署

xjk27400861發表於2022-04-07

1. Istio簡介

Istio是最初由IBM,Google和Lyft開發的服務網格的開源實現。它可以透明地分層到分散式應用程式上,並提供服務網格的所有優點,例如流量管理,安全性和可觀察性。
它旨在與各種部署配合使用,例如本地部署,雲託管,Kubernetes容器以及虛擬機器上執行的服務程式。儘管Istio與平臺無關,但它經常與Kubernetes平臺上部署的微服務一起使用。
從根本上講,Istio的工作原理是以Sidcar的形式將Envoy的擴充套件版本作為代理佈署到每個微服務中

image

2. 環境準備與安裝

本文使用現有的k3s叢集環境,使用rancher2.6.3管理工具安裝Istio,比較方便,當然你也可以使用k8s的環境進行安裝,方法請自行查詢
進入Rancher管理工具介面,點選“叢集工具”,分別安裝Istio與Monitoring,我這裡已安裝完畢,點選安裝後,等待安裝成功即可

image

安裝Istio工具,可以選擇想安裝的元件,這裡勾上Jaeger跟蹤

image

安裝成功後,點選Istio工具選單,即可進入Istio工具介面

image

3. Istio元件-VirtualService(虛擬服務)

VirtualService中文名稱虛擬服務,是istio中一個重要的資源, 它定義了一系列針對指定服務的流量路由規則。每個路由規則都針對特定協議的匹配規則。如果流量符合這些特徵,就會根據規則傳送到服務登錄檔中的目標服務(或者目標服務的子集或版本)。
VirtualService和k8s service的區別
如果沒有 Istio virtual service,僅僅使用 k8s service 的話,那麼只能實現最基本的流量負載均衡轉發,但是就不能實現類似按百分比來分配流量等更加複雜、豐富、細粒度的流量控制了。

4. Istio元件-目標規則 (Destination Rule)

目標規則(Destination Rule)是 Istio 重要的資源物件之一,它不能獨自使用,必須跟 Virtual Service 共同發揮作用,作用是將流量標記分組並路由到具體服務。
Destination Rule 還可以做什麼?
通常在生產場景下,用使用 Destination Rule 對使用者進行身份、地址位置等條件的識別後的流量路由,例如部分使用者優先享用新版本,則可以通過HTTP Header附加相關的欄位進行識別,路由到新版本的服務上。或者在版本更新的時候,使用灰度釋出,對新舊版本標記子集,按照不同的負載百分比進行調整逐步迭代。

5. Istio應用部署實戰

  • 應用準備:使用以前springbootapp映象,xjk27400861/springbootapp:42與xjk27400861/springbootapp:43兩個映象,部署兩個版本的應用
  • 建立名稱空間,springistiodemo,在k3s叢集的任意一個節點執行
    命令:
      sudo kubectl create namespace springistiodemo
    
    image
  • 自動注入(給名稱空間打指定標籤,啟用自動注入)
      sudo kubectl label namespace springistiodemo istio-injection=enabled
    
    image
  • 檢視標籤狀態
      sudo kubectl get ns springistiodemo --show-labels
    
    image
  • 禁用自動注入命令
      sudo kubectl label namespace springistiodemo istio-injection=disabled –overwrite
    
    image
  • 啟用名稱空間,自動注入後,rancher介面顯示按鈕為:禁用Istio自動注入
    image
  • 手動注入方式,(其他安裝方式),rancher暫未找到執行istioctl命令的視窗
      sudo istioctl kube-inject -f springbootapp-2nodes.yaml | sudo kubectl apply -f -
    
  • 新建springbootapp-2nodes.yaml檔案,執行命令部署應用
      sudo kubectl create -f springbootapp-2nodes.yaml -n springistiodemo
    
  • springbootapp-2nodes.yaml檔案內容,2個版本的服務,分別為v1和v2
    image
    image
  • 稍等片刻,可以看到兩個服務建立完成
    image
  • 建立及部署目標規則springbootapp-destination.yaml
      sudo kubectl apply -f springbootapp-destination.yaml -n springistiodemo
    
    image
  • GateWay建立,供外網訪問
      sudo kubectl apply -f springbootapp-vs-v1.yaml -n springistiodemo
    
    image
  • 建立及部署預設路由springbootapp-vs-v1.yaml,訪問都訪問v1版本服務
      sudo kubectl apply -f springbootapp-vs-v1.yaml -n springistiodemo
    
    image
  • 輸入命令:sudo kubectl get svc istio-ingressgateway -n istio-system,檢視埠對映,發現31380埠對應80埠
    image
  • 通過k3s主機ip+埠/method,訪問api,http://192.168.231.133:31380/hello or http://192.168.231.134:31380/hello, 可以看到結果都被轉到v1版本上:
    image
  • 檢視kiali介面,檢視呼叫路徑,namespace選擇2個istio-system和springistiodemo,發現通過ingressgateway訪問的服務都定位在了v1版本上
    image
  • 也可以通過在istio-ingressgateway的service中,新增埠對映,對映到應用上,可以不用80埠;例如:加埠對映8066-8080-31386,同時gateway的yaml檔案,number屬性改為8066,即可通過31386埠,訪問服務(http://ip:31386
    image

相關文章