Isito 入門(二):Istio 的部署

本教程已加入 Istio 系列:https://istio.whuanle.cn

2,部署 Istio

在本章中,將會介紹如何在 Kubernetes 中使用 Helm 部署 Istio。

Istio 的安裝方式主要有兩類,第一類是基於 Kubernetes 原生集羣或虛擬機的安裝。另一種是基於 Azure、KubeSphere 等公私有云或 Kubernetes 管理平臺上的安裝。而在本章中介紹的是基於 Kubernetes 的 Helm 安裝。

Istio 官網關於這兩類部署方式還有很多小細節,讀者可根據實際需要從官方中獲取部署資料。

https://istio.io/latest/zh/docs/setup/platform-setup/

https://istio.io/latest/zh/docs/setup/install/

安裝 Helm

首先添加 Helm 官方倉庫地址到 apt 源中。

curl https://baltocdn.com/helm/signing.asc | sudo apt-key add -  
echo "deb https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list  

然後更新包索引。

apt-get update  

通過 apt 命令安裝 Helm。

apt-get install helm

驗證是否安裝完成。

helm version  

image-20230507152206386

部署 istio-base

Google 對 istio-base 的描述信息太少了,只得請教一下 ChatGPT 哥。

image-20230523084951637

也就是說,只有先安裝 istio-base,才能接着安裝其它 Istio 組件。

在本文教程中,安裝的 Istio 與官方使用 istiocli 部署的方式不同,本教程中是逐漸安裝需要的組件,不會一次性安裝完成所有組件。這樣便於讀者逐步瞭解不同的 Istio 組件的作用,瞭解其安裝方式。

在 Helm 中 添加 Istio 的倉庫。

helm repo add istio https://istio-release.storage.googleapis.com/charts
helm repo update

接着提前爲 Istio 組件創建命名空間 istio-system

kubectl create namespace istio-system

接下來將使用 Helm 將 Istio 組件安裝到 istio-system 命名空間中。

首先安裝 Istio CRD:

helm install istio-base istio/base -n istio-system
root@k8smain:~# helm install istio-base istio/base -n istio-system
NAME: istio-base
LAST DEPLOYED: Tue May  2 07:19:15 2023
NAMESPACE: istio-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Istio base successfully installed!

To learn more about the release, try:
  $ helm status istio-base
  $ helm get all istio-base

使用 helm ls 命令驗證 Istio CRD 的安裝情況:

root@k8smain:~# helm ls -n istio-system
NAME      	NAMESPACE   	REVISION	UPDATED                                	STATUS  	CHART      	APP VERSION
istio-base	istio-system	1       	2023-05-02 07:19:15.792125237 +0000 UTC	deployed	base-1.17.2	1.17.2     

如果 STATUS 的內容是 deployed ,說明已經正常,接下來我們進行下一步操作。

部署 istiod

Istiod( Istio Discovery) 是 Istio 服務網格的核心組件,負責控制平面功能

istiod 具備了五大功能:

  • 配置管理:負責分發和同步 Istio 配置到數據平面(Envoy 代理)。

  • 服務發現:基於 Kubernetes 的 Service 和 Endpoint 信息生成服務發現數據,這些數據用於 Envoy Proxy 的負載均衡。

  • 證書管理:爲 Envoy Proxy 提供證書籤發,以支持雙向 TLS 身份驗證。

  • 驗證和轉換:驗證 Istio 配置資源的正確性,並將它們轉換爲 Envoy Proxy 可以理解的格式。

  • Envoy 代理注入:負責將 Envoy Proxy 注入到服務 Pod 中,以便進行流量攔截和路由。

簡單看一下就好了,不用記。

新版本的 Istiod 將舊版本中零散的組件如 Mixer、Pilot、Citadel、Galley 等合併起來了,所以在網上看書查找資料的時候,要注意規避過舊的內容。

在 Helm 中添加 Istiod 倉庫。

helm install istiod istio/istiod -n istio-system --wait

image-20230507153558751

驗證 Istiod 的安裝情況:

root@k8smain:~# helm ls -n istio-system
NAME      	NAMESPACE   	REVISION	UPDATED                                	STATUS  	CHART        	APP VERSION
istio-base	istio-system	1       	2023-05-02 07:19:15.792125237 +0000 UTC	deployed	base-1.17.2  	1.17.2     
istiod    	istio-system	1       	2023-05-02 07:21:07.791242626 +0000 UTC	failed  	istiod-1.17.2	1.17.2     

檢查 istiod 服務是否安裝成功,其 Pod 是否正在運行:

root@k8smain:~# kubectl get deployments -n istio-system -o wide
NAME     READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES                         SELECTOR
istiod   1/1     1            1           10m   discovery    docker.io/istio/pilot:1.16.1   istio=pilot

部署 istio-ingressgateway

istio-ingressgateway (Istio Ingress Gateway )類似 Kubernetes 的 Ingress ,是 Istio 控制外部流量進入 Kubernetes 的入口組件,istio-ingressgateway 作爲一個入口點,允許從服務網格外部訪問服務網格內部的服務,起到了類似 nginx、apisix 等入口網關的作用。

Istio Ingress Gateway 的主要包括以下作用:

  • 接收集羣外部的流量,並根據 Istio 的配置將請求路由到適當的內部服務(起到網關的作用)。

  • 提供負載均衡和流量控制功能,包括請求路由、重試、超時、熔斷等(流量治理)。

  • 支持 TLS 配置,以便在流量進入服務網格之前進行加密(給域名配置證書)。

  • 支持雙向 TLS 身份驗證,以提高服務網格的安全性(服務間通訊)。

  • 提供 Metrics、Tracing 和 Logging 收集,以便更好地觀察和監控流量(需要自己安裝對應的組件)。

隨便看看就好,不用記這些。

安裝 istio-ingressgateway。

helm install istio-ingressgateway istio/gateway -n istio-system

image-20230503121734717

實際上 istio-ingressgateway 是作爲一個 Kubernetes Service 對外提供訪問服務。

image-20230507154929369

由於 Istio-ingressgateway 默認使用的是 LoadBalancer ,需要公有云平臺支撐,不然會一直處於 <pending>,因此我們需要修改 Service ,將 istio-ingressway 的網絡類型從 LoadBalancer 改成 NodePort,以便直接通過服務器的 IP 訪問。

   kubectl edit svc istio-ingressgateway -n istio-system  

找到 type: LoadBalancer ,修改爲 type: NodePort

1683087604976

因爲 LoadBalancer 包含了 NodePort,其實不修改也行。

istio-ingressgateway 本身包含 Kubernetes Service 、Pod,通過暴露節點端口,外部可以通過節點端口將流量打入 istio-ingressgateway 的 Pod。

image-20230523091815336

流量經過 Istio 分析後,流量通過負載均衡轉發到其中一個 Pod。

image-20230528090617137

流量進入 Istio 之後,不需要將流量轉發到 Service,但是依然需要依賴 Service。 Istio 會從 Service 中獲取到所有的 Pod,然後 Istio 直接將流量轉發到 Pod,實現熔斷、故障處理等一系列任務。

經過以上步驟,我們已經安裝和了解 istio-base、istiod、istio-ingressgateway 三個 Istio 基礎組件,在後面的章節中,我們將開始真正實踐使用 Istio ,去解決微服務中的一些問題。

清除

如果有一天不需要 Istio 了,你可以通過當前命令清空部署的 Istio 應用。

helm delete istio-ingressgateway -n istio-system
helm delete istiod -n istio-system
helm delete istio-base -n istio-system

kubectl delete namespace istio-system
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章