Kubernetes Deployment:Overview

閱讀時間約 14 分鐘

什麼是 Kubernetes Deployment?

一樣先來個官網解說
Deployment provides declarative updates for Pods and ReplicaSets.
You describe a desired state in a Deployment, and the Deployment Controller changes the actual state to the desired state at a controlled rate. You can define Deployments to create new ReplicaSets, or to remove existing Deployments and adopt all their resources with new Deployments.
跟ReplicaSet不同,Deployment的工作主要是為 pod & replicaset 提供了一個宣告式的設定 & 更新方式,透過定義 desired status,Deployment controller 會在所謂的 controlled rate 下達到使用者所期望的狀態,這些機制是由 k8s 自動化完成,因此官方建議應該透過 Deployment 來佈署 pod & replicaset。

為什麼需要Deployment

因為Pod無法實現自我更新,必須砍掉重建後才會是新的內容,這樣會導致服務中斷,有了Deployment的出現,對Pod進行管理與版本控制,而在Deployment的背後使用Replicaset來確保指定數量的Pod運行,在更新方面,可根據指定的更新策略來控制版本更新。

Deployment是如何運作的

在k8s中,Pod是最小的資源單位,Pod的副本管理是透過Replicaset實現,而Deployment則是控制Replicaset,並不是直接對Pod進行管理。

甚麼時候使用Deployment

Deployment 在以下情況下適合使用:
  1. 應用程式的部署和管理:Deployment 提供了一個方便且可靠的方式來部署和管理應用程式。它允許您定義應用程式的配置,包括容器映像、資源需求、環境變數等,並確保指定數量的 Pod 在運行。
  2. 滾動更新和回滾:當需要對應用程式進行更新時,Deployment 提供了滾動更新的能力。它可以逐步部署新版本的應用程式,同時確保舊版本的 Pod 在新版本完全運行之前持續提供服務。如果新版本出現問題,Deployment 還允許回滾到先前的版本。
  3. 應用程式的擴展性和負載均衡:Deployment 允許指定應用程式的副本數,以根據需求自動擴展或收縮應用程式的副本數。這使得應用程式能夠彈性地應對流量的變化,確保高效的資源利用和良好的用戶體驗。
  4. 高可用性和容錯能力:Deployment 通過管理多個 Pod 的運行,提供了高可用性和容錯能力。如果某個 Pod 發生故障或需要進行維護,Deployment 會自動替換它,確保應用程式持續運行並提供無中斷的服務。
  5. 多環境部署:如果需要在不同的環境中部署應用程式(如開發、測試、正式),Deployment 提供了一致的部署方式,確保在不同環境中的應用程式配置和版本的一致性,簡化了部署和管理的流程。

Deployment有哪些特性

  1. 產生並管理 ReplicaSet:Deployment 可以自動創建和管理與其關聯的 ReplicaSet 物件。ReplicaSet 確保指定數量的 Pod 實例正在運行,並根據 Deployment 物件的配置來維護所需的 Pod 數量。
  2. 滾動更新和回滾:Deployment 提供了滾動更新的能力,使您能夠逐步將新版本的應用程式部署到生產環境中,同時確保舊版本的 Pod 在新版本完全運行之前持續提供服務。如果新版本出現問題,Deployment 還允許您輕鬆地回滾到先前的版本。
  3. 健康檢查和自我修復:Deployment 可以定期檢查 Pod 的健康狀態,並根據定義的健康檢查條件進行自我修復。如果 Pod 遇到故障或不符合健康檢查條件,Deployment 會自動替換該 Pod,以確保應用程式的高可用性。
  4. 部署策略:Deployment 允許您指定部署策略,例如最大並行部署數量、最大不可用 Pod 數量等。這些策略可用於控制部署的速度和可靠性,並減少對應用程式的影響。
  5. 環境變數和資源配置:Deployment 允許您在運行中的應用程式上動態配置環境變數和資源需求。這使得在不中斷服務的情況下,可以調整應用程式的配置,例如修改連接字串、調整內存和CPU的資源分配等。
  6. 多環境部署:Deployment 可以用於在不同環境(如開發、測試、生產)中部署應用程式,並提供一致的部署方式和管理能力。這使得在不同環境中保持應用程式配置和版本的一致性變得更容易。

