《Windows Azure Platform 系列文章目錄》
我們在使用Azure API Management (APIM)實現服務網關的時候,一般都是面向互聯網的。
比如場景一:Azure API Management保護Azure VM上部署的Apache Web Service,客戶端是來自於Internet的用戶。
整體的數據流是:用戶 -> Internet -> Azure APIM -> 微軟雲Azure內部網絡-> Azure VM
又比如場景二:Azure環境已經與IDC側通過專線打通,Azure API Management保護部署在IDC上的Apache Web Service,客戶端來自於Internet的用戶
整體的數據流是:用戶 -> Internet -> Azure APIM -> 雲專線 -> IDC自建機房
想象一下,如果在極端情況下,客戶端是來自於IDC側的應用A,Azure API Management保護部署在IDC的的應用B,整體數據流如下:
IDC應用A -> Azure APIM (微軟雲數據中心) -> IDC應用B
可見,如果雖然應用A和應用B都部署在同一個IDC,但是因爲經過了微軟雲數據中心的APIM,流量進行了繞行,增加了網絡延遲。
其實Azure APIM可以通過將自託管網關部署到和後端API所在的網絡環境,使API流量直接流向後端API,減少數據傳輸成本。
請注意:
1.APIM本地網關僅僅支持通過Docker和Kubernetes進行部署
2.部署完自託管網絡後,通過APIM的Test頁面將無法進行測試
我們演示的整體架構:
1.應用A部署在IDC的K8S集羣上(這裏我們用Azure AKS模擬)
2.APIM部署在同樣的K8S集羣上
3.客戶端部署在IDC側
接下來進行演示環節:
1.首先我們創建一個Azure API Management,定價層選擇:開發人員。請注意該SKU只能用於開發測試,不能用於生產
2.再創建1個Azure AKS集羣。
3.請注意:Azure APIM和AKS不需要部署在同一個虛擬網絡Virtual Network裏,不需要內網互通。
4.在Azure APIM裏,點擊Gateway,點擊Add,給本地網關起一個名字。如下圖:
5.等待上面的本地網關創建完畢。
6.APIM本地網關創建完畢後,點擊該網關,選擇部署。如下圖:
請注意上面的yaml file裏,有一段代碼是:
--- apiVersion: v1 kind: Service metadata: name: onpremisegateway spec: type: LoadBalancer externalTrafficPolicy: Local ports: - name: http port: 80 targetPort: 8080 - name: https port: 443 targetPort: 8081
也就是說,APIM Gateway部署完成後,是以Load Balancer方式對外提供服務的,是外網可訪問的。
我們可以根據實際需求,改成Internal Load Balancer或者Node Port方式,進行訪問
7.我們回到Azure AKS集羣裏,執行上面的create secret,並apply yaml 文件。
8.創建完畢後,我們執行命令:
kubectl get svc
顯示的onpremisegateway就是本地容器化部署的APIM網關,截圖如下:
8.然後我們部署被APIM保護的應用A,該應用與APIM一起部署在同一個AKS集羣上。
具體的yaml file如下:
這裏使用的是internal LB,有關Internal LB的內容,請參考:AKS (5) 使用AKS內網負載均衡器-自動創建內網IP地址
apiVersion: v1 kind: Service metadata: name: internal-80 annotations: service.beta.kubernetes.io/azure-load-balancer-internal: "true" service.beta.kubernetes.io/azure-load-balancer-internal-subnet: "lb-subnet" spec: type: LoadBalancer loadBalancerIP: 10.241.2.4 ports: - port: 80 protocol: TCP targetPort: 80 selector: run: testapp01 --- apiVersion: apps/v1 kind: Deployment metadata: labels: run: testapp01 name: testapp01 spec: replicas: 1 selector: matchLabels: run: testapp01 template: metadata: labels: run: testapp01 spec: containers: - image: nginx name: nginx
9.我們kubectl apply上面的yaml文件,然後執行命令:
kubectl get svc
顯示如下:
上圖中,Internal-80是被保護的應用A,內網IP地址是10.241.2.4
onpremisegateway是本地APIM網關地址,訪問地址是52.131.222.178。
10.我們訪問https://portal.azure.cn/,點擊API,選擇添加API
11.Web Service URL,輸入http://10.241.2.4,也就是被保護的應用A,內網IP地址
12.我們增加一個方法,叫getwelcomepage,如下圖:
13.我們還要記錄一下IntenalNginx使用本地網關,並僅配置HTTP(測試用),如下圖:
13.到這裏,配置就流程就差不多了,再說一下數據流:
我們通過AKS onpremisegateway的IP (公網Load Balancer),配置配置Web Service URL,訪問到應用A的內網IP地址10.241.2.4
14.我們訪問執行腳本:
curl http://52.131.222.178 -H "Ocp-Apim-Subscription-Key: 這裏是你的APIM Key"
就可以訪問到應用A的服務
15.最後我們查看APIM的網關,可以看到客戶端的請求情況。如下圖: