KubeEdge
KubeEdgeは、Kubernetesを基盤としたオープンソースのシステム。エッジデバイス上でのコンテナ化されたアプリケーションのオーケストレーションとデバイス管理を可能にする。これにより、クラウドとエッジ間でのネットワーキング、アプリケーションのデプロイメント、メタデータの同期を容易にする。
KubeEdgeは、Cloud Native Computing Foundation(CNCF)のサンドボックスプロジェクトとして開発が進められていたが、晴れてCNCFのGraduatedとなり、現在も盛んに開発が進められている。
Ref:
https://gyazo.com/0a0489ea6a10e1a397c2c2fe5f868746
(画像は公式より引用)
KubeEdgeはk3sやk0sのようなLightweight Kubernetesを構築するためのソフトウェアではなく、構築済みのKubernetesをエッジ側に拡張するためのソフトウェアである。具体的には、CloudCoreというクラウド側に配置される機能がPodとして構築済みのKubernetes Clusterに配置される。そして、エッジデバイス側にはEdgeCoreというモジュールをシステムに組み込む。このEdgeCoreがCloudCoreと接続することで、エッジデバイスをあたかもKubernetesのノードのように管理することが可能となる。また、EdgeCoreはKubernetes Clusterに適用されるマニフェストをもとに、kubeletのようにエッジデバイス側でリソース管理を行う。 k3sなどのLightweight KubernetesでもエッジデバイスをKubernetesのノードとして活用可能ではあるが、Kubernetesの仕組み上、好ましくない部分も存在する。大きな問題点の一つが、k3sを含むKubernetesではノードはControl Planeからの変更をPull型で取得することである。つまり、ノードは一定期間ごとにControl PlaneのAPI Serverをポーリングし、状態の変更を検知している。管理するエッジデバイスが増加するとControl Planeの負荷が増大し、大規模なエッジデバイス群の管理が難しくなる。KubeEdgeはこれを解消するがめのソリューションを提供する。
KubeEdgeにおいては、ベースとなるKubernetesのControl Planeの状態をポーリングするのはCloudCoreのみである。CloudCoreとEdgeCore間は通常はWebSocketでネットワークのコネクションが確立されており、状態の変化があった場合はCloudCoreからEdgeCoreにWebSocketの経路で通知が送られる。つまり、Edge NodeはPull型ではなくPush型で動作する。これがKubeEdgeをエッジデバイス管理に用いるもっとも大きな理由とも言えよう。