(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
はじめての画面で「データベース作成」ページが出ることがあります。
- 今回は既に
odooDB を作成済み&odoo.confでdb_name=odooを指定しています。- それでも DB 管理画面が出る場合は、画面上で Master Password に
adminを入力 → 既存odooDB を選択 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-forward+hosts=127.0.0.1に統一するのが楽です。
コメントを残す