深入淺出 Kubernetes:淺談 Deployment 和 ReplicaSet

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章