22 NATS #
NATSは、ますますハイパーコネクテッド化が進む世界のために構築された接続テクノロジです。NATSは、クラウドベンダ、オンプレミス、エッジ、Web、モバイルデバイスがどのように組み合わさっていてもアプリケーションが安全に通信することを可能にする単一のテクノロジです。NATSはオープンソース製品ファミリで構成されており、各製品は緊密に統合されている一方で、簡単に個別にデプロイできます。NATSは世界中で数千社もの企業で使用されており、マイクロサービス、エッジコンピューティング、モバイル、IoTなどのユースケースに幅広く対応しているため、NATSを使用して従来のメッセージングの強化や置き換えを図ることができます。
22.1 アーキテクチャ #
NATSは、メッセージの形式でアプリケーション間のデータ交換を可能にするインフラストラクチャです。
22.1.1 NATSクライアントアプリケーション #
NATSクライアントライブラリを使用すると、アプリケーションが異なるインスタンス間でパブリッシュ、サブスクライブ、要求、および応答できるようになります。このようなアプリケーションを一般的にクライアントアプリケーション
と呼びます。
22.1.2 NATSサービスインフラストラクチャ #
NATSサービスは、相互接続されてNATSサービスインフラストラクチャを提供するように設定された1つ以上のNATSサーバプロセスによって提供されます。NATSサービスインフラストラクチャは、1つのエンドデバイスで動作する単一のNATSサーバプロセスから、すべての主要クラウドプロバイダと世界のあらゆる地域にまたがる多数のクラスタからなるパブリックなグローバルスーパークラスタまで拡張可能です。
22.1.3 シンプルなメッセージングデザイン #
NATSを使用すると、アプリケーションはメッセージを送受信して簡単に通信できます。これらのメッセージはサブジェクト文字列によってアドレス指定および識別され、ネットワークの場所には依存しません。データはエンコードされてメッセージとしてフレーム化され、パブリッシャによって送信されます。メッセージは1人以上のサブスクライバによって受信、デコード、処理されます。
22.1.4 NATS JetStream #
NATSにはJetStreamと呼ばれる分散型の永続化システムが組み込まれています。JetStreamは、今日のテクノロジにおけるストリーミングで明らかになった問題、すなわち複雑性、脆弱性、スケーラビリティの欠如を解決するために作成されました。また、JetStreamは、パブリッシャとサブスクライバのカップリングに関する問題(パブリッシュされたメッセージを受信するにはサブスクライバが稼働している必要がある)も解決します。NATS JetStreamの詳細については、こちらを参照してください。
22.2 インストール #
22.2.1 K3s上へのNATSのインストール #
NATSは複数のアーキテクチャ向けに構築されているため、K3s (第13章 「K3s」)上に簡単にインストールできます。
NATSのデフォルト値を上書きするvaluesファイルを作成しましょう。
cat > values.yaml <<EOF
cluster:
# Enable the HA setup of the NATS
enabled: true
replicas: 3
nats:
jetstream:
# Enable JetStream
enabled: true
memStorage:
enabled: true
size: 2Gi
fileStorage:
enabled: true
size: 1Gi
storageDirectory: /data/
EOF
では、Helmを介してNATSをインストールしてみましょう。
helm repo add nats https://nats-io.github.io/k8s/helm/charts/
helm install nats nats/nats --namespace nats --values values.yaml \
--create-namespace
上記のvalues.yaml
ファイルでは、次のコンポーネントがnats
ネームスペースに配置されます。
NATS StatefulsetのHAバージョン。3つのコンテナ(NATSサーバ + ConfigリローダとMetricsサイドカー)が含まれます。
NATS boxコンテナ。セットアップの確認に使用できる一連の
NATS
ユーティリティが付属します。JetStreamは、Podにバインドされた
PVC
が付属するKey-Valueバックエンドも利用します。
22.2.1.1 セットアップのテスト #
kubectl exec -n nats -it deployment/nats-box -- /bin/sh -l
テストサブジェクトのサブスクリプションを作成します。
nats sub test &
テストサブジェクトにメッセージを送信します。
nats pub test hi
22.2.1.2 クリーンアップ #
helm -n nats uninstall nats
rm values.yaml
22.2.2 K3sのバックエンドとしてのNATS #
K3sが利用するコンポーネントの1つがKINEです。KINEは、最初からリレーショナルデータベースをターゲットとした代替ストレージバックエンドでetcdを置き換えることを可能にするシムです。JetStreamはKey Value APIを備えているので、NATSをK3sクラスタのバックエンドとして利用することが可能です。
K3sのビルトインNATSが容易になるマージ済みのPRがありますが、この変更はまだK3sリリースに含まれていません。
このため、K3sのバイナリを手動で構築する必要があります。
このチュートリアルでは、Appleシリコン上のOSX上のSLE Micro (UTM)のVMを使用します。
以下のコマンドはOSX PC上で実行してください。
22.2.2.1 K3sの構築 #
git clone --depth 1 https://github.com/k3s-io/k3s.git && cd k3s
次のコマンドは、ビルドタグにnats
を追加して、K3sでNATSビルトイン機能を有効にします。
sed -i '' 's/TAGS="ctrd/TAGS="nats ctrd/g' scripts/build
make local
<node-ip>は、K3sを起動するノードの実際のIPに置き換えます。
export NODE_IP=<node-ip>
sudo scp dist/artifacts/k3s-arm64 ${NODE_IP}:/usr/local/bin/k3s
K3sをローカルで構築するには、buildx Docker CLIプラグインが必要です。$ make
local
が失敗する場合は、手動でインストールできます。
22.2.2.2 NATS CLIのインストール #
TMPDIR=$(mktemp -d)
nats_version="nats-0.0.35-linux-arm64"
curl -o "${TMPDIR}/nats.zip" -sfL https://github.com/nats-io/natscli/releases/download/v0.0.35/${nats_version}.zip
unzip "${TMPDIR}/nats.zip" -d "${TMPDIR}"
sudo scp ${TMPDIR}/${nats_version}/nats ${NODE_IP}:/usr/local/bin/nats
rm -rf ${TMPDIR}
22.2.2.3 K3sのバックエンドとしてのNATSの実行 #
ノードでssh
を実行し、--datastore-endpoint
フラグでnats
を指してK3sを実行しましょう。
次のコマンドでは、K3sをフォアグランドプロセスとして起動するので、ログを簡単に追跡して問題がないかどうかを確認できます。現在の端末をブロックしないようにするには、コマンドの前に&
フラグを追加して、バックグラウンドプロセスとして起動できます。
k3s server --datastore-endpoint=nats://
NATSバックエンドを使用するK3sサーバをslemicro
VM上で永続化するには、次のスクリプトを実行して、必要な設定でsystemd
サービスを作成します。
export INSTALL_K3S_SKIP_START=false
export INSTALL_K3S_SKIP_DOWNLOAD=true
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="server \
--datastore-endpoint=nats://" sh -
22.2.2.4 トラブルシューティング #
次のコマンドをノード上で実行して、ストリームのすべてが適切に動作していることを確認できます。
nats str report -a
nats str view -a