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 - 图1

从整体上看,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手动部署文档

边缘自治示例

  1. 根据使用说明部署lite-apiserver
  2. 使用下面的示例 yaml 文件部署一个运行 echoserver 的Deployment
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: lite-demo
  5. namespace: default
  6. spec:
  7. replicas: 1
  8. selector:
  9. matchLabels:
  10. app: echo
  11. template:
  12. metadata:
  13. labels:
  14. app: echo
  15. spec:
  16. containers:
  17. - image: superedge/echoserver:2.2
  18. name: echo
  19. ports:
  20. - containerPort: 8080
  21. protocol: TCP
  22. env:
  23. - name: NODE_NAME
  24. valueFrom:
  25. fieldRef:
  26. fieldPath: spec.nodeName
  27. - name: POD_NAME
  28. valueFrom:
  29. fieldRef:
  30. fieldPath: metadata.name
  31. - name: POD_NAMESPACE
  32. valueFrom:
  33. fieldRef:
  34. fieldPath: metadata.namespace
  35. - name: POD_IP
  36. valueFrom:
  37. fieldRef:
  38. fieldPath: status.podIP
  1. 访问对应的 echoserver,结果正常
  1. $ kubectl get pods -owide
  2. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  3. lite-demo-c7b458ddc-6lpnx 1/1 Running 0 4m23s 10.0.6.2 ecm-q5hx6hhd <none> <none>
  4. $ curl http://10.0.6.2:8080 | grep pod
  5. pod name: lite-demo-c7b458ddc-6lpnx
  6. pod namespace: default
  7. pod IP: 10.0.6.2
  1. 断开 pod 所在节点与 kube-apiserver 的网络,节点进入自治模式
  2. 访问 echoserver,结果正常
  1. $ curl http://10.0.6.2:8080 | grep pod
  2. pod name: lite-demo-c7b458ddc-6lpnx
  3. pod namespace: default
  4. pod IP: 10.0.6.2
  1. 重启该节点,重启成功后,再次访问 echoserver,结果正常,说明边缘节点自治成功
  1. $ curl http://10.0.6.2:8080 | grep pod
  2. pod name: lite-demo-c7b458ddc-6lpnx
  3. pod namespace: default
  4. pod IP: 10.0.6.2

最后修改 June 15, 2021 : Fixed error links and paths (fef537b)