29 NATS #
NATSは、ますますハイパーコネクテッド化が進む世界のために構築された接続技術です。これは、クラウドベンダー、オンプレミス、エッジ、Web、モバイルデバイスのあらゆる組み合わせにおいて、アプリケーションが安全に通信できるようにする単一の技術です。NATSは、緊密に統合されながらも、簡単かつ独立してデプロイできるオープンソース製品群で構成されています。NATSは、マイクロサービス、エッジコンピューティング、モバイル、IoTなどのユースケースにわたり、世界中の何千もの企業で使用されており、従来のメッセージングを拡張または置き換えるために使用できます。
29.1 アーキテクチャ #
NATSは、メッセージの形式でアプリケーション間のデータ交換を可能にするインフラストラクチャです。
29.1.1 NATSクライアントアプリケーション #
NATSクライアントライブラリを使用すると、アプリケーションは異なるインスタンス間でパブリッシュ、サブスクライブ、リクエスト、およびリプライを行うことができます。 これらのアプリケーションは、一般的に`client applications`と呼ばれます。
29.1.2 NATSサービスインフラストラクチャ #
NATSサービスは、相互に接続し、NATSサービスインフラストラクチャを提供するように構成された1つ以上のNATSサーバープロセスによって提供されます。NATSサービスインフラストラクチャは、エンドデバイス上で実行される単一のNATSサーバープロセスから、すべての主要なクラウドプロバイダーと世界のすべての地域にまたがる多数のクラスターからなるパブリックなグローバルスーパー・クラスターまで拡張可能です。
29.1.3 シンプルなメッセージング設計 #
NATSを使用すると、アプリケーションはメッセージを送受信することで簡単に通信できます。これらのメッセージはサブジェクト文字列によって宛先指定および識別され、ネットワークの場所に依存しません。 データはメッセージとしてエンコードおよびフレーム化され、パブリッシャーによって送信されます。メッセージは、1つ以上のサブスクライバーによって受信、デコード、および処理されます。
29.1.4 NATS JetStream #
NATSには、JetStreamと呼ばれるビルトインの分散永続化システムがあります。 JetStreamは、今日のテクノロジーにおけるストリーミングの課題である複雑さ、脆弱性、スケーラビリティの欠如を解決するために作成されました。JetStreamは、パブリッシャーとサブスクライバーの結合に関する問題も解決します(メッセージがパブリッシュされたときに、サブスクライバーがメッセージを受信するために稼働している必要があります)。 NATS JetStreamに関する詳細情報は こちらをご覧ください。
29.2 インストール #
29.2.1 K3s上へのNATSのインストール #
NATSは複数のアーキテクチャ向けに構築されているため、K3s (Chapter 11, K3s)に簡単にインストールできます。
NATSのデフォルト値を上書きするための値ファイルを作成しましょう。
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`ネームスペースに配置されます:
3つのコンテナを含むNATSステートフルセットのHAバージョン:NATSサーバー + 設定リローダーおよびメトリクスサイドカー。
セットアップの検証に使用できる`NATS`ユーティリティのセットが付属しているNATSボックスコンテナ。
JetStreamは、ポッドにバインドされた`PVCs`が付属するキー・バリュー・バックエンドも活用します。
29.2.1.1 セットアップをテストする #
kubectl exec -n nats -it deployment/nats-box -- /bin/sh -lテストサブジェクトのサブスクリプションを作成します:
nats sub test &テストサブジェクトにメッセージを送信します:
nats pub test hi
29.2.1.2 クリーンアップ #
helm -n nats uninstall nats
rm values.yaml29.2.2 K3sのバックエンドとしてのNATS #
K3sが活用するコンポーネントの1つに KINEがあります。これは、本来リレーショナルデータベースを対象とした代替ストレージバックエンドでetcdを置き換えることを可能にするシムです。 JetStreamはキー・バリューAPIを提供するため、NATSをK3sクラスターのバックエンドにすることが可能です。
K3sにビルトインされたNATSを簡単にするPRはすでにマージされていますが、その変更はまだK3sのリリースに 含まれていません。
このため、K3sバイナリは手動でビルドする必要があります。
29.2.2.1 K3sのビルド #
git clone --depth 1 https://github.com/k3s-io/k3s.git && cd k3s次のコマンドは、K3sでNATSのビルトイン機能を有効にするために、ビルドタグに`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/k3s29.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}29.2.2.3 K3sバックエンドとしてのNATSの実行 #
ノード上で ssh し、nats を指す --datastore-endpoint フラグを指定して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 -29.2.2.4 トラブルシューティング #
以下のコマンドをノード上で実行し、ストリームに関するすべてが正常に機能していることを確認できます。
nats str report -a
nats str view -a