無狀態服務
無狀態服務是指服務的實例之間沒有持久化狀態,每個實例都是相同的,可以互換使用。
調度器
ReplicationController
簡稱 RC是 Kubernetes 早期版本中用來確保 Pod 副本始終運行的 API 對象。它通過監控 Pod 副本的數量,確保任何時候都有指定數量的 Pod 副本始終運行。即如果有容器異常退出,會自動創建新的 Pod 來替代;而異常多出來的容器也會自動回收。
確保健康 Pod 的數量、彈性伸縮、滾動升級以及應用多版本發布跟蹤等。
特點:
- 確保 Pod 副本始終運行。
- 可以進行滾動更新。
- 在較新版本的 Kubernetes 中,
ReplicaSet
已經取代了ReplicationController
。
示例
apiVersion: v1
kind: ReplicationController
metadata:name: my-replicationcontroller
spec:replicas: 3selector:app: myapptemplate:metadata:labels:app: myappspec:containers:- name: myapp-containerimage: myapp:1.0.0
ReplicaSet
RS,ReplicaSet
保證 Pod 的副本數不變,并且能夠處理 Pod 模板的更新。
特點:
- 與
ReplicationController
類似,但更通用。 - 支持基于集合的選擇器(如
key in (value1, value2)
)。 - 推薦用于替代
ReplicationController
。
示例
apiVersion: apps/v1
kind: ReplicaSet
metadata:name: my-replicaset
spec:replicas: 3selector:matchLabels:app: myapptemplate:metadata:labels:app: myappspec:containers:- name: myapp-containerimage: myapp:1.0.0
Deployment
Deployment
是一種更高級的 API 對象,用于聲明 Pod 和 ReplicaSet 的聲明周期管理。Deployment
控制器負責 Pod 副本的聲明式更新,可以自動替換 Pod 模板中的鏡像或其他定義。
API版本:apps/v1
特點:
- 提供應用的聲明式更新能力。
- 支持回滾和暫停更新。
- 可以查看 Deployment 的狀態,如更新進度、修訂版本等。
- 是管理無狀態應用的標準方式。
示例
apiVersion: apps/v1
kind: Deployment
metadata:name: my-deployment
spec:replicas: 3selector:matchLabels:app: myapptemplate:metadata:labels:app: myappspec:containers:- name: myapp-containerimage: myapp:1.0.0
比較
- 功能:
Deployment
提供了比ReplicaSet
和ReplicationController
更豐富的功能,如自動滾動更新、回滾等。 - 選擇器:
ReplicaSet
支持集合選擇器,而ReplicationController
只支持等值選擇器。 - 推薦使用:在新的 Kubernetes 應用中,推薦使用
Deployment
來管理無狀態應用的聲明周期,使用StatefulSet
來管理有狀態應用。
$ kubectl apply -f exampleDeploymentv1.yml --record
參數–record,這樣會把每次修改Deployment控制器時所使用的命令記錄到備注字段中,以便在查看Deployment控制器變更歷史或進行回滾時可以辨別每次修改的內容。
deployment的yaml模板
apiVersion: apps/v1
kind: Deployment
metadata:name: String #元數據,必填,Deployment控制器的名字namespace: String #元數據,Deployment控制器的命名空間labels: #元數據,標簽列表key: value #元數據,可定義多個標簽的鍵/值對annotations: #元數據,自定義注解列表key: value #元數據,可定義多個注解的鍵/值對
spec:selector:#必填,用于指定此Deployment控制器針對的Pod的標簽選擇器,需要與template中的標簽匹配matchLabels: #定義需要匹配的標簽集合key: value #需要匹配的標簽,可定義多個標簽的鍵/值對template: [PodTemplate] #必填,Pod模板,它與Pod具有完全相同的結構,不過它是嵌套的,#而且不需要帶apiVersion或kind字段replicas: int #指定所需Pod的數量,默認為1strategy: #更新時替換舊Pod的策略type: Recreate/RollingUpdate #Recreate表示所有現有的Pod都會在創建新的Pod之前被#終止,RollingUpdate表示以滾動更新方式更新PodrollingUpdate:maxSurge: int/int% #在滾動更新時,在所需數量的Pod上允許創建的最大Pod數,#這個數字也可以為百分比形式maxUnavailable: int/int% #在滾動更新時,同時存在最大不可用Pod數,#這個數字也可以為百分比形式progressDeadlineSeconds: int #Deployment控制器處于進行狀態時的等待秒數,超過這個時間將會變為失敗minReadySeconds: int #指定新創建的Pod應該在沒有任何容器崩潰的情況下準備好的最短秒數revisionHistoryLimit: int #指定要保留的允許回滾的舊ReplicaSet的數量paused: boolean #默認為false,用于暫停和恢復部署。當暫停部署時,#Pod模板中spec屬性的任何更改都不會觸發新的部署
Deployment控制器有兩種更新方式。
-
Recreate:所有現有的Pod都會在創建的Pod之前被終止;刪除舊的ReplicaSet控制器下的所有Pod,只保留舊的ReplicaSet控制器的定義,但不再投入使用
-
RollingUpdate:表示以滾動跟新方式更新Pod,并可以通過maxUnavailable和maxSurge參數控制滾動更新過程
- maxUnavailable:表示在更新過程中能夠進入不可用狀態的Pod的最大值或相對于總副本數的最大百分比
- maxSurge:表示能夠額外創建的Pod數或相對于總副本數的百分比。
更新的暫停與恢復
暫停與恢復的命令如下所示。
$ kubectl rollout pause deploy {Deployment名稱}
$ kubectl rollout resume deploy {Deployment名稱}
回滾
需要回滾到之前版本,則可以先使用以下命令查看歷史變更記錄。
$ kubectl rollout history deployment {Deployment名稱}
回滾命令
kubectl rollout undo deployment {Deployment名稱} --to-revision={revision編號}