documentation.suse.com / SUSE Edge 文档 / 第三方集成 / NATS

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 名称空间中:

  1. HA 版本的 NATS 有状态副本集,其中包含三个容器:NATS 服务器、配置重载器和指标分支。

  2. NATS 箱容器,其中附带一组可用于校验设置的 NATS 实用程序。

  3. JetStream 还会利用其键值后端,该后端附带与 Pod 绑定的 PVC

32.2.1.1 测试设置

kubectl exec -n nats -it deployment/nats-box -- /bin/sh -l
  1. 为测试主题创建订阅:

    nats sub test &
  2. 向测试主题发送消息:

    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
注意
注意

在本地构建 K3s 需要 buildx Docker CLI 插件。如果 $ make local 失败,可以手动安装该插件。

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
Documentation survey