1. 应用程序部署方式演变
    1. 传统部署:互联网早期,会直接将应用程序部署在物理机上
      1. 不能为应用程序定义资源使用边界,很难合理分配计算机资源,而且程序之间容易产生影响
    2. 虚拟化部署:可以在一台物理机上运行多个虚拟机
      1. 增加了操作系统,浪费部分资源
    3. 容器化部署:与虚拟化类似,但是共享操作系统
      1. 可以保证每个容器拥有自己的文件系统、CPU、内存、进程空间 运行应用程序所需要的资源被容器封装,并和底层架构解耦 容器化的应用程序可以跨云服务商、跨linux操作系统发现版进行部署
      2. 某个容器宕机,怎么自动让另一个容器去替补
      3. 并发量大的时候,容器数量怎么水平扩容
      4. 针对这些容器管理编排问题,大量的编排工具也随之诞生,最著名的就是kubernetes
  2. Features(功能)
    1. 自我修复
      1. 某个容器坏掉,能够迅速启动新的容器,保证高可用
    2. 弹性伸缩
      1. 自动根据服务器压力调整集群容器运行的数量
    3. 服务发现
      1. 可以通过服务发现找到依赖的服务
    4. 负载均衡
      1. 当一个应用启动了多个容器,能够自动实现负载均衡
    5. 版本回退
      1. 新发布的应用有问题时,可以立即回退到上一个安全的版本
    6. 存储编排
      1. 可以根据容器自身的需求自动创建存储卷
  3. Component(组件)
    1. 控制节点(master)
      1. APIServer
        1. 资源操作的唯一入口,接收用户输入的命令,提供认证、授权、API注册和发现等机制
      2. Scheduler
        1. 负责集群资源调度,按照预定的调度策略将pod调度到相应的node节点上,一个k8s集群有很多个node节点,master就是通过scheduler进行一系列算法,最终觉决定要在哪个node节点上创建pod
      3. Controller-Manager
        1. 负责维护集群的状态,比如程序部署、故障迁移、自动扩展、滚动更新,当一个node节点挂掉后,容器的迁移都是由Controller-Manager来操作
      4. Etcd
        1. 负责存储集群中各种资源对象的信息,集群中有多少个node、多少个master、哪个容器运行在哪个node节点等待各种集群信息都是存储在Etcd中
    2. 工作节点(node)
      1. Kubelet
        1. 负责维护容器的生命周期,调用docker来创建、更新、删除容器
      2. KubeProxy
        1. 负责提供集群内部的服务发现和负载均衡,容器运行后肯定是要对外提供访问了,KubeProxy就是将容器对外暴露,让外界能够访问到
      3. Docker
        1. 负责节点上容器的各种操作
    3. Run Nginx Demo
      1. K8S启动之后,master和node的信息都会被存储到etcd
      2. 发送一个nginx安装请求,首先到达master的apiService
      3. apiService调用scheduler,scheduler从etcd拿到当前的node节点信息,通过一些列的算法计算,最终告知apiService服务要被安装在哪个node上
      4. apiService调用controller-manager调度node做实际的nginx服务的安装
      5. Kubelet接收到安装指令,告知nginx启动一个pod,容器跑于pod之中
      6. nginx服务启动成功之后,外界通过kubeProxy去代理访问pod中的容器服务
      7. Master
      8. Node
    4. 集群的控制平面,负责集群的决策
    5. 集群的数据平面,负责为容器提供运行环境
  4. Concepts(概念)
    1. Master
      1. 集群控制节点,每个集群至少一个master节点负责集群的管理
    2. Node
      1. 工作负载节点,由master分配容器到这些node工作节点上,然后node节点上的docker负责创建容器
    3. Pod
      1. kubernetes最小的控制单元,容器都是运行在pod中的,一个pod中可以有1个或多个容器
    4. Controller
      1. 控制器,通过它来实现对pod的管理,启动、停止、伸缩
    5. Service
      1. pod对外服务的统一入口,下面可以维护者同类的多个pod
    6. Label
      1. 应用于对pod进行分类,同一类的pod拥有相同的标签,service也是根据标签来判断一组pod
    7. Namespace
      1. 命名空间,用来隔离pod的运行环境,一个namespace命令空间下的容器是无法与另一个namespace下的容器进行通讯
  5. Cluster Construction(集群搭建)
    1. 类型
      1. 一主多从
        1. 一台master节点和多台node节点
        2. 有单机故障风险
      2. 多主多从
        1. 多台master节点和多台node节点
        2. 安全性高,适合用于生产环境
  6. kubernetes的本质是一组服务器集群,它开源在集群的每个节点上运行特定的程序,来对节点中的容器进行管理,它的目的就是实现资源管理的自动化