Tanzu Service Mesh整合Istio強大的Traffic Management機制,讓微服務版本變更更容易,而其Global Namespace機制可使所有需要跨叢集合作的服務,在微服務部署當下就自動升級成跨叢集服務。再配合拓樸分析與效能監測儀表板,則讓Site Reliable Engineer對微服務有完整的可視性。
關於VMware的容器策略,一直需要考量的是企業內整體Kubernetes的使用,因此「多K8S叢集」就是一個必要的功能,畢竟企業內很難統一各開發團隊使用相同版本的Kubernetes版本,也很難不考量多租戶的完整隔離需求。
多叢集提供安全的多租戶環境,但叢集內的服務也會被叢集節點限制其擴展性,加上許多企業客戶對於混合雲(Hybrid Cloud),甚至是邊界雲(Edge Cloud)也有著迫切的需求,這些場景受限於地域限制,也會以「多K8S叢集」的架構呈現。
讓容器內服務能夠依照企業需求,進行跨叢集的通訊,打破叢集邊界,是VMware在一年多前,開始基於Istio著手打造Service Mesh的產品的動力。結合Istio開源的能力與VMware對於企業需求的了解,催生了Tanzu Service Mesh(TSM)。
了解Tanzu Service Mesh
如果你是一個在做DevOps的Site Reliable Engineer(SRE)或是Platform Engineer,希望找一個可以協助專案達到換版不停機,或是落實電商的A/B測試。又或者你是一個企業主,希望在光棍節或是黑色星期五這樣的熱銷日前,能夠把自家的服務透過K8S延伸到公有雲上,那一定需要知道Service Mesh。
Tanzu Service Mesh(TSM)是VMware Cloud Service最新釋出的服務,可達成上述的需求,這個服務目前具備了以下幾種特色(圖1):
‧開源Istio(版本為1.3):強大的網路流向、資安、DevOps(藍綠部署、AB Testing)以及監控的機制。
‧VMware AllSpark Operator:簡化企業使用Istio的門檻,特別強化跨叢集服務。
‧可視性的UI:與開源的Kiali相比,TSM的UI強化了跨叢集的顯示功能與歷史網路流量訊息。
TSM定位在此次Tanzu方案裡的Connect與Protect兩個領域,可以管理Kubernetes叢集中的相關服務,無論是TKG(Tanzu Kubernetes Grid)、EKS、AKS、GKE,或甚至是Kubeadm生成的K8S叢集,都是可以透過註冊叢集到TSM之後,利用TSM對其內部的微服務流進行控制與資安強化,如圖2所示。目前,這個服務可透過「https://tanzu.vmware.com/service-mesh」網站申請。
設定Tanzu Service Mesh
怎樣設定Tanzu Service Mesh?以下分成叢集註冊以及設定Global NameSpace兩部分來加以說明。
叢集註冊
將叢集納入TSM的管理,是設定的第一步。透過開啟TSM服務,可以依照圖3的流程快速地將一個K8S叢集加入TSM,以下以GKE叢集為例進行示範。
透過圖4~5所示的方式在TSM UI中新增叢集。
如圖6所示,拷貝底下兩個YAML,並部署到叢集。
部署完成後,可以看到新的allspark名稱空間,同時TSM上的UI也會出現〔INSTALL TANZU SERVICE MESH〕按鈕。按下〔INSTALL TANZU SERVICE MESH〕按鈕後,就可以開始TSM的反向Istio部署,如圖7所示。
3. TSM反向部署Istio
若監看叢集內,將會看到TSM要求部署Istio,如圖8所示。大約3~5分鐘,如圖9所示,就可以看到註冊成功的訊息。
這時,可以檢查一下istio-system的名稱空間,就能夠看到完整的Istio部署。
設定Global NameSpace
Global Namespace適用於需要跨叢集的服務,特別是兩個叢集不在同一個SDN管理下的時候,例如混合雲部署。使用Global Namespace有一個前提,那就是這兩個叢集對外的IngressGateway與EgressGateway L3網路必須可路由。
如圖10所示,建立Global Namespace的步驟有四:
STEP 1 首先,在兩個叢集分別建立Namespace,並且打上istio-injection=enabled標籤:
kubectl label ns netadmin istio- injection=enabled
STEP 2 接著,在TSM網頁上新增GlobalNamespace,如圖11所示。新增時,必須選擇名稱以及Domain名稱。該Domain名稱只要讓兩個叢集內的服務相互知道就好,無須加到實體DNS中(TSM會自動加入到istiocoredns裡)。
STEP 3 在各個叢集中,選擇所須對應的名稱空間(NameSpace)。TSM會自動偵測,被標註為istio-injection模式的名稱空間,如圖12所示。
STEP 4 其中提供外部連線的FQDN、對外連線IP以及資安加密機制,皆選擇預設,最後確認整個整個設定是否正確無誤,如圖13所示。
設定成功後,如圖14所示,會產生對應的圖示(例如netadmin)。
建立跨叢集服務
啟動Global Namespace之後,就可以開始進行跨叢集的實驗。在標準Istio 1.5中,若要開啟跨叢集服務,將需要手動到兩個叢集內,啟動Istio裡面的istiocoredns、憑證、serviceentry、ingressgateway/egressgateway等功能。透過Tanzu Service Mesh,只需要部署服務在剛剛指定的Global Namespace內,跨叢集的服務就會自動被建置,是不是很神奇呢?以下透過兩個展示來剖析TSM的好處。
單元服務
在這個展示裡,將在TSM上啟動的Global Namespace Netadmin裡實驗。在叢集2裡部署hello-kubernetes的服務,直接透過叢集1中Pod,存取叢集2內的hello-Kubernetes。所有的設定都由TSM代勞,開發者或是SRE,僅須在叢集2部署後,與叢集1之間的服務自動會被打通。相關的架構圖如圖15所示。
部署完成後,透過以下的命令就可以輕鬆地存取到叢集2內的服務,如圖16所示:
kubectl exec -it deployment/ sleep -- curl hello-kubernetes. netadmin.acme.com
若要將這個網站發布出來,只需要發布Gateway,並以Tag方式連結到Istio IngressGateway即可。詳細機制,可參考底下的YAML檔案內容:
apiVersion: networking.istio.io/ v1alpha3 kind: Gateway metadata: name: hello-gateway spec: selector: istio: ingressgateway # use istio default controller servers: - port: number: 80 name: http protocol: HTTP hosts: - "*" --- apiVersion: networking.istio. io/v1alpha3 kind: VirtualService metadata: name: hello spec: hosts: - "*" gateways: - hello-gateway http: - match: - uri: prefix: / route: - destination: host: hello-kubernetes.netadmin. acme.com port: number: 80
網站服務
接下來,測試跨叢集部署一個以微服務打造的網站服務。這個服務是一個體育用品(虛擬的ACME_Fitness)的電子商務。此項服務是由5個子服務所構成,分別為網站、使用者SSO登入、產品目錄、購物車服務與付款服務,如圖17所示。
每個服務都以不同的語言所撰寫,並依照微服務架構,每個子服務都帶有自己的資料庫,避免資料庫共享造成的瓶頸。
為了展示跨叢集的能力,這裡將Catalog服務(主要用來提供網站產品資訊的)部署到叢集2,其他的服務部署在叢集1,這個部署程序分為四個步驟:
首先,下載ACME_Fitness專案,然後將部署到兩個叢集:
git clone -b dkalani-dev3 https:// github.com/vmwarecloudadvocacy/ acme_fitness_demo.git
在叢集1中,部署過程如下:
kubectl label ns default istio- injection=enabled kubectl apply -f kubernetes-mani fests/secrets.yaml kubectl apply -f istio-manifests/ gateway.yaml kubectl apply -f kubernetes-mani fests/acme_fitness_cluster1.yaml
在叢集2中,部署過程如下:
kubectl label ns default istio-in jection=enabled kubectl apply -f kubernetes-mani fests/secrets.yaml kubectl apply -f istio-manifests/ gateway.yaml kubectl apply -f kubernetes-mani fests/acme_fitness_cluster2.yaml
再回到TSM,設定一個新的Global Namespace,把兩邊Default名稱空間對應起來,與上述netadmin的設定相同,Public Service、External Service、Security皆選擇預設值,如圖18所示。
設定完成之後,為了要讓叢集1取用叢集2的Catalog服務,將修改acme_fitness_cluster1.yaml中的Deployment名稱為Shopping服務的環境變數,並重新apply在叢集1:
#demo.acme.com須更換為自己設定的 global namespace裡的Domain名稱 - name: CATALOG_HOST value: 'catalog.demo.acme.com'
待一切都部署成功後,透過以下的命令找出istio-ingressgateway的IP位置:
#有些公有雲是使用fqdn,需要將最後一個 .ip更換為.fqdn kubectl get svc -n istio-system istio-ingressgateway -o json path={.status.loadBalancer. ingress [0].ip}
再打開瀏覽器,如圖19所示,就可以看到整個服務了。
最後,在叢集1中部署Locust服務,這個服務顧名思義是一個壓測工具,能夠讓使用者透過自行定義Python語法來壓測微服務裡的各個套件。acme_fitness服務也很貼心地幫大家寫好了這個測試,可以直接使用:
#記得必須部署在與shopping服務同名稱空間中 kubectl apply -f traffic-gener ator/loadgen.yaml -n default
隨後再打開TSM,稍待2~3分鐘之後,如圖20所示就可以看到一個美麗的跨叢集拓樸。
其中,連線上的rps讀數為requests per second,可以看到整體拓樸上的流量大小。也可以單擊點某個服務,可以直接看該服務的流量效能分析,如圖21所示。
結語
如前述所說,TSM整合了Istio強大的Traffic Management機制,讓微服務版本變更更加地便利。而TSM的Global Namespace機制,讓所有需要跨叢集合作的服務,在微服務部署當下,就自動升級成為跨叢集的服務。最後,配合上TSM提供完整的拓樸分析與效能監測儀表板,使Site Reliable Engineer能夠對微服務有完整的可視性。下一篇文章將會透過研究Istio本身的跨叢集機制來了解TSM實現Global Namespace的原理。
<本文作者:Shawn Ho,致力推動雲端運算服務加速企業創新研發能力,現任開源容器K8s技術的佈道者,希望透過新技術加速企業內的流程改造。Shawn喜歡以終為始,持續學習新技術,閒暇時考考證照來娛樂自己。近來發現社群裡有更多志同道合的夥伴一起玩技術,所以開始寫部落格《輕鬆小品:PKS和K8s的點滴》,歡迎切磋(https://tinyurl.com/ycmkzxg8)!>