API和API网关的认识
1 概述
API的应用较为广泛
我们从不同角度理解下API和API网关的知识点
2 API接口
2.1 认证
访问API时,需要提供认证方法,主流的认证方法有用户名密码方式,有证书认证方式,有token的方式,这些都可以通过curl来模拟验证,例如token方式访问APIserver
kubectl create sa cluster-admin
kubectl create clusterrolebindingcluster-admin-majorinche --clusterrole=cluster-admin--serviceaccount=default:cluster-admin
new_name="cluster-admin"
token=`kubectl get serviceaccounts ${new_name} -oyaml |grep token | awk -F': ' '{print $2}'`
new_token=`kubectl get secrets $token -oyaml | grep"token:" | awk -F': ' '{print $2}'`
TOKEN=`echo $new_token | base64 -d`
curl -k -H "Authorization: Bearer $TOKEN" https://10.2.11.65:6443/API
2.2 请求和配额
当API服务端接收到客户端的HTTP请求后,可以根据路径或者头部信息中的用户身份,访问不同的服务,根据请求类型,例如GET或者POST,决定是查询或者更改请求的资源
从当前K8S的APIserver组件的API使用情况来看,查询类的API请求类型占多数,例如LIST,WATCH和GET
verb |
count |
LIST |
754 |
WATCH |
546 |
GET |
286 |
DELETE |
143 |
POST |
134 |
DELETECOLLECTION |
105 |
PATCH |
95 |
PUT |
95 |
CREATE |
61 |
UPDATE |
56 |
CONNECT |
19 |
而配额的管理,就是根据这些请求的次数,进行管理和计费
例如限制每日请求次数,针对不同类型和访问次数进行收费
2.3 输入与输出
输入与输出是API接口的一个特点,强调的是,需要哪些资源,而又能够反馈出什么结果
在编程中,程序中每个函数的输入对应着函数的参数,输出对应着返回值,详细的输入输出的说明文档和示例可以提升函数的开发友好度。
在数据中心中,网络的输入是由大量的交换机,路由器,网络模块和网络控制软件构成,而输出就是更低的网络延迟,更快的网络带宽,更稳定的网络质量
K8S的优越性也在于其定义了一套优秀的API接口,例如cni对网络插件的支持,csi对存储插件的支持,cri对容器运行时的支持,这样的设计可以促进基于用户自身场景的创新,突出K8S的平台性,而非一个大而全的臃肿产品
2.4 k8s中的API
一个普通的yaml文件如下
[root@d0404 kubeflow]# cat crc.yaml
APIVersion:rbac.istio.io/v1alpha1
kind:ClusterRbacConfig
metadata:
name: default
spec:
exclusion:
namespaces:
-kfserving-system
mode:ON_WITH_EXCLUSION
当执行kubectlapply -f crc.yaml时,就会把crc.yaml中的内容写入到https://10.2.11.65:6443/apis/rbac.istio.io/v1alpha1/clusterrbacconfigs中去
3 API网关
3.1 需求
API本质是服务的入口,而为什么要引入API网关的概念呢?
这个其实是随着微服务的需求而出现的,因为每个微服务,由于是不同的开发语言,不同的服务角色,其访问方式可能是不一样的,这个就给客户端造成困扰。如果出现一个统一的接口,所有微服务都访问这个统一接口,可以提高微服务之间通信的效率,所以API网关是协调微服务之间如何处理API请求的。
每个微服务只需要在API网关上注册好本服务的访问方式就可以,不需要考虑其他微服务的调用方式。
3.2 中间件
一些公共的功能,例如流量控制,身份认证,负载均衡这些,都属于中间件的任务,这些没有必要在各个微服务中,重复开发,可以直接交给API网关统一实现
例如主流的API网关kong,其构成的一个组件就是nginx,而nginx本身可以实现四层和七层的负载均衡
kong的原型图
微服务之间不直接通信,都是通过API网关间接通信
4 总结
总得来说,API可以理解为一个接入层,由三部分构成:负载均衡,http代理服务器和请求动作。
目前使用API提供服务的产品还有对象存储,URL化的数据资源,优化了数据的流转方式,解决了块存储和文件系统相互间的传输不便。
现代软件产品的设计趋势是,以API接口的形式,扩展产品本身的功能,以适应不同的场景,理解API相关的知识点,有助于我们更好的掌握云原生产品的工作原理