Nats

用途

Ops 通过 Nats 组件,导出相关的事件,主要有两类:

  • CRD 的状态,包括主机、集群的状态,TaskRun、PipelineRun 的状态
  • alert 定时巡检上报的状态信息

下面提供 Nats 组件的安装与配置。这里采用的是,一个主集群,若干边缘集群的方式,边缘集群会将事件转发到主集群,在主集群统一进行处理。

添加 Helm Repo

  • 添加仓库
helm repo add nats https://nats-io.github.io/k8s/helm/charts/
helm repo update
  • 查看可配置的字段
helm show values nats/nats

部署主集群

  • 设置 Nats 的基本信息
export adminpassword=mypassword
export apppassword=mypassword
  • 生成 nats-values.yaml
cat <<EOF > nats-values.yaml
config:
  jetstream:
    enabled: true
    fileStore:
      enabled: false
      dir: /data
    memoryStore:
      enabled: true
      maxSize: 1Gi
    pvc:
      enabled: false
      storageClassName: my-sc
  cluster:
    enabled: true
  leafnodes:
    enabled: true
  merge:
    accounts:
      SYS:
        users:
          - user: admin
            password: ${adminpassword}
      APP:
        users:
          - user: app
            password: ${apppassword}
        jetstream: true
    system_account: SYS
container:
  image:
    repository: nats
    tag: 2.10.20-alpine
natsBox:
  container:
    image:
      repository: natsio/nats-box
      tag: 0.14.5
reloader:
  enabled: true
  image:
    repository: natsio/nats-server-config-reloader
    tag: 0.15.1
EOF

数据被持久化到内存中,如果需要存储到磁盘,需要设置 fileStore

  • 安装 nats
helm -n ops-system install nats nats/nats  --version 1.2.4  -f nats-values.yaml
helm -n ops-system uninstall nats
  • 暴露 Nats 服务端口
kubectl patch svc nats -p '{"spec":{"type":"NodePort","ports":[{"port":4222,"nodePort":32223,"targetPort":"nats"},{"port":7422,"nodePort":32222,"targetPort":"leafnodes"}]}}' -n ops-system
  • 查看负载
kubectl -n ops-system get pod,svc | grep nats

pod/nats-0                         2/2     Running   0             15h
pod/nats-1                         2/2     Running   0             15h
pod/nats-2                         2/2     Running   0             15h
pod/nats-box-6bb86df889-xcr6x      1/1     Running   0             15h
service/nats            NodePort    10.100.109.24    <none>        4222:32223/TCP,7422:32222/TCP         15h
service/nats-headless   ClusterIP   None             <none>        4222/TCP,7422/TCP,6222/TCP,8222/TCP   15h

部署边缘节点

  • 添加仓库
helm repo add nats https://nats-io.github.io/k8s/helm/charts/
helm repo update
  • 设置主集群的 nats 信息
export natsendpoint=10.8.101.244:32222
  • 生成 nats-values.yaml

需要注意的是,不同集群的 server_name 不能相同,否则会有重复连接的问题。

cat <<EOF > nats-values.yaml
config:
  leafnodes:
    enabled: true
    merge:
      remotes:
        - urls:
          - nats://admin:${adminpassword}@${natsendpoint}
          account: SYS
        - urls:
          - nats://app:${apppassword}@${natsendpoint}
          account: APP
  merge:
    server_name: need-to-be-unique
    accounts:
      SYS:
        users:
          - user: admin
            password: ${adminpassword}
      APP:
        users:
          - user: app
            password: ${apppassword}
        jetstream: true
    system_account: SYS
container:
  image:
    repository: nats
    tag: 2.10.20-alpine
natsBox:
  container:
    image:
      repository: natsio/nats-box
      tag: 0.14.5
reloader:
  enabled: true
  image:
    repository: natsio/nats-server-config-reloader
    tag: 0.15.1
EOF
  • 安装 nats
helm install nats nats/nats  --version 1.2.4  -f nats-values.yaml -n ops-system

Nats 常用命令

  • 测试 Nats
kubectl -n ops-system exec -it deployment/nats-box -- sh
  • 订阅消息
nats --user=app --password=${apppassword} sub "ops.>"
  • 发布消息
nats --user=app --password=${apppassword} pub ops.test "mymessage mycontent"
  • 创建 stream 持久化消息
nats --user=app --password=${apppassword} stream add ops --subjects "ops.>" --ack --max-msgs=-1 --max-bytes=-1 --max-age=1y --storage memory --retention limits --max-msg-size=-1 --discard=old --replicas 1 --dupe-window=2m

生产环境中,推荐使用 file 存储,并且 replica 设置为 3。

  • 查看 stream 事件
nats --user=app --password=${apppassword} stream view ops
  • 查看 stream 配置
nats --user=app --password=${apppassword} stream info ops
  • 查看集群信息
nats --user=admin --password=${adminpassword} server report jetstream

这里可以看到,主集群的信息,边缘集群的信息,以及连接的信息。

  • 查看 stream 的 subjects
nats --user=app --password=${adminpassword} stream subjects ops
  • 压力测试
nats --user=app --password=${apppassword} bench benchsubject --pub 1 --sub 10

参考

https://docs.nats.io/running-a-nats-service/configuration#jetstream https://docs.nats.io/running-a-nats-service/configuration/leafnodes/leafnode_conf https://docs.nats.io/running-a-nats-service/configuration/gateways/gateway#gateway-configuration-block

results matching ""

    No results matching ""

    results matching ""

      No results matching ""