深入淺出 Kubernetes:淺談 Deployment 和 ReplicaSet
一 背景
Deployment 和 ReplicaSet 是 Kubernetes 中兩個比較重要的對象,本文簡單地討論了他們之間的一些區別與聯繫。
二 Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-gysl
spec:
replicas: 2
selector:
matchLabels:
app-1: nginx
app-2: busybox
template:
metadata:
labels:
app-1: nginx
app-2: busybox
spec:
containers:
- name: app-1
image: nginx:1.16.0
imagePullPolicy: Always
ports:
- containerPort: 80
- containerPort: 8080
- name: app-2
image: busybox
imagePullPolicy: Never
command: ['/bin/sh', '-c']
args:
- while :;do sleep 20;done
這是一個編排得非常簡單的 Deployment,確保攜帶 app-1=nginx 和 app-2=busybox 標籤的 Pod 的個數等於 spec.replicas 指定的總數 2 個。也就是說在這個 Deployment 的 Pod 數量大等於2時,就會有 Pod 被刪除,反之則會有 Pod 被創建。
這個 Deployment 由2個部分構成,例子中的 yaml 第1-10行定義了 Deployment 控制器,第10行以後的內容則定義了被控制的 Pod ,template 後面這一部分我們會發現跟之前的 Pod 定義大同小異。
此處順便提一條命令(更新 Deployment 的鏡像):
kubectl set image deployment/deployment-gysl app-1=nginx:latest
這個命令還可以更新以下對象:
env Update environment variables on a pod template
image 更新一個 pod template 的鏡像
resources 在對象的 pod templates 上更新資源的 requests/limits
selector 設置 resource 的 selector
serviceaccount Update ServiceAccount of a resource
subject Update User, Group or ServiceAccount in a RoleBinding/ClusterRoleBinding
三 ReplicaSet
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: replica-set-gysl
spec:
selector:
matchLabels:
app: nginx
replicas: 2
template:
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
一個 ReplicaSet 對象就是由副本數目的定義和一個 Pod 模板組成的, 它的定義就是 Deployment 的一個子集。Deployment 控制器實際操縱的是 ReplicaSet 對象,而不是 Pod 對象。
ReplicaSet 負責通過“控制器模式”,保證系統中 Pod 的個數永遠等於指定的個數(比如,3 個)。這也正是 Deployment 只允許容器的 restartPolicy=Always 的主要原因:只有在容器能保證自己始終是 Running 狀態的前提下,ReplicaSet 調整 Pod 的個數纔有意義。
Deployment 通過“控制器模式”,來操作 ReplicaSet 的個數和屬性,進而實現“水平擴展 / 收縮”和“滾動更新”這兩個編排動作。
四 其他
在之前的文章中已經討論過 Kubernetes 中的滾動更新,這是 Deployment 控制器與 ReplicaSet 的最大不同之處,也是 Deployment 被廣泛使用的最主要原因。