iT邦幫忙

2025 iThome 鐵人賽

DAY 13
0
Cloud Native

駕馭商用容器叢集,汪洋漂流術系列 第 13

【Day 13】 Deployment 和 雖然被棄坑但也需要了解的 DeploymentConfig

  • 分享至 

  • xImage
  •  

前言

  • 〖重磅!慟!!〗在 OCP 4.14 之後,Red Hat 將 DeploymentConfig 標記為即將淘汰的 Workload。 以前搞出 DeploymentConfig 是為了解決 Deployment 缺少的功能。 但隨著 K8s 原生 Deployment 已經成熟,為了減少重複功能,且讓 OCP 與上游的 K8s 一致,因此之後會建議讓 DeploymentConfig 改成 Deployment
  • 另外,不能因為這東西未來被放棄,就不了解,因為還是有很高機會會遇到,歷史包袱到處都有!!
  • 雖然在本系列 【Day 5】 從文件了解 K8s 的基本 Workload 及使用場景 有略提到 Deployment,但尚未特別拿出來和 OCP 的慣用做法進行比較。 在對於 OCP 的操作有初步認識後,來看一下 K8s/OCP 支援的 Deployment 和 OCP 特有的 DeploymentConfig

名詞

Deployment

Deployment Controller

DeploymentConfig

類別 特點 說明
觸發機制 (Triggers) Image TriggerConfig TriggerManual Trigger - 當 ImageStream 裡的 image 有新版本,會自動觸發 DC rollout。- DeploymentConfig 內容(env/config 變更)會觸發新的 rollout。- 也可手動 oc rollout latest 觸發更新。
與 ImageStream/BuildConfig 整合 ✅ 與 OCP CI/CD 深度整合 - 可自動監聽 BuildConfig → ImageStream 的輸出,並自動更新 Deployment。- 形成「Build → ImageStream → DeploymentConfig」流水線。
回滾 (Rollback) ✅ 可回滾到指定版本 - 使用 oc rollout undo dc/<name> 回滾到先前版本。
版本歷史管理 ✅ 自動保留多個版本 - DC 會保留歷史記錄,可隨時檢查 rollout 狀態。
Replica 管理 ✅ 使用 ReplicationController (RC)(而不是 ReplicaSet) - 與 K8s Deployment 使用的 ReplicaSet 不同,DC 使用 RC 來維持副本數量。
更新策略 支援 Rolling、Recreate - 與 Deployment 相似,但滾動更新常與 Trigger 結合使用。
命令與操作 oc rollout latest dc/<name> oc rollout undo dc/<name> oc set triggers dc/<name> - 提供額外 oc 指令,專門控制 DeploymentConfig 的 rollout 與觸發行為。

(原) K8s & OCP Deployment 比較表

項目 Kubernetes Deployment OpenShift Deployment (OCP)
基本定義 K8s 提供的控制器,用於管理 Pod 副本數量滾動更新回滾等。 OCP 內建支援 K8s Deployment,但也提供 DeploymentConfig (DC) 作為進階功能。
主要 API apps/v1Deployment apps/v1Deployment(相容 K8s)apps.openshift.io/v1DeploymentConfig(OCP 特有)
觸發更新方式 主要靠 滾動更新策略 (rolling update strategy),或手動 kubectl rollout restart 除了滾動更新策略外,DeploymentConfig 可透過 Trigger 機制(image 變更、自動程式碼變更、Config 變更)自動觸發更新。
內建 CI/CD 整合 無內建 CI/CD,需搭配 ArgoCD、Jenkins、Tekton 等外部工具。 DeploymentConfig 可與 OCP BuildConfig、ImageStream 整合,做到自動化 CI/CD。
回滾 (Rollback) kubectl rollout undo 可回滾到上一個版本。 oc rollout undo 同樣支援回滾,但 DeploymentConfig 提供更細粒度的 rollback(例如 image trigger rollback)。
資源管理 使用 ReplicaSet 管理 Pod 副本。 Deployment → 使用 ReplicaSet;DeploymentConfig → 使用 ReplicationController (RC)
鏡像更新 須手動更新 YAML 或使用外部工具監控 Registry。 ImageStream 可自動偵測新版本 image 並觸發 DeploymentConfig 部署。
適用場景 標準 Kubernetes 環境,偏向基礎功能。 需要與 CI/CD、Image Registry 深度整合,或利用 OCP 生態系(BuildConfig、ImageStream)的場景。

