32 NATS #
NATS 是为日益发展的超级互联世界而开发的连接技术。仅凭这一项技术,应用程序就能在云供应商、本地、边缘、Web 和移动设备的任意组合之间安全地通讯。NATS 由一系列开源产品组成,这些产品紧密集成,但可以轻松独立部署。NATS 已由全球数千家公司使用,涵盖微服务、边缘计算、移动通讯和 IoT 等使用场景,并可用于增强或取代传统的消息传递方式。
32.1 体系结构 #
NATS 是能够在应用程序之间以消息形式实现数据交换的基础架构。
32.1.1 NATS 客户端应用程序 #
应用程序可以使用 NATS
客户端库在不同的实例之间发布和订阅消息,以及发出请求和做出答复。这些应用程序通常称作客户端应用程序
。
32.1.2 NATS 服务基础架构 #
NATS 服务由一个或多个 NATS 服务器进程提供,这些进程配置为彼此互连,提供了 NATS 服务基础架构。NATS 服务基础架构可以从一个终端设备上运行的单个 NATS 服务器进程,扩展为由许多群集组成的全球公用超级群集,这些群集跨越所有主要云提供商服务和全球所有区域。
32.1.3 简单的消息传递设计 #
NATS 使应用程序能够通过发送和接收消息来轻松进行通讯。这些消息按照主题字符串进行寻址和标识,并且不依赖于网络位置。数据经过编码,并构造为由发布者发送的消息。该消息由一个或多个订阅者接收、解码和处理。
32.1.4 NATS JetStream #
NATS 内置了一套称为 JetStream 的分布式持久化系统,旨在解决当今流媒体技术存在的诸多问题 — 复杂性高、稳定性差以及可伸缩性不足。JetStream 还能解决发布者和订阅者之间的耦合问题(即订阅者必须处于正常运行状态,才能接收发布的消息)。有关 NATS JetStream 的详细信息,请参见此处。
32.2 安装 #
32.2.1 在 K3s 上安装 NATS #
NATS 是为多种体系结构构建的,因此可以在 K3s 上轻松安装。(第 15 章 “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
名称空间中:
HA 版本的 NATS 有状态副本集,其中包含三个容器:NATS 服务器、配置重载器和指标分支。
NATS 箱容器,其中附带一组可用于校验设置的
NATS
实用程序。JetStream 还会利用其键值后端,该后端附带与 Pod 绑定的
PVC
。
32.2.1.1 测试设置 #
kubectl exec -n nats -it deployment/nats-box -- /bin/sh -l
为测试主题创建订阅:
nats sub test &
向测试主题发送消息:
nats pub test hi
32.2.1.2 清理 #
helm -n nats uninstall nats
rm values.yaml
32.2.2 NATS 用作 K3s 的后端 #
K3s 利用的一个组件是 KINE,它是一种适配层,能够用最初面向关系数据库的其他存储后端替代 etcd。由于 JetStream 提供了键值对 API,因此可以将 NATS 用作 K3s 群集的后端。
有一个已经合并的 PR 可以直接将内置的 NATS 包含在 K3s 中,但这项更改仍未包含在 K3s 版本中。
出于此原因,应该手动构建 K3s 二进制文件。
32.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
32.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}
32.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 -
32.2.2.4 查错 #
可以在节点上运行以下命令来校验流的所有功能是否正常运行:
nats str report -a
nats str view -a