Kubernetes
Ongrid 在 Kubernetes 上跑得动,但它不是一等部署目标。默认安装路径是在 单台 Linux 主机上 docker compose,因为这是从 git clone 到能用 https://your-host/ 的最快路径。K8s 给那些已经有 Kubernetes 平台、想把 Ongrid 塞进去的运维。
Helm chart 状态
还没有官方 Helm chart。release tarball 发 deploy/docker-compose.yml 和包它的 install 脚本 —— 没有 deploy/charts/、没有 kustomize/。今天要 在 K8s 上部署,你得手工把 compose 文件翻译过去。社区 chart 在 roadmap 上; 在 GitHub issue tracker 跟。
compose 文件给你的,对应你要的:
| Compose 服务 | K8s 等价 |
|---|---|
mysql | StatefulSet(1 副本)+ headless Service + PVC |
ongrid | Deployment(1 副本)+ ClusterIP Service,给 :8080(/api)和 :9100(/metrics) |
nginx(前门) | Deployment + LoadBalancer/Ingress,给 :443 和 :80 |
frontier | Deployment + LoadBalancer/NodePort,给 tunnel 端口 :40012 |
prometheus | StatefulSet + PVC,或者你已有的 kube-prom-stack |
loki | StatefulSet + PVC,或者你已有的 loki-distributed |
tempo | StatefulSet + PVC |
grafana | Deployment + PVC,或者你已有的 grafana |
searxng | Deployment + ClusterIP |
用 ConfigMap + Secret 装 ONGRID_* env。把跟 compose 栈一样的 TLS 证书 挂进 nginx pod。
manager 该跑 K8s 吗?
老实答:跑得动,但不太得到什么。manager 是单进程带持久状态(MySQL)、不 水平扩展 —— 一个 Service 后挂两个 pod 会破坏进程内告警 evaluator、chat 会 话路由器、agent kernel 的 tool registry 缓存。所以你跑的是 1 副本 Deployment 带 PVC,本质上跟一台 VM 上的 Docker 是同一个形状,只是多了 YAML。
K8s 在哪买得回点东西:
- 你已经有 ingress / cert-manager / external-DNS —— 给 manager 前门复用。
- 你已经有托管 MySQL(RDS / CloudSQL / Vitess)—— 把
ONGRID_DB_DSN指过去, 扔掉 StatefulSet。 - 你已经有 Prometheus / Loki / Tempo 栈 —— 把
ONGRID_PROM_URL、ONGRID_LOG_QUERY_URL、ONGRID_TRACE_QUERY_URL指过去,扔掉那些 StatefulSet。
替换完,"manager on K8s" 就剩两个 Deployment(manager + nginx)加每个复用 上游一个 Service。
edge on K8s —— daemonset 模式
如果你的工作负载跑在 K8s 上、你想要按节点的可观测,把 edge agent 当 DaemonSet 跑。每节点一个 agent pod,hostPath 进 /proc、/sys、节点的 journal、节点的 syslog。
草稿:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: ongrid-edge
namespace: ongrid
spec:
selector: { matchLabels: { app: ongrid-edge } }
template:
metadata: { labels: { app: ongrid-edge } }
spec:
hostPID: true
hostNetwork: false # tunnel is outbound; no need for hostNetwork
containers:
- name: edge
image: your-registry/ongrid-edge:vX.Y.Z
env:
- name: ONGRID_EDGE_CLOUD_ADDR
value: ongrid.example.com:40012
- name: ONGRID_EDGE_ACCESS_KEY
valueFrom: { secretKeyRef: { name: ongrid-edge, key: access_key } }
- name: ONGRID_EDGE_SECRET_KEY
valueFrom: { secretKeyRef: { name: ongrid-edge, key: secret_key } }
# rare cases (read-only network introspection skills)
securityContext:
capabilities: { add: ["NET_ADMIN"] }
volumeMounts:
- { name: proc, mountPath: /host/proc, readOnly: true }
- { name: sys, mountPath: /host/sys, readOnly: true }
- { name: jrnl, mountPath: /var/log/journal, readOnly: true }
volumes:
- { name: proc, hostPath: { path: /proc } }
- { name: sys, hostPath: { path: /sys } }
- { name: jrnl, hostPath: { path: /var/log/journal } }你要一个 ongrid-edge 的 Docker 镜像 —— make docker-ongrid-edge 出一个 (ongrid-edge:<version>)。推到你的私有 registry。
每个节点复用同一对 access/secret。manager 的 Edges 页会每节点一行显示,按 hostname 去重。
edge on K8s —— sidecar 模式
只想观测一个应用 —— 不是整个节点 —— 就把 edge agent 当那个应用 pod 里的 sidecar。同样的镜像、同样的 env 变量、不挂 hostPath。你失去主机指标 (gopsutil 收集器返回 pod 的视图,不是节点的)但得到更窄的 scope。
适合:
- 多团队共享集群,每个团队想要自己的 Ongrid manager / 租户。
- 你没权限跑特权 DaemonSet。
- 你只关心一个工作负载的日志和链路。
什么不行
ongrid跨多个副本跑。 manager 进程内有状态:告警 evaluator 状态、 chat 会话路由器、agent kernel 缓存都是单实例。2 副本 Deployment 会出 重复通知、抢告警 evaluator、把 chat 会话切分到多个实例上。跑一个副本。- pod 里跑 curl-pipe 安装器。 没 systemd 它硬挂。用镜像。
- ADR-024 staged-bundle 升级。 hook 是 Linux shell 脚本接到 systemd 里。 在 K8s 上你通过改 image tag 滚 DaemonSet 升级 —— 原地交换路径被绕开。
- 40012 端口的 NodePort。 能用,但 NodePort 后面的节点一变,每条 edge 连接都重 hash。tunnel listener 用 LoadBalancer,或者把 frontier broker 暴露在专属节点。
roadmap
- 带合理默认的 Helm chart(1 副本 manager、可选内置 MySQL / Prom / Loki / Tempo)。
- CRD 驱动的 operator,吃
Manager和EdgePool资源,自动生成 access/secret 对,滚升级。 - k8s 原生 edge 插件,通过 kubelet API 读 pod 日志而不是 journald,让 集群本地日志不需要 hostPath。
这些都没提交到任何 release;想帮推就看 GitHub issue。