如何使用Deployment

創建deployment

apiVersion: apps/v1                     # 定義api版本
kind: Deployment # 定義資源類型
metadata: # 定義元數據
name: nginx-deployment
labels:
app: nginx
spec:
strategy:
type: RollingUpdate # 更新策略
rollingUpdate:
maxUnavailable: 25% # 當更新時,無法使用的Pod佔整體Pod數量的比例
maxSurge: 25% # 當更新時,Pod可以超過desired status數量的比例
progressDeadlineSeconds: 600 # 部屬的最長等待時間,當超過則回報"failed progressing"
minReadySeconds: 0 # 服務部屬後準備到可接收流量的時間
revisionHistoryLimit: 10 # 可rollback的版本數
replicas: 3 # 副本數
selector: # 定義label selector
matchLabels:
app: nginx
template: # pod template
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
resources:
requests:
cpu: 200m
memory: 512Mi

查看Deployment

> kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 24m
> kubectl get deployments.apps -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
nginx-deployment 3/3 3 3 24m nginx nginx:1.8 app=nginx

更新Deployment

  • 更新image版本
> kubectl set image deployment nginx-deployment nginx=nginx:1.9
deployment.apps/nginx-deployment image updated
> kubectl get deployments.apps -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
nginx-deployment 3/3 1 3 37m nginx nginx:1.9 app=nginx
  • 查看更新狀態
> kubectl rollout status deployment nginx-deployment
deployment "nginx-deployment" successfully rolled out
  • 修改pod template
> kubectl edit deployment nginx-deployment

回退Deployment

  • 檢查Deployment的升級歷史紀錄
> kubectl rollout history deployment nginx-deployment
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
1 nginx:1.7.9
2 nginx:1.8
  • 查看特定版本的紀錄
> kubectl rollout history deployment nginx-deployment --revision=2
deployment.apps/nginx-deployment with revision #2
Pod Template:
Labels: app=nginx
pod-template-hash=58f44756c
Annotations: kubernetes.io/change-cause: nginx:1.8
Containers:
nginx:
Image: nginx:1.8
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
  • 回退到指定版本
> kubectl rollout undo deployment nginx-deployment --to-revision 1
deployment.apps/nginx-deployment rolled back

擴縮Deployment

  • 指定數量
> kubectl scale deployment nginx-deployment --replicas 2
deployment.apps/nginx-deployment scaled
  • 水平自動擴縮,根據當前Pod的CPU利用率當作擴縮依據
kubectl autoscale deployment nginx-deployment --max 5 --min 3 --cpu-percent 70
如果是使用minikube,得啟用metrics-server的addonminikube addons list ## 查看minikube的addon minikube addons enable metrics-server ## 啟用metrics-server的addon

暫停和恢復Deployment

> kubectl rollout pause deployment nginx-deployment
deployment.apps/nginx-deployment paused

> kubectl rollout resume deployment nginx-deployment
deployment.apps/nginx-deployment resumed
在暫停期間任意修改deployment都不會更新,暫停前的狀態將繼續它的功能

Deployment cheat sheet

Reference

