Basic - Creating a Deployment
什麼是 Deployment
在 Kubernetes 中,Deployment 是一種高層次的 API 資源,用於管理應用程式的部署和擴展。它提供了一種聲明式的方法來定義應用程式的所需狀態,並由 Kubernetes 控制平面自動執行所需的更改,確保集群中的實際狀態匹配所需狀態。
Deployment 的核心功能
- 管理 Pod 的生命週期
- Deployment 會管理基於 Pod 的應用程式,確保指定數量的 Pod 副本運行,並監控其健康狀態。
- 滾動更新與回滾
- 滾動更新:允許逐步更新應用程式,無需停機。
- 回滾:如果更新失敗,可以快速恢復到之前的穩定版本。
- 自動化擴展與縮減
- Deployment 支援透過 Horizontal Pod Autoscaler (HPA) 自動調整 Pod 的數量。
- 容錯恢復
- 如果某些 Pod 發生故障,Deployment 會自動重新創建或替換,確保應用程式的穩定運行。
實作一個 Deployment
定義並製作一個 Deployment
- 我們定義兩個 deployment,為了要讓這兩個 Pod 的版本個別擁有一個 Replica Set,這一就能自由實現自動縮放
deployment.yaml
# 定義第一個 Deployment,用於管理版本 v1 的應用
apiVersion: apps/v1 # API 版本,Deployment 使用的是 apps/v1 版本。
kind: Deployment # 資源類型為 Deployment,用於部署和管理 Pod。
metadata:
name: v1-deployment # Deployment 的名稱,唯一標識該資源。
labels:
type: demo-v1 # 自定義標籤,用於標識此 Deployment 為 demo-v1 類型。
spec:
replicas: 3 # 需要運行的 Pod 副本數量,設為 3。
selector: # 定義 Deployment 如何選擇管理的 Pod。
matchLabels:
type: demo-v1 # 匹配具有 `type: demo-v1` 標籤的 Pod。
template: # Pod 的模板,用於創建 Pod。
metadata:
labels:
type: demo-v1 # Pod 的標籤,需與 selector 的條件一致。
spec:
containers: # 定義 Pod 中的容器。
- name: v1 # 容器名稱,標識為 "v1"。
image: hello-world:v1.0.0 # 容器使用的映像,版本為 v1.0.0。
ports:
- containerPort: 8080 # 定義容器內部開放的服務端口。
---
# 定義第二個 Deployment,用於管理版本 v2 的應用
apiVersion: apps/v1
kind: Deployment
metadata:
name: v2-deployment # Deployment 的名稱,唯一標識該資源。
labels:
type: demo-v2 # 自定義標籤,用於標識此 Deployment 為 demo-v2 類型。
spec:
replicas: 2 # 需要運行的 Pod 副本數量,設為 2。
selector:
matchLabels:
type: demo-v2 # 匹配具有 `type: demo-v2` 標籤的 Pod。
template:
metadata:
labels:
type: demo-v2 # Pod 的標籤,需與 selector 的條件一致。
spec:
containers:
- name: v2 # 容器名稱,標識為 "v2"。
image: hello-world:v2.0.0 # 容器使用的映像,版本為 v2.0.0。
ports:
- containerPort: 8080
- 透過 kubectl 來執行他
kubectl.exe apply -f deployment.yaml
---
deployment.apps/v1-deployment created
deployment.apps/v2-deployment created
- 我們可以透過指令或是 dashboard 看見他們成功被創立,而且 pod 數量 v1 是 3 個,v2 是 2 個
kubectl.exe get all
---
NAME READY STATUS RESTARTS AGE
pod/v1-deployment-76f7b58999-544kx 1/1 Running 0 39s
pod/v1-deployment-76f7b58999-plxqm 1/1 Running 0 39s
pod/v1-deployment-76f7b58999-w9qsf 1/1 Running 0 39s
pod/v2-deployment-96fc9cb46-7h4f7 1/1 Running 0 39s
pod/v2-deployment-96fc9cb46-jjzpw 1/1 Running 0 39s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 86d
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/v1-deployment 3/3 3 3 39s
deployment.apps/v2-deployment 2/2 2 2 39s
NAME DESIRED CURRENT READY AGE
replicaset.apps/v1-deployment-76f7b58999 3 3 3 39s
replicaset.apps/v2-deployment-96fc9cb46 2 2 2 39s
