Odoo dev-portal first step

進め方(全体像)

  1. Milestone 1: 基盤 & Postgres(StatefulSet+PVC、接続スモークテスト)
  2. Milestone 2: Dev-Portal用 DDL(portal_fields)を ConfigMap+Job で適用
  3. Milestone 3: Dev-Portal API v0(Healthのみ)を K8s にデプロイ
  4. Milestone 4: Fields CRUD 実装(Swaggerで selection を登録/取得)
  5. Milestone 5: Odoo 18 を K8s にデプロイ(Ingress経由で到達)

今やること(Milestone 1)

# 作業したい親ディレクトリで実行
mkdir -p dev-portal-k8s/k8s/infra/postgres dev-portal-k8s/scripts

# Milestone 1 のファイルを空で作成
touch dev-portal-k8s/k8s/namespaces.yaml \
      dev-portal-k8s/k8s/infra/postgres/statefulset.yaml \
      dev-portal-k8s/k8s/infra/postgres/service.yaml \
      dev-portal-k8s/scripts/m1_apply.sh \
      dev-portal-k8s/scripts/m1_delete.sh

# スクリプトに実行権限(中身は後で入れます)
chmod +x dev-portal-k8s/scripts/m1_apply.sh dev-portal-k8s/scripts/m1_delete.sh

# (任意)中身を編集するためにVSCodeで開く
code dev-portal-k8s

Milestone 1 — Infra base & Postgres (Kubernetes)

目的: Kubernetes 上に基本の Namespaces と Postgres を立て、DB に接続できるところまで確認します。ここでは Odoo や Dev-Portal API はまだ載せません。


成果物(このマイルストーンで作るもの)

  • k8s/namespaces.yamlodoo / infra / dev の3名前空間
  • k8s/infra/postgres/statefulset.yaml:Postgres 16(PVC あり)
  • k8s/infra/postgres/service.yaml:ClusterIP サービス
  • scripts/m1_apply.sh:上記の一括適用+接続スモークテスト
  • scripts/m1_delete.sh:本マイルストーン分の削除

以降は WSL2 の Ubuntu ターミナルで、プロジェクト直下(dev-portal/)から実行してください。


1) ファイル群

k8s/namespaces.yaml

apiVersion: v1
kind: List
items:
- apiVersion: v1
  kind: Namespace
  metadata: { name: odoo }
- apiVersion: v1
  kind: Namespace
  metadata: { name: infra }
- apiVersion: v1
  kind: Namespace
  metadata: { name: dev }

k8s/infra/postgres/statefulset.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: postgres
  namespace: infra
spec:
  serviceName: postgres
  replicas: 1
  selector: { matchLabels: { app: postgres } }
  template:
    metadata: { labels: { app: postgres } }
    spec:
      containers:
      - name: db
        image: postgres:16
        ports: [{ name: pg, containerPort: 5432 }]
        env:
        - { name: POSTGRES_DB, value: devportal }
        - { name: POSTGRES_USER, value: dev }
        - { name: POSTGRES_PASSWORD, value: dev }
        volumeMounts:
        - { name: data, mountPath: /var/lib/postgresql/data }
  volumeClaimTemplates:
  - metadata: { name: data }
    spec:
      accessModes: ["ReadWriteOnce"]
      resources: { requests: { storage: 5Gi } }

k8s/infra/postgres/service.yaml

apiVersion: v1
kind: Service
metadata:
  name: postgres
  namespace: infra
spec:
  selector: { app: postgres }
  ports:
  - name: pg
    port: 5432
    targetPort: 5432
  type: ClusterIP

2) スクリプト

scripts/m1_apply.sh

#!/usr/bin/env bash
set -euo pipefail

# 1) 基本適用
kubectl apply -f k8s/namespaces.yaml
kubectl -n infra apply -f k8s/infra/postgres/statefulset.yaml
kubectl -n infra apply -f k8s/infra/postgres/service.yaml

# 2) 起動待ち
kubectl -n infra rollout status statefulset/postgres --timeout=120s

# 3) スモークテスト(psql で SELECT 1)
cat <<'YAML' | kubectl -n infra apply -f -
apiVersion: batch/v1
kind: Job
metadata:
  name: pg-smoke
spec:
  backoffLimit: 0
  template:
    spec:
      restartPolicy: Never
      containers:
      - name: psql
        image: postgres:16
        env:
        - name: PGPASSWORD
          value: dev
        command: ["bash","-lc"]
        args:
          - |
            set -e
            echo "SELECT 1;" | psql -h postgres.infra.svc.cluster.local -U dev -d devportal -t
YAML

# 4) 結果表示
kubectl -n infra logs job/pg-smoke -f || true
kubectl -n infra get pods,svc

scripts/m1_delete.sh

#!/usr/bin/env bash
set -euo pipefail
# 作成した Job を先に削除(存在しなくてもOK)
kubectl -n infra delete job pg-smoke --ignore-not-found
# Postgres サービス/StatefulSet を削除
kubectl -n infra delete -f k8s/infra/postgres/service.yaml --ignore-not-found
kubectl -n infra delete -f k8s/infra/postgres/statefulset.yaml --ignore-not-found
# ネームスペースは残します(次のマイルストーンで使うため)

: PVC(データ)は残ります。完全消去したいときは kubectl -n infra delete pvc -l app=postgres などで手動削除してください。


3) 実行手順

chmod +x scripts/m1_apply.sh scripts/m1_delete.sh
./scripts/m1_apply.sh

成功の目安

  • rollout status が完了
  • pg-smoke のログに 1 が出力(SELECT 1 の結果)
  • kubectl -n infra get svcpostgres が表示

問題があれば:

kubectl -n infra describe pod -l app=postgres
kubectl -n infra logs statefulset/postgres

次のマイルストーン(予告)

  • Milestone 2: Dev-Portal 用の テーブルDDLportal_fields)を ConfigMap + Job で適用
  • Milestone 3: Dev-Portal API v0(Healthのみ)をK8sにデプロイ
  • Milestone 4: Fields CRUD(Swaggerでselection登録)
  • Milestone 5: Odoo 18 をK8sにデプロイ(Ingressでアクセス)


Comments

コメントを残す

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