深入淺出 Kubernetes:淺談 Deployment 和 ReplicaSet
- 2019 年 10 月 4 日
- 筆記
版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/solaraceboy/article/details/98883311
文章目錄
深入淺出 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 的個數永遠等於指定的個數(比如,2 個)。這也正是 Deployment 只允許容器的 restartPolicy=Always 的主要原因:只有在容器能保證自己始終是 Running 狀態的前提下,ReplicaSet 調整 Pod 的個數才有意義。
Deployment 通過「控制器模式」,來操作 ReplicaSet 的個數和屬性,進而實現「水平擴展 / 收縮」和「滾動更新」這兩個編排動作。
四 其他
在之前的文章中已經討論過 Kubernetes 中的滾動更新,這是 Deployment 控制器與 ReplicaSet 的最大不同之處,也是 Deployment 被廣泛使用的最主要原因。