Skip to content

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 相当物
mysqlStatefulSet(1 レプリカ)+ headless Service + PVC
ongridDeployment(1 レプリカ)+ :8080/api)と :9100/metrics)用 ClusterIP Service
nginx(フロントドア)Deployment + :443:80 用 LoadBalancer/Ingress
frontierDeployment + トンネルポート :40012 用 LoadBalancer/NodePort
prometheusStatefulSet + PVC、または既存の kube-prom-stack
lokiStatefulSet + PVC、または既存の loki-distributed
tempoStatefulSet + PVC
grafanaDeployment + PVC、または既存の grafana
searxngDeployment + 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_URLONGRID_LOG_QUERY_URLONGRID_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。

スケッチ:

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>)。プライベートレジストリにプッシュしてください。

同じ 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。
  • ManagerEdgePool リソースを取り、access/secret ペアを自動生成し、アップグレードをロールする CRD 駆動 operator。
  • journald ではなく kubelet API でポッドログを読む k8s ネイティブ edge プラグイン —— クラスタローカルログに hostPath が要らなくなる。

これらは何もリリースにコミットされていません。推進を手伝いたければ GitHub issue を参照してください。