Skip to main content

Kubernetes介绍

Kubernetes(简称“k8s”)是 Google 在 2014 年 6 月开源的一个容器集群管理系统,使用Go语言开发,用于管理云平台中多个主机上的容器化的应用,Kubernetes 的目标是让部署容器化的应用简单且高效,Kubernetes 具有资源调度、部署管理、服务发现、扩容缩容、 监控、维护等功能优势,逐渐成为跨主机集群的自动部署、扩展以及运行应用程序容器的平台。它支持一系列容器工具,包括 Docker 等,主要支持的功能如下:

自我修复:一旦某一个容器崩溃,能够在1秒中迅速启动新的容器。

弹性伸缩:可以根据需求,自动对集群中正在运行的容器数量进行调整。

服务发现:通过自动发现的形式找到它所依赖的服务。

负载均衡:如果多个容器启动,能够自动实现请求的负载均衡。

版本回退:如果发现新发布的程序版本有问题,可以立即回退到原来的版本。

存储编排:可以根据容器自身的需求自动创建存储卷。

 

Kubernetes原理

kubernetes 采用 “控制面/数据面”架构,集群中计算机被称为“节点”(node),节点可以是实体机器,也可以是虚拟机器,少量的节点用作控制面来执行集群的维护工作,其他的大部分节点被规划为数据面,用来跑业务应用。

控制面的节点在 kubernetes 里叫做Master Node,一般简称为Master,它是整个集群的重要部分,相当于 kubernetes 的大脑和心脏。

数据面的节点在 kubernetes 里叫做Woker Node,一般简称为 Worker 或者 Node,相当于 kubernetes 的手和脚,在Master的指挥下进行工作。

 

控制面 Master 节点

Kubernetes 集群的控制中心是 Master 节点,它负责管理集群的状态、调度应用程序、监视集群状态等。Master节点由多个组件组成,包括:API Server、Scheduler、Controller Manager和etcd。

 

API-Server:

负责对外提供集群各类资源的增删改查及 Watch 接口,它是 Kubernetes 集群中各组件数据交互和通信的枢纽。当收到一个创建 Pod 写请求时,对请求进行认证、限速、授权、准入机制并检查,写入到 etcd 即可。kube-apiserver在设计上可水平扩展,高可用 Kubernetes集群中一般多副本部署。

 

Scheduler:

Scheduler是调度器组件,负责集群 Pod 的调度。通过监听 kube-apiserver 获取待调度的 Pod,基于一系列筛选和评优算法,为 Pod 分配最佳的 Node 节点。

 

Controller-Manager:

Controller-Manager 包括一些子控制器(副本控制器,节点控制器、命名空间控制器和服务账号控制器等),控制器作为集群内部的管理控制中心,负责集群内的 Node、Pod副本、服务端点(Endpoint)、命名空间 (Namespace)、服务账号 (ServiceAccount)、资源定额 (ResourceQuota)的管理。当Node意外宕机时,Controller-Manager会及时发现并执行自动化修复流程,确保集群中的 pod 副本始终处于预期的工作状态。

Controller-Manager 监测 node 节点机制:

● controller-manager 控制器每间隔 5 秒检查一次节点的状态;

● 如果 controller-manager 控制器没有收到节点的心跳,则将该 node 节点被标记为不可达;

● controller-manager 将在标记为无法访问之前等待 40 秒;

● 如果该 node 节点被标记为无法访问后 5 分钟还没有恢复,controller-manager 会驱逐当前 node 节点的所有 pod,并在其它可用节点重建此 pod。

Pod 高可用机制:

● node monitor period:节点监测周期 5s

● node monitor grace peroiod:节点监视器宽限期 40s

● node eviction timeout:pod 驱逐超时时间 5m

 

etcd 组件:

作为 Kubernetes 的首要数据存储,etcd 能够存储和复制 Kubernetes 集群所有状态。etcd 是 Kubernetes 集群的关键组件。

 

Node 节点

Worker 节点,也称为 Node,是 Kubernetes 集群中的工作节点,负责运行应用程序的容器实例。Node上运行的Kubernetes组件有kubelet、kube-proxy和Pod网络。

 

Kubelet:

负责 Pod 的创建运行,部署在每个节点上的 Agent 的组件。通过监听 APIServer 获取分配到其节点上的 Pod,然后根据 Pod 规格详情,调用运行时组件创建 pause 和业务容器等。

 

kube-proxy:

Kubernetes 网络代理运行在所有节点上,包括 master 节点,它反映了 node 上 Kubernetes AP1 中定义的服务,并可以通过一组后端进行简单的 TCP UDP 和 SCTP 流转发或者在一组后端进行循环 TCP UDP 和 SCTP 转发,用户必须利用 api Server API 创建一个服务来配置代理,即kube-proxy 通过在主机上维护网络规则并执行连找转发来实现 Kubernetes 服务访问。

kube-proxy 运行在每个节点上,监听 API Server 中服务对象的变化,再通过管理 IPtables 或者 IPVS 规则来实现网络的转发。

 

Pod:

Pod是最小部署单元,一个Pod由一个或多个容器组成,Pod中容器共享存储和网络,在同一台 Docker 主机上运行。每个 Pod 都会包含一个 “根容器”,包含一个或者多个紧密相连的业务容器。

● Pod 运行在节点 Node 中;

● Pod 是对容器的封装,是 k8s 最小的调度单元,也是 Kubernetes 最重要的基本概念。

Pause 容器是每个 Pod 都有的“根容器”,其对应的镜像属于 Kubernetes 平台的一部分。Kubernetes 为何如此设计Pod?

● 在一组容器作为一个单位的情况下,我们难以判断整组容器的状态。如果其中一个容器死亡,此时是去定义整组容器死亡,还是定义 N/M 的死亡率呢?通过引入与业务无关且不易死亡的 Pause 容器作为 Pod 的根容器,以它的状态代表整组容器的状态,即可解决。

● Pod 里的多个业务容器共享 Pause 容器 IP,共享 Pause 容器挂接Volume,这样既简化了关联的业务容器间的通信问题,也解决了它们之间的文件共享问题。

 

Kubernetes 为每个 Pod 都分配了唯一的 IP 地址,称之为 Pod IP,一个 Pod ⾥的多个容器共享 Pod IP。Kubernetes 要求底层网络支持集群内任意两个 Pod 之间的 TCP/IP 直接通信,因此一个 Pod 容器与另外主机上的 Pod 容器能够直接通信。