虛擬機器架構
在閱讀本文檔之前,請務必先複習 Istio 的架構 和 部署模型。本頁將建立在這些文件的基礎上,說明如何擴展 Istio 以支援將虛擬機器加入網格。
Istio 的虛擬機器支援允許將 Kubernetes 叢集之外的工作負載連接到網格。這使得傳統應用程式或不適合在容器化環境中執行的應用程式,也能獲得 Istio 為 Kubernetes 內部應用程式提供的所有優點。
對於在 Kubernetes 上運行的工作負載,Kubernetes 平台本身提供了各種功能,例如服務發現、DNS 解析和健康檢查,這些功能在虛擬機器環境中通常是缺失的。Istio 為在虛擬機器上運行的工作負載啟用了這些功能,此外,還允許這些工作負載使用 Istio 的功能,例如相互 TLS (mTLS)、豐富的遙測和進階流量管理功能。
下圖顯示了具有虛擬機器的網格架構
服務關聯
Istio 提供了兩種機制來表示虛擬機器工作負載
WorkloadGroup
表示共享共同屬性的虛擬機器工作負載的邏輯群組。這類似於 Kubernetes 中的Deployment
。WorkloadEntry
表示虛擬機器工作負載的單一實例。這類似於 Kubernetes 中的Pod
。
建立這些資源(WorkloadGroup
和 WorkloadEntry
)不會導致佈建任何資源或執行任何虛擬機器工作負載。相反,這些資源僅引用這些工作負載,並告知 Istio 如何適當設定網格。
將虛擬機器工作負載添加到網格時,您需要建立一個 WorkloadGroup
,作為每個 WorkloadEntry
實例的範本
apiVersion: networking.istio.io/v1
kind: WorkloadGroup
metadata:
name: product-vm
spec:
metadata:
labels:
app: product
template:
serviceAccount: default
probe:
httpGet:
port: 8080
一旦虛擬機器被設定並加入網格,Istio 控制平面將會自動建立對應的 WorkloadEntry
。例如
apiVersion: networking.istio.io/v1
kind: WorkloadEntry
metadata:
annotations:
istio.io/autoRegistrationGroup: product-vm
labels:
app: product
name: product-vm-1.2.3.4
spec:
address: 1.2.3.4
labels:
app: product
serviceAccount: default
此 WorkloadEntry
資源描述了工作負載的單一實例,類似於 Kubernetes 中的 Pod。當工作負載從網格中移除時,WorkloadEntry
資源將會被自動移除。此外,如果在 WorkloadGroup
資源中設定了任何探針,Istio 控制平面將會自動更新相關聯的 WorkloadEntry
實例的健康狀態。
為了讓消費者能夠可靠地呼叫您的工作負載,建議您宣告一個 Service
關聯。這允許客戶端可以透過穩定的主機名稱 (例如 product.default.svc.cluster.local
) 連線,而不是暫時的 IP 位址。這也使您能夠透過 DestinationRule
和 VirtualService
API 在 Istio 中使用進階路由功能。
任何 Kubernetes 服務都可以透過選擇器欄位透明地選取 Pod 和虛擬機器中的工作負載,這些欄位會分別與 Pod 和 WorkloadEntry
標籤進行比對。
例如,名為 product
的 Service
由一個 Pod
和一個 WorkloadEntry
組成
透過此組態,對 product
的請求將會在 Pod 和虛擬機器工作負載實例之間進行負載平衡。
DNS
Kubernetes 在 Pod 中為 Service
名稱提供 DNS 解析,讓 Pod 可以透過穩定的主機名稱輕鬆地相互通信。
對於虛擬機器擴充,Istio 透過 DNS Proxy 提供類似的功能。此功能會將虛擬機器工作負載的所有 DNS 查詢重新導向到 Istio 代理,Istio 代理會維護主機名稱到 IP 位址的對應。
因此,在虛擬機器上運行的工作負載可以透明地呼叫 Service
(類似於 Pod),而無需任何額外的組態。