NATS · 集群内部消息中间件
NATS 是部署在 nats namespace 的云原生消息系统,单副本 StatefulSet,开启 JetStream 做持久化消息,供集群内的 app / platform / game / argo-workflows 等命名空间作为消息总线使用。
namespace: nats 且没有 namePrefix,资源名就是 nats / nats-headless / nats-nodeport / nats-exporter。部署形态
- Name
- namespace
- Description
nats(kustomization 设namespace: nats,无 namePrefix)。
- Name
- 工作负载
- Description
- 主体是 StatefulSet
nats,serviceName: nats-headless,1 副本;监控旁路是独立 Deploymentnats-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-data,storageClassName: local-path,ReadWriteOnce,20Gi,挂载到/data(JetStream 落盘在/data/jetstream)。配置通过 ConfigMapnats-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: 4222、http_port: 8222、server_name: $POD_NAME(来自 downward API 注入的 POD_NAME env)、max_payload: 1MB、max_connections: 100000、max_subscriptions: 0(不限)、debug/trace 关闭、logtime 开启。
JetStream 在配置里开启:store_dir: /data/jetstream、max_memory_store: 1Gi、max_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/nats 的 username / password 属性,映射为 NATS_USER / NATS_PASSWORD。
POD_NAME / POD_NAMESPACE 两个 downward API env,并未把 nats-secret 的 NATS_USER / NATS_PASSWORD 引入容器,nats.conf 里也没有 authorization 段——也就是说 Secret 已同步但当前 manifest 未在服务端启用账号鉴权。访问与监控
集群内访问走 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-exporter 抓 http://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。
| 入口 | 类型 | 端口 |
|---|---|---|
nats | ClusterIP | 4222 client / 8222 monitoring |
nats-headless | ClusterIP (None) | 4222 / 6222 / 8222 |
nats-nodeport | NodePort | 4222 → 30422 / 8222 → 30822 |
nats-exporter | ClusterIP | 7777 metrics |
nats Ingress | traefik | nats.yldm.tech → nats: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 出站。