微服務(wù)非常適合用于生成Api。使用Azure Kubernetes Service(AKS),你可以在云中快速部署和運(yùn)行基于微服務(wù)的體系結(jié)構(gòu)。然后,你可以利用AZURE Api管理(api管理)將微服務(wù)作為api發(fā)布到內(nèi)部和外部使用。本文介紹了通過(guò)AKS部署API管理的選項(xiàng)。它假定Kubernetes、API管理和Azure網(wǎng)絡(luò)的基本知識(shí)。
背景
將微服務(wù)發(fā)布為用于使用的Api時(shí),管理微服務(wù)和使用它們的客戶端之間的通信可能會(huì)很困難。需要考慮多種跨切削問(wèn)題,例如身份驗(yàn)證、授權(quán)、限制、緩存、轉(zhuǎn)換和監(jiān)視。不管是否向內(nèi)部或外部客戶端公開(kāi)微服務(wù),這些問(wèn)題都是有效的。
API網(wǎng)關(guān)模式解決了這些問(wèn)題。API網(wǎng)關(guān)充當(dāng)微服務(wù)的前端,將客戶端與微服務(wù)分離,增加額外的安全層,并通過(guò)消除處理交叉切削問(wèn)題的負(fù)擔(dān),降低微服務(wù)的復(fù)雜性。
AZURE Api管理是一種全包式解決方案,用于解決API網(wǎng)關(guān)需求??梢詾槲⒎?wù)快速創(chuàng)建一致的新式網(wǎng)關(guān),并將其發(fā)布為Api。它還提供了其他功能,包括用于API發(fā)現(xiàn)、API生命周期管理和API分析的自助服務(wù)開(kāi)發(fā)人員門戶。
結(jié)合使用時(shí),AKS和API管理提供了一個(gè)平臺(tái),用于部署、發(fā)布、保護(hù)、監(jiān)視和管理基于微服務(wù)的Api。在本文中,我們將逐步介紹幾個(gè)與API管理一起部署AKS的選項(xiàng)。
Kubernetes服務(wù)和Api
在Kubernetes群集中,容器部署在pod中,并具有生命周期。輔助角色節(jié)點(diǎn)停止運(yùn)行時(shí),節(jié)點(diǎn)上運(yùn)行的盒將丟失。因此,Pod的IP地址可隨時(shí)更改。我們不能依靠它來(lái)與pod通信。
為了解決此問(wèn)題,Kubernetes引入了服務(wù)的概念。Kubernetes服務(wù)是一種抽象層,它定義了pod的邏輯組,并為這些pod啟用了外部流量泄露、負(fù)載平衡和服務(wù)發(fā)現(xiàn)。
當(dāng)我們準(zhǔn)備通過(guò)API管理將微服務(wù)發(fā)布為Api時(shí),我們需要考慮如何將Kubernetes中的服務(wù)映射到API管理中的Api。沒(méi)有設(shè)置規(guī)則。這取決于你在一開(kāi)始就將業(yè)務(wù)功能或域劃分到微服務(wù)中的方式。例如,如果服務(wù)背后的pod負(fù)責(zé)給定資源的所有操作(例如,客戶),則該服務(wù)可能會(huì)映射到一個(gè)API。如果對(duì)資源的操作分區(qū)為多個(gè)微服務(wù)(例如,GetOrder、PlaceOrder),則可在API管理中將多個(gè)服務(wù)邏輯聚合為一個(gè)API(請(qǐng)參閱圖1)。
映射也可以發(fā)展。由于API管理在微服務(wù)的前面創(chuàng)建了一個(gè)外觀,因此,我們可以在一段時(shí)間內(nèi)重構(gòu)微服務(wù)并調(diào)整其大小。
將服務(wù)映射到Api
在AKS之前部署API管理
有幾個(gè)選項(xiàng)可用于在AKS群集前面部署API管理。
盡管AKS群集始終部署在虛擬網(wǎng)絡(luò)中(VNet),但不需要在VNet中部署API管理實(shí)例。如果API管理不在群集VNet中,AKS群集必須發(fā)布公共終結(jié)點(diǎn),以便API管理連接到。在這種情況下,需要保護(hù)API管理和AKS之間的連接。換句話說(shuō),我們需要確保群集只能通過(guò)API管理以獨(dú)占方式訪問(wèn)。我們來(lái)看一下這些選項(xiàng)。
選項(xiàng)1:公開(kāi)公開(kāi)服務(wù)
可以使用NodePort、LoadBalancer或ExternalName服務(wù)類型公開(kāi)公開(kāi)AKS群集中的服務(wù)。在這種情況下,可以直接從公共internet訪問(wèn)服務(wù)。將API管理部署到群集之前,我們需要確保所有入站流量通過(guò)API管理,方法是在微服務(wù)中應(yīng)用身份驗(yàn)證。例如,API管理可以在對(duì)群集發(fā)出的每個(gè)請(qǐng)求中包含一個(gè)訪問(wèn)令牌。每個(gè)微服務(wù)負(fù)責(zé)在處理請(qǐng)求之前驗(yàn)證令牌。
這可能是在AKS之前部署API管理的最簡(jiǎn)單選項(xiàng),尤其是在微服務(wù)中實(shí)現(xiàn)了身份驗(yàn)證邏輯時(shí)。
直接發(fā)布服務(wù)
優(yōu)點(diǎn):
API管理端上的輕松配置,因?yàn)闊o(wú)需注入群集VNet
如果服務(wù)已公開(kāi)公開(kāi)并且微服務(wù)中已存在身份驗(yàn)證邏輯,則無(wú)AKS端的更改。
缺點(diǎn):
服務(wù)終結(jié)點(diǎn)的公共可見(jiàn)性導(dǎo)致的潛在安全風(fēng)險(xiǎn)
沒(méi)有入站群集流量的單一入口點(diǎn)
利用重復(fù)的身份驗(yàn)證邏輯使微服務(wù)復(fù)雜化
選項(xiàng)2:安裝入口控制器
盡管選項(xiàng)1可能更簡(jiǎn)單,但它具有上面提到的顯著缺點(diǎn)。如果API管理實(shí)例不在群集VNet中,則相互TLS身份驗(yàn)證(mTLS)是一種可靠的方式,可確保在API管理實(shí)例和AKS群集之間的兩個(gè)方向上都安全且信任流量。
API管理以本機(jī)方式支持相互TLS身份驗(yàn)證,并且可在Kubernetes中通過(guò)安裝入口控制器(圖3)啟用。因此,將在入口控制器中執(zhí)行身份驗(yàn)證,這將簡(jiǎn)化微服務(wù)。此外,可以通過(guò)入口將API管理的IP地址添加到允許列表,以確保只有API管理可以訪問(wèn)群集。
通過(guò)入口控制器發(fā)布
優(yōu)點(diǎn):
API管理端上的輕松配置,因?yàn)闊o(wú)需注入群集VNet,而mTLS是本機(jī)支持的
為入口控制器層上的入站群集流量集中保護(hù)
通過(guò)最大程度減少公開(kāi)可見(jiàn)的群集終結(jié)點(diǎn)來(lái)降低安全風(fēng)險(xiǎn)
缺點(diǎn):
增加群集配置的復(fù)雜性,原因是安裝、配置和維護(hù)入口控制器并管理用于mTLS的證書(shū)
由于入口控制器終結(jié)點(diǎn)的公開(kāi)可見(jiàn)性(s的安全風(fēng)險(xiǎn))
通過(guò)API管理發(fā)布API時(shí),使用訂閱密鑰保護(hù)對(duì)這些API的訪問(wèn)容易且常見(jiàn)。需要使用已發(fā)布API的開(kāi)發(fā)人員在調(diào)用這些API時(shí)必須在HTTP請(qǐng)求中包括一個(gè)有效的訂閱密鑰。否則,API管理網(wǎng)關(guān)會(huì)立即拒絕調(diào)用。不會(huì)將它們轉(zhuǎn)發(fā)到后端服務(wù)。
若要獲取訪問(wèn)API所需的訂閱密鑰,必須擁有訂閱。訂閱實(shí)質(zhì)上是一個(gè)已命名的容器,該容器包含一對(duì)訂閱密鑰。需要使用已發(fā)布API的開(kāi)發(fā)人員可以獲取訂閱。不需要API發(fā)布者批準(zhǔn)。API發(fā)布者也可以直接為API使用者創(chuàng)建訂閱。
選項(xiàng)3:在群集VNet內(nèi)部署APIM
在某些情況下,由于公開(kāi)的終結(jié)點(diǎn),具有法規(guī)約束或嚴(yán)格安全要求的客戶可能會(huì)找到選項(xiàng)1和2不可行的解決方案。在其他情況下,AKS群集和使用微服務(wù)的應(yīng)用程序可能駐留在同一VNet中,因此沒(méi)有理由公開(kāi)群集,因?yàn)樗蠥PI流量將保留在VNet中。在這些情況下,你可以將API管理部署到群集VNet中。API管理高級(jí)層支持VNet部署。
將API管理部署到VNet中的模式有兩種:外部和內(nèi)部。
如果API使用者不在群集VNet中,則應(yīng)使用外部模式(圖4)。在此模式下,API管理網(wǎng)關(guān)注入群集VNet,但可通過(guò)外部負(fù)載均衡器從公共internet訪問(wèn)。它有助于完全隱藏群集,同時(shí)仍允許外部客戶端使用微服務(wù)。此外,還可以使用Azure網(wǎng)絡(luò)功能,例如網(wǎng)絡(luò)安全組(NSG)來(lái)限制網(wǎng)絡(luò)流量。
外部VNet模式
如果所有API使用者都駐留在群集VNet中,則可以使用內(nèi)部模式(圖5)。在此模式下,API管理網(wǎng)關(guān)注入群集VNET,只能通過(guò)內(nèi)部負(fù)載均衡器在此VNet內(nèi)訪問(wèn)。無(wú)法從公共internet訪問(wèn)API管理網(wǎng)關(guān)或AKS群集。
內(nèi)部VNet模式
在這兩種情況下,AKS群集都不公開(kāi)可見(jiàn)。與選項(xiàng)2相比,入口控制器可能不是必需的。根據(jù)你的方案和配置,可能仍需要在API管理與微服務(wù)之間進(jìn)行身份驗(yàn)證。例如,如果采用服務(wù)網(wǎng)格,則它始終需要相互TLS身份驗(yàn)證。
優(yōu)點(diǎn):
最安全的選項(xiàng),因?yàn)锳KS群集沒(méi)有公共終結(jié)點(diǎn)
簡(jiǎn)化群集配置,因?yàn)樗鼪](méi)有公共終結(jié)點(diǎn)
能夠使用內(nèi)部模式在VNet中隱藏API管理和AKS
使用Azure網(wǎng)絡(luò)功能控制網(wǎng)絡(luò)流量的能力(NSG的網(wǎng)絡(luò)安全組)
缺點(diǎn):
增加在VNet中部署和配置API管理的復(fù)雜性