【05】Kubernets:資源清單(控制器 - ReplicaSet)

寫在前面的話docker

 

從上一章節開始,咱們一直在學習關於自主式 Pod 的資源清單編寫, 可是自主式 Pod 存在着一個問題,就是和咱們直接 docker run 運行 docker 容器同樣。若是咱們想以集羣的形式並配合複雜的處理邏輯就不那麼好用了。api

針對這點,咱們將 Pod 的處理交給了控制器。app

 

 

關於控制器curl

 

再詳細講解控制器怎麼使用以前,咱們得知道控制器是啥,以及咱們須要使用哪些。ide

在講解 K8S 的 Master 組成的時候說過,Master 節點有個重要組件叫作 Controller Manager。學習

Controller Manager 由 kube-controller-manager 和 cloud-controller-manager 組成,是 K8S 的核心。測試

Cloud controller 通常在配合雲服務的時候再使用,因此不是咱們關心得重點。url

kube-controller-manager 由如下主要的控制器組成:spa

1. Replication Controller(已經廢棄)rest

2. Replicaset

3. Deployment Controller

4. DaemonSet Controller

5. Job / CronJob Controller

6. Volume Controller

7. StatefulSet Controller

8. Node Controller

9. Service Controller

10. 等等...

 

 

常見控制器說明

 

Replication Controller

保證了再特定時間內運行的副本數了,多退少補。而且不會去關注 pod 的狀態,只要你被刪除或者被終止,自動就把你替換掉。他就像一個進程管理器監管着多個節點的 pod。 

該控制器只對 restartPolicy 配置爲默認 Always 的生效,且控制器永遠不會本身關閉。但咱們更但願控制器是伴隨着服務的生命週期建立刪除,由於程序會更新。

 

ReplicaSet

新一代的副本控制器,屬於 Replication Controller 的升級版,區別在於新版本支持更爲高級的 selector。

包含 3 個關鍵點:用戶指望副本數,標籤選擇器,Pod 資源模板。

 

Deployment

調度 ReplicaSet 實現咱們的需求,官方也建議咱們使用 Deployment 替代 ReplicaSet。例如:

使用 Deployment 來建立 ReplicaSet,ReplicaSet 會在後臺啓動相關的 Pod 並檢測其狀態。

當咱們更新 Deployment 中定義的 Pod 狀態時,會新建 ReplicaSet 並根據配置的策略,讓 ReplicaSet 按照必定的規則來重建 Pod,實現切換。

 

StatefulSet

主要用於解決有狀態的服務的問題。後面會專門用到。

 

DaemonSet

保證每一個節點上都有運行一個副本,經常使用來做爲集羣日誌收集,監控。

 

 

Replicaset Controller 資源清單

 

對於 Replicaset Controller 的資源清單,咱們也能夠像查看 Pod 同樣查看:

kubectl explain rs

咱們能夠將 ReplicaSet 簡寫成爲 rs,就像以前咱們使用 service 簡寫成 svc 同樣。

在 ReplicaSet 中,前面提到了 3 個關鍵點:副本數,標籤選擇器,Pod 資源模板。其結果以下表:

rs
apiVersion     extensions/v1beta1
kind     ReplicaSet
metadata      
  name   rs 的名稱
  namespace   所屬命名空間
  labels   rs 的標籤
  annotations   rs 的說明
spec      
  replicas   副本數
  selector   標籤選擇器
    matchExpressions KV 列表
    matchLabels 標籤選擇鍵值對
  template   模板
    metadata Pod 的 metadata
    spec Pod 的 spec

至關於在 Pod 外面嵌套了一層,用來定義 rs 的相關信息,如副本數,標籤選擇器。例如(紅色部分就是 Pod 定義):

apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
  name: rs-demo
  namespace: default
  labels:
    app: rs
    release: stable
  annotations:
    ezops.cn/create-by: "Dylan"
spec:
  replicas: 3
  selector:
    matchLabels:
      app: erp
      release: stable
  template:
 metadata: name: rs-pod
      namespace: default
      labels:
        app: erp
        release: stable
      annotations:
        ezops.cn/create-by: "Dylan"
    spec:
      containers:
      - name: rs-container
        image: ikubernetes/myapp:v1
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          containerPort: 80
        - name: https
          containerPort: 443

建立查看:

kubectl create -f rs-demo.yaml
kubectl get rs -o wide

結果以下:

對於 ReplicaSet 有幾點須要咱們注意:

1. 標籤選擇器中的標籤在咱們的 Pod 中必須有知足條件的。

2. ReplicaSet 建立完成後再去刪除 Pod 會自動建立新的 Pod。

3. 修改集羣中其餘 Pod 的標籤,改成知足 ReplicaSet 中標籤選擇器定義的需求。ReplicaSet 會幹掉本身的 Pod,知道數量等於 replicas 定義的副本數。

4. 直接使用 edit 修改 ReplicaSet 的副本數量可以生效,可是修改鏡像須要 Pod 在重啓之後才能生效。

執行測試:

kubectl get pods
# 修改副本數爲 5
kubectl edit rs rs-demo
# 再度查看
kubectl get pods
# 修改鏡像版本爲 v2
kubectl edit rs rs-demo
# 查看
kubectl get rs -o wide
# 訪問查看
curl 10.1.2.4

結果如圖:

 

 

小結

 

我這裏準備將每一個點都單獨做爲一個獨立的章節記錄,ReplicaSet 其實在以後的不會用到,可是咱們須要理解原理,由於 Deployment 調度的其實就是 ReplicaSet。

相關文章
相關標籤/搜索