淘汰 DeploymentConfig

  • 未來一陣子都可以預期得到,要把 OCP特有種 DeploymentConfig 改成 K8s原生種 Deployment,先用下表格來評估差異吧。
項目 DeploymentConfig (DC) Deployment (K8s/OCP) 遷移影響
副本管理 使用 ReplicationController 使用 ReplicaSet 自動轉換,無需手動干預
更新策略 Rolling / Recreate Rolling / Recreate 幾乎一致,可直接對應
觸發機制 ✅ 支援 ImageStream Trigger ✅ 支援 Config Trigger ❌ 無內建 trigger,需用外部工具 最大差異
與 CI/CD 整合 OCP BuildConfig + ImageStream → 自動 rollout 需搭配 Tekton、ArgoCD、Webhook 需改接新工具
命令操作 oc rollout latest dc/<name> oc rollout restart deploy/<name> 操作習慣需調整
回滾 oc rollout undo dc/<name> kubectl/oc rollout undo deploy/<name> 幾乎一致

小結

  • 二分法判斷能不能修改?
    • 如果只是一般 K8s 相容部署 → 可以改回去 用 Deployment。
    • 如果需要用到跟 OCP BuildConfig、ImageStream 整合,自動化 CI/CD只能繼續使用 DeploymentConfig
  • 現在 OCP 已經提供更完整的 Pipelines (Tekton)、ArgoCD (GitOps),這些比 DC 更強大、彈性。
  • Red Hat 承諾 DC 還會「支援」(不會馬上消失),但只修 安全性與重大錯誤,不再投入新功能。

轉換方式說明

  1. 清查現有 DC,確認哪些 DC 有使用 ImageStream trigger、哪些是 手動觸發。
    oc get dc -A
    
  2. 建立等價 Deployment YAML
    • 把 DC 裡的 spec.template(Pod 模板部分)搬到 Deployment。
    • 設定 replicas、strategy 等保持一致。
  3. 範例 / 原 DC
    apiVersion: apps.openshift.io/v1
    kind: DeploymentConfig
    metadata:
      name: myapp
    spec:
      replicas: 3
      strategy:
        type: Rolling
      template:
        spec:
          containers:
          - name: myapp
            image: image-registry.openshift-image-registry.svc:5000/myproj/myapp:latest
    
    
  4. 範例 / 修成 Deployment
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: myapp
    spec:
      replicas: 3
      strategy:
        type: RollingUpdate
      selector:
        matchLabels:
          app: myapp
      template:
        metadata:
          labels:
            app: myapp
        spec:
          containers:
          - name: myapp
            image: image-registry.openshift-image-registry.svc:5000/myproj/myapp:latest
    
    
  5. 另外處理 ImageStream / BuildConfig
    • 原本很潮的串接 CI/CD,現在要替換成別種...
    • DC 的 image trigger 要改由外部工具處理:
      • Tekton Pipeline:監聽 Build 完成 → 更新 Deployment YAML → Apply
      • ArgoCD (GitOps):監聽 Git Repo → 同步到 Deployment
      • Webhook:由 Image Registry 推送通知 → oc rollout restart
    • 簡單替代方案(短期):手動 oc rollout restart deploy/<name>
  6. 測試部署
    部署新的 Deployment,觀察行為
    oc apply -f myapp-deployment.yaml
    oc rollout status deploy/myapp
    
  7. 切換流量
    • 先同時部署新 Deployment 與舊 DeploymentConfig。
    • 切換 Service / Route 指到新的 Deployment Pod。
    • 確認穩定後,刪除舊的 DeploymentConfig。

結論

  • 棄坑真的很阿雜,不過既然原生 K8s 都有了,那棄坑合理啦。

上一篇
【Day 12】 實戰篇 - 憑證快要過期了 (下) / 挖出 TLS / CA
下一篇
【Day 14】 Cert Manager / 懶人必學自動更新憑證
系列文
駕馭商用容器叢集,汪洋漂流術15
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言