从 lite-apiserver 看 SuperEdge 边缘节点自治 (2)

Cert Mgr && Transport Mgr
Cert Mgr 负责管理连接 kube-apiserver 的 TLS 客户端证书。它周期性加载配置的TLS证书,如果有更新,通知Transport Mgr创建或更新对应的transport。
Transport Mgr负责管理transport。它接收Cert Mgr的通知,创建新的transport,或者关闭证书已更新的transport的旧连接。

Proxy
根据 request mtls 证书中的 Common Name 选择对应的 ReverseProxy(如果 request 没有 mtls 证书,则使用 default),将 request 转发到 kube-apiserver。如果请求成功,则将结果直接给 Client 返回,并调用 Cache Mgr 缓存数据;如果请求失败,则从 Cache Mgr 中读取数据给 Client。

Cache Mgr
根据 Client 的类型分别缓存 Get 和 List 的结果数据,并根据 Watch 的返回值,更新对应的 List 数据。

关键技术 1. HTTPS Server

在当前架构下,lite-apiserver 只处理本节点的所有请求,使用 HTTP Server 可以满足性能和安全要求。然而,大部分组件和业务容器采用 client-go 库访问 kube-apiserver,如果使用 HTTP Server,Client 自己的认证和鉴权信息全部丢失,不符合权限管理的要求。因此必须采用 HTTPS Server。lite-apiserver 的 TLS Server 证书,需用 kube-apiserver 的 Server 证书相同的CA签发。

2. 支持 InCluster 方式访问

一般的 Client 通过指定 kube-apiserver 的 URL 访问 kube-apiserver,使用 lite-apiserver 时,只需将原来 kube-apiserver 的 URL 替换为 lite-apiserver 的地址即可。
在 Pod 中访问 kube-apiserver 的推荐方式是通过 kubernetes.default.svc 这个 DNS 名称,该名称将会解析为服务 IP,然后服务 IP 将会路由到 kube-apiserver。在这种场景下使用 lite-apiserver 需要一些小小的"魔法"。
在 SuperEdge 中,application-grid-wrapper 以 DaemonSet 的形式部署在每个边缘节点上,通过给 kube-proxy 只返回本区域内的 endpoints 来达到访问在区域内闭环的目的。利用这个特性,application-grid-wrapper 把 kubernetes 这个 Service 的 endpoint 改为 lite-apiserver 的地址, 返回给本节点 kube-proxy,即可支持 InCluster 方式访问。

3. 支持 Client 的 Bootstrap Token 和证书轮换

lite-apiserver 使用 Client 自己的认证和鉴权方式,访问云端的 kube-apiserver。对于 static token、bootstrap token、service account 等方式,lite-apiserver 只需透传 Http Request 的 Header 中包含的认证鉴权信息即可。对于 TLS 客户端证书的认证方式,lite-apiserver 通过读取配置文件,加载所有 Client 用到的 TLS 客户端证书,使用这些证书构造对应的 HTTPS 请求 kube-apiserver。
为了支持 Client 的 Bootstrap Token 和证书轮换,lite-apiserver 需要周期性的加载和更新这些证书。kube-controller-manager 签发的证书默认时间是1年,lite-apiserver 加载 TLS 客户端证书周期不宜过短。但如果证书加载周期时间过长,kubelet 使用 Bootstrap Token 的场景中会存在证书更新不及时的问题。为了处理这些场景,lite-apiserver 采用一种“优雅”的证书加载策略:当加载证书出现错误或证书过期时,进入快速加载模式,周期是1s; 加载证书均成功时,进入普通加载模式,周期是30min。
当证书更新后,lite-apiserver 使用 提供的closeAll方法,关闭已存在的连接,以防认证鉴权失败。

4. 缓存解析和更新

lite-apiserver 需要支持缓存所有类型的资源,缓存的解析和更新是 lite-apiserver 实现的关键之一。lite-apiserver 分别缓存每个 Client 的对资源的 Get 和 List 请求,这样虽然造成了一定的存储空间的浪费,但是也避免了复杂的资源版本转换。对于 Watch 类型的请求结果,lite-apiserver 采用unstructured.UnstructuredJSONScheme 解析出资源的 meta 信息,进而更新相应的 List 数据。

展望

SuperEdge 正式开源以来,得到了广泛的关注。SuperEdge 在快速迭代开发中,lite-apiserver 也有不少可扩展点,欢迎大家积极参与,共同打造一个优秀的云原生边缘容器项目。

内存中缓存部分高频更新的资源,提升性能

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpdfxg.html