進め方(全体像)
- Milestone 1: 基盤 & Postgres(StatefulSet+PVC、接続スモークテスト)
- Milestone 2: Dev-Portal用 DDL(
portal_fields)を ConfigMap+Job で適用 - Milestone 3: Dev-Portal API v0(Healthのみ)を K8s にデプロイ
- Milestone 4: Fields CRUD 実装(Swaggerで selection を登録/取得)
- 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.yaml:odoo/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 svcでpostgresが表示
問題があれば:
kubectl -n infra describe pod -l app=postgres
kubectl -n infra logs statefulset/postgres
次のマイルストーン(予告)
- Milestone 2: Dev-Portal 用の テーブルDDL(
portal_fields)を ConfigMap + Job で適用 - Milestone 3: Dev-Portal API v0(Healthのみ)をK8sにデプロイ
- Milestone 4: Fields CRUD(Swaggerでselection登録)
- Milestone 5: Odoo 18 をK8sにデプロイ(Ingressでアクセス)
コメントを残す