Files
awoooi/k8s/awoooi-prod/05-deployment-web.yaml
2026-07-01 16:06:24 +08:00

142 lines
4.2 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AWOOOI Frontend (Next.js) Deployment
# 負責人: CIO
# 版本: v1.1
# 日期: 2026-03-20
# 更新: 2026-03-28 - 新增 startupProbe + revisionHistoryLimit:3 (Phase K0.5/K0.7)
apiVersion: apps/v1
kind: Deployment
metadata:
name: awoooi-web
namespace: awoooi-prod
labels:
app: awoooi-web
system: awoooi
environment: prod
spec:
replicas: 2
revisionHistoryLimit: 3
selector:
matchLabels:
app: awoooi-web
environment: prod
system: awoooi
strategy:
type: RollingUpdate
rollingUpdate:
# 2026-06-13 Codex: no surge keeps topology spread honest during rollouts.
maxSurge: 0
maxUnavailable: 1
template:
metadata:
labels:
app: awoooi-web
system: awoooi
environment: prod
annotations:
awoooi.dev/topology-rebalance-generation: "2026-06-13T13:05:00+08:00"
spec:
# 2026-07-01 Codex: topology spread must not deadlock rollouts when the
# active prod placement has fewer eligible domains after reboot.
# Keep the skew preference, but allow scheduling so GitOps deploys can finish.
topologySpreadConstraints:
- maxSkew: 1
topologyKey: kubernetes.io/hostname
whenUnsatisfiable: ScheduleAnyway
labelSelector:
matchLabels:
app: awoooi-web
environment: prod
system: awoooi
containers:
- name: web
# 映像標籤由 CI/CD 動態注入 (格式: {sha}-{run_id})
# Harbor 金庫: 110 主機 (192.168.0.110:5000)
image: 192.168.0.110:5000/library/web:IMAGE_TAG_PLACEHOLDER
imagePullPolicy: Always
ports:
- containerPort: 3000
name: http
env:
- name: NODE_ENV
value: "production"
# 正式域名 (必須 https)
- name: NEXT_PUBLIC_API_URL
value: "https://awoooi.wooo.work"
# 2026-04-22 ogt: 移除前端硬碼 IP改由 K8s 注入
- name: NEXT_PUBLIC_HOST_IPS
value: "192.168.0.110,192.168.0.112,192.168.0.120,192.168.0.188"
- name: NEXT_PUBLIC_K8S_VIP_INFO
value: "VIP 192.168.0.125 · kubectl :6443 · Web :32335 · API :32334"
- name: SENTRY_HOST
value: "http://192.168.0.110:9000"
envFrom:
- configMapRef:
name: awoooi-config
# 2026-03-28: 加入 Secret 參考 (Sentry DSN 等)
- secretRef:
name: awoooi-secrets
resources:
requests:
cpu: "100m"
memory: "256Mi"
limits:
cpu: "500m"
memory: "512Mi"
livenessProbe:
httpGet:
# 2026-05-31 Codex: probe a cheap API route instead of the
# localized app shell. The shell can block on SSR/middleware
# during rollout and caused transient 502 + liveness restarts.
path: /api/health
port: 3000
initialDelaySeconds: 30
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3
readinessProbe:
httpGet:
path: /api/health
port: 3000
initialDelaySeconds: 5
periodSeconds: 5
timeoutSeconds: 3
failureThreshold: 3
# Phase K0.5: Startup Probe (允許最多 60 秒啟動時間)
startupProbe:
httpGet:
path: /api/health
port: 3000
initialDelaySeconds: 5
periodSeconds: 5
timeoutSeconds: 5
failureThreshold: 12
# 反親和性 - 分散到不同節點
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchLabels:
app: awoooi-web
topologyKey: kubernetes.io/hostname
---
apiVersion: v1
kind: Service
metadata:
name: awoooi-web-svc
namespace: awoooi-prod
labels:
app: awoooi-web
spec:
type: NodePort
selector:
app: awoooi-web
ports:
- port: 3000
targetPort: 3000
nodePort: 32335
name: http