即將進入廣告,捲動後可繼續閱讀
為什麼會看到廣告
17會員
83內容數
golang
留言0
查看全部
發表第一個留言支持創作者!
Alan的開發者天地 的其他內容
👨‍💻Intro 為了實現vscode在wsl環境下使用ssh連接到gce的需求,在爬文後找到一篇解法,因此記錄下來,方便日後查詢 🎯setup 建立ssh.bat檔案,並放在windows下任意位置 2. vscode設定ssh.bat路徑 打開vscode的settings -> exte
GitLab不僅是一個源代碼管理工具,它還提供了一個統一的平台,將開發、運營和安全等流程整合在一起。通過GitLab,可以在單一的應用程序中進行專案計劃、源代碼管理、分支控制、CI/CD等操作。不論角色為何,GitLab提供了一個統一的資訊來源,讓你輕鬆地管理和追蹤整個開發流程。它消除了工具鏈的複雜
什麼是Kubernetes Service? 先來個官網的解說 A Kubernetes Service is an abstraction which defines a logical set of Pods and a policy by which to access them. 白話文就是
Kubernetes是現代應用程序開發和部署的重要技術,而Pod是Kubernetes中最小的部署單位。Pod是一個或多個container的集合,它們共享一個網路命名空間和一個網路接口。Pod不僅提供了一個簡單而強大的container環境,還可以用於實現多種container編排方案,例如負載平
Intro👨‍💻 在gcp環境下使用ansible playbook 建立k8s cluster,目前base image為centos 7,安裝方式類似elk stack,一樣先等master安裝完後產生token,接著安裝slave。 使用的CRI為containerd,CNI為calico
標題:15 Best Practices when working with Docker 連結:15 Best Practices when working with Docker | by Ali Zeynalli | Dec, 2022 | Medium 本篇文章作者根據經驗以及自身研究整理出
👨‍💻Intro 為了實現vscode在wsl環境下使用ssh連接到gce的需求,在爬文後找到一篇解法,因此記錄下來,方便日後查詢 🎯setup 建立ssh.bat檔案,並放在windows下任意位置 2. vscode設定ssh.bat路徑 打開vscode的settings -> exte
GitLab不僅是一個源代碼管理工具,它還提供了一個統一的平台,將開發、運營和安全等流程整合在一起。通過GitLab,可以在單一的應用程序中進行專案計劃、源代碼管理、分支控制、CI/CD等操作。不論角色為何,GitLab提供了一個統一的資訊來源,讓你輕鬆地管理和追蹤整個開發流程。它消除了工具鏈的複雜
什麼是Kubernetes Service? 先來個官網的解說 A Kubernetes Service is an abstraction which defines a logical set of Pods and a policy by which to access them. 白話文就是
Kubernetes是現代應用程序開發和部署的重要技術,而Pod是Kubernetes中最小的部署單位。Pod是一個或多個container的集合,它們共享一個網路命名空間和一個網路接口。Pod不僅提供了一個簡單而強大的container環境,還可以用於實現多種container編排方案,例如負載平
Intro👨‍💻 在gcp環境下使用ansible playbook 建立k8s cluster,目前base image為centos 7,安裝方式類似elk stack,一樣先等master安裝完後產生token,接著安裝slave。 使用的CRI為containerd,CNI為calico
標題:15 Best Practices when working with Docker 連結:15 Best Practices when working with Docker | by Ali Zeynalli | Dec, 2022 | Medium 本篇文章作者根據經驗以及自身研究整理出
你可能也想看
Google News 追蹤
Thumbnail
本專欄將提供給您最新的市場資訊、產業研究、交易心法、精選公司介紹,以上內容並非個股分析,還請各位依據自身狀況作出交易決策。歡迎訂閱支持我,獲得相關內容,也祝您的投資之路順遂! 每年 $990 訂閱方案👉 https://reurl.cc/VNYVxZ 每月 $99 訂閱方案👉https://re
Thumbnail
Kubernetes是什麼? 1. Kubernetes是Google嚴格保密十幾年的秘密武器——Borg的一個開放原始碼版本。 2. Kubernetes是一個開放的開發平台。 3. Kubernetes是一個完備的分散式系統支撐平台。
Autoscaling 的目的是當有大量請求時,系統可以自動的增加運算資源,處理當下的大量請求;也可以根據當下資源使用率低時,自動降低運算資源,達到省錢的目的。
Thumbnail
本專欄將提供給您最新的市場資訊、產業研究、交易心法、精選公司介紹,以上內容並非個股分析,還請各位依據自身狀況作出交易決策。歡迎訂閱支持我,獲得相關內容,也祝您的投資之路順遂! 每年 $990 訂閱方案👉 https://reurl.cc/VNYVxZ 每月 $99 訂閱方案👉https://re
Thumbnail
Kubernetes是什麼? 1. Kubernetes是Google嚴格保密十幾年的秘密武器——Borg的一個開放原始碼版本。 2. Kubernetes是一個開放的開發平台。 3. Kubernetes是一個完備的分散式系統支撐平台。
Autoscaling 的目的是當有大量請求時,系統可以自動的增加運算資源,處理當下的大量請求;也可以根據當下資源使用率低時,自動降低運算資源,達到省錢的目的。