Holloをkubernetesでホストしてみる

なんとなく動いている。

https://hl.oyasumi.dev/@ntek

Holloとは

以下を参照。

https://docs.hollo.social/ja/intro

Kubernetesで動かして何が嬉しいか

Holloは基本的に一人用サーバのため、現状ではあまり嬉しいことはないように思える。ただ、弊環境はDocker等のコンテナ基盤が常時動作していないため、Kubernetesに載せた。

使用したKubernetesディストロとオペレータ等

k0s + Cilium CNI + Cloudflare tunnel ingress controller + CloudNativePG + Redis Operator(opstree) + NFS CSI

Redis無くてもいいらしい。(Redisをやめたい。Valkeyさん公式でOperator作ってくれないかな・・・)

セットアップ

Holloは現在、S3互換オブジェクトストレージを必要としている。今回はCloudflare R2を使用。

HolloはHelmの提供を目指している?様子だが、まだ無いのでとりあえずYAMLで書いていく。
Containerが同時に起動してDBにアクセスすると恐らく壊れるので、DeploymentのストラテジをデフォルトからRecreateへ変更する。※k8sドキュメントにあるように、これではContainerの単一性は保証できないので本来はStatefulSetを使用すべきである。

Hollo本体

kind: Deployment
apiVersion: apps/v1
metadata:
  name: hollo-app
  namespace: hollo-1
spec:
  strategy:
    type: Recreate
  replicas: 1
  selector:
    matchLabels:
      app: hollo
  template:
    metadata:
      labels:
        app: hollo
    spec:
      initContainers:
      - name: wait-db
        image: busybox:latest
        imagePullPolicy: Always
        command: ['sh', '-c', 'until nc -z hollo-db-cluster-rw 5432; do echo waiting for hollo-db-cluster-rw; sleep 2; done;']
      containers:
      - name: hollo
        image: ghcr.io/dahlia/hollo:<version>
        imagePullPolicy: IfNotPresent
        envFrom:
        - configMapRef:
            name: hollo-config
        ports:
        - containerPort: 3000
        resources:
          limits:
            cpu: "2"
            memory: "2048Mi"
      volumes:
      - name: hollo-config
        configMap:
          name: hollo-config

Service(宅内からの試験用にCiliumのLoadbalancer機能を使用。Calico等の人はMetalLBとか、よしなに。今回のようにCloudflare tunnel Ingressコントローラ使う場合はClusterIPで十分)

apiVersion: v1
kind: Service
metadata:
  name: hollo
  namespace: hollo-1
spec:
  type: LoadBalancer
  selector:
    app: hollo
  ports:
  - name: http
    protocol: TCP
    port: 3000
    targetPort: 3000

DBとRedisは適当に。(この記事では記載しません。)

ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: hollo-config
  namespace: hollo-1
data:
  DATABASE_URL: postgres://省略
  REDIS_URL: redis://redis-main/0
  以下環境変数省略。詳細はドキュメントを参照。

上記を作成することにより、HolloをKubernetes上で起動できる。

Cloudflare関連の設定は以下のような感じで。(YAMLでも作れるよ)

kubectl create -n hollo-1 ingress hollo-1-to-cftunnel --rule="Hollo動かすFQDN/*=hollo:3000" --class cloudflare-tunnel

DBの待機などは以下を参考にした。うまく動いているかはわからない。

【kubernetes】Pod間に依存関係を持たせるときの一工夫

Post by @nt776@sv1.in-deep.blue
View on Mastodon

Hollo開発者のホン・ミンヒさんがかなり情熱を注いでおられて、個人的に注目しているプロジェクトです。

ぜひ、使ってみてくださいね。