Kubernetes是什么?

Kubernetes是一个开源容器管理工具,它负责容器部署,扩缩容以及负载平衡的职责。作为Google的创意,它提供了出色的社区,并且与所有云提供商都精采合作。因此,可以说Kubernetes不是一个容器化平台,而是一个多容器管理解决方案。或者说是基于容器技术的分布式架构领先方案。

如果系统设计遵循了Kubernetes的设计思想,那么传统系统架构中那些和业务没有多大关系的底层代码或功能模块,都可以从我们的视线中消失,我们不必再费心于负载均衡器的选型和部署实施问题,不必再考虑引入或自己开发一个复杂的服务治理框架,不必再头疼于服务监控和故障处理模块的开发。使用Kubernetes提供的解决方案,不仅节省了开发成本,还可以将精力更加集中于业务本身,而且由于Kubernetes提供了强大的自动化机制,所以系统后期的运维难度和运维成本大幅度降低。

Kubernetes是一个分布式系统支撑平台。Kubernetes具有完备的集群管理能力,包括多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和服务发现机制、内建的智能负载均衡器、强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制,以及多粒度的资源配额管理能力。同时,Kubernetes提供了完善的管理工具,这些工具涵盖了包括开发、部署测试、运维监控在内的各个环节。

因此,Kubernetes是一个全新的基于容器技术的分布式架构解决方案,并且是一个一站式的完备的分布式系统开发和支撑平台。

为什么要用Kubernetes?

使用Kubernetes的理由很多,最重要的理由是,IT行业从来都是由新技术驱动的。

使用Kubernetes的好处:

首先,可以“轻装上阵”地开发复杂系统。以前需要很多人一起分工协作才能设计、实现和运维的分布式系统,在采用Kubernetes解决方案后,只需一个精悍的小团队就能轻松应对。团队里只需一名架构师负责系统中服务组件的架构设计,几名开发工程师负责业务代码的开发,一名系统兼运维工程师负责Kubernetes的部署和运维。

其次,可以全面拥抱微服务架构。微服务架构的核心是将一个巨大的单体应用分解为很多小的互相连接的微服务,一个微服务可能由多个实例副本支撑,副本的数量可以随着系统的负荷变化进行调整。微服务架构使得每个服务都可以独立开发、升级和扩展,因此系统具备很高的稳定性和快速迭代能力,开发者也可以自由选择开发技术。

再次,可以随时随地将系统整体“搬迁”到公有云上。Kubernetes最初的设计目标就是让用户的应用运行在谷歌自家的公有云GCE中,华为云(CCE)、阿里云(ACK)和腾讯云(TKE)等等陆续都支持Kubernetes集群。在Kubernetes的架构方案中完全屏蔽了底层网络的细节,基于Service的虚拟IP地址(Cluster IP)的设计思路让架构与底层的硬件拓扑无关,无须改变运行期的配置文件,就能将系统从现有的物理机环境无缝迁移到公有云上。

然后,Kubernetes内在的服务弹性扩容机制可以轻松应对突发流量。在服务高峰期,可以选择在公有云中快速扩容某些Service的实例副本以提升系统的吞吐量。中国铁路总公司的12306购票系统,在客流高峰期(如节假日)就租用了阿里云进行分流。

最后,Kubernetes系统架构拥有超强的横向扩容能力。对于互联网公司来说,用户规模等价于资产,因此横向扩容能力是衡量互联网业务系统竞争力的关键指标。Kubernetes能将一个集群从只包含几个Node的小集群平滑扩展到拥有上百个Node的大集群,甚至可以在线完成集群扩容。只要微服务架构设计得合理,能够在多个云环境中进行弹性伸缩,系统就能够承受大量用户并发访问带来的巨大压力。

架构描述

Kubernetes 由 Master 和 Node 两种节点组成,分别对应着控制节点和工作节点(可以理解为老板和员工)。

Master 节点由三个独立组件组成,分别是负责整个集群通信的 API 服务的 kube-apiserver、负责容器调度的 kube-scheduler 以及负责维护集群状态的 kube-controller-manager 组件。整个集群的数据都是通过 kube-apiserver 保存到 etcd 数据库中的,而其他所有组件的通信也都是通过 kube-apiserver 和 etcd 数据库进行通信的,都不会直接和 etcd 进行通信。

Node 节点上最核心的组件就是 kubelet,主要来实现和底层的容器运行时进行通信的,这个通信的过程也被 Kubernetes 抽象成了一个 CRI(Container Runtime Interface)的远程调用接口,这个接口里面定义了容器运行时的所有标准操作,比如创建容器、删除容器等等。kubelet 的另外功能就是调用网络插件(CNI)和存储插件(CSI)为容器配置网络和存储功能。

image.png

kubectl 日志调试级别

信息 描述
v=0 通常级别
v=1 当不想要很详细的输出时,这个是一个合理的默认日志级别。
v=2 有关服务和重要日志消息的有用稳定状态信息。这是大多数系统推荐的默认日志级别。
v=3 关于更改的扩展信息。
v=4 调试级别信息。
v=6 显示请求资源。
v=7 显示 HTTP 请求头。
v=8 显示 HTTP 请求内容。
v=9 显示 HTTP 请求内容,并且不截断内容。

$ kubectl get nodes -v=7

集群组件

kube-apiserver

API Server 提供了资源对象的唯一操作入口,其它所有组件都必须通过它提供的 API 来操作资源数据。只有 API Server 会与 etcd 进行通信,其它模块都必须通过 API Server 访问集群状态。API Server 作为 Kubernetes 系统的入口,封装了核心对象的增删改查操作。API Server 以 RESTFul 接口方式提供给外部客户端和内部组件调用,API Server 再对相关的资源数据(全量查询 + 变化监听)进行操作,以达到实时完成相关的业务功能。

API Server服务特点:

  • 端口默认为6443,可通过启动参数 “—secure-port” 设置;
  • 默认IP地址为非本地网络端口,可通过启动参数 “—bind-address” 设置;
  • 该端口用于接收客户端、dashboard等外部HTTPS请求;
  • 用于基于Token文件或客户端证书及HTTP Base的认证;
  • 用于基于策略的授权。

kube-controller-manager

Controller Manager 用于实现 Kubernetes 集群故障检测和恢复的自动化工作。

主要负责执行各种控制器:

  • Replication Controller:定期关联 Replication Controller (RC) 和 Pod,以保证集群中的 RC (一种资源对象) 所关联的 Pod 副本数始终保持为与预设值一致。
  • Node Controller:Kubelet 在启动时会通过 API Server 注册自身的节点信息,并定时向 API Server 汇报状态信息。API Server 在接收到信息后将信息更新到 Etcd 中。Node Controller 通过 API Server 实时获取 Node 的相关信息,实现管理和监控集群中的各个 Node 节点的相关控制功能。
  • ResourceQuota Controller:资源配额管理控制器用于确保指定的资源对象在任何时候都不会超量占用系统上物理资源。
  • Namespace Controller:Namespace Controller 定时通过 API Server 读取 Namespace 信息来操作 Namespace。
  • Service Account Controller:服务账号控制器主要在命名空间内管理 ServiceAccount,以保证名为 default 的 ServiceAccount 在每个命名空间中存在。
  • Token Controller:令牌控制器主要用作:监听 serviceAccount 的创建和删除动作以及监听 secret 的添加、删除动作。
  • Service Controller:服务控制器主要用作监听 Service 的变化。
  • Endpoint Controller:Endpoints 表示了一个 Service 对应的所有 Pod 副本的访问地址,而 Endpoints Controller 是负责生成和维护所有 Endpoints 对象的控制器。其负责监听 Service 和对应的 Pod 副本的变化。定期关联 Service 和 Pod,以保证 Service 到 Pod 的映射总是最新的。

image.png

kube-scheduler

Scheduler 是负责集群的资源调度,主要职责如下:

  • 收集和分析集群中所有 Node 节点的资源 (包括内存、CPU 等) 负载情况,依据资源占用情况分发新建的 Pod 到集群中可用的节点
  • 实时监测集群中未分发和已分发的所有运行的 Pod
  • 实时监测 Node 节点信息
  • 在分发 Pod 到指定的 Node 节点后,会把 Pod 相关的 Binding 信息写回 API Server,以便其它组件使用

kubelet

kubelet 是负责容器运行的核心组件,主要的职责如下:

  • 负责 Node 节点上 Pod 的创建、修改、监控、删除等全生命周期的管理
  • 定时上报本地 Node 的状态信息给 API Server
  • kubelet 是 Master 和 Node 之间的桥梁,接收 API Server 分配给它的任务并执行
  • kubelet 通过 API Server 间接与 Etcd 集群交互来读取集群配置信息
  • kubelet 在 Node 上的主要工作:
    1. 设置容器的环境变量、给容器绑定 Volume、给容器绑定 Port、给指定的 Pod 创建 Network 容器
    2. 同步 Pod 的状态
    3. 在容器中运行命令、杀死容器、删除 Pod 的所有容器

kube-proxy

kube-proxy 是为了解决集群网络能够访问集群中容器提供的应用服务而设计的,Proxy 运行在每个Node 上。

每创建一个 Service,kube-proxy 就会从 API Server 获取 Services 和 Endpoints 的配置信息,然后根据其配置信息在 Node 上启动一个 Proxy 的进程并监听相应的服务端口。当接收到外部请求时,kube-proxy 会根据 Load Balancer 将请求分发到后端正确的容器处理。

kubectl

Kubectl 是 Kubernetes 的集群管理命令行客户端工具。通过 Kubectl 命令对 API Server 进行操作,API Server 响应并返回对应的命令结果,从而达到对集群的管理。

集群组件参数

公共配置参数

公共配置参数适用于所有组件,如下参数可用于kube-apiserver、kube-controller-manager、kube-scheduler、kubelet、kube-proxy。
image.png
image.png

kube-apiserver启动参数

image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png

kube-controller-manager启动参数

image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png

kube-scheduler启动参数

image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png

kube-proxy启动参数

image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png