Controller Manager 由 kube-controller-manager 和 cloud-controller-manager 组成。 它通过 apiserver 监控整个集群的状态, 并确保集群处于预期的工作状态。
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
主要作用,控制有特定数量的Pod副本运行。若多余特定数量就kill,若少于特定数量则create。Replication Controller 就像一个进程管理器,监管着不同node上的多个pod,而不是单单监控一个node上的pod,Replication Controller 会委派本地容器来启动一些节点上服务。
注意:
1)Replication Controller只会对RestartPolicy = Always的Pod的生效(RestartPolicy的默认值就是Always),Replication Controller 不会去管理其他启动策略pod。
2)Replication Controller永远不会自己关闭。
2、ReplicaSet
ReplicaSet和 Replication Controller的区别在于选择器的支持。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来创建ReplicaSet。ReplicaSet在后台创建pod。检查启动状态(成功/失败)
2)更新Deployment的PodTemplateSpec字段来声明Pod的新状态。这会创建一个新的ReplicaSet,Deployment会按照控制的速率将pod从旧的ReplicaSet移动到新的ReplicaSet中。
3)如果当前状态不稳定,回滚到之前的Deployment revision。每次回滚都会更新Deployment的revision。
4)扩容Deployment以满足更高的负载。
5)暂停Deployment来应用PodTemplateSpec的多个修复,然后恢复上线。
6)根据Deployment 的状态判断上线是否成功。
7)清除旧的不必要的ReplicaSet。
4、StatefulSet
有状态服务使用。
应用场景:
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)Headless Service(网络标志(DNS domain))
2)volumeClaimTemplates(创建PersistentVolumes)
3)StatefulSet(定义具体应用)
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)cluster.local为Cluster Domain
5、DaemonSet
保证在每个Node上都运行一个容器副本,常用来部署一些集群的日志、监控或者其他系统管理应用。
应用场景:
1)日志收集(fluentd,logstash)
2)系统监控(Prometheus Node Exporter,collectd,New Relic agent,Ganglia gmond)
3)系统程序(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分钟玩转Kubernetes》
《黑马k8s集群技术》