什么是 Kubernetes
企业级的容器编排平台。
Kubernetes 这个单词是希腊语,它的中文翻译是“舵手”或者“飞行员”。联想一下 Docker 的集装箱,不难想到 k8s 是想成为运送集装箱的轮船,来管理集装箱,也就是管理容器。
“k8s”,是通过将8个字母“ubernete ”替换为“8”而导致的一个缩写。(这种缩短名称的方式还是第一次见,有创意)
Kubernetes 核心功能
- 服务的发现与负载的均衡;
- 容器的自动装箱,我们也会把它叫做 scheduling,就是“调度”,把一个容器放到一个集群的某一个机器上,Kubernetes 会帮助我们去做存储的编排,让存储的声明周期与容器的生命周期能有一个连接;
- 自动化的容器恢复。
- 应用的自动发布与应用的回滚,以及与应用相关的配置密文的管理;
- 对于 job 类型任务,Kubernetes 可以去做批量的执行;
- 为了让这个集群、这个应用更富有弹性,Kubernetes 也支持水平的伸缩。
调度
k8s 将用户提交的容器,放置到集群的某个节点上。结合容器的大小,所需要的资源情况等,将容器放到一个满足容器要求的、相对空闲的节点上。
自动修复
k8s 会检查节点是否健康,如果节点出现故障,k8s 会自动将该节点的容器迁移到健康的节点上。
水平伸缩
k8s 具备业务负载检查的能力,如果某个容器 cpu 利用率过高,响应时间长,k8s 可以对该容器进行水平扩展。其中需要用到负载均衡。
Kubernetes 的架构
典型的二层架构和 server-client 架构。(Docker 也是 server-client 架构)
中央的管控节点 master
- API Server:用来处理 API 操作的,Kubernetes 中所有的组件都会和 API Server 进行连接,组件与组件之间一般不进行独立的连接,都依赖于 API Server 进行消息的传送;
- 本身在部署结构上是一个可以水平扩展的一个部署组件
- Controller:是控制器,它用来完成对集群状态的一些管理。比如刚刚我们提到的两个例子之中,第一个自动对容器进行修复、第二个自动进行水平扩张,都是由 Kubernetes 中的 Controller 来进行完成的;
- 可以进行热备的一个部署组件
- Scheduler:调度器,完成调度的操作,就是我们刚才介绍的第一个例子中,把一个用户提交的 Container,依据它对 CPU、对 memory 请求大小,找一台合适的节点,进行放置;
- etcd:是一个分布式的一个存储系统,API Server 中所需要的这些原信息都被放置在 etcd 中,etcd 本身是一个高可用系统,通过 etcd 保证整个 Kubernetes 的 Master 组件的高可用性。
真正运行业务负载的 Node
Pod
每个业务负载会以 Pod 的形式运行,一个 Pod 中运行的一个或者多个容器。
kubelet
真正去运行这些 Pod 的组件的是叫做 kubelet,通过 API Server 接收到所需要 Pod 运行的状态,然后提交到 Container Runtime 组件中。
Storage Plugin、Network Plugin
在 OS 上创建容器运行所需要的环境,需要对存储、网络进行管理,Kubernetes 并不会直接进行网络存储的操作,他会靠 Storage Plugin 或者是网络的 Plugin 来进行操作。用户自己或者云厂商都会去写相应的 Storage Plugin 或者 Network Plugin,去完成存储操作或网络操作。
也就是定义规范,让各个厂商自己去实现。前提是软件自身要有话语权,想想一下如果不这样,就需要对接各种 OS,任务之重,没有话语权又想让各个 OS 使用 k8s,是多么的难。还好在容器编排领域,k8s 处于领先地位
Kube-proxy
在 Kubernetes 自己的环境中,也会有 Kubernetes 的 Network,它是为了提供 Service network 来进行搭网组网的。真正完成 service 组网的组件的是 Kube-proxy,它是利用了 iptable
的能力来进行组建 Kubernetes 的 Network,就是 cluster network。
Pod调度执行流程
用户可以通过 UI 或者 CLI 提交一个 Pod 给 Kubernetes 进行部署,这个 Pod 请求首先会通过 CLI 或者 UI 提交给 Kubernetes API Server,下一步 API Server 会把这个信息写入到它的存储系统 etcd,之后 Scheduler 会通过 API Server 的 watch 或者叫做 notification 机制得到这个信息:有一个 Pod 需要被调度。
这个时候 Scheduler 会根据它的内存状态进行一次调度决策,在完成这次调度之后,它会向 API Server report 说:“OK!这个 Pod 需要被调度到某一个节点上。”
这个时候 API Server 接收到这次操作之后,会把这次的结果再次写到 etcd 中,然后 API Server 会通知相应的节点进行这次 Pod 真正的执行启动。相应节点的 kubelet 会得到这个通知,kubelet 就会去调 Container runtime 来真正去启动配置这个容器和这个容器的运行环境,去调度 Storage Plugin 来去配置存储,network Plugin 去配置网络。
Kubernetes 的核心概念
Pod
- Pod 是 Kubernetes 的一个最小调度以及资源分配单元。
- 一个或者多个容器组成。
- 定义容器运行的方式(Command、环境变量等)
- 提供给容器共享的运行环境(网络、进程空间)
- Pod 里的容器可以用 localhost 来进行直接的连接。而 Pod 与 Pod 之间,是互相隔离的。
Volume
- 声明在 Pod 中的容器可以访问的文件目录
- 一个卷可以被挂载在 Pod 中一个或者多个容器的指定路径下面。
- 支持多种后端存储的抽象
- 本地存储、分布式存储、云存储
Deployment
一般用 Deployment 这个抽象来做应用的真正的管理,而 Pod 是组成 Deployment 最小的单元。
- 定义一组 Pod 的副本数目、版本等
- 通过 Controller 维持 Pod 的数目
- 自动恢复失败的 Pod
- 通过 Controller 以指定的策略控制版本
- 滚动升级、重新生成、回滚等
滚动升级:
- 逐个更新 Pod,不会停止所有 Pod,导致业务中断
- 更新期间仅对可用的 Pod 进行负载均衡
Service
- 提供访问一个或多个 Pod 实例的稳定访问地址
- Pod 实例生命周期短,自身访问地址无法固定
- 支持多种访问方式实现
- ClusterIP
- NodePort
- LoadBalancer
Namespace
区分不同的BU(business units:业务单位)
- 一个集群内部的逻辑隔离机制(鉴权、资源管理)
- 每个资源都属于一个 Namespace
- Pod、Deployment、Service
- 同一个 Namespace 中的资源命名唯一
Kubernetes 的 API
从 high-level(学到个新名词) 上看,Kubernetes API 是由 HTTP JSON 组成的
- labels:一个非常核心的 kubernetes API 的概念(目前只理解到起标识作用), KeyValuePair,可以作为 Pod 查询条件。
- spec:期望的状态,Pod 内部容器的信息
Kubernetes 官方文档