《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,给本地网关起一个名字。如下图:

  

azure app service常见架构图 azure api management_内网

  5.等待上面的本地网关创建完毕。

  6.APIM本地网关创建完毕后,点击该网关,选择部署。如下图:

  

azure app service常见架构图 azure api management_内网_02

  请注意上面的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网关,截图如下:

  

azure app service常见架构图 azure api management_API_03

 

  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

  显示如下:

azure app service常见架构图 azure api management_内网_04

  上图中,Internal-80是被保护的应用A,内网IP地址是10.241.2.4

  onpremisegateway是本地APIM网关地址,访问地址是52.131.222.178。

 

  10.我们访问https://portal.azure.cn/,点击API,选择添加API

  

azure app service常见架构图 azure api management_API_05

 

  11.Web Service URL,输入http://10.241.2.4,也就是被保护的应用A,内网IP地址  

  

azure app service常见架构图 azure api management_内网_06

 

  12.我们增加一个方法,叫getwelcomepage,如下图:

  

azure app service常见架构图 azure api management_内网_07

 

  13.我们还要记录一下IntenalNginx使用本地网关,并仅配置HTTP(测试用),如下图:

 

azure app service常见架构图 azure api management_内网_08

 

 

  13.到这里,配置就流程就差不多了,再说一下数据流:

  我们通过AKS onpremisegateway的IP (公网Load Balancer),配置配置Web Service URL,访问到应用A的内网IP地址10.241.2.4

azure app service常见架构图 azure api management_内网_04

 

  14.我们访问执行脚本:

curl http://52.131.222.178  -H "Ocp-Apim-Subscription-Key: 这里是你的APIM Key"

  就可以访问到应用A的服务

 

  15.最后我们查看APIM的网关,可以看到客户端的请求情况。如下图:

  

azure app service常见架构图 azure api management_Azure_10