您好,登錄后才能下訂單哦!
今天小編給大家分享的是ReplicaSet和StatefulSet控制器的詳細介紹,相信大部分人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,話不多說,一起往下看吧。
#一、常見Pod控制器及含義
###1、 ReplicaSets
ReplicaSet是下一代復本控制器。ReplicaSet和 Replication Controller之間的唯一區別是現在的選擇器支持。Replication Controller只支持基于等式的selector(env=dev或environment!=qa),但ReplicaSet還支持新的,基于集合的selector(version in (v1.0, v2.0)或env notin (dev, qa))。
大多數kubectl支持Replication Controller的命令也支持ReplicaSets。rolling-update命令有一個例外 。如果想要滾動更新功能,請考慮使用Deployments。此外, rolling-update命令是必須的,而Deployments是聲明式的,因此我們建議通過rollout命令使用Deployments。
雖然ReplicaSets可以獨立使用,但是今天它主要被 Deployments 作為協調pod創建,刪除和更新的機制。當使用Deployments時,不必擔心管理他們創建的ReplicaSets。Deployments擁有并管理其ReplicaSets。
###2、 Deployment
Deployment為Pod和Replica Set(下一代Replication Controller)提供聲明式更新。
你只需要在Deployment中描述你想要的目標狀態是什么,Deployment controller就會幫你將Pod和Replica Set的實際狀態改變到你的目標狀態。你可以定義一個全新的Deployment,也可以創建一個新的替換舊的Deployment。一個典型的用例如下:
1.使用Deployment來創建ReplicaSet。ReplicaSet在后臺創建pod。檢查啟動狀態,看它是成功還是失敗。
2.然后,通過更新Deployment的PodTemplateSpec字段來聲明Pod的新狀態。這會創建一個新的ReplicaSet,Deployment會按照控制的速率將pod從舊的ReplicaSet移動到新的ReplicaSet中。
3.如果當前狀態不穩定,回滾到之前的Deployment revision。每次回滾都會更新Deployment的revision。
4.擴容Deployment以滿足更高的負載。
5.暫停Deployment來應用PodTemplateSpec的多個修復,然后恢復上線。
6.根據Deployment 的狀態判斷上線是否hang住了。
7.清除舊的不必要的ReplicaSet。
###3、 StatefulSet
StatefulSet是為了解決有狀態服務的問題(對應Deployments和ReplicaSets是為無狀態服務而設計),其應用場景包括
1.穩定的持久化存儲,即Pod重新調度后還是能訪問到相同的持久化數據,基于PVC來實現
2.穩定的網絡標志,即Pod重新調度后其PodName和HostName不變,基于Headless Service(即沒有Cluster IP的Service)來實現
3.有序部署,有序擴展,即Pod是有順序的,在部署或者擴展的時候要依據定義的順序依次依次進行(即從0到N-1,在下一個Pod運行之前所有之前的Pod必須都是Running和Ready狀態),基于init containers來實現
4.有序收縮,有序刪除(即從N-1到0)從上面的應用場景可以發現,StatefulSet由以下幾個部分組成:
1.用于定義網絡標志(DNS domain)的Headless Service
2.用于創建PersistentVolumes的volumeClaimTemplates
3.定義具體應用的StatefulSetStatefulSet中每個Pod的DNS格式為statefulSetName-{0..N-1}.serviceName.namespace.svc.cluster.local,其中
1.serviceName為Headless Service的名字
2.0..N-1為Pod所在的序號,從0開始到N-1
3.statefulSetName為StatefulSet的名字
4.namespace為服務所在的namespace,Headless Servic和StatefulSet必須在相同的namespace
5.svc.cluster.local為Cluster Domain
###4、DaemonSet
DaemonSet保證在每個Node上都運行一個容器副本,常用來部署一些集群的日志、監控或者其他系統管理應用。典型的應用包括:
日志收集,比如fluentd,logstash等
系統監控,比如Prometheus Node Exporter,collectd,New Relic agent,Ganglia gmond等
系統程序,比如kube-proxy, kube-dns, glusterd, ceph等
#二、常用Pod控制器示例
###1、DeploymentapiVersion: apps/v1 kind: Deployment metadata: name: myapp-deploy spec: replicas: 5 selector: matchLabels: app: myapp release: canary template: metadata: labels: app: myapp release: canary spec: containers: - name: myapp image: ikubernetes/myapp:v2 ports: - name: httpd containerPort: 80
###2、Deployment + DaemonSet
apiVersion: apps/v1 kind: Deployment metadata: name: redis namespace: default spec: replicas: 1 selector: matchLabels: app: redis role: logstor template: metadata: labels: app: redis role: logstor spec: containers: - name: redis image: redis:4.0-alpine ports: - name: redis containerPort: 6379
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: filebeat-ds
spec:
selector:
matchLabels:
app: filebeat
release: stable
template:
metadata:
labels:
app: filebeat
release: stable
spec:
containers:
###3、StatefulSet
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: "nginx"
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
#三、Pod完整示例字段講解
apiVersion: v1 #必選,版本號,例如v1
kind: Pod #必選,Pod
metadata: #必選,元數據
name: string #必選,Pod名稱
namespace: string #必選,Pod所屬的命名空間
labels: #自定義標簽
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。