1. Kubernetes 集群介绍
Kubernetes(k8s)作为自动化容器操作的开源平台已经名声大噪, 目前已经成为成为容器玩家主流选择. Kubernetes 在容器技术的基础上, 增加调度和节点集群间扩展能力, 可以非常轻松地让你快速建立一个企业级容器应用集群, 这个集群主要拥有以下能力:
自动化容器的部署和复制
随时扩展或收缩容器规模
将容器组织成组, 并且提供容器间的负载均衡
很容易地升级应用程序容器的新版本
提供容器弹性, 如果容器失效就替换它
下面是一个典型的 Kubernetes 架构图:
2. API 网关作为 Kubernetes 集群的接入层架构
我们可以看到 Kubernetes 集群是有足够理由作为应用服务的首选, 但是 Kubernetes 集群没有足够的接入能力, 特别在大型应用中, 它是不能够直接对用户提供服务的, 否则会有非常大的安全风险. 而 API 网关作为成熟的云产品, 已经集成了非常丰富的接入能力, 把 API 网关放在 Kubernetes 集群前面作为应用集群的接入服务使用, 将大大提高 Kubernetes 集群的服务能力, 可以作为标准的大型互联网应用的标准架构. 下面是使用阿里云架构图:
从架构图中我们可以看到, API 网关作为 Kubernetes 集群的桥头堡, 负责处理所有客户端的接入及安全工作, API 网关和 Kubernetes 集群中每个服务的内网 SLB 进行通信.
3. API 网关接入能力
读者要问了, 接入了 API 网关具体能为整个架构带来哪些好处呢? 下面我们列一下这种架构中, API 网关具体能给整个应用带来什么价值.
1.API 网关允许客户端和 API 网关使用多种协议进行通信, 其中包括:
- * HTTP
- * HTTP2
- * webScoket
2.API 网关使用多种方法保证和客户端之间的通信安全:
* 允许定义 API 和 APP 之间的授权关系, 只有授权的 APP 允许调用;
* 全链路通信都使用签名验证机制, 包括客户端和 API 网关之间的通信和 API 网关和后端服务之间的通信, 保证请求在整个链路上不会被篡改;
* 支持用户使用自己的 SSL 证书进行 HTTPS 通信;
* 支持 OPENID CONNECT;
3.API 网关具备 iOS/Android/Java 三种 SDK 的自动生成能力, 并且具备 API 调用文档自动生成能力;
4.API 网关支持入参混排能力, 请求中的参数可以映射到后端请求中的任何位置;
5.API 网关提供参数清洗能力, 用户定义 API 的时候可以指定参数的类型, 正则等规则, API 网关会帮用户确认传输给后端服务的请求是符合规则的数据;
6.API 网关支持流量控制能力, 支持的维度为用户 / APP/API;
7.API 网关提供双向通信的能力; 具体双向通信相关的使用规则请参考: https://help.aliyun.com/document_detail/66031.html
8.API 网关提供基于请求数 / 错误数 / 应答超时时间 / 流量监控报警能力, 所有的报警信息会使用短信或者邮件在一分钟内发出;
9.API 网关已经和阿里云的 SLS 产品打通, 用户可以将所有请求日志自动上传到用户自己的 SLS 中, 后继好对访问日志进行统计分析;
10.API 网关支持 Mock 模式, 在联通中这个能力非常方便;
11.API 网关支持用户自动以的 IP 白名单和黑名单;
12.API 网关结合阿里云的云市场, 为 Provider 提供向 API 使用者收费的能力.
阿里云的 API 网关是一个上线数年的成熟云产品, 在稳定性和性能方面, 经过了时间和阿里云的工程师的不断打磨, 有高性能需求的用户尽管放马过来.
4. 在阿里云快速配置 Kubernetes 集群和 API 网关
阿里云支持快速创建 Kubernetes 集群, 同一个 Region 内的 Kubernetes 集群和 API 网关的集成也非常简单, 下面我们来一步一步地在阿里云中配置出本文第二节中架构设计. 我们假设要创建的目标集群是一个 Tomcat 集群, 同时有 6 个容器对外服务, 对外服务的接口是 8080.
4.1 创建 Kubernetes 集群, 生成具备内网 SLB 的服务
首先我们来通过 yaml 文件创建一个具备内网 SLB 的 Kubernetes 集群.
4.1.1 在控制台创建一个 Kubernetes
1. 进入 Kubernetes 集群管理控制台界面: https://cs.console.aliyun.com/#/k8s/cluster/list
2. 点击左上角 "创建 Kubernetes 集群" 按钮, 进入
3. 在创建集群页面选择不同的规格
4. 创建成功后可以在 Kubernetes 列表页面看到刚才创建的集群.
4.1.2 在 Kubernetes 集群内创建一个多容器的服务
现在集群有了, 我们需要在集群内创建一个服务, 这个服务由 6 个容器组成, 每个容器都由最新的 Tomcat 镜像生成. 容器的服务端口是 8080, 整个服务对外服务的端口也是 8080.
1. 进入 Kubernetes 集群管理控制台界面: https://cs.console.aliyun.com/#/k8s/cluster/list
2. 选在刚才创建的 Kubernetes 集群, 点击 "控制台" 链接:
3. 进入 Kubernetes 集群的控制台页面后, 点击左边菜单栏的 "服务" 按钮, 进入服务页面后, 点击右上角的 "创建" 按钮进入创建页面:
4. 进入创建页面后, 点击使用文本创建按钮, 输入下面的资源编排文本点击上传按钮进行创建:
- apiVersion: extensions/v1beta1
- kind: Deployment
- metadata:
- name: tomcat-demo
- spec:
- replicas: 6
- selector:
- matchLabels:
- app: tomcat-demo
- template:
- metadata:
- labels:
- app: tomcat-demo
- spec:
- containers:
- - name: tomcat-demo
- image: tomcat:latest
- ports:
- - containerPort: 8080
- ---
- apiVersion: v1
- kind: Service
- metadata:
- name: tomcat-demo
- annotations:
- service.beta.kubernetes.io/alicloud-loadbalancer-address-type: intranet
- spec:
- ports:
- - port: 8080
- targetPort: 8080
- name: tomcat-demo
- selector:
- app: tomcat-demo
- type: LoadBalancer
对这段编排模板创建文本做下解释:
第一段是使用最新的 Tomcat 镜像创建 6 个容器的意思, 容器的服务端口是 8080;
第二段是将所有标签为 "tomcat-demo" 的容器, 建立一个服务. 服务使用内网 SLB 对外提供服务.
具体的 Kubernetes 容器管理编排语法, 请参加文档:
https://help.aliyun.com/document_detail/66436.html
另外, 所有资源编排的模板执行都可以在 "容器服务", 使用模板这个页面去执行部署, 在这个页面有所有的资源模板, 可以改后即发:
好了, 目前为止, 我们已经创建了一个 Kubernetes 集群, 并且在这个集群下面创建了六个容器, 每个容器上面跑着一个最新的 Tomcat. 这六个容器组成一个服务, 使用内网 SLB 对内网提供服务. 我们可以进入服务详情页面看到整个服务的运行情况:
需要注意的是, 我们外部服务的地址是一个 VPC 地址, 是不可以直接在 API 网关上配置的, 下面我们看看对于 VPC 的内网地址如何在 API 网关上配置.
4.2 在 API 网关创建 Kubernets 集群的 API
4.2.1 创建 VPC 授权
API 网关如果要访问 VPC 内的 SLB, 需要增加 VPC 网络的授权, 首先我们需要准备 VPC 的标识和内网 SLB 的示例 ID, 我们可以在 VPC 控制台获取:
1. 登录 VPC 控制台(vpcnext.console.aliyun.com), 找到刚才创建 Kubernetes 服务时自动创建的 VCP, 点击进去查看详情, 我们可以在这个页面看到 VPC 的标识:
2. 我们点击 SLB 实例, 进入 SLB 列表页面, 然后点击进入 SLB 实例详情页面, 我们可以在这个页面找到 SLB 的实例 ID:
好了, 目前我们已经获取到了 VPC 的 ID 和 SLB 的实例 ID, 下面我们来创建 API 网关的授权:
3. 进入 API 网关授权页面: https://apigateway.console.aliyun.com/#/cn-beijing/vpcAccess/list , 点击右上角的创建授权按钮, 弹出创建 VPC 授权的小页面, 将刚才查询到的 VPC 标识和 SLB 实例 ID 填入到对应的内容中:
点击确认按钮后, 授权关系就创建好了.
4.2.1 创建 API
在 API 网关控制台创建 API 的时候, 后端服务这块, 我们需要选择刚才创建的 VPC 授权关系, 然后 API 的请求就会直接发送到刚才创建的内网 SLB 上去了.
API 定义的其他字段的描述请参阅文档:
https://help.aliyun.com/document_detail/29478.html
4.3 调用测试
API 建立好了以后, 我们把 API 发布到线上就可以使用 API 网关的测试工具进行测试, 看看能否将请求发送到刚才创建的 Kubernetes 集群中去.
我们进入刚才创建好的 API 的详情页面, 点击左侧菜单中的调试 API, 进入调试页面. 在调试页面填写好相应的参数, 点击 "发起请求" 按钮.
我们可以看到, 请求发送到了 Kubernetes 的集群中的容器中, 并且收到了容器中 tomcate 的 200 的应答.
5 总结
让我们总结一下本文的内容, 在前三节中, 我们描述了 Kubernetes 集群和 API 网关的各项能力, 并且画出了结合他俩作为后端应用服务生产的架构图. 我们结合 API 网关 + Kubernetes 集群的架构替代了传统的 Nginx(Ecs)+Tomcat(Ecs)(如下图), 让系统具备了动态伸缩, 动态路由, 支持多协议接入, SDK 自动生成, 双向通信等各项能力, 成为可用性更高, 更灵活, 更可靠的一套架构.
在最后一节, 我们描述了在阿里云的公有云如何创建一整套 API 网关加 Kubernetes 的流程, 关键点在于 Kubernetes 集群通过 VPC 中的 SLB 结合容器做服务发现, API 网关绑定 VPC 中的 SLB, 将所有请求发送到 SLB 上. 下面我们再总结一下:
创建一个 Kubernetes 的集群;
使用资源编排命令, 在 Kubernetes 集群中创建六个运行这最新版本的 Tomcat 的容器, 并且基于这六个容器创建一个 VPC 内负载均衡 (SLB) 的服务;
到 VPC 内找到 VPC 的 ID 和 SLB 的实例 ID, 在 API 网关创建一个 VPC 授权;
在 API 网关创建一些列 API, 后端服务使用刚才创建的 VPC 授权. 这些 API 的请求将发送到 Kubernetes 集群的 SLB 上, 由 SLB 分发给容器内部的 Tomcat 服务上.
P.S: 本文系转载, 原文由 fredlong 首发于API 网关为 K8s 容器应用集群提供强大的接入能力
来源: https://yq.aliyun.com/articles/582311