什么是Kubernetes(K8S)?

K8s是一个可移植的、用于自动化部署、扩展和管理容器化应用的开源容器编排技术。
K8s使部署和管理微服务架构应用程序变得很简单。它通过在集群之上形成一个抽象层来实现这一点,允许开发团队平滑地部署应用程序,而 K8s主要处理以下任务:

  • 控制和管理应用程序对资源的使用
  • 自动负载均衡应用程序的多个实例之间请求
  • 监控资源使用和资源限制,为了可以自动阻止应用消耗过多的资源并且可以再次恢复它们
  • 如果主机资源耗尽或主机死机,将应用程序实例从一台主机迁移到另一台主机是一个可行的选项
  • 当有新的主机加入集群时,新增加的额外资源可以被自动使用

Kubernetes(K8S)优势及特点

K8S优势

  • 自动装箱,水平扩展,自我修复
  • 服务发现和负载均衡
  • 自动发布和回滚
  • 集中化配置管理和密钥管理
  • 存储编排
  • 批处理:提供一次性任务,定时任务;满足批量数据处理和分析的场景

K8S 特点

  • 可移植 : 支持公有云,私有云,混合云,多重云(multi-cloud)
  • 可扩展 : 可根据业务流量情况快速扩展kubernetes集群的节点数量。
  • 自愈 : 自动发布,自动重启,自动复制,自动扩展
  • 进程协同 :利用复合应用保证应用和容器一对一的模型。

Kubernetes(K8S)集群架构与组件

集群架构 Shell Kubernetes集群包含有节点代理kubeletMaster组件(APIs, scheduler, etcd),一切都基于分布式的存储系统。 一个kubernetes集群主要是由 控制节点(master)、工作节点(node)构成,每个节点上都会安装不同的组件。

K8S架构图

大致工作原理

kubectl和web UI接入我们master节点后,scheduler调度器将任务交给api server, 通过api server 把任务写入 etcd 存储服务器,然后交给node节点执行 控制器,它们就是维护我们的副本的数目的或者叫做我们的期望值的,一旦它的副本数不满足我们的期望值,replication controller就会将它改写成 我们的期望值(创建或删除Pod数)

  • 控制节点Master

    K8S中的Master是集群控制节点,负责整个集群的管理和控制

    • ApiServer : 资源操作的唯一入口,接收用户输入的命令,提供认证、授权、API注册和发现等机制,其他模块通过API Server查询或修改数据,只有API Server才直接和etcd进行交互;d
    • Scheduler : 负责集群资源调度,通过API Server的Watch接口监听新建Pod副本信息,按照预定的调度策略将Pod调度到相应的node节点上;
    • ControllerManager : K8S里所有资源对象的自动化控制中心,通过 api-server 提供的 restful 接口实时监控集群内每个资源对象的状态,发生故障时,导致资源对象的工作状态发生变化,就进行干预,尝试将资源对象从当前状态恢复为预期的工作状态,常见的 controller 有 Namespace Controller、Node Controller、Service Controller、ServiceAccount Controller、Token Controller、ResourceQuote Controller、Replication Controller等;
    • Etcd : 是Kubernetes的存储状态的数据库(所有master的持续状态都存在etcd的一个实例中)
  • 工作节点Node

    Node是K8S集群中的工作负载节点,每个Node都会被Master分配一些工作负载,当某个Node宕机时,其上的工作负载会被Master自动转移到其他节点上

    • Kubelet : 负责维护容器的生命周期,即通过控制docker,控制Pod 的创建、启动、监控、重启、销毁等工作,处理Master节点下发到本节点的任务;
    • KubeProxy : 负责制定数据包的转发策略,并以守护进程的模式对各个节点的pod信息实时监控并更新转发规则,service收到请求后会根据kube-proxy制定好的策略来进行请求的转发,从而实现负载均衡,总的来说,负责为Service提供cluster内部的服务发现和负载均衡;
    • Docker : 负责节点上容器的各种操作;
  • 其他组件

    学习kubernetes的核心,就是学习如何对集群上的Pod、Pod控制器、Service、存储等各种资源进行操作

    • Pod: kubernetes的最小控制单元,容器都是运行在pod中的,一个pod中可以有1个或者多个容器
    • Controller: 控制器,通过它来实现对pod的管理,比如启动pod、停止pod、伸缩pod的数量等等
    • Service: pod对外服务的统一入口,下面可以维护者同一类的多个pod
    • Label: 标签,用于对pod进行分类,同一类pod会拥有相同的标签
    • NameSpace: 命名空间,用来隔离pod的运行环境

kubernetes在集群启动之后,会默认创建几个namespace:default、kube-node-lease、kube-public、kube-system。默认情况下,kubernetes集群中的所有的Pod都是可以相互访问的,但是在实际中,可能不想让两个Pod之间进行互相的访问,那此时就可以将两个Pod划分到不同的namespace下。kubernetes通过将集群内部的资源分配到不同的Namespace中,可以形成逻辑上的"组",以方便不同的组的资源进行隔离使用和管理。