目錄
一、ReplicaSet
關鍵特性
示例
解釋
支持的 Operator
二、Deployment
1. 聲明式更新
示例
2. 滾動更新
示例
3. 回滾
示例
4. ReplicaSet 管理
示例
5. 自動恢復
示例
6. 擴展和縮容
示例
示例
一、ReplicaSet
ReplicaSet 是 Kubernetes 中的一個核心控制器,用于確保指定數量的 Pod 副本始終處于運行狀態。它的主要職責是維護一組穩定的 Pod 副本,確保在任何時候都有指定數量的 Pod 在運行。ReplicaSet 是 Kubernetes 中實現 Pod 水平擴展的基礎組件之一。
關鍵特性
-
副本管理:
-
ReplicaSet 的核心功能是確保指定數量的 Pod 副本始終在運行。你可以通過
replicas
字段指定期望的 Pod 副本數量。 -
如果實際運行的 Pod 數量少于預期,ReplicaSet 會自動創建新的 Pod。
-
如果實際運行的 Pod 數量多于預期,ReplicaSet 會自動刪除多余的 Pod。
-
-
標簽選擇器(Label Selector):
-
ReplicaSet 使用標簽選擇器來識別它管理的 Pod。只有那些與選擇器匹配的 Pod 才會被 ReplicaSet 管理。
-
標簽選擇器可以是簡單的等值匹配(
matchLabels
),也可以是更復雜的集合匹配(matchExpressions
)。
-
-
Pod 模板:
-
ReplicaSet 使用 Pod 模板來創建新的 Pod。Pod 模板定義了 Pod 的規格,包括容器鏡像、環境變量、卷等。
-
當 ReplicaSet 需要創建新的 Pod 時,它會根據 Pod 模板生成新的 Pod 實例。
-
-
自動恢復:
-
如果某個 Pod 意外終止(例如,節點故障或手動刪除),ReplicaSet 會自動創建一個新的 Pod 來替換它,以確保 Pod 副本數量始終符合預期。
-
-
手動管理:
-
ReplicaSet 通常不直接由用戶創建和管理,而是通過更高級的控制器(如 Deployment)來管理。用戶通常只需要與 Deployment 交互,Deployment 會自動創建和管理 ReplicaSet。
-
示例
以下是一個簡單的 ReplicaSet 定義示例:
apiVersion: apps/v1
kind: ReplicaSet
metadata:name: my-replicaset
spec:replicas: 3selector:matchLabels:app: my-apptemplate:metadata:labels:app: my-appspec:containers:- name: my-containerimage: nginx
在這個示例中:
-
replicas: 3
表示期望有 3 個 Pod 副本在運行。 -
selector
指定了 ReplicaSet 管理的 Pod 的標簽為app: my-app
。 -
template
定義了 Pod 的規格,包括容器鏡像nginx
以下是一個使用幾個匹配的ReplicaSet實例
apiVersion: apps/v1
kind: ReplicaSet
metadata:name: my-replicaset
spec:replicas: 3selector:matchExpressions:- key: appoperator: Invalues:- my-app- my-backup-app- key: environmentoperator: NotInvalues:- productiontemplate:metadata:labels:app: my-appenvironment: stagingspec:containers:- name: my-containerimage: nginx
解釋
-
selector.matchExpressions
:
- 這是集合匹配的核心部分,允許你定義多個標簽選擇規則。
- 每個規則由
key
、operator
和values
組成。
- 規則 1:
app
標簽:
key: app
:表示選擇標簽鍵為app
的 Pod。operator: In
:表示標簽值必須在values
列表中。values: [my-app, my-backup-app]
:表示選擇標簽值為my-app
或my-backup-app
的 Pod。
-
規則 2:
environment
標簽:
key: environment
:表示選擇標簽鍵為environment
的 Pod。operator: NotIn
:表示標簽值不能出現在values
列表中。values: [production]
:表示排除標簽值為production
的 Pod。
-
綜合效果:
-
這個 ReplicaSet 會選擇滿足以下條件的 Pod:
-
標簽
app
的值為my-app
或my-backup-app
。 -
標簽
environment
的值不為production
。
-
-
-
Pod 模板:
-
在
template
部分,定義了新創建的 Pod 的標簽為app: my-app
和environment: staging
。 -
這些標簽滿足 ReplicaSet 的選擇條件,因此這些 Pod 會被 ReplicaSet 管理。
-
支持的 Operator
在 matchExpressions
中,operator
可以取以下值:
-
In
:標簽值必須在values
列表中。 -
NotIn
:標簽值不能在values
列表中。 -
Exists
:標簽鍵必須存在(不需要指定values
)。 -
DoesNotExist
:標簽鍵必須不存在(不需要指定values
)。
二、Deployment
Deployment 是 Kubernetes 中用于管理無狀態應用的高級控制器。它基于 ReplicaSet 實現,提供了聲明式更新、滾動更新和回滾等功能。Deployment 是 Kubernetes 中最常用的控制器之一,特別適用于需要頻繁更新和擴展的應用場景。
1. 聲明式更新
Deployment 允許你通過聲明式的方式更新應用。你只需要修改 Deployment 的 YAML 文件(例如更新鏡像版本),然后使用 kubectl apply
命令應用更改,Deployment 會自動處理更新過程。
示例
假設你有一個 Deployment,運行的是 nginx:1.18
鏡像。現在你想將鏡像更新為 nginx:1.19
。
Deployment 定義文件 (deployment.yaml
):
apiVersion: apps/v1
kind: Deployment
metadata:name: my-deployment
spec:replicas: 3selector:matchLabels:app: my-apptemplate:metadata:labels:app: my-appspec:containers:- name: nginximage: nginx:1.18
更新步驟:
-
修改
deployment.yaml
文件,將image: nginx:1.18
改為image: nginx:1.19
。 -
使用
kubectl apply
應用更新:kubectl apply -f deployment.yaml
-
Deployment 會自動觸發更新流程,逐步替換舊的 Pod 為新的 Pod。
2. 滾動更新
Deployment 默認支持滾動更新策略,逐步替換舊的 Pod 副本為新的 Pod 副本,確保應用在更新過程中不會中斷。
示例
以下是一個配置了滾動更新策略的 Deployment:
apiVersion: apps/v1
kind: Deployment
metadata:name: my-deployment
spec:replicas: 3selector:matchLabels:app: my-apptemplate:metadata:labels:app: my-appspec:containers:- name: nginximage: nginx:1.19strategy:type: RollingUpdaterollingUpdate:maxUnavailable: 1 # 更新過程中最多允許 1 個 Pod 不可用maxSurge: 1 # 更新過程中最多允許超出預期副本數 1 個 Pod
更新過程:
-
Deployment 會先啟動一個新的 Pod,然后終止一個舊的 Pod,逐步替換所有 Pod。
-
通過
maxUnavailable
和maxSurge
,你可以控制更新的速度和可用性。
3. 回滾
如果更新過程中出現問題,Deployment 允許你回滾到之前的版本。
示例
假設你更新了 Deployment,但新版本的應用有問題,需要回滾到上一個版本。
回滾步驟:
-
查看 Deployment 的更新歷史:
kubectl rollout history deployment/my-deployment
輸出示例:
REVISION CHANGE-CAUSE 1 <none> 2 Update image to nginx:1.19
-
回滾到上一個版本:
kubectl rollout undo deployment/my-deployment
-
回滾到指定版本(例如回滾到 Revision 1):
kubectl rollout undo deployment/my-deployment --to-revision=1
4. ReplicaSet 管理
Deployment 通過創建和管理 ReplicaSet 來實現 Pod 的副本管理。每次更新 Pod 模板時,Deployment 都會創建一個新的 ReplicaSet,并逐步將舊的 ReplicaSet 縮容。
示例
假設你有一個 Deployment,初始版本使用 nginx:1.18
鏡像。
初始 Deployment:
apiVersion: apps/v1
kind: Deployment
metadata:name: my-deployment
spec:replicas: 3selector:matchLabels:app: my-apptemplate:metadata:labels:app: my-appspec:containers:- name: nginximage: nginx:1.18
更新 Deployment:
將鏡像更新為 nginx:1.19
后,Deployment 會創建一個新的 ReplicaSet,并逐步將舊的 ReplicaSet 縮容。
查看 ReplicaSet:
kubectl get replicaset
輸出示例:
NAME DESIRED CURRENT READY AGE
my-deployment-1234567890 3 3 3 5m # 新的 ReplicaSet
my-deployment-9876543210 0 0 0 10m # 舊的 ReplicaSet
5. 自動恢復
Deployment 會自動恢復意外終止的 Pod,以確保 Pod 副本數量始終符合預期。
示例
假設你有一個 Deployment,配置了 replicas: 3
。
手動刪除一個 Pod:
kubectl delete pod <pod-name>
Deployment 的行為:
-
Deployment 會檢測到 Pod 數量不足,并自動創建一個新的 Pod 來替換被刪除的 Pod。
6. 擴展和縮容
Deployment 支持動態擴展和縮容。你可以通過修改 replicas
字段來調整 Pod 的副本數量。
示例
假設你有一個 Deployment,初始副本數為 3。
擴展副本數:
-
修改
deployment.yaml
文件,將replicas: 3
改為replicas: 5
。 -
應用更新:
kubectl apply -f deployment.yaml
-
Deployment 會自動創建 2 個新的 Pod。
縮容副本數:
-
修改
deployment.yaml
文件,將replicas: 5
改為replicas: 2
。 -
應用更新:
kubectl apply -f deployment.yaml
-
Deployment 會自動刪除 3 個 Pod,只保留 2 個 Pod。
示例
以下是一個簡單的 Deployment 定義示例:
apiVersion: apps/v1
kind: Deployment
metadata:name: my-deployment
spec:replicas: 3selector:matchLabels:app: my-apptemplate:metadata:labels:app: my-appspec:containers:- name: my-containerimage: nginxstrategy:type: RollingUpdaterollingUpdate:maxUnavailable: 1maxSurge: 1
在這個示例中:
-
replicas: 3
表示期望有 3 個 Pod 副本在運行。 -
selector
指定了 Deployment 管理的 Pod 的標簽為app: my-app
。 -
template
定義了 Pod 的規格,包括容器鏡像nginx
。 -
strategy
配置了滾動更新策略,maxUnavailable: 1
表示在更新過程中最多允許 1 個 Pod 不可用,maxSurge: 1
表示在更新過程中最多允許超出預期副本數 1 個 Pod。