深入淺出 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 被廣泛使用的最主要原因。