NATS · 集群内部消息中间件

NATS 是部署在 nats namespace 的云原生消息系统,单副本 StatefulSet,开启 JetStream 做持久化消息,供集群内的 app / platform / game / argo-workflows 等命名空间作为消息总线使用。

部署形态

  • Name
    namespace
    Description
    nats(kustomization 设 namespace: nats,无 namePrefix)。
  • Name
    工作负载
    Description
    主体是 StatefulSet natsserviceName: nats-headless,1 副本;监控旁路是独立 Deployment nats-exporter,1 副本。
  • Name
    镜像
    Description
    NATS 容器 nats:2.14-alpine(README 文字仍写 2.10,以 statefulset.yaml 的 2.14 为准);exporter 容器 natsio/prometheus-nats-exporter:0.20.1
  • Name
    调度
    Description
    StatefulSet nodeSelector: node-role=database,按 README/README 集群拓扑钉在 k8s-worker3(数据库层,本地盘 PV)。exporter 无 nodeSelector。
  • Name
    端口
    Description
    容器暴露 4222(client,NATS 协议)、8222(HTTP monitoring)、6222(cluster routing,预留给未来集群化)。
  • Name
    存储
    Description
    PVC nats-datastorageClassName: local-pathReadWriteOnce,20Gi,挂载到 /data(JetStream 落盘在 /data/jetstream)。配置通过 ConfigMap nats-config 挂到 /etc/nats
  • Name
    资源
    Description
    NATS 容器 requests 250m CPU / 256Mi,limits 1000m CPU / 2Gi。namespace 另有 ResourceQuota(pods 10、requests 500m/512Mi、limits 2 核/4Gi)与 LimitRange(容器默认 100m/128Mi)。
  • Name
    探针
    Description
    liveness / readiness 均为 HTTP GET /healthz(port 8222)。

配置与依赖

NATS 通过 args -c /etc/nats/nats.conf 加载 ConfigMap nats-config。关键配置:client port: 4222http_port: 8222server_name: $POD_NAME(来自 downward API 注入的 POD_NAME env)、max_payload: 1MBmax_connections: 100000max_subscriptions: 0(不限)、debug/trace 关闭、logtime 开启。

JetStream 在配置里开启:store_dir: /data/jetstreammax_memory_store: 1Gimax_file_store: 10Gi

jetstream {
  store_dir: /data/jetstream
  max_memory_store: 1Gi
  max_file_store: 10Gi
}

ExternalSecret nats-secret 从 ClusterSecretStore vault-backend 拉取认证凭据,refreshInterval: 1h,目标 Secret 名 nats-secret。两个键来自 Vault secret/database/prod/natsusername / password 属性,映射为 NATS_USER / NATS_PASSWORD

访问与监控

集群内访问走 ClusterIP Service nats(4222 client、8222 monitoring);StatefulSet 的稳定网络身份由 headless Service nats-headless(4222 / 6222 / 8222,clusterIP: None)提供。

集群外有 NodePort Service nats-nodeport:client 4222 → NodePort 30422,monitoring 8222 → NodePort 30822

Ingress nats(ingressClassName traefik)把 host nats.yldm.tech/ 转发到 nats:8222(HTTP 监控端口),带 external-dns Cloudflare 注解(cloudflare-proxied: "true",target 指向一个 cfargotunnel 域名)。

监控由独立 Deployment nats-exporter 承担:以 natsio/prometheus-nats-exporterhttp://nats:8222(args 含 -varz -connz -routez -subz -jsz=all),在容器 7777 端口暴露 /metrics,由 ClusterIP Service nats-exporter(port 7777)承接。ServiceMonitor nats(label prometheus: kube-prometheus)选中 app: nats-exporter,每 30s 抓一次 /metrics,并 relabel 出 pod / namespace / service=nats / job=nats。目录内没有 HPA / VPA / PDB / PrometheusRule。

入口类型端口
natsClusterIP4222 client / 8222 monitoring
nats-headlessClusterIP (None)4222 / 6222 / 8222
nats-nodeportNodePort4222 → 30422 / 8222 → 30822
nats-exporterClusterIP7777 metrics
nats Ingresstraefiknats.yldm.technats:8222

网络策略

namespace 默认收紧入站再按来源放行:default-deny-ingress 对所有 Pod 拒绝全部 ingress;allow-same-namespace 放行 namespace 内部双向流量;allow-from-app / allow-from-game / allow-from-platform / allow-from-argo-workflows 分别按 namespace 标签放行来自 app / game / platform / argo-workflows 的入站(前三个 NetworkPolicy 未写 namespace 字段,由 kustomization 的 namespace: nats 注入);allow-from-ingress 放行 kube-system 访问 8222;allow-prometheus-scraping 放行 prometheus namespace 抓指标;allow-dns-egress 放行所有 Pod 到 kube-system 的 53/UDP+TCP DNS 出站。

评论