昨天我們完成應用的 容器化 (Dockerfile),今天要正式讓它在 Kubernetes 上跑起來。
我們會完成以下幾件事:
kubectl port-forward
或 minikube service
測試服務是否正常我們的 app 是單一服務(search-service),一開始可以先用最基本的 Deployment。
# k8s/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: search-deploy
spec:
replicas: 2
selector:
matchLabels:
app: search
template:
metadata:
labels:
app: search
spec:
containers:
- name: search
image: shirley/search:day25
ports:
- containerPort: 8080
env:
- name: PORT
value: "8080"
💡重點:
replicas: 2
:即使有 Pod 掛掉,K8s 也會自動重建。selector
+labels
:一定要對應起來,不然會「孤兒 Pod」。- image 記得要 push 到 registry(例如 Docker Hub)。
Deployment 管的是 生命週期,
Service 管的是 流量進出與負載分配。
# k8s/service.yaml
apiVersion: v1
kind: Service
metadata:
name: search-svc
spec:
type: ClusterIP
selector:
app: search
ports:
- port: 80
targetPort: 8080
說明:
type: ClusterIP
:叢內服務使用。如果你要本機測試,可以先用
kubectl port-forward
。kubectl port-forward svc/search-svc 8080:80 curl http://localhost:8080/search?q=golang
# k8s/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: search-config
data:
APP_ENV: "prod"
DEFAULT_QUERY_LIMIT: "20"
# k8s/secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: search-secret
type: Opaque
stringData:
ES_USER: "elastic"
ES_PASS: "changeme"
然後在 Deployment 引用:
# deployment.yaml (部分)
envFrom:
- configMapRef:
name: search-config
- secretRef:
name: search-secret
好處:
- 不需要重新 build image 就能改設定。
- Secret 自動 base64 編碼存放。
把所有 YAML 套用:
kubectl apply -f k8s/configmap.yaml
kubectl apply -f k8s/secret.yaml
kubectl apply -f k8s/deployment.yaml
kubectl apply -f k8s/service.yaml
確認運作:
kubectl get pods
kubectl get svc
再用 port-forward 測試:
kubectl port-forward svc/search-svc 8080:80
curl localhost:8080/health
類型 | 功能 | 關鍵概念 |
---|---|---|
Deployment | 控制 Pod 的版本與副本 | 滾動更新、自動重建 |
Service | 負責流量分配與尋址 | selector + port 對應 |
ConfigMap | 保存一般設定 | 方便環境切換 |
Secret | 保存敏感資訊 | base64 加密、自動掛載 |