Kubernetes
Ongrid は Kubernetes 上で動きますが、ファーストクラスのデプロイメント ターゲットではありません。デフォルトのインストールパスは単一 Linux ホスト上の docker compose です。git clone から動く https://your-host/ までの最速パスだからです。K8s は既に Kubernetes プラットフォームを持っていて、Ongrid を組み込みたい operator 向けです。
Helm chart の状況
公式 Helm chart はまだありません。リリースタールボールは deploy/docker-compose.yml とそれをラップするインストールスクリプトを出荷します —— deploy/charts/ も kustomize/ もありません。今日 K8s でデプロイする必要があれば、compose ファイルを手で翻訳することになります。コミュニティ chart はロードマップにあります。GitHub の issue tracker で追跡してください。
compose ファイルが提供するものと、必要になる相当物:
| Compose サービス | K8s 相当物 |
|---|---|
mysql | StatefulSet(1 レプリカ)+ headless Service + PVC |
ongrid | Deployment(1 レプリカ)+ :8080(/api)と :9100(/metrics)用 ClusterIP Service |
nginx(フロントドア) | Deployment + :443 と :80 用 LoadBalancer/Ingress |
frontier | Deployment + トンネルポート :40012 用 LoadBalancer/NodePort |
prometheus | StatefulSet + PVC、または既存の kube-prom-stack |
loki | StatefulSet + PVC、または既存の loki-distributed |
tempo | StatefulSet + PVC |
grafana | Deployment + PVC、または既存の grafana |
searxng | Deployment + ClusterIP |
ONGRID_* env には ConfigMap + Secret を使ってください。compose スタックでマウントしたのと同じ TLS 証明書を nginx pod にマウントしてください。
manager は K8s で動かすべき?
正直な答え:動くけれど、得られるものはあまりありません。manager は永続状態(MySQL)を持つ単一プロセスで、水平スケールしません —— Service 後ろで 2 pod 走らせると、プロセス内アラート evaluator、チャットセッションルーター、エージェントカーネルのツールレジストリキャッシュが壊れます。なので 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」は 2 つの Deployment(manager + nginx)と再利用した上流ごとの Service に縮約されます。
K8s 上の edge —— daemonset パターン
ワークロード が K8s で走り、ノードごとの可観測性が欲しいなら、edge エージェントを DaemonSet として走らせてください。ノードごとに 1 エージェント pod、/proc、/sys、ノードの journal、ノードの syslog への hostPath。
スケッチ:
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>)。プライベートレジストリにプッシュしてください。
同じ access/secret ペアをすべてのノードが再利用します。manager の Edges ページはノードごとに 1 行を表示し、ホスト名で重複排除されます。
K8s 上の edge —— sidecar パターン
ノード全体ではなく 1 つのアプリだけを観測したいなら、edge エージェントをそのアプリの pod 内 sidecar として走らせてください。同じイメージ、同じ env vars、hostPath なし。ホストメトリクス(gopsutil コレクターはノードではなく pod のビューを返す)は失いますが、より狭いスコープを得ます。
これが正しい形になるのは:
- 複数チームがクラスタを共有し、各チームが自前の Ongrid manager / テナントを欲しがる。
- 特権 DaemonSet を走らせる権限がない。
- 1 つのワークロードのログとトレースだけ気にする。
動かないもの
ongridを複数レプリカで走らせる。 manager はプロセス内ステートフル:アラート evaluator 状態、チャットセッションルーター、エージェントカーネルキャッシュすべて単一インスタンス。2 レプリカ Deployment は重複通知を生成し、アラート evaluator をレースさせ、チャットセッションをインスタンス間で分断します。1 レプリカで走らせてください。- pod 内の curl-pipe インストーラ。 systemd なしでハード失敗します。代わりにイメージを使ってください。
- ADR-024 のステージドバンドルアップグレード。 フックは systemd に配線された Linux シェルスクリプトです。K8s ではイメージタグを変えて DaemonSet をロールしてアップグレードします —— in-place スワップパスはバイパスされます。
- ポート 40012 用の NodePort。 動きますが、NodePort 後ろのノードが変わるたびにすべての edge 接続が再ハッシュされます。トンネルリスナーには LoadBalancer を、または専用ノード上で frontier broker を公開してください。
ロードマップ
- 賢いデフォルト(1 レプリカ manager、オプションのバンドル MySQL / Prom / Loki / Tempo)付きの Helm chart。
ManagerとEdgePoolリソースを取り、access/secret ペアを自動生成し、アップグレードをロールする CRD 駆動 operator。- journald ではなく kubelet API でポッドログを読む k8s ネイティブ edge プラグイン —— クラスタローカルログに hostPath が要らなくなる。
これらは何もリリースにコミットされていません。推進を手伝いたければ GitHub issue を参照してください。