一、什么是 Kubernetes
1、含义:
Kubernetes 是一个自动化的容器编排平台,它负责应用的部署、应用的弹性以及应用的管理。
2、核心功能:
(1) 调度:
Kubernetes 的调度器可以把用户提交的容器放到 Kubernetes 管理的集群的某一台节点上去。它会观察正在被调度的这个容器的大小、规格,然后在集群中找一台相对比较空闲的机器来进行放置。
(2) 自动修复:
Kubernetes 有一个节点健康检查的功能,它会监测这个集群中所有的宿主机,当宿主机本身出现故障,或者软件出现故障的时候,Kubernetes 会把运行在这些失败节点上的容器迁移到一个正在健康运行的宿主机上,来完成集群内容器的一个自动恢复。
(3)水平伸缩
Kubernetes 有业务负载检查的能力,它会监测业务上所承担的负载,如果这个业务本身的 CPU 利用率过高,或者响应时间过长,它可以对这个业务进行一次扩容。
二、Kubernetes 的架构
Kubernetes 架构是一个比较典型的二层架构和 server-client 架构。Master 作为中央的管控节点,会去与 Node 进行一个连接。
1、Master:
Master 包含四个主要的组件:API Server、Controller、Scheduler 以及 etcd。
① API Server:是用来处理 API 操作的,Kubernetes 中所有的组件都会和 API Server 进行连接,依赖于 API Server 进行消息的传送;
② Controller:是控制器,它用来完成对集群状态的一些管理。对容器进行修复、水平扩张,都是由 Kubernetes 中的 Controller 来进行完成的;
③ Scheduler:是调度器,就是完成调度的操作,把一个用户提交的 Container,依据它对 CPU、对 memory 请求大小,找一台合适的节点,进行放置;
④ etcd:是一个分布式的一个存储系统,API Server 中所需要的这些原信息都被放置在 etcd 中。
2、Node:
Kubernetes 的 Node 是真正运行业务负载的,每个业务负载会以 Pod 的形式运行,一个 Pod 中运行着一个或者多个容器。真正去运行这些 Pod 的组件的是叫做 kubelet,也就是 Node 上最为关键的组件。它通过 API Server 接收到所需要 Pod 运行的状态,然后提交到 Container Runtime 组件中。
3、Kubernetes 架构中的组件如何通信:
用户可以通过 UI 或者 CLI 提交一个 Pod 给 Kubernetes 进行部署,这个 Pod 请求首先会通过 CLI 或者 UI 提交给 Kubernetes API Server,下一步 API Server 会把这个信息写入到它的存储系统 etcd,之后 Scheduler 会通过 API Server 的 watch 得到信息:有一个 Pod 需要被调度。
Scheduler 会根据它的内存状态进行一次调度决策,API Server 接收到这次操作之后,会把这次的结果再次写到 etcd 中,然后 API Server 会通知相应的节点进行这次 Pod 真正的执行启动。
相应节点的 kubelet 会得到这个通知,kubelet 就会去调 Container runtime 来真正去启动配置这个容器和这个容器的运行环境,去调度 Storage Plugin 来去配置存储,network Plugin 去配置网络。
三、Kubernetes 的核心概念
1、Pod
Pod 是 Kubernetes 的一个最小调度以及资源单元。用户可以通过 Kubernetes 的 Pod API 生产一个 Pod,让 Kubernetes 对这个 Pod 进行调度,放在某一个 Kubernetes 管理的节点上运行起来。
简单来说一个 Pod 是对一组容器的抽象,里面会包含一个或多个容器。在 Pod 里面,可以去定义容器所需要运行的方式,比如说运行容器的 Command,以及运行容器的环境变量等。Pod 也给容器提供了一个共享的运行环境。
2、Volume
Volume 就是卷的概念,它是用来管理 Kubernetes 存储的,声明在 Pod 中的容器可以访问的文件目录,一个卷可以被挂载在 Pod 中一个或者多个容器的指定路径下面。
3、Deployment
Deployment 是在 Pod 这个抽象上更为上层的一个抽象,它可以定义一组 Pod 的副本数目、以及这个 Pod 的版本。通常用 Deployment 这个抽象来做应用的真正的管理,而 Pod 是组成 Deployment 最小的单元。
Kubernetes 通过 Controller 控制器去维护 Deployment 中 Pod 的数目,帮助 Deployment 自动恢复失败的 Pod。
4、Service
Service 提供了一个或者多个 Pod 实例的稳定访问地址。一个 Deployment 可能有两个甚至更多个完全相同的 Pod,Service 把所有 Pod 的访问能力抽象成一个第三方的一个 IP 地址。
5、Namespace
Namespace 是用来做一个集群内部的逻辑隔离的,它包括鉴权、资源管理等。Kubernetes 的每个资源,如 Pod、Deployment、Service 都属于一个 Namespace,同一个 Namespace 中的资源需要命名的唯一性,不同的 Namespace 中的资源可以重名。