lite-apiserver
边缘侧轻量化 apiserver - 代理边缘侧组件及Pod对云端kube-apiserver的请求;将请求结果在边缘侧进行缓存,以支持在与云端断连时的边缘自治。
lite-apiserver
是运行在边缘节点上的轻量级 apiserver,它代理节点上所有组件和业务容器访问云端 kube-apiserver 的请求,并对请求结果做高效缓存。在云边断连的情况下,利用这些缓存提供服务,实现边缘自治的能力。
lite-apiserver
具有以下特点:
- 支持所有 Client 类型,包括以 bin(如 kubelet 等)或 pod(如 flannel\kube-proxy 等)形式运行的 Kubernetes 组件,以及以 InCluster 方式访问 kube-apiserver 的业务容器
- 支持缓存所有类型资源(Kubernetes 内置资源和 Custom Resources)
- 支持访问 kube-apisever 的所有认证和鉴权方式(TLS 客户端证书、token 等),各组件和业务容器使用自己的认证方式和权限。支持证书轮换
- 支持多种存储, 包括文件存储、KV存储(bolt, badger)等
Architecture
从整体上看,lite-apiserver
启动一个 HTTPS Server 接受所有 Client 的请求(https request),并根据 request tls 证书中的 Common Name 选择对应的 ReverseProxy(如果 request 没有 mtls 证书,则使用 default),将 request 转发到 kube-apiserver。当云边网络正常时,将对应的返回结果(https response)返回给client,并按需将response异步存储到缓存中;当云边断连时,访问kube-apiserver超时,从缓存中获取已缓存的数据返回给client,达到边缘自治的目的。
- HTTPS Server 监听 localhost 的端口(SuperEdge 中为51003)接受 Client 的 Https 请求。
- 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 数据。
使用说明
可使用static pod或者systemd在边缘节点上部署lite-apiserver,参见edgeadm或手动部署文档
边缘自治示例
- 根据使用说明部署
lite-apiserver
- 使用下面的示例 yaml 文件部署一个运行 echoserver 的Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: lite-demo
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: echo
template:
metadata:
labels:
app: echo
spec:
containers:
- image: superedge/echoserver:2.2
name: echo
ports:
- containerPort: 8080
protocol: TCP
env:
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
- 访问对应的 echoserver,结果正常
$ kubectl get pods -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
lite-demo-c7b458ddc-6lpnx 1/1 Running 0 4m23s 10.0.6.2 ecm-q5hx6hhd <none> <none>
$ curl http://10.0.6.2:8080 | grep pod
pod name: lite-demo-c7b458ddc-6lpnx
pod namespace: default
pod IP: 10.0.6.2
- 断开 pod 所在节点与 kube-apiserver 的网络,节点进入自治模式
- 访问 echoserver,结果正常
$ curl http://10.0.6.2:8080 | grep pod
pod name: lite-demo-c7b458ddc-6lpnx
pod namespace: default
pod IP: 10.0.6.2
- 重启该节点,重启成功后,再次访问 echoserver,结果正常,说明边缘节点自治成功
$ curl http://10.0.6.2:8080 | grep pod
pod name: lite-demo-c7b458ddc-6lpnx
pod namespace: default
pod IP: 10.0.6.2
Feedback
Was this page helpful?
Glad to hear from you! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.
最后修改
June 15, 2021
: Fixed error links and paths (fef537b)