本教程已加入 Istio 系列:https://istio.whuanle.cn
2,部署 Istio
在本章中,將會介紹如何在 Kubernetes 中使用 Helm 部署 Istio。
Istio 的安裝方式主要有兩類,第一類是基於 Kubernetes 原生集羣或虛擬機的安裝。另一種是基於 Azure、KubeSphere 等公私有云或 Kubernetes 管理平臺上的安裝。而在本章中介紹的是基於 Kubernetes 的 Helm 安裝。
Istio 官網關於這兩類部署方式還有很多小細節,讀者可根據實際需要從官方中獲取部署資料。
安裝 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
部署 istio-base
Google 對 istio-base 的描述信息太少了,只得請教一下 ChatGPT 哥。
也就是說,只有先安裝 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
驗證 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
實際上 istio-ingressgateway 是作爲一個 Kubernetes Service 對外提供訪問服務。
由於 Istio-ingressgateway 默認使用的是 LoadBalancer ,需要公有云平臺支撐,不然會一直處於 <pending>
,因此我們需要修改 Service ,將 istio-ingressway 的網絡類型從 LoadBalancer 改成 NodePort,以便直接通過服務器的 IP 訪問。
kubectl edit svc istio-ingressgateway -n istio-system
找到 type: LoadBalancer
,修改爲 type: NodePort
。
因爲
LoadBalancer
包含了NodePort
,其實不修改也行。
istio-ingressgateway 本身包含 Kubernetes Service 、Pod,通過暴露節點端口,外部可以通過節點端口將流量打入 istio-ingressgateway 的 Pod。
流量經過 Istio 分析後,流量通過負載均衡轉發到其中一個 Pod。
流量進入 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