《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的网关,可以看到客户端的请求情况。如下图: