目录
1、Kubernetes是什么
2、Kubernetes不是什么
3、Kubernetes架构与分层
4、Kubernetes 集群架构
5、Kubernetes 集群组件
5.1、K8s 在 Master 上的组件
5.2、K8s 在 Node 上的组件
6、Kubernetes API
在云原生技术与生态快速发展的今天,越来越多的IT厂商都在拥抱和使用云原生,各大互联网公司也在自主筹建自己的云原生架构与产品体系。云原生不是一个产品,而是一套技术体系与一套方法论,云原生既包含技术(微服务、容器等基础设施),也包含管理(DevOps、持续交付、资源重组等)。Docker和Kubernetes作为云原生的两大基础设施,Docker实现了容器,Kubernetes则实现了容器编排系统。今天我们就来讲述一下Kubernetes的基础内容。
1、Kubernetes是什么
Kubernetes(以下简称 K8s)是一个管理容器化工作单元和服务的可移植、可扩展的开源平台,它是一个大规模容器集群管理工具,它能够方便地进行配置与自动化部署。K8s 迄今已经形成一个巨大且快速增长的生态系统,相关的服务、技术支持和工具得到了广泛应用。
google创造了K8s,于2014年6月将之开源,google云计算专家Eric Brewer在旧金山的发布会为这款新的开源工具揭牌,它的名字Kubernetes在希腊语中的意思是领航员,这个名字与它在容器集群管理中的作用相契合,负担着全局调度和运行监控的职责。K8s是google 多年产品运维经验及社区最佳实践的结晶。
K8s是一个完备的分布式系统支撑平台。K8s具有完备的集群管理能力,包括多层次的安全防护和准入机制/多租户应用支撑能力、透明的服务注册和服务发现机制、内建智能负载均衡器、强大的故障发现和自我修复功能、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制,以及多粒度的资源配额管理能力。
同时,K8s提供了完善的管理工具,这些工具覆盖了包括开发、测试部署、运维监控在内的各个环节。因此,K8s是一个全新的基于容器技术的分布式架构解决方案,并且是一个一站式的完备的分布式系统开发和支撑平台。
K8s 的主要特点可归纳为:
1)是一个容器平台(a container platform)
2)是一个微服务平台(a microservices platform)
3)是一个可移植的云平台
2、Kubernetes不是什么
K8s不是一个传统的、包含所有功能的PaaS系统。因为K8s运行在容器级,而不是在硬件层面。它和其它PaaS产品一样提供了一些普遍适用的特性,如部署、伸缩、负载平衡、日志和监控等。不同于一个单块( monolithic)系统,这些默认的解决方案在 K8s 中是以插件形式可选的
K8s 保留了用户的选择和灵活性:
1)K8s 没有限制应用运行的类型,只要应用可以在容器中运行,则也能在 K8s 中运
行。
2)K8s 不部署源码,也不构建应用。
3)K8s 不提供应用级的服务,如中间件,软件框架等。但这些服务可运行在 K8s 之上。
4)K8s 并不指定记录、监视或报警解决方案。
5)K8s 仅提供了一个可声明的 API 用于定义任意接口定义。
6) K8s 不提供也没有采用任何机器配置、维护、管理、自愈系统。
K8s其实并不是一个纯粹的编排系统。事实上,它没有把编排作为所考虑的一个必要功能。编排往往用于工作流,然而 K8s 由一组独立的、可组合的控制流程组成,这样使得系统更容易使用、更强大、健壮、有弹性、可扩展。
3、Kubernetes架构与分层
K8s 在架构方面主要分为5层,包括生态系统、接口层、治理层、应用层及内核层,如下所示,下图中的最底层主要是一些接口,包括运行时接口等相关信息:
生态系统:主要分为两部分的集群管理调度,包括Kubernetes外部的日志,监控以及CICD等方面,同时也包括Kubernetes内部的CRI,镜像仓库管理方面的调度。
接口层:kubectl命令行工具、客户端SDK以及集群联邦。
治理层:系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动态Provision等)
应用层:部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服务发现、DNS解析等)
内核层:核心层主要包括API和执行环境,能够对外提供api,帮助构建应用,对内提供插件式应用执行环境。
4、Kubernetes 集群架构
K8s 将一组计算机资源组成一个高可用集群,使得就像在一个统一单元上工作一样。K8s
能够将容器化应用自动部署到集群的计算机资源中,并能根据用户要求对容器化应用进行自
动调度。
一个 K8s 集群是一个典型的主从结构,有 master 和 node 两种类型的节点组成,其结构
如下所示:
其中,Master 是集群的管理节点,协调集群中的所有活动,如调度应用、维护应用状态、对
容器进行伸缩管理以及更新容器中应用等。
Node 是集群中的一台物理计算机或虚拟机,上面部署了运行应用程序的容器,目前容器主要使用Docker来实现。每个 Node 由一个 Kubelet 作为 Node 的代理与 Master 进行通信。
5、Kubernetes 集群组件
5.1、K8s 在 Master 上的组件
K8s 在 Master 上的组件包括:
1)kube-apiserver:提供用于 K8s 前端控制的 API,apiserver 为实现高可用性,被设计
为可水平扩展。
2)etcd: 是一个高可用的“名-值对”协同系统⑤,K8s 中的元数据信息都保存在 etcd
中。
3)kube-scheduler:对集群内的 Pod⑥资源进行调度,调度可以人工定义也可以由系统
自动完成,
4)kube-controller-manager:实现对 K8s 中多种控制器的管理,K8s 中管理器包括:
- Node Controller: 负责通知与发现 Node 不可用的情况。
- Replication Controller: 根据系统要求维护正确的 Pod 复制数目
- Endpoints Controller: 管理端点(Endpoint)对象
- Service Account & Token Controllers: 对新的名空间创建新的账号与 API访问 token
5)cloud-controller-manager: 从 K8s 的 1.6 版本后才提供,是与云环境交互的控制器。
cloud-controller-manager 仅管理由云提供商定义的控制器,这些特定的控制器不可 在 kube-controller-manager 中运行(可在启动 kube-controller-manager 时在 external参数中加入–cloud-provider 选项以阻止这些特定的控制器运行)。管理器允许云提供商的代码和 K8s 的内核各自演进(无依赖关系,在之前的版本中,K8s 的内核依赖于云提供商的特定功能代码)。在以后的版本中,与特定云提供商相关的代码由云提供商自行维护,运行时连接到 cloud-controller-manager。 下列控制器是云提供商提供的:
- Node Controller: 管理云中的 Node 节点
- Route Controller: 设置云中路由控制
- Service Controller: 对云中的负载均衡器增删改查
- Volume Controller: 管理云中的数据卷
5.2、K8s 在 Node 上的组件
K8s 在 Node 上的组件包括:
1)Kubelet: 是集群中每个 Node 的代理,由它来保证容器运行在 Pod 中。Kubelet 并不能管理非 K8s 创建的容器。
2)kube-proxy:保证了K8s 中定义的服务能够正确运行。
3)Container Runtime:容器运行时,保证了K8s支持的容器能够在运行时上正确运行。
未加入 cloud controller manager 的 K8s 集群架构如下所示:
这种架构中 K8s 需要使用云提供商提供的插件来与云环境交互。
加入 cloud controller manager 的 K8s 集群架构如下所示:
6、Kubernetes API
REST API 是 K8s 的基本元素,K8s 组件通过对 API Server 的 API 调用完成组件间的通信与
功能操作。K8s 中的任何操作都能在 API 中找到入口。这些 API 可被 kubectl 或 kubeadm 这样的工具间接调用,也可直接通过 REST 方式进行调用。
如果要开发 K8s 客户端程序,可以使用 K8s 提供的客户端开发库。客户端开发库支持Java、Go、js、Perl、PHP、Python、Ruby、Scala、.Net多种编程语言。此外,K8s 中支持多个 API 版本,常以版本号作为路径前缀,如“/api/v1”。