iT邦幫忙

2025 iThome 鐵人賽

DAY 25
0

昨天我們完成應用的 容器化 (Dockerfile),今天要正式讓它在 Kubernetes 上跑起來
我們會完成以下幾件事:

  1. 把應用包裝成一個 Deployment
  2. 暴露它成為 Service
  3. ConfigMapSecret 提供設定與敏感資訊
  4. 在本機用 kubectl port-forwardminikube service 測試服務是否正常

一、Deployment:讓 Pod 自動維持穩定

我們的 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)。

二、Service:讓外界能打到你的 Pod

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
    

三、ConfigMap 與 Secret:讓設定與密碼分家

ConfigMap — 放非機密設定

# k8s/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: search-config
data:
  APP_ENV: "prod"
  DEFAULT_QUERY_LIMIT: "20"

Secret — 放敏感資料

# 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 加密、自動掛載

上一篇
Day 24 - 容器化:用多階段 Dockerfile 打造雲原生的第一步
下一篇
Day 26 - 資源治理:讓每個 Pod 吃得剛剛好
系列文
用 Golang + Elasticsearch + Kubernetes 打造雲原生搜尋服務26
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言