Google Code Prettify

2020年1月28日 星期二

K8s: ReplicaSet

Kubernetes 管理 Pod 的方式是透過 ReplicationController 或 ReplicaSet,不是直接管理 Pod,ReplicaSet 是後來才有的資源,最終會完全取代 ReplicationController,也就是說 ReplicationController 在不久後的版本就會被棄用,所以這裡只整理 ReplicaSet 相關說明。

在「K8s: cluster (hostname & IP)」中,有使用到如下的指令擴容 pod host 成 3 個,並交給讓 ReplicaSet 管理。
kubectl scale rs host --replicas=3
在「部署 RESTful service 到 Kubernetes」中更有使用到如下的 yaml 直接由 image 創立 3 個 pod 交給 ReplicaSet 管理,這裡針對 yaml 做個說明。
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: host
spec:
  replicas: 3
  selector:
    matchLabels:
      app: host
  template:
    metadata:
      labels:
        app: host
    spec:
      containers:
      - name: host
        image: twleader/host
  1. 第 2 行指出要建立的資源是 ReplicaSet
  2. 第 4 行指出 ReplicaSet 的名稱為 host
  3. 第 6 行表示會產生 3 個 pod
  4. ReplicaSet 管理 pod 的方式是透過 label,第 7~9 行指出當 pod 有 app=host 的 label 時,就納入這個 rs host 管理。
  5. 第 10 行 template 以下,說明了要創建 pos,包括第 12~13 行指出每個 pod 會有 label "app=host",第 14~17 行則指出,pod 是由 image twleader/host 產生,並且 pod 的名稱為 host。
ReplicaSet 怎麼管理 pod ? 如下:

也就是說,只要有納入 rs 管理的 pod,當 pod 因為各種原因被判定為已經停止運轉,rs 會重新啟動 pod,但是如果是 pod 被刪除,則 rs 會創立一個新的 pod。下面要開始來實驗看看 …
我把 pod、rs 都刪光了,所以現在什麼都沒有 …
kubectl create -f host-rs.yaml
使用上面的 yaml 創立一個命名為 host 的 rs,及三個命名為 host-xxxxx 的 pod 交給這個 rs 管理,特別注意,這三個 pod 都有 Label "app=host"。
現在我們要刪除一個 pod,看看 rs 有什麼反應?
如上,我刪除了 pod host-dfsrc,rs 立刻又建立了一個新的 pod host-tft2x。如果我把 pod 的 label 改掉呢?
kubectl label pods host-678mg "app=hostX" --overwrite
我改掉了 po host-678mg 裡的 label 讓它變成 "app=hostX",因為 rs host 管理的是 label "app=host" 的 pod,ReplicaSet 偵測到符合的 pod 只剩兩個,所以又創建了一個 po host-c492q。
這個時候因為 pod host-678mg 沒有被任何 ReplicaSet 管理,它的存續與否不會被偵測管理。上面實驗證實了,當實際的 pod 少於預期時,ReplicaSet 會創立新的 pod,那麼,如果 pod 超過預期呢? ReplicaSet 真的會將它減少為 3 個嗎?
如上,我們觀察到了,當我把 host-678mg 的 label 改回 "app=host",ReplicaSet 偵測到符合條件的 pod 有四個,比預期的多一個,這時候就從已存在的四個中排一個刪除。上面我的刪除後查詢的太快,顯示出要被刪除的 pod 狀態為 Terminating,重新查詢後,才真的只剩 3 個。

最後,我們可以用以下指令查詢 rs 的詳細說明:
kubectl describe rs

實驗做完了,我們想刪除 rs 及所有的 pod,只要刪除 rs 即可,rs 所管理的 pod 會被一併刪除。

沒有留言:

張貼留言