寫在前面的話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。