
Empowers IoX from a piece of AI.
aion-core は、主にエッジコンピューティング向けの マイクロサービスアーキテクチャ・プラットフォームである AION を動作させるのに必要な オープンソースレポジトリ です。
aion-core は、以下のリソースを提供しています。
aion-core の動作方法として、単体のマシンで動作するシングルモードと、複数のマシンでクラスタ構成をとるクラスタモードの、2通りの動作方法があります。
シングルモードでは、エッジコンピューティング環境の単体のマシンに Kubernetes の Master Node のみが構成され動作します。
クラスタモードでは、主にエッジコンピューティング環境の複数のマシンにわたって、 Kubernetes の Master Node と Wokrer Nodes が構成され動作します。
目次
aion-core、関連リソースならびにエッジアプリケーションやマイクロサービス等を、安定的に動作させるには、以下の環境であることを前提とします。
AIONは、100% Linux のオープンソース環境をベースとして開発・構築された、主にエッジコンピューティングのための、マイクロサービス志向のコンピューティング・プラットフォーム環境です。
エッジ端末内において、ほぼ全てのマイクロサービス・ミドルウェアがコンテナ化されコンテナオーケストレーションシステムのKubernetesによって制御・監視されています。
AION の アーキテクチャ概要図 です。
aion-core の メッセージングアーキテクチャ(カンバンシステム) の 図 です。(最新版のAIONでは、status-kanbanとkanban-replicator による メッセージングアーキテクチャは、RabbitMQ に置き換わっています)
AIONプラットフォームのリソースを実装構築した、エッジコンピューティングアーキテクチャの例(OMOTE-Bakoアプリケーションのアーキテクチャ)です。
AIONでは、主要構成として以下があります。 Service Broker、Status Kanban および Kanban Replicator、Send Anything は、aion-core に含まれます。
Service Brokerは、AION™のコア機能で、主にエッジコンテナオーケストレーション環境でのマイクロサービスの実行に関する統括制御をつかさどるモジュールです。
AIONでは、Service Broker はそれ自体がマイクロサービスとして機能します。
Status Kanban および Kanban Replicatorは、それぞれAION™のコア機能の1つで、マイクロサービス間のかんばんのやりとりを制御します。AION™ にはカンバンロジックがあらかじめ含まれているため、コンピューティングリソースとストレージリソースが制限されたエッジで、1、10、または100ミリ秒のタイムサイクルでエンドポイントの高性能処理を実行できます。マイクロサービス(マイクロサービスA>マイクロサービスB>マイクロサービスCなど)の各連続処理に割り当てられたAまたは一部のカンバンカードは、エッジでのIoTおよびAI処理における大量の同時注文の一貫性とモデレーションを厳密に維持します。
AIONでは、Status Kanban および Kanban Replicator は各々それ自体がマイクロサービスとして機能します。
Send Anythingは、エッジのAION™プラットフォームでソフトウェアのコアスタック専用に機能する統合カンバンネイティブデータ処理システムを提供します。
Send Anything によるクロスデバイスかんばん処理システムは、AION™サービスブローカーによってオーケストレーションされ、多数のネットワークノード全体で、マイクロサービス指向アーキテクチャのデータ処理/インターフェースとアプリケーションのランタイムの柔軟なパターンを可能にします。
AIONでは、Send Anything はそれ自体がマイクロサービスとして機能します。
Data Sweeperは、マイクロサービスが生成した不要なファイルを定期的に削除する機能を提供します。これにより、ストレージリソースをクリーンアップして、エッジアプリケーションの実行時環境を安定かつ適度に保つことが可能になります。また、Data Sweeperはセキュリティブローカーとしても機能し、デバイス上の個人情報を自動的に消去することで、非常に安全なエッジ環境を確保し、個人のデータが外部に漏洩しないようにします。
AIONでは、Data Sweeper はそれ自体がマイクロサービスとして機能します。
Avisは、Fluentdを用いてマイクロサービスログやアクセスログ、システムログ等を収集し、収集されたログから重要なログをピックアップしてUI上に表示します。
UI は Electron をベースとしており、カスタマイズが容易で、直感的で洗練されたUIとなっています。
AIONでは、Avis はそれ自体がマイクロサービスとして機能します。
AIONでは以下のミドルウェアとフレームワークを採用しております。
AIONでは、AION がカンバンシステムと呼んでいる、マイクロサービス間のメッセージングアーキテクチャのコアアーキテクチャとして、RabbitMQ を採用しています。
AION のカンバンシステムは、コンピューティングリソースとストレージリソースが制限されたエッジ環境で、1/10/100ミリ秒のタイムサイクルでエンドポイントにおけるマイクロサービス間の効率的・安定的処理をつかさどる、軽量なメッセージングアーキテクチャです。
AIONでは、RabbitMQ はマイクロサービスとして機能します。
AIONプラットフォームにおける RabbitMQ について、詳しくはこちらを参照してください。
Fluentdは大量のログファイルを収集、解析し、ストレージに集約、保存を行うことができるオープンソースのデータコレクタです。
AIONでは、Fluentdを用いてマイクロサービス単位で対象Podのログを監視し、必要なログをデータベースに保存します。
AIONでは、Fluentd はマイクロサービスとして機能します。
AIONプラットフォームにおける Fluentd について、詳しくはこちらを参照してください。
Redisは高速で永続化可能なインメモリデータベースです。AIONでは、主に以下の用途でRedisを利用しています。
AIONでは、Redis(RedisCluster)はマイクロサービスとして機能します。
AIONプラットフォームにおける Redis について、詳しくはこちらを参照してください。
Envoy はマイクロサービス間のネットワーク制御をライブラリとしてではなく、ネットワークプロキシとして提供します。 AION ではネットワーク制御プロキシ、及びネットワークの負荷軽減を目的とするロードバランサーとして採用されています。
AIONでは、Envoy はマイクロサービスとして機能します。
AIONプラットフォームにおける Envoy について、詳しくはこちらを参照してください。
MongoDBはNoSQLの一種でドキュメント指向データベースと言われるDBです。スキーマレスでデータを保存し、永続化をサポートしています。 AIONでは、各マイクロサービスのLogをKanban Replicatorを通して保存する役割を担っています。
AIONでは、MongoDB はマイクロサービスとして機能します。
AIONプラットフォームにおける MongoDB について、詳しくはこちらを参照してください。
AIONでは、主にフロントエンドUIで発生した静的データが保持されます。
AIONでは、MySQL はマイクロサービスとして機能します。
AIONプラットフォームにおける MySQL について、詳しくはこちらを参照してください。
AIONでは、ブラウザで利用可能な API として、ビデオ、音声、および一般的なデータをリアルタイムにやり取りすることができます。
AIONプラットフォームにおける WebRTC について、詳しくはこちらを参照してください。
AIONでは、あるマイクロサービスからのリクエストに対して応答し、別のマイクロサービスへ送信することで、双方のマイクロサービスが通信をできるようにします。
AIONでは、gRPC はマイクロサービスとして機能します。
AIONプラットフォームにおける gRPC について、詳しくはこちらを参照してください。
ReactJSは、ユーザインタフェース構築のためのJavaScriptライブラリです。
AIONからのアウトプットをフロントエンドUIに表示したり、フロントエンドUIからの指示をバックエンド経由でAIONに伝えたりする役割を果たします。 ReactJSはコンポーネントベースで、大規模なJavaScriptコードを部品化させることで保守性を高めたり、既存のReactコンポーネントを再利用したりできるため、マイクロサービスアーキテクチャに適しています。
AIONプラットフォームにおける ReactJS について、詳しくはこちらを参照してください。
AIONでは、Kubernetes / Docker / Aion-Core をベースとした包括的なマイクロサービス環境だけでなく、RabbitMQ、Fluentd、Redis、Envoy、ReactJS、MongoDB、MySQL 等の周辺リソースの技術とフレームワークをフル活用した、360°マイクロサービスアーキテクチャの環境を採用しています。
これにより、大きな単位のサービス管理だけでなく、真に細かく刻まれたレベルにおいてのマイクロサービスの開発実行環境を実現することが可能です。
また、これらのマイクロサービス環境は、他の全てのコンポーネントやマイクロサービスと、疎結合できるように設計されています。
詳細については、microservice-oriented-architectureを参照してください。
AION がマイクロサービスの起動を行い、マイクロサービス間の通信を RabbitMQ で管理します。 RabbitMQ での通信により長時間安定したシステムが実現されます。 さらに柔軟性の高さからシステムの拡張を容易に行うことができます。 (例えば、gRPCのような、より重厚なメッセージングアーキテクチャを採用する場合、もしくは、gRPCとRabbitMQを組み合わせる場合の方が適切なときもあります)
AION のフロントエンドにWebRTCを実装して、フロントエンド/ブラウザからバックエンドサービス等へ、ビデオ・音声など、任意のデータ入力を、リアルタイムに送信することができます。
AIONプラットフォーム のレポジトリは、次の分類に分かれます。
以下の全てのレポジトリ分類に含まれるレポジトリは、主にエッジコンピューティング環境において、AIONのアーキテクチャの中で、もしくは、それぞれマイクロサービスとして、安定動作します。また、クラウド環境でも利用できます。
AIONプラットフォーム のレポジトリは、それぞれ1つのマイクロサービスから、部品として利用できます。
AIONプラットフォーム で提供されているオープンソースは、必ずしもAIONの統合環境として利用される必要はありません。
したがって、次の図の各Caseのように、各レポジトリ(=マイクロサービス)をそれぞれ組み合わせて開発・実装することができます。
AIONプラットフォームでは、推論をはじめとしたAI環境のためのランタイムを備えています。
AIONプラットフォームにおけるAI環境は、IoT環境と統合可能であり、エッジ環境でIoTデータをリアルタイムでストリーミングしてAI環境に分析にかけ、アウトプットを得るといったユースケースを可能にします。
例えば、AIONプラットフォームにおいて以下のようなマイクロサービスを動作させることができます。
以下は、人物検出を行うためのモデルである PeopleNet を活用したマイクロサービスです。
以下は、車体検出を行うためのモデルである TrafficCamNet を活用したマイクロサービスです。
以下は、物体検出を行うためのモデルである YOLOv5 を活用したマイクロサービスです。
AIONプラットフォーム では、次の概念図の通り、AI/IoTランタイム環境のために、データパイプラインが定義・供給されます。
AIONプラットフォーム では、次の概念図に説明される通り、エッジコンピューティング環境と Azure IoT Hub / Google Cloud IoT Core とのデータ統合が為されます。
AIONプラットフォームのエッジコンピューティング環境では、主に次の機能が提供されます。
エッジコンピューティング環境と統合されたクラウド環境(Azure IoT Hub / Google Cloud IoT Core)では、主に次の機能が提供されます。
AIONプラットフォーム では、クラウド環境(Azure IoT Hub / Google Cloud IoT Core)にエッジコンピューティング環境からデータを送信するときに、メッセージングアーキテクチャとして、エッジ側で RabbitMQ が利用されています。
エッジコンピューティング環境で RabbitMQ のキューから受け取ったメッセージを、エッジ側からクラウド側(Azure IoT Hub / Google Cloud IoT Core)に送信するためのマイクロサービスは、以下のリポジトリを参照してください。
シングルモードでは、aion-coreはKubernetesのMaster node上に各種リソースおよびマイクロサービスがデプロイされます。
シングルモードの特徴として、1つの端末上にマイクロサービスを展開し、aion-coreはそれらのサービスの起動または再起動、通信等を自動的に実行します。これにより、複数のマイクロサービスで構成されるシステムが実現できます。
クラスタモードでは、aion-coreはKubernetesのMaster node上にmaster-aionがデプロイされ、 Worker node上にworker-aionおよび各マイクロサービスがデプロイされます。
クラスタモードの特徴として、デプロイするマイクロサービスをWorker node単位で指定することができます。 デプロイ先の指示はmaster-aionから各worker-aionに対して振り分けられ、master-aion上でデプロイの状況などを見ることもできます。
AIONではLinuxの端末名を頼りに端末間通信を行うため、端末名を一台ごとに異なるものに変えておく必要があります。端末名を変更する場合は以下のコマンドを実行してください。
hostnamectl set-hostname [new device name]
その後一度ターミナルを閉じ、開き直し、 以下のコマンドを実行して端末名が変更されていることを確認します。
hostnamectl
作業ファイル等を配置するディレクトリを作成します。
mkdir ~/$(hostname)
mkdir ~/$(hostname)/AionCore
mkdir ~/$(hostname)/DataSweeper
mkdir ~/$(hostname)/BackendService
mkdir ~/$(hostname)/Runtime
mkdir ~/$(hostname)/MysqlKube
mkdir ~/$(hostname)/UI
sudo mkdir -p /var/lib/aion
sudo mkdir -p /var/lib/aion/default/config
sudo mkdir -p /var/lib/aion/prj/config
sudo mkdir -p /var/lib/aion/Data
sudo mkdir -p /var/lib/aion/Data/deployment
sudo mkdir -p /var/lib/aion/prj/Data
なお、本ディレクトリを自動作成することができます。
本ディレクトリ自動作成のための定義は、aion-ansible-unification内の、roles/aion/tasks/created-directories.yaml にあります。
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker
ログインユーザにDockerコマンドの実行権限を付与する必要があります。 権限を付与するには以下のコマンドを実行してください。
sudo gpasswd -a $USER docker
sudo systemctl restart docker
次の手順で、kubeadm、kubelet、kubectlをインストールします。
sudo apt update && sudo apt install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt update && sudo apt install -y kubelet=<version> kubectl=<version> kubeadm=<version>
sudo apt show kubelet kubectl kubeadm
echo 'export DOCKER_BUILDKIT=1' >> ~/.bashrc
sudo vi /etc/docker/daemon.json
以下の内容に書き換え
{
"default-runtime": "nvidia",
"runtimes": {
"nvidia": {
"path": "/usr/bin/nvidia-container-runtime",
"runtimeArgs": []
}
},
"features": {
"buildkit": true
}
}
source ~/.bashrc
reboot
cd $(hostname)/AionCore
git clone https://github.com/latonaio/aion-core.git
cd aion-core
docker login
make docker-build
cd ..
一部のマイクロサービスのDockerイメージには、以下のベースイメージが必要となります。
pyhon-base-imagesのREADMEを参照し、これらのベースイメージを準備してください。
docker login
docker pull envoyproxy/envoy:v1.16-latest
AION上で動作させるためのマイクロサービスのDocker Imageを作成します。
クラスタモードで動作させる場合、デプロイ先のWorker Node上でそれぞれ個別にDocker Imageを作成する必要があります。
aion-coreをデプロイするためのマニフェストファイル群です。 クラスタモードで利用する場合は、master nodeのあるマシン上に配備してください。
cd ~/$(hostname)/AionCore
git clone https://github.com/latonaio/aion-core-manifests.git
cd aion-core-manifests
aion-coreでは、マイクロサービスをデプロイするために、YAML形式の定義ファイルを作成する必要があります。
シングルモードで利用する場合は、以下のディレクトリに services.ymlを配置します。
services.ymlは/var/lib/aion/(namespace)/configの中に配置する。
deviceName:自身のデバイス名。ここの値をdevices配下のマイクロサービスで環境変数DEVICE_NAMEとして参照できる
devices:通信相手となる端末の情報を記述する
devices.[device-name]:端末名。この下の階層にその端末の設定を記載する
devices.[device-name].addr:IPなど、その端末を参照できるアドレス
devices.[device-name].aionHome:AIONのホームディレクトリ
microservices:この端末で動かすマイクロサービスの情報を記述する
microservices.[service-name]:マイクロサービス名。この下の階層にそのサービスの設定を記載する
microservices.[service-name].startup:AIONの起動が完了したら、すぐ起動する(デフォルト:no)
microservices.[service-name].always:podが停止していたら自動で再起動する(デフォルト:no)
microservices.[service-name].env:この下の階層にKEY: VALUEで環境変数を定義することができる
microservices.[service-name].nextService:この下の階層に次のサービス一覧を記述する
microservices.[service-name].scale:同時起動数(デフォルト:1)
microservices.[service-name].privileged:Dockerの特権モードで動作させる
microservices.[service-name].serviceAccount:Kubernetesのサービスアカウントを付与する
microservices.[service-name].volumeMountPathList:この下の階層に、追加でマウントする一覧を記載する
microservices.[service-name].withoutKanban:カンバンを使用するかどうか
microservices.[service-name].targetNode:nodeをworker nodeとして運用する際のnode名
例)
kube-etcd-sentinel:
startup: yes
always: yes
withoutKanban: yes
serviceAccount: controller-serviceaccount
env:
MY_NODE_NAME: YOUR_DEVICE_NAME
targetNode: YOUR_NODE_NAME
make build
$ make build-master HOST={masterのHOSTNAME}
$ make build-worker HOST={workerのHOSTNAME}
startup: no
ports: hoge
...
targetNode: {workerのHOSTNAME}
metadata:
namespace: {workerのHOSTNAME}
template:
metadata:
labels:
app: hoge
spec:
containers:
...
spec.template.spec.nodeSelect:
kubernetes.io/hostname: {workerのHOSTNAME}
volume mountで、ディレクトリパスなどの変更が必要な場合は、合わせて修正する
metadata:
namespace: {workerのHOSTNAME}
template:
metadata:
labels:
app: hoge
spec:
containers:
...
spec.template.spec.nodeSelect:
kubernetes.io/hostname: {workerのHOSTNAME}
$ make apply-master
$ make apply-worker HOST={workerのHOSTNAME}
$ make delete-worker HOST={workersのHOSTNAME}
$ make delete-master
aion-coreが正常に動作しているか確認するには、以下のコマンドを実行する
$ kubectl get pod
または
$ kubectl get pod -n prj
以下の名前を含むpodが起動すればaion-coreは動作している
aion-servicebroker : マイクロサービスの呼び出しを管理する
aion-statuskanban : マイクロサービス間のデータ(看板)受け渡しを管理する
aion-sendanything : 端末間のデータ(看板)受け渡しを管理する
aion-kanban-replicator : 処理が終わった看板をログとしてmongodbに保管する
mongo : MongoDBサーバ
redis-cluster : Redisサーバ
その後、任意のマイクロサービスが起動しているかを確認する
KubernetesのMaster Nodeのセットアップを行いますが、ホスト側のIPアドレスがKubernentesの設定ファイルに書き込まれるため、静的IPアドレスを設定しておくことをおすすめします。
sudo kubeadm init --pod-network-cidr=10.244.10.0/16
mkdir $HOME/.kube/
sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
※「apiserver-cert-extra-sans」オプションは外部サーバからkubectlで接続したい場合、接続元のIPアドレスを入力する項目になります(不要であればオプションごと削除して構いません)
Kubernetesにレイヤー3通信を実装するために、また、ポッド間の通信を行うために、Flannelをデプロイします。
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml
kubectl taint nodes --all node-role.kubernetes.io/master-
※ デフォルトでは、マスターノードに対してSystem系以外のPodが配置されないよう設定されているため
下記のコマンドを実行し、NodeのStatusがReadyになっていればセットアップが完了です。
kubectl get node
cd /path/to/aion-core/
go install cmd/aionctl/main.go
# master nodeで下記のコマンドを実行
kubeadm token create --print-join-command
# 実行すると下記のコマンドが出るのでworker側で実行する
kubeadm join {マスターノードのIP}:6443 --token {token} --discovery-token-ca-cert-hash sha256:{hash値}
※ Worker Node側でkubeadm initですでにclusterを立ち上げている場合はsudo kubeadm resetでclusterをリセットする
master nodeの/etc/kubernetes/admin.conf内の設定ファイルを、worker nodeの~/.kube/configにコピー
下記のコマンドを実行し、master nodeと自分のnodeが表示され、StatusがREADYになっていれば完了です。
kubectl get node
aion-core およびAION 稼働に必要なリソースをまとめて起動、停止します。
aion-core には、Service Broker, Kanban Server, Kanban Replicator, Send Anything が含まれます。 AION 稼働に必要なリソースには、Envoy, Redis, MongoDB などが含まれます。
以下の各Shellスクリプトは、aion-core-manifests の中にあります。
$ sh aion-start.sh
$ sh aion-stop.sh
aion-core を単体で起動、停止します。
$ sh aion-core-start.sh
$ sh aion-core-stop.sh