Milestone 5 — Odoo 18 を Kubernetes にデプロイ

(Ingress 経由で到達いまの構成(infra に Postgres、dev に API)を活かしつつ、odoo 名前空間に Odoo を載せます

以降、カレントは dev-portal-k8s/ 前提。ファイルは LF 改行で保存してください(VSCode右下が「LF」になっているか確認)。


Step 1) Odoo の設定ファイル(ConfigMap)

k8s/odoo/odoo-configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: odoo-config
  namespace: odoo
data:
  odoo.conf: |

[options]

; — DB 接続(infra の Postgres を利用)— db_host = postgres.infra.svc.cluster.local db_port = 5432 db_user = odoo db_password = odoo db_name = odoo ; — Ingress 経由での動作に必要 — proxy_mode = True ; — DEV向け(単一プロセス) — workers = 0 ; — 任意(DB管理画面で必要。開発だけで使う想定)— admin_passwd = admin

admin_passwd は開発用の簡易値です。チームで共有するなら Secret 化推奨。


Step 2) Odoo 用の DB/ユーザー作成 Job(Postgres 側)

k8s/infra/postgres/odoo-db-init-job.yaml

apiVersion: batch/v1
kind: Job
metadata:
  name: odoo-db-init
  namespace: infra
spec:
  backoffLimit: 0
  template:
    spec:
      restartPolicy: Never
      containers:
      - name: psql
        image: postgres:16
        env:
        - name: PGPASSWORD
          value: dev      # ← Milestone1で作成した POSTGRES_USER=dev のPW
        command: ["bash","-lc"]
        args:
          - |
            set -e
            PGHOST=postgres.infra.svc.cluster.local PGUSER=dev PGDATABASE=postgres

            # 1) ロール作成(存在しなければ)
            psql -h $PGHOST -U $PGUSER -d $PGDATABASE -tc "SELECT 1 FROM pg_roles WHERE rolname='odoo'" | grep -q 1 \
              || psql -h $PGHOST -U $PGUSER -d $PGDATABASE -c "CREATE ROLE odoo LOGIN PASSWORD 'odoo'"

            # 2) DB作成(存在しなければ)
            psql -h $PGHOST -U $PGUSER -d $PGDATABASE -tc "SELECT 1 FROM pg_database WHERE datname='odoo'" | grep -q 1 \
              || psql -h $PGHOST -U $PGUSER -d $PGDATABASE -c "CREATE DATABASE odoo OWNER odoo"

            # 3) よく使う拡張
            psql -h $PGHOST -U $PGUSER -d odoo -c "CREATE EXTENSION IF NOT EXISTS pg_trgm"
            psql -h $PGHOST -U $PGUSER -d odoo -c "CREATE EXTENSION IF NOT EXISTS unaccent"

dev ユーザーは Postgres の superuser(Milestone1)想定です。


Step 3) Odoo の永続化(PVC)

k8s/odoo/odoo-pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: odoo-data
  namespace: odoo
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  storageClassName: standard

Step 4) Odoo Deployment & Service

k8s/odoo/odoo-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: odoo
  namespace: odoo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: odoo
  template:
    metadata:
      labels:
        app: odoo
    spec:
      containers:
      - name: odoo
        image: odoo:18
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          containerPort: 8069
        readinessProbe:
          httpGet:
            path: /web
            port: http
          initialDelaySeconds: 20
          periodSeconds: 10
        livenessProbe:
          httpGet:
            path: /web
            port: http
          initialDelaySeconds: 40
          periodSeconds: 20
        volumeMounts:
        - name: config
          mountPath: /etc/odoo
        - name: data
          mountPath: /var/lib/odoo
      volumes:
      - name: config
        configMap:
          name: odoo-config
          items:
          - key: odoo.conf
            path: odoo.conf
      - name: data
        persistentVolumeClaim:
          claimName: odoo-data

k8s/odoo/odoo-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: odoo
  namespace: odoo
spec:
  selector:
    app: odoo
  ports:
  - name: http
    port: 8069
    targetPort: 8069
  type: ClusterIP

Step 5) Ingress(ホスト名: odoo.local

k8s/odoo/ingress-odoo.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: odoo
  namespace: odoo
spec:
  ingressClassName: nginx
  rules:
  - host: odoo.local
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: odoo
            port:
              number: 8069

すでに api.local を使っている構成と同じ流儀です。
hosts 編集がイヤなら api.local 同様に odoo.127.0.0.1.nip.io 版の Ingress を足す方法もあります(必要なら出します)。


Step 6) 適用手順(この順で)

# 1) 名前空間が無ければ作成(すでにあるならスキップOK)
kubectl apply -f - <<'YAML'
apiVersion: v1
kind: Namespace
metadata: { name: odoo }
YAML

# 2) Config, PVC
kubectl -n odoo apply -f k8s/odoo/odoo-configmap.yaml
kubectl -n odoo apply -f k8s/odoo/odoo-pvc.yaml

# 3) DB初期化(infra 側)
kubectl -n infra delete job odoo-db-init --ignore-not-found
kubectl -n infra apply -f k8s/infra/postgres/odoo-db-init-job.yaml
kubectl -n infra wait --for=condition=complete job/odoo-db-init --timeout=120s
kubectl -n infra logs job/odoo-db-init

# 4) Odoo本体
kubectl -n odoo apply -f k8s/odoo/odoo-deployment.yaml
kubectl -n odoo apply -f k8s/odoo/odoo-service.yaml
kubectl -n odoo apply -f k8s/odoo/ingress-odoo.yaml

# 5) 起動待ち
kubectl -n odoo rollout status deploy/odoo --timeout=180s

# 6) Ingress を 8080 にポートフォワード(別ターミナルで常駐)
kubectl -n ingress-nginx port-forward svc/ingress-nginx-controller 8080:80

Step 7) アクセス方法

A) hosts で odoo.local を 127.0.0.1 に向ける(Windows/WSL 両方)

  • Windows: 管理者権限で C:\Windows\System32\drivers\etc\hosts に追記 127.0.0.1 odoo.local
  • WSL(Ubuntu): /etc/hosts に追記 127.0.0.1 odoo.local

B) ブラウザで開く

http://odoo.local:8080/web

はじめての画面で「データベース作成」ページが出ることがあります。

  • 今回は既に odoo DB を作成済み&odoo.confdb_name=odoo を指定しています。
  • それでも DB 管理画面が出る場合は、画面上で Master Passwordadmin を入力 → 既存 odoo DB を選択 or 新規作成をしてください(開発用)。

トラブルシュート(詰まりやすい所)

  • 404/Nginx → Ingress 側。
    kubectl -n odoo get ingress odoo -o wide / kubectl -n odoo get endpoints odoo を確認。
  • Odoo Pod が Ready にならない
    kubectl -n odoo logs -l app=odoo --tail=200 を確認。DB 認証失敗なら odoo.conf の値と DB Job を再確認。
  • DB拡張でエラー
    kubectl -n infra logs job/odoo-db-init を確認。必要なら Job を再実行。
  • Windows から NodePort で直接アクセス不可
    開発中は 8080 port-forwardhosts=127.0.0.1に統一するのが楽です。

Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です