POD控制器(kube-controller-manager)

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集群技术》

你可能感兴趣的:(POD控制器(kube-controller-manager))