Skip to content

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 等价
mysqlStatefulSet(1 副本)+ headless Service + PVC
ongridDeployment(1 副本)+ ClusterIP Service,给 :8080/api)和 :9100/metrics
nginx(前门)Deployment + LoadBalancer/Ingress,给 :443:80
frontierDeployment + LoadBalancer/NodePort,给 tunnel 端口 :40012
prometheusStatefulSet + PVC,或者你已有的 kube-prom-stack
lokiStatefulSet + PVC,或者你已有的 loki-distributed
tempoStatefulSet + PVC
grafanaDeployment + PVC,或者你已有的 grafana
searxngDeployment + 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_URLONGRID_LOG_QUERY_URLONGRID_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。

草稿:

yaml
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,吃 ManagerEdgePool 资源,自动生成 access/secret 对,滚升级。
  • k8s 原生 edge 插件,通过 kubelet API 读 pod 日志而不是 journald,让 集群本地日志不需要 hostPath。

这些都没提交到任何 release;想帮推就看 GitHub issue。