zoukankan      html  css  js  c++  java
  • k8s学习笔记之六:Pod控制器(kube-controller-manager)

    第一章、什么是kube-controller-manager?

    Controller Manager 由 kube-controller-manager 和 cloud-controller-manager 组成, 是Kubernetes 的大脑, 它通过 apiserver 监控整个集群的状态, 并确保集群处于预期的工作状态。

    kube-controller-manager 由一系列的控制器组成

    复制代码
     1 Replication Controller
     2 Node Controller
     3 CronJob Controller
     4 Daemon Controller
     5 Deployment Controller
     6 Endpoint Controller
     7 Garbage Collector
     8 Namespace Controller
     9 Job Controller
    10 Pod AutoScaler
    11 RelicaSet
    12 Service Controller
    13 ServiceAccount Controller
    14 StatefulSet Controller
    15 Volume Controller
    16 Resource quota Controller
    复制代码

    cloud-controller-manager 在 Kubernetes 启用 Cloud Provider 的时候才需要, 用来配合云服务提供商的控制, 也包括一系列的控制器, 如 

    1 Node Controller
    2 Route Controller
    3 Service Controller

    第二章、常见Pod控制器及含义

    Replication Controller

    Replication Controller 保证了在所有时间内,都有特定数量的Pod副本正在运行,如果太多了,Replication Controller就杀死几个,如果太少了,Replication Controller会新建几个,和直接创建的pod不同的是,Replication Controller会替换掉那些删除的或者被终止的pod,不管删除的原因是什么(维护阿,更新啊,Replication Controller都不关心)。基于这个理由,我们建议即使是只创建一个pod,我们也要使用Replication Controller。Replication Controller 就像一个进程管理器,监管着不同node上的多个pod,而不是单单监控一个node上的pod,Replication Controller 会委派本地容器来启动一些节点上服务(Kubelet ,Docker)。
    Replication Controller只会对那些RestartPolicy = Always的Pod的生效,(RestartPolicy的默认值就是Always),Replication Controller 不会去管理那些有不同启动策略pod
    Replication Controller永远不会自己关闭,但是,我们并不希望Replication Controller成为一个长久存在的服务。服务可能会有多个Pod组成,这些Pod又被多个Replication Controller控制着,我们希望Replication Controller 会在服务的生命周期中被删除和新建(例如在这些pod中发布一个更新),对于服务和用户来说,Replication Controller是通过一种无形的方式来维持着服务的状态

    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。

    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。
    复制代码

    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.定义具体应用的StatefulSet
    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,
    复制代码

    DaemonSet

    DaemonSet保证在每个Node上都运行一个容器副本,常用来部署一些集群的日志、监控或者其他系统管理应用。典型的应用包括:
    
    日志收集,比如fluentd,logstash等
    系统监控,比如Prometheus Node Exporter,collectd,New Relic agent,Ganglia gmond等
    系统程序,比如kube-proxy, kube-dns, glusterd, ceph等

     第三章、简单示例

    Deployment

    复制代码
    apiVersion: 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
    复制代码

    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
    复制代码

    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

    #spec.updateStrategy.rollingUpdate.partition #该参数可以控制statefulset的升级策略,可使用金丝雀和灰度发布的功能
    复制代码
    浪漫家园,没事就来逛逛
  • 相关阅读:
    Leetcode 349. Intersection of Two Arrays
    hdu 1016 Prime Ring Problem
    map 树木品种
    油田合并
    函数学习
    Leetcode 103. Binary Tree Zigzag Level Order Traversal
    Leetcode 102. Binary Tree Level Order Traversal
    Leetcode 101. Symmetric Tree
    poj 2524 Ubiquitous Religions(宗教信仰)
    pat 1009. 说反话 (20)
  • 原文地址:https://www.cnblogs.com/lovezbs/p/13172842.html
Copyright © 2011-2022 走看看