您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關如何將部署在VM中的服務納入Istio,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
Istio在設計之初,主要面向Kubernetes當中的服務。但是在實際場景中,依舊有不少服務部署在VM上,Istio想成為Service Mesh事實上的標準,毫無疑問需要支持VM部署的服務。
Istio1.6 新增了 WorkloadEntry 自定義資源,通過該資源為VM提供了一流的支持。
Istio1.7 增加了安全引導VM中運行的服務的身份的功能。最后,Istio 1.7增加了Sidecar的安裝包,以支持CentOS/Red Hat和現有的Debian/Ubuntu。
Istio1.8 新增了智能 DNS 代理,它是由 Go 編寫的 Istio sidecar 代理,sidecar 上的 Istio agent 將附帶一個由 Istiod 動態編程的緩存 DNS 代理。來自應用程序的 DNS 查詢會被 pod 或 VM 中的 Istio 代理透明地攔截和服務,該代理會智能地響應 DNS 查詢請求,可以實現虛擬機到服務網格的無縫多集群訪問。
并且Istio1.8新增了 WorkloadGroup 自定義資源,該資源是描述部署在VM上的服務實例的集合,旨在模仿現有的用于Kubernetes工作負載的Sidecar注入和Deployment規范模型,以引導Istio代理。
通過 WorkloadGroup方式, 實現VM 實例自動注冊的功能目前處于pre-alpha狀態
WorkloadEntry用來描述非Pod的端點,將VM納入mesh中。此時VM成為像Pod一樣的一等公民,可以配置MUTUAL_TLS。
要創建一個WorkloadEntry并將其附加到ServiceEntry,執行以下操作:
apiVersion: networking.istio.io/v1alpha3
kind: WorkloadEntry
metadata:
name: vm1
namespace: ns1
spec:
address: 1.1.1.1
labels:
app: foo
instance-id: vm-78ad2
class: vm
---
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: svc1
namespace: ns1
spec:
hosts:
- svc1.internal.com
ports:
- number: 80
name: http
protocol: HTTP
resolution: STATIC
workloadSelector:
labels:
app: foo
這將創建一個包含一組標簽和地址的新WorkloadEntry,以及一個使用WorkloadSelector選擇帶有所需標簽的所有端點的ServiceEntry,在這種情況下,包括為VM創建的WorkloadEntry。
請注意,ServiceEntry可以使用相同的選擇器引用Pod和WorkloadEntries。現在,Istio可以對VM和Pod進行相同的處理,而不必將它們分開。
WorkloadGroup主要用于 WorkloadEntry 自動注冊,該功能在實際場景中比較實用。事實上我們部署在VM當中的服務,一般都會配置自動伸縮,這就要求我們的服務必須可以自動注冊到mesh中。
如何實現自動注冊那?
首先我們需要做一些準備工作:
在安裝istiod的時候,啟用自動注冊的功能。
$ istioctl install --set values.pilot.env.PILOT_ENABLE_WORKLOAD_ENTRY_AUTOREGISTRATION=true
部署一個east-west gateway。用于暴露istiod服務,從而可以讓VM上的Sidecar 可以和istiod 通信。
然后我們創建如下的 WorkloadGroup:
apiVersion: networking.istio.io/v1alpha3
kind: WorkloadGroup
metadata:
name: python-http
namespace: vm
spec:
metadata:
annotations: {}
labels:
app: python-http
template:
ports: {}
serviceAccount: my-vm
這樣我們在每個vm上python-http 實例啟動后,都會自動在mesh中創建一個WorkloadEntry。而創建的WorkloadEntry,包含了VM實例的ip和元數據。此時我們就可以創建一個ServiceEntry,通過標簽選擇器選擇我們的WorkloadEntry。然后mesh中的其他服務就可以通過ServiceEntry中的hosts, 對我們的python-http服務進行訪問。
apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
name: vm-workload-svc
namespace: vm
spec:
hosts:
- vmservice.example.com
location: MESH_INTERNAL
ports:
- number: 80
name: http
protocol: HTTP
targetPort: 9090
resolution: STATIC
workloadSelector:
labels:
app: python-http
關于VM詳細的安裝步驟,參考官方文檔。
其實完成VM自動注冊,并不能通過主機名實現虛擬機到服務網格的無縫訪問。例如,如果我們在VM上部署Istio sidecar代理,我們將無法通過主機名(例如httpbin.default.svc.cluster.local)訪問網格和Kubernetes集群中服務。此時我們需要智能DNS。
在Istio 1.8中,Sidecar現在具有一個DNS代理,該代理緩存網格中的端點和ServiceEntry資源創建的端點。通過Iptables規則,攔截dns請求到sidecar 本地dns server,在緩存中可以解析的主機名,則直接返回解析結果,如果找不到,它將作為普通DNS代理委派給系統DNS。這樣vm上的服務可以通過主機名訪問mesh中的服務。
智能DNS 默認沒有啟用,我們在安裝istio的時候,可以通過如下參數啟用該功能:
--set meshConfig.defaultConfig.proxyMetadata.ISTIO_META_DNS_CAPTURE=true
當VM連接到Istio控制平面時,它通過“東西向網關”進行連接。該網關實際上只是一個專門為網格內部流量指定的Istio網關,現在,東西向網關已經是Istio 1.8中的推薦部署。一旦從VM Sidecar到Istio控制平面建立了連接,便會創建適當的WorkloadEntry資源,并使VM Sidecar可以解析集群中的所有服務。從VM上部署服務可以直接訪問httpbin.default.svc.cluster.local。DNS名稱由代理解析,并通過“東西方網關”路由到網格中的適當服務。
上述就是小編為大家分享的如何將部署在VM中的服務納入Istio了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。