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手动部署文档

边缘自治示例

  1. 根据使用说明部署lite-apiserver
  2. 使用下面的示例 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
  1. 访问对应的 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
  1. 断开 pod 所在节点与 kube-apiserver 的网络,节点进入自治模式
  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
  1. 重启该节点,重启成功后,再次访问 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

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