Kubernetes系列第1篇-架构及组件介绍

33次阅读

共计 3758 个字符,预计需要花费 10 分钟才能阅读完成。

1. Kubernetes 简介

Kubernetes 是谷歌开源的容器集群管理系统,是 Google 多年大规模容器管理技术 Borg 的开源版本,主要功能包括:

  • 基于容器的应用部署、维护和滚动升级
  • 负载均衡和服务发现
  • 跨机器和跨地区的集群调度
  • 自动伸缩
  • 无状态服务和有状态服务
  • 广泛的 Volume 支持
  • 插件机制保证扩展性

Kubernetes 发展非常迅速,已经成为容器编排领域的领导者。

2. Kubernetes 架构及组件介绍

2.1 kubernetes 架构

Kubernetes 架构如图所示:

Kubernetes 主要由以下几个核心组件构成:

  • etcd 保存整个集群的状态;
  • apiserver 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API 注册和发现等机制;
  • controller manager 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
  • scheduler 负责资源的调度,按照预定的调度策略将实例(Pod)调度到相应的主机上;
  • kubelet 负责维护容器的生命周期,同时也负责存储卷和网络的管理;
  • container runtime 负责镜像管理以及容器的真正执行,在我们系统中指的是 Docker
  • kube-proxy 负责为应用提供集群内部的服务发现和负载均衡

推荐的插件

  • helm – kubernetes 包管理工具
  • kube-dns/coreDNS 负责为整个集群提供 DNS 服务
  • Ingress Controller 为服务提供外网入口
  • Heapster 提供资源监控
  • Dashboard 提供 GUI
  • Federation 提供跨可用区的集群
  • Fluentd-elasticsearch 提供集群日志采集、存储与查询

2.2 Kubernetes 组件介绍

2.2.1 etcd

etcd 是基于 Raft 一致性算法开发的分布式 key-value 存储,可用于服务发现、共享配置以及一致性保障(如数据库选主、分布式锁等)

etcd 主要功能:

  • 基本的 key-value 存储
  • 监听机制
  • key 的过期及续约机制,用于监控和服务发现
  • 原子 CAS 和 CAD,用于分布式锁和 leader 选举

Etcd 基于 RAFT 的一致性

leader 节点选举方法

  • 初始启动时,节点处于 follower 状态并被设定一个 election timeout,如果在这一时间周期内没有收到来自 leader 的心跳检测,节点将发起选举,将自己切换为 candidate(候选人)节点之后,向集群中的其他 follow 节点发送请求,询问其是否选举自己为 leader
  • 当收到来自集群中过半数节点的接受投票后,节点即成为 leader,开始接收保存 client 的数据并向其他的 follower 节点同步日志。如果没有达成一致,则 candidate 节点随机选择一个等待时间(150ms ~ 300ms)再次发起投票,得到集群中半数以上的 follower 接受的 candidate 将成为 leader
  • leader 节点依靠定时向 follower 节点发送心跳检测来保持其地位
  • 任何时候如果其他 follower 在 election timeout 期间没有收到来自 leader 的心跳检测,同样会将自己的状态切换为 candidate 并发起选举。每成功选举一次,新 leader 的步进数(Term)都会比之前 leader 的步进数加 1

失效处理

  • leader 失效:其他没有收到心跳检测的节点将发起新的选举,当 leader 恢复后由于步进数小自动成为 follower(日志会被新 leader 的日志覆盖)
  • follower 节点不可用:follower 节点不可用的情况相对比较容易解决。因为集群中的日志内容始终是从 leader 节点同步,只要这一节点再次加入集群时重新从 leader 节点处复制日志即可
  • 多个候选人(candidate):冲突后 candidate 将随机选择一个等待时间(150ms ~ 300ms)再次发起投票,得到集群中半数以上的 follower 接受的 candidate 将成为 leader

讲到这里可能有同学发现 Etcd 和 Zookeeper、Consul 等一致性协议实现框架有些类似,的确这些中间件是比较类似的,关于其中的异同点,大家可以自行查阅资料。

2.2.2 kube-apiserver

kube-apiserver 是 Kubernetes 最重要的核心组件之一,主要提供了如下功能:

  • 提供集群管理的 REST API 接口,包括认证授权、数据校验以及集群状态变更等
  • 提供同其他模块之间的数据交互 (其他模块通过 API Server 查询或修改数据,只有 API Server 才直接操作 etcd)

2.2.3 kube-scheduler

kube-scheduler 负责分配调度 Pod 到集群内的节点上,它监听 kube-apiserver,查询还未分配 Node 的 Pod,然后根据调度策略为这些 Pod 分配节点

通过以下三种方式可以指定 Pod 只运行在特定的 Node 节点上

  • nodeSelector: 只调度到匹配指定 label 的 Node 上
  • nodeAffinity: 功能更丰富的 Node 选择器,比如支持集合操作
  • podAffinity: 调度到满足条件的 Pod 所在的 Node 上

2.2.4 kube-controller-manager

kube-controller-manager 是 Kubernetes 的大脑,通过 kube-apiserver 监控整个集群的状态,并确保集群处于预期的工作状态,它由一系列的控制器组成,这些控制器主要包括三组:

  1. 必须启动的控制器
  • eploymentController
  • DaemonSetController
  • NamesapceController
  • ReplicationController
  • RelicaSet
  • JobController

  1. 默认启动的控制器
  • NodeController
  • ServiceController
  • PVBinderController

  1. 默认禁止的可选控制器
  • BootstrapSignerController
  • TokenCleanerController

2.2.5 Kubelet

每个 Node 节点上都运行一个 kubelet 守护进程,默认监听 10250 端口,接收并执行 master 发来的指令,管理 Pod 及 Pod 中的容器。每个 kubelet 进程会在 API Server 上注册节点自身信息,定期向 master 节点汇报节点的资源使用情况

节点管理

主要是节点自注册和节点状态更新:

  • Kubelet 可以通过设置启动参数 –register-node 来确定是否向 API Server 注册自己;
  • 如果 Kubelet 没有选择自注册模式,则需要用户自己配置 Node 资源信息,同时需要在 Kubelet 上配置集群中 API Server 的信息;
  • Kubelet 在启动时通过 API Server 注册节点信息,并定时向 API Server 发送节点状态消息,API Server 在接收到新消息后,将信息写入 etcd

容器健康检查

Pod 通过两类探针检查容器的健康状态

  • LivenessProbe 存活探针:通过该探针判断容器是否健康,告诉 Kubelet 一个容器什么时候处于不健康的状态。如果 LivenessProbe 探针探测到容器不健康,则 kubelet 将删除该容器,并根据容器的重启策略做相应的处理。如果一个容器不包含 LivenessProbe 探针,那么 kubelet 认为该容器的 LivenessProbe 探针返回的值永远是“Success”。
  • ReadinessProbe 就绪探针:用于判断容器是否启动完成且准备接收请求。如果 ReadinessProbe 探针探测到失败,则 Pod 的状态将被修改。Endpoint Controller 将从 Service 的 Endpoint 中删除包含该容器所在 Pod 的 IP 地址的 Endpoint 条目。

以下是 Pod 的启动流程:

2.2.6 kube-proxy

每台机器上都运行一个 kube-proxy 服务,它监听 API Server 中 service 和 Pod 的变化情况,并通过 userspace、iptables、ipvs 等 proxier 来为服务配置负载均衡

代理模式(proxy-mode)提供如下三种类型:

1)userspace

最早的负载均衡方案,它在用户空间监听一个端口,所有请求通过 iptables 转发到这个端口,然后在其内部负载均衡到实际的 Pod。service 的请求会先从用户空间进入内核 iptables,然后再回到用户空间(kube-proxy),由 kube-proxy 完成后端 Endpoints 的选择和代理工作,这样流量从用户空间进出内核带来的性能损耗是不可接受的,所以产生了 iptables 的代理模式

2)iptables:

iptables mode 完全使用 iptables 来完成请求过滤和转发。但是如果集群中存在大量的 Service/Endpoint,那么 Node 上的 iptables rules 将会非常庞大,添加或者删除 iptables 规则会引起较大的延迟。

3)ipvs:

为了解决存在大量 iptables 规则时的网络延迟的问题,Kubernetes 引入了 ipvs 的模式,(ipvs 是 LVS – Linux Virtual Server 的重要组成部分,最早是由中国的章文嵩博士推出的一个开源项目,提供软件负载均衡的解决方案),下面是 ipvs 模式的原理图:

正文完
 0