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


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM