Controller Manager 由 kube-controller-manager 和 cloud-controller-manager 組成。 它通過 apiserver 監(jiān)控整個集群的狀態(tài)靠汁, 并確保集群處于預(yù)期的工作狀態(tài)童擎。
kube-controller-manager 由一系列的控制器組成 :
Replication Controller帐我、Node Controller、CronJob Controller子眶、Daemon Controller鹰溜、Deployment Controller、Endpoint Controller...等
cloud-controller-manager 在 Kubernetes 啟用 Cloud Provider 的時候才需要,也包括一系列的控制器:
Node Controller吞彤、Route Controller我衬、Service Controller
Pod控制器介紹:
1、Replication Controller
主要作用饰恕,控制有特定數(shù)量的Pod副本運行挠羔。若多余特定數(shù)量就kill,若少于特定數(shù)量則create埋嵌。Replication Controller 就像一個進程管理器破加,監(jiān)管著不同node上的多個pod,而不是單單監(jiān)控一個node上的pod,Replication Controller 會委派本地容器來啟動一些節(jié)點上服務(wù)。
注意:
1)Replication Controller只會對RestartPolicy = Always的Pod的生效(RestartPolicy的默認值就是Always)雹嗦,Replication Controller 不會去管理其他啟動策略pod拌喉。
2)Replication Controller永遠不會自己關(guān)閉。
2俐银、ReplicaSet
ReplicaSet和 Replication Controller的區(qū)別在于選擇器的支持尿背。Replication Controller只支持基于等式的selector(env=dev或environment!=qa),但ReplicaSet還支持新的捶惜,基于集合的selector(version in (v1.0, v2.0)或env notin (dev, qa))田藐。
3、Deployment
Deployment為Pod和Replica Set提供聲明式更新吱七。
使用流程Demo:
1)使用Deployment來創(chuàng)建ReplicaSet汽久。ReplicaSet在后臺創(chuàng)建pod。檢查啟動狀態(tài)(成功/失敗)
2)更新Deployment的PodTemplateSpec字段來聲明Pod的新狀態(tài)踊餐。這會創(chuàng)建一個新的ReplicaSet景醇,Deployment會按照控制的速率將pod從舊的ReplicaSet移動到新的ReplicaSet中。
3)如果當(dāng)前狀態(tài)不穩(wěn)定吝岭,回滾到之前的Deployment revision三痰。每次回滾都會更新Deployment的revision吧寺。
4)擴容Deployment以滿足更高的負載。
5)暫停Deployment來應(yīng)用PodTemplateSpec的多個修復(fù)散劫,然后恢復(fù)上線稚机。
6)根據(jù)Deployment 的狀態(tài)判斷上線是否成功。
7)清除舊的不必要的ReplicaSet获搏。
4赖条、StatefulSet
有狀態(tài)服務(wù)使用。
應(yīng)用場景:
1)穩(wěn)定的持久化存儲(Pod重新調(diào)度后還是能訪問到相同的持久化數(shù)據(jù)常熙,基于PVC來實現(xiàn))
2)穩(wěn)定的網(wǎng)絡(luò)標(biāo)志(Pod重新調(diào)度后其PodName和HostName不變纬乍,基于Headless Service(即沒有Cluster IP的Service)來實現(xiàn))
3)有序部署,有序擴展(Pod是有順序的裸卫,在部署或者擴展的時候要依據(jù)定義的順序依次依次進行(即從0到N-1仿贬,在下一個Pod運行之前所有之前的Pod必須都是Running和Ready狀態(tài)),基于init containers來實現(xiàn))
4)有序收縮彼城,有序刪除(即從N-1到0)
StatefulSet的組成:
1)Headless Service(網(wǎng)絡(luò)標(biāo)志(DNS domain))
2)volumeClaimTemplates(創(chuàng)建PersistentVolumes)
3)StatefulSet(定義具體應(yīng)用)
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為服務(wù)所在的namespace,Headless Servic和StatefulSet必須在相同的namespace
5)cluster.local為Cluster Domain
5募壕、DaemonSet
保證在每個Node上都運行一個容器副本调炬,常用來部署一些集群的日志、監(jiān)控或者其他系統(tǒng)管理應(yīng)用舱馅。
應(yīng)用場景:
1)日志收集(fluentd缰泡,logstash)
2)系統(tǒng)監(jiān)控(Prometheus Node Exporter,collectd代嗤,New Relic agent棘钞,Ganglia gmond)
3)系統(tǒng)程序(kube-proxy, kube-dns, glusterd, ceph)
例子:
1、Deployment
apiVersion: 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:
- name: filebeat
image: ikubernetes/filebeat:5.6.5-alpine
env:
- name: REDIS_HOST
value: redis.default.svc.cluster.local
- name: REDIS_LOG_LEVEL
value: info
3宜猜、StatefulSet
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: "nginx"
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: gcr.io/google_containers/nginx-slim:0.8
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
annotations:
volume.alpha.kubernetes.io/storage-class: anything
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
參考資料:
《每天5分鐘玩轉(zhuǎn)Kubernetes》
《黑馬k8s集群技術(shù)》