k8s集群架构


k8s管理容器方式

一、K8S功能

  1. 自我修复:一旦某一个容器崩溃,能够在1秒中左右迅速启动新的容器
  2. 弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整
  3. 服务发现:服务可以通过自动发现的形式找到它所依赖的服务
  4. 负载均衡:如果一个服务启动了多个容器,能够自动实现请求的负载均衡
  5. 版本回退:如果发现新发布的程序版本有问题,可以立即回退到原来的版本

二、master node(控制节点)

  1. API server
    资源操作的唯一入口,接受用户输入的命令,提供认证,授权、API注册和发现等机制

  2. scheduler(调度器)
    负责集群资源的调度,按照预定的调度策略将pod调度到相应的node节点上

  3. controller-manager
    负责维护集群的状态,比程序部署安排,故障检测,自动扩展,滚动更新等

  4. Etcd
    负责存储集群中各种资源对象的信息

二、worker node(工作节点)

  1. kubelet
    作用:管理本机的容器

  2. kube-proxy
    作用:负责提供集群内部的服务发现和负载均衡

  3. docker
    作用:负责节点上容器的各种操作

三、核心概念

  1. pod

    1. Pod 是 k8s 系统中可以创建和管理的最小单元.
    2. Pod 是由一个或多个容器(container) 组成
    3. k8s 不会直接处理容器,而是 Pod
    4. pod中的容器共享网络命名空间
  2. 控制器

控制器 作用
ReplicaSet 确保预期的Pod 副本数量
Deployment 无状态应用部署
StatefulSet 有状态应用部署
DaemonSet 确保所有Node 运行同一个Pod
Job 一次性任务
cronjob 定时任务
  1. service 服务
    将一组pod关联起来,提供一个统一的入口,即使pod地址发生改变,这个统一入口也不会发生改变,可以保证用户访问不受影响

  2. label 标签
    一组pod是一个统一的标签 service是通过标签和一组pod进行关联的

  3. namespace 名称空间
    为不同的业务提供不同的名称空间。进行隔离

总结

简单总结为以下几条

  1. etcd保存了整个集群的状态;
  2. apiserver提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;
  3. controller manager负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
  4. scheduler负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上;
  5. kubelet负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理;
  6. kube-proxy负责为Service提供cluster内部的服务发现和负载均衡;

K8S集群架构:

一个K8S集群是由两大部分组成:Master节点和Node节点

一.Master节点

主要包括API Server、Scheduler(调度器)、Controller manager、etcd几大组件

  1. API Server(提供其他模块之间的数据交互和通信的枢纽(其他模块通过API Server查询或修改数据,只有API Server才直接和etcd进行交互)Kubernetes 集群中,API Server 扮演着通信枢纽的位置。API Server 不仅负责和 etcd 交互(其他组件不会直接操作 etcd,只有 API Server 这么做),并切对外提供统一的API调用入口, 所有的交互都是以 API Server 为核心的。API Server 提供了以下的功能:

    • 整个集群管理的 API 接口:所有对集群进行的查询和管理都要通过 API 来进行。集群内部的组件(如kubelet)也是通过Apiserver更新和同步数据到etcd中。
    • 集群内部各个模块之间通信的枢纽:所有模块之前并不会之间互相调用,而是通过和 API Server 打交道来完成自己那部分的工作。
    • 集群安全控制:API Server 提供的验证和授权保证了整个集群的安全。
    • 数据中心枢纽: API Server 负责和 Etcd 交互存放集群用到的运行数据。
  2. Scheduler调度器(负责对集群内部的资源进行调度,相当于“调度室”。)
    Scheduler负责节点资源管理,接收来自kube-apiserver创建Pods的任务,收到任务后它会检索出所有符合该Pod要求的Node节点(通过预选策略和优选策略),开始执行Pod调度逻辑。调度成功后将Pod绑定到目标节点上。

  3. Controller manager
    controller-manager 作为 k8s 集群的管理控制中心,负责集群内 Node、Namespace、Service、Token、Replication 等资源对象的管理,使集群内的资源对象维持在预期的工作状态。
    每一个 controller 通过 api-server 提供的 restful 接口实时监控集群内每个资源对象的状态,当发生故障,导致资源对象的工作状态发生变化,就进行干预,尝试将资源对象从当前状态恢复为预期的工作状态,常见的 controller 有 Namespace Controller、Node Controller、Service Controller、ServiceAccount Controller、Token Controller、ResourceQuote Controller、Replication Controller等。

  4. Etcd
    etcd在kubernetes集群是用来存放数据并通知变动的。
    Kubernetes中没有用到数据库,它把关键数据都存放在etcd中,这使kubernetes的整体结构变得非常简单。在kubernetes中,数据是随时发生变化的,比如说用户提交了新任务、增加了新的Node、Node宕机了、容器死掉了等等,都会触发状态数据的变更。状态数据变更之后呢,Master上的kube-scheduler和kube-controller-manager,就会重新安排工作,它们的工作安排结果也是数据。这些变化,都需要及时地通知给每一个组件。etcd有一个特别好用的特性,可以调用它的api监听其中的数据,一旦数据发生变化了,就会收到通知。有了这个特性之后,kubernetes中的每个组件只需要监听etcd中数据,就可以知道自己应该做什么。kube-scheduler和kube-controller-manager呢,也只需要把最新的工作安排写入到etcd中就可以了,不用自己费心去逐个通知了

二.Node节点

主要包括kubelet、kube-proxy模块和pod对象

  1. Pod
    Pod是Kubernetes最基本的操作单元。一个Pod代表着集群中运行的一个进程,它内部封装了一个或多个紧密相关的容器。

  2. Kubelet
    运行在每个计算节点上

  3. kubelet 组件通过 api-server 提供的接口监测到 kube-scheduler 产生的 pod 绑定事件,然后从 etcd 获取 pod 清单,下载镜像并启动容器。

  4. 同时监视分配给该Node节点的 pods,周期性获取容器状态,再通过api-server通知各个组件。

  5. kube-proxy
    首先k8s 里所有资源都存在 etcd 中,各个组件通过 apiserver 的接口进行访问etcd来获取资源信息
    kube-proxy 会作为 daemon(守护进程) 跑在每个节点上通过watch的方式监控着etcd中关于Pod的最新状态信息,它一旦检查到一个Pod资源被删除了或新建或ip变化了等一系列变动,它就立即将这些变动,反应在iptables 或 ipvs规则中,以便之后 再有请求发到service时,service可以通过ipvs最新的规则将请求的分发到pod上

总结:kube-proxy和service的关系:
Kube-proxy负责制定数据包的转发策略,并以守护进程的模式对各个节点的pod信息实时监控并更新转发规则,service收到请求后会根据kube-proxy制定好的策略来进行请求的转发,从而实现负载均衡



文章作者: 千羽
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 千羽 !
评论
  目录