一通り、M6が終わってから
環境変数ファイル(ConfigMap/Secret)が無い前提で、OpenAI実呼び出し版を動かす最短手順を”全部ここ”にまとめます。
(※ いまは portal_fields に書き戻す実装のまま。集約テーブル版は後で差し替えます)
0) 前提確認(コード側)
api/app/services/i18n.pyを “OpenAI呼び出し版” に置き換え済み(先ほどの実装)。
要 env:OPENAI_API_KEY(必須)、OPENAI_TRANSLATE_MODEL/OPENAI_TRANSLATE_TEMPERATURE/OPENAI_TRANSLATE_TIMEOUT(任意)api/requirements.txtにopenai>=1.0.0を追加済み
1) Secret/ConfigMap を今ここで作る(YAML不要の一発コマンド)
1-1. Secret(APIキー)— 必ず Secret に
# 入力プロンプトで安全に入力
kubectl -n dev create secret generic openai-api --from-literal=OPENAI_API_KEY="$(read -s -p 'OpenAI API Key: ' k; echo $k)"
※ 既にある場合は kubectl -n dev delete secret openai-api 後に再作成。
1-2. ConfigMap(任意のチューニング値)
kubectl -n dev create configmap dev-portal-i18n-config \
--from-literal=OPENAI_TRANSLATE_MODEL=gpt-4o-mini \
--from-literal=OPENAI_TRANSLATE_TEMPERATURE=0.2 \
--from-literal=OPENAI_TRANSLATE_TIMEOUT=30
※ 既にある場合は kubectl -n dev delete configmap dev-portal-i18n-config 後に再作成。
※ 既存の dev-portal-config を使いたければ、そこへ追加でもOK(ここでは分離しています)。
2) Deployment に環境変数を渡す(マニフェスト編集不要のCLI方式)
# デプロイ名と最初のコンテナ名を取得
DEPLOY=$(kubectl -n dev get deploy -o jsonpath='{.items[0].metadata.name}')
CN=$(kubectl -n dev get deploy $DEPLOY -o jsonpath='{.spec.template.spec.containers[0].name}')
# Secret から環境変数注入
kubectl -n dev set env deploy/$DEPLOY --from=secret/openai-api
# ConfigMap から環境変数注入(任意)
kubectl -n dev set env deploy/$DEPLOY --from=configmap/dev-portal-i18n-config
すでに env を大量に持っている場合でも上記は上書き/追加してくれます。
マニフェストに固定したい場合は、env:へvalueFrom.secretKeyRef/configMapKeyRefを追記してください。
3) 画像ビルド&ロールアウト(OpenAIライブラリを入れた新タグ)
# Minikube の Docker を使用
eval $(minikube -p dev32 docker-env)
# api ディレクトリでビルド(Dockerfile は api/ にある想定)
cd /home/kenji/test_k8s/project_portal/dev-portal-k8s/dev-portal-k8s/api
DOCKER_BUILDKIT=0 docker build -t dev-portal-api:v9 .
# 反映
kubectl -n dev set image deploy/$DEPLOY $CN=dev-portal-api:v9
kubectl -n dev rollout status deploy/$DEPLOY
4) Pod 内に env が入っているかワンチェック(任意)
POD=$(kubectl -n dev get po -l app=$DEPLOY -o jsonpath='{.items[0].metadata.name}')
kubectl -n dev exec -it $POD -c $CN -- /bin/sh -lc 'env | grep -E "OPENAI_|OPENAI_API_KEY"'
OPENAI_API_KEY=...(値はマスクされませんが Pod 内確認なのでOK)などが見えればOK。
5) 動作確認(まずは dry-run で差分のみ)
# ポートフォワード(必要なら)
kubectl -n ingress-nginx port-forward svc/ingress-nginx-controller 8080:80 \
> /tmp/pf_ingress.log 2>&1 & echo $! > /tmp/pf_ingress.pid
# 翻訳プレビュー(書き込み無し)
curl -s -X POST \
"http://api.local:8080/fields/translate?target=en_US&only_missing=true&limit=10&dry_run=true" | jq .
preview_samples[].diff.*.after に英訳が入っていれば OpenAI 呼び出し成功です。
問題なければ dry_run=false で反映。
失敗時の定番チェック
- 401/Unauthorized → APIキーが不正。Secret を作り直し、Deployment に再注入してロールアウト。
- タイムアウト/接続不可 → クラスタから外部へ出られるか(ネット/プロキシ)を確認。
- Rate limit →
limitを小さめに、またはservices/i18n.pyの_sleep_every/_sleep_secsを強めに。
参考:YAMLで管理したい場合(あとでGit管理に移す用)
- Secret(openai-api.yaml)
apiVersion: v1
kind: Secret
metadata:
name: openai-api
namespace: dev
type: Opaque
stringData:
OPENAI_API_KEY: "sk-xxx_your_key_here"
- ConfigMap(dev-portal-i18n-config.yaml)
apiVersion: v1
kind: ConfigMap
metadata:
name: dev-portal-i18n-config
namespace: dev
data:
OPENAI_TRANSLATE_MODEL: "gpt-4o-mini"
OPENAI_TRANSLATE_TEMPERATURE: "0.2"
OPENAI_TRANSLATE_TIMEOUT: "30"
- Deployment への追加(抜粋)
spec:
template:
spec:
containers:
- name: <CN>
envFrom:
- secretRef:
name: openai-api
- configMapRef:
name: dev-portal-i18n-config
コメントを残す