Istio 提供了一個統一的平台來管理微服務之間的通訊、安全和可觀察性。它透過在應用程式 Pod 中注入 Envoy 代理,攔截和管理所有網路流量,從而實作服務發現、流量路由、負載平衡、安全認證和監控等功能。Istio 的控制平面負責組態和管理這些代理,並收集遙測資料,提供對服務網格的全面控制和洞察力。
深入瞭解 Istio:解決微服務架構中的網路挑戰
初步使用 Istio
Istio 解決了雲端環境中服務通訊的一些困難挑戰,並為開發人員和操作員提供了許多功能。我們將在後續章節中詳細介紹這些功能及其工作原理;但為了讓你感受到 Istio 的一些功能,我們在本章中進行基本安裝(更高階的安裝選項可以在附錄 A 中找到)並佈署一些服務。這些服務和範例來自本章的原始碼,你可以在 https://github.com/istioinaction/book-source-code 上找到它們。從那裡開始,我們探索構成 Istio 的元件以及我們可以為範例服務提供哪些功能。最後,我們看看如何進行基本流量路由、指標收集和彈性。
在 Kubernetes 上佈署 Istio
我們將使用容器佈署 Istio 和我們的範例應用程式,並使用 Kubernetes 容器平台來完成這一任務。Kubernetes 是一個強大的容器平台,能夠在稱為 Kubernetes 節點的主機機器群中排程和協調容器。這些節點是能夠執行容器的主機機器,但 Kubernetes 處理這些機制。如我們所見,Kubernetes 是初次嘗試 Istio 的絕佳場所——儘管我們應該明確指出 Istio 應該支援多種工作負載型別,包括執行在虛擬機器(VM)上的工作負載。
使用 Docker Desktop 進行範例
要開始,我們需要存取 Kubernetes 分佈。對於本章,我們使用 Docker Desktop(www.docker.com/products/docker-desktop),它提供了一個精簡版本的 Kubernetes 分佈。
內容解密:
本文探討了 Istio 作為一個開放原始碼服務網格技術如何解決微服務架構中的網路連線挑戰。玄貓解釋了 Istio 的核心概念、設計原則以及實際應用程式場景,幫助讀者理解如何在雲端環境中構建更加可靠、安全和可觀察的應用程式系統。
在 Kubernetes 上佈署 Istio
使用 Docker Desktop 進行範例
Docker Desktop 提供了主機機器與虛擬機器之間的良好整合。你不必受限於使用 Docker Desktop 來執行這些範例並遵循本章:這些範例應該能夠在任何 Kubernetes 變體上良好執行,包括 Google Kubernetes Engine(GKE)、OpenShift 或你自己的自啟動 Kubernetes 分佈。要設定 Kubernetes,請參閲 Docker Desktop 的檔案(www.docker.com/products/docker-desktop)以取得你的機器。成功設定 Docker Desktop 並啟用 Kubernetes 後,你應該能夠像下面這樣連線到你的 Kubernetes 叢集:
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
docker-desktop Ready master 15h v1.21.1
注意:本章使用的 Istio 1.13.0 需要至少 Kubernetes 版本 1.19.x。
為 Docker Desktop 分配推薦資源
雖然 Istio 在本地機器上對 Docker Desktop 不會需要太多資源,但在某些章節中我們安裝了許多其他支援元件。值得給 Docker 分配 8 GB 的記憶體和四個 CPU。你可以在 Docker Desktop 的高階設定中進行這些設定。
取得 Istio 分佈
接下來,我們想要將 Istio 安裝到我們的 Kubernetes 分佈中。我們使用 istioctl 命令列工具來安裝 Istio。要做到這一點,從 Istio 發布頁面(https://github.com/istio/istio/releases)下載 Istio 1.13.0 分佈,並下載適合你作業系統的分佈。你可以選擇 Windows、macOS/Darwin 或 Linux。或者,你可以執行這個方便的指令碼:
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.13.0 sh -
下載適合你作業系統的分佈後,將壓縮檔案解壓縮到一個目錄中。如果你使用 downloadIstio 指令碼,則會自動解壓縮存檔。從那裡,你可以探索分佈的內容,包括範例、安裝資源和適合你作業系統的二進位命令列介面。
這裡是 macOS 的 Istio 分佈範例:
$ cd istio-1.13.0
$ ls -l
total 48
-rw-r--r-- 1 ceposta staff 11348 Mar 19 15:33 LICENSE
-rw-r--r-- 1 ceposta staff 5866 Mar 19 15:33 README.md
drwxr-x--- 3 ceposta staff 96 Mar 19 15:33 bin
-rw-r
---
-- 1 ceposta staff 853 Mar 19 15:33 manifest.yaml
drwxr-xr-x 5 ceposta staff 160 Mar 19 15:33 manifests
drwxr-xr-x 20 ceposta staff 640 Mar 19 15:33 samples
drwxr-x--- 6 ceposta staff 192 Mar 19 15:33 tools
瀏覽分佈目錄以瞭解 Istio 提供了什麼。例如,在 samples 目錄中,你會看到一些教程和應用程式,幫助你開始使用 Istio。逐一檢視這些內容將給你一個很好的初步概念,瞭解 Istio 能做什麼以及如何與其元件互動。我們將在下一節探討。tools 目錄包含一些用於排除 Istio 安裝問題的工具,以及 istioctl 的 bash-completion。manifests 目錄包含用於自定義特定平台上的 Istio 安裝的 Helm 圖表和 istioctl 設定檔案。你可能不需要直接使用這些(如我們所見),但它們是為自定義目的而存在的。
特別值得注意的是 bin 目錄,那裡有一個簡單的命令列介面(CLI)工具 istioctl 用於與 Istio 互動。這個二進位檔案類別似於用於與 Kubernetes API 互動的 kubectl,但它包含了一些命令來增強使用 Istio 的使用者經驗。執行 istioctl 二進位檔案以驗證一切是否按預期執行:
$ ./bin/istioctl version
no running Istio pods in "istio-system"
1.13.0
此時,你可以將 istioctl CLI 增加到你的路徑中,以便在命令列上導航到任何地方都可用。這是特定於平台的,由你來決定如何實作。
在 Kubernetes 中安裝 Istio 元件
在你剛剛下載和解壓縮的分佈中,manifests 目錄包含一組圖表和資源檔案,用於將 Istio 安裝到你選擇的平台中。安裝 Istio 的官方方法是使用 istioctl、istio-operator 或 Helm。附錄 A 引導你使用 istioctl 和 istio-operator 安裝和自定義 Istio。
對於本章,我們使用 istioctl 和各種預先精選的設定檔案來採取逐步、增量的方法來採用 Istio。要執行演示安裝,請使用 istioctl CLI 工具如下所示:
$ istioctl install --set profile=demo -y
✔ Istio core installed
✔ Istiod installed
✔ Ingress gateways installed
✔ Egress gateways installed
✔ Installation complete
執行此命令後,你可能需要等待幾分鐘讓 Docker 影像正確下載並佈署成功。當一切都穩定下來後,你可以執行 kubectl 命令來列出 istio-system 名稱空間中的所有 Pod。你還可能會看到一個通知,指出你的叢集不支援第三方 JSON Web Token(JWT)驗證。這對於本地開發是可以接受的,但對於生產環境則不建議。如果在生產叢集中安裝過程中出現錯誤,請按照 Istio 的檔案設定第三方服務帳戶令牌(http://mng.bz/Vl7G),這是大多數雲端服務提供商的預設設定,不應該是必要的。
讓我們看看安裝到 istio-system 名稱空間中的元件:
$ kubectl get pod -n istio-system
NAME READY STATUS RESTARTS AGE
istio-egressgateway-55d547456b-q2ldq 1/1 Running 0 92s
istio-ingressgateway-7654895f97-2pb62 1/1 Running 0 93s
istiod-5b9d44c58b-vvrpb 1/1 Running 0 99s
安裝控制平面支援元件
$ kubectl apply -f samples/addons/
namespace/istio-system created
customresourcedefinition.apiextensions.k8s.io/prometheuses.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/servicemonitors.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/podmonitors.monitoring.coreos.com created
serviceaccount/prometheus created
configmap/configmap created
clusterrole.rbac.authorization.k8s.io/prometheus created
clusterrolebinding.rbac.authorization.k8s.io/prometheus created
service/monitoring created
deployment.apps/prometheus created
service/monitoring created
驗證 Prometheus 安裝
$ kubectl get pods -n istio-system -l app=prometheus -w
NAME READY STATUS RESTARTS AGE
prometheus-7d7c7d7c7d-7d7c7 2/2 Running 0 10s
Kubernetes 中 Istio 控制平面的解析
在現代雲原生架構中,服務網格扮演著越來越重要的角色,而 Istio 作為領先的開源服務網格解決方案,為管理和監控微服務提供了強大的功能。本文將探討 Istio 的控制平面,解析其核心元件、功能以及如何與 Kubernetes 整合。
Istio 控制平面的架構
Istio 的控制平面負責管理和設定服務網格中的所有元件,其核心元件包括 istiod、安全元件和可觀察性元件。控制平面為資料平面提供了統一的設定和管理介面,確保服務之間的通訊安全、可靠和可觀察。
Istiod:核心控制元件
istiod 是 Istio 控制平面的核心元件,負責將高階的 Istio 設定轉換為資料平面代理伺服器(如 Envoy)的具體設定。它提供了以下關鍵功能:
- 設定管理:
istiod將使用者的設定意圖轉化為 Envoy 可以理解的設定,並透過 xDS API 下發給資料平面代理。 - 服務發現:提供服務發現機制,使代理伺服器能夠動態取得伺服器端點資訊。
- 證書管理:負責簽發和管理工作負載的 X.509 證書,實作 mTLS 加密通訊。
控制平面與 Kubernetes 的整合
在 Kubernetes 環境中,Istio 的控制平面與 Kubernetes API 伺服器緊密整合。Istio 利用 Kubernetes 的自定義資源定義(CRD)機制擴充套件了 Kubernetes 的 API,引入了 VirtualService、DestinationRule 等 Istio 特有的資源型別。
設定流程範例
以下是一個簡單的範例,展示如何使用 VirtualService 設定流量路由規則:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: catalog-service
spec:
hosts:
- catalog.prod.svc.cluster.local
http:
- match:
- headers:
x-dark-launch:
exact: "v2"
route:
- destination:
host: catalog.prod.svc.cluster.local
subset: v2
- route:
- destination:
host: catalog.prod.svc.cluster.local
subset: v1
這個設定定義了根據 HTTP 請求頭 x-dark-launch 的值,將流量路由到不同版本的 catalog 服務。Istio 的控制平面會將這個設定轉化為 Envoy 的組態,並推播到相關的代理伺服器。
安全與身份管理
Istio 的控制平面提供了強大的身份管理和安全功能:
- 自動 mTLS:Istio 可以自動為服務間的通訊啟用 mTLS 加密,無需應用程式修改。
- SPIFFE 相容身份:工作負載身份遵循 SPIFFE 規範,提供跨平台的身份驗證能力。
- 細粒度授權:支援根據請求屬性的細粒度授權策略。
可觀察性增強
控制平面還整合了可觀察性元件,如 Prometheus、Grafana 和 Kiali,為服務網格提供了全面的監控和分析能力。
此圖示說明瞭 Istio 控制平面元件之間的互動關係:
內容解密:
此 Plantuml 圖表展示了 Istio 控制平面元件之間的互動關係。其中,istiod 透過 xDS API 與 Envoy Sidecar 通訊,提供設定和證書管理。Envoy Sidecar 之間透過 mTLS 進行安全通訊。同時,istiod 也與 Kubernetes API 緊密整合,實作對服務網格的全面管理。
服務網格實戰:Istio 技術深度解析
前言
在現代雲端環境中,微服務架構已成為企業應用程式開發的主流模式。然而,隨著服務數量的增加,網路連線的複雜性也隨之提升。Istio 作為一個開放原始碼的服務網格技術,為解決這些挑戰提供了強大的工具。本文將探討 Istio 的核心概念、設計原則以及實際應用場景,幫助讀者理解如何在雲端環境中構建更加可靠、安全和可觀察的應用程式系統。
Istio 核心概念與架構設計
內容解密:
Istio 的服務網格架構主要由資料平面和控制平面組成。資料平面負責處理服務之間的網路流量,而控制平面則提供組態管理、策略執行和遙測資料收集等功能。這種分層架構使得 Istio 能夠靈活地適應不同的雲端環境和應用程式需求。
在 Kubernetes 中佈署 Istio
要開始使用 Istio,首先需要在 Kubernetes 叢集中進行安裝。以下是簡化的安裝步驟:
# 下載 Istio 安裝套件
curl -L https://istio.io/download/istio | sh -
# 切換到 Istio 目錄
cd istio-<version>
# 安裝 Istio
./bin/istioctl install --set profile=demo
# 驗證安裝結果
kubectl get deployments -n istio-system
流程解密
此圖示展示了 Istio 的安裝流程:
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title Istio服務網格技術深度解析
package "Kubernetes Cluster" {
package "Control Plane" {
component [API Server] as api
component [Controller Manager] as cm
component [Scheduler] as sched
database [etcd] as etcd
}
package "Worker Nodes" {
component [Kubelet] as kubelet
component [Kube-proxy] as proxy
package "Pods" {
component [Container 1] as c1
component [Container 2] as c2
}
}
}
api --> etcd : 儲存狀態
api --> cm : 控制迴圈
api --> sched : 調度決策
api --> kubelet : 指令下達
kubelet --> c1
kubelet --> c2
proxy --> c1 : 網路代理
proxy --> c2
note right of api
核心 API 入口
所有操作經由此處
end note
@enduml
佈署範例應用程式
ACME 公司正在重新設計其網站和支援庫存和結帳的系統。該公司決定使用 Kubernetes 作為其佈署平台的核心,並將其應用程式構建為 Kubernetes API。為了展示 Istio 的功能,我們將使用一個簡化的線上網路商店範例應用程式。
下載範例程式碼
要取得此範例的原始碼,請從 http://istioinaction.io 下載或從 https://github.com/istioinaction/book-source-code 複製。在 services 目錄中,您應該會看到描述我們元件佈署的 Kubernetes 資源檔案。
# 建立名稱空間
kubectl create namespace istioinaction
# 切換到新建立的名稱空間
kubectl config set-context $(kubectl config current-context) --namespace=istioinaction
檢視佈署內容
catalog-service 的 Kubernetes 資源檔案內容如下:
apiVersion: v1
kind: Service
metadata:
labels:
app: catalog
name: catalog
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: 3000
selector:
app: catalog
內容解密:
這個 YAML 檔案定義了一個名為 catalog 的 Kubernetes Service 物件。它指定了服務的標籤、名稱、埠組態以及選擇器,用於將服務與具有特定標籤的 Pod 關聯起來。這種組態使得 Istio 可以輕鬆地管理和監控服務之間的流量。