在上一篇文章中,我們介紹了 Kubernetes 中的 CNI 網路插件(Calico、Flannel、Cilium),並討論了不同網路模型的差異與應用。今天,我們將進一步探討 多環境部署 的實務需求,特別是 如何隔離 Dev、Staging、Prod,並以 Kubernetes 的工具(Namespace、ConfigMap、Kustomize)來展示一個實作範例。這篇文章的目標是讓你在日常開發到正式上線的過程中,能夠清楚地劃分環境,避免「一個指令誤刪正式環境」的悲劇。
在 DevOps 流程中,常見的環境分層如下:
Dev(開發環境)
Staging(測試/驗證環境)
Prod(正式環境)
不同 Cluster
kubectl config use-context
切換,避免誤操作。main → Prod
develop → Dev
release/* → Staging
values-dev.yaml / values-staging.yaml / values-prod.yaml
建立三個 namespace:
kubectl create namespace dev
kubectl create namespace staging
kubectl create namespace prod
設定 RBAC 權限,避免開發者對 Prod 有過多操作權限。
不同環境的 API endpoint:
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
namespace: dev
data:
API_URL: "http://dev.api.local"
---
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
namespace: prod
data:
API_URL: "https://api.prod.com"
資料夾結構
my-app/
├── base/
│ ├── deployment.yaml
│ └── service.yaml
└── overlays/
├── dev/
│ └── kustomization.yaml
├── staging/
│ └── kustomization.yaml
└── prod/
└── kustomization.yaml
base/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 2
template:
spec:
containers:
- name: my-app
image: my-app:latest
env:
- name: API_URL
value: "http://default"
overlays/dev/kustomization.yaml
bases:
- ../../base
patchesStrategicMerge:
- dev-env.yaml
overlays/dev/dev-env.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
template:
spec:
containers:
- name: my-app
env:
- name: API_URL
value: "http://dev.api.local"
overlays/prod/prod-env.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 5
template:
spec:
containers:
- name: my-app
env:
- name: API_URL
value: "https://api.prod.com"
部署指令
kubectl apply -k overlays/dev
kubectl apply -k overlays/staging
kubectl apply -k overlays/prod
小結
在下一篇文章中,我們將延伸探討 ConfigMap 的細節與實務應用,並示範如何更有效率地管理設定檔。