原文链接: k8s(Kubernetes 一丶基础知识与核心组件).
1. 什么是Kubernetes?
Kubernetes(又名k8s ,8是中间8个字母 "ubernete"的缩写)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展。如果你曾经用过Docker容器技术部署容器,那么可以将Docker看成Kubernetes内部使用的低级别组件。Kubernetes不仅仅支持Docker,还支持Rocket(另一种容器技术)
使用Kubernetes可以:
- 自动化容器的部署和复制
- 随时扩展或收缩容器规模
- 将容器组织成组,并且提供容器间的负载均衡
- 很容易地升级应用程序容器的新版本
- 提供容器弹性,如果容器失效就替换它,等等…
基本概念
- Master
Master节点是控制节点,由三个紧密协作的独立组件组合而成。其中,APIServer负责API服务;Controller Manager负责负责容器编排;Scheduler负责容器调度。 - Node
节点是计算节点,其中也有很多其他组件 - kubelet
主要负责同容器运行时打交道
CRI,远程调用接口,定义了容器运行时的各项核心操作
OCI,通过容器运行时规范同底层的Linux系统进行交互,即把CRI请求翻译成对Linux操作系统的调用(操作Linux的Cgroups和Namespace) - Pod
Pod是Kubernetes的基本操作单元,把相关的一个或多个容器构成一个Pod,通常Pod里的容器运行相同的应用。Pod包含的容器运行在同一个Node上,看作一个统一管理单元,共享相同的volumes和network namespace/IP和Port空间。 - Replication Controller
Replication Controller确保任何时候Kubernetes集群中有指定数量的pod副本(replicas)在运行, 如果少于指定数量的pod副本(replicas),Replication Controller会启动新的Container,反之会杀死多余的以保证数量不变。Replication Controller使用预先定义的pod模板创建pods,一旦创建成功,pod 模板和创建的pods没有任何关联,可以修改pod 模板而不会对已创建pods有任何影响,也可以直接更新通过Replication Controller创建的pods。对于利用pod 模板创建的pods,Replication Controller根据label selector来关联,通过修改pods的label可以删除对应的pods。 - Service
Service也是Kubernetes的基本操作单元,是真实应用服务的抽象,每一个服务后面都有很多对应的容器来支持,通过Proxy的port和服务selector决定服务请求传递给后端提供服务的容器,对外表现为一个单一访问接口,外部不需要了解后端如何运行,这给扩展或维护后端带来很大的好处。 - Label
Label是用于区分Pod、Service、Replication Controller的key/value键值对,Pod、Service、 Replication Controller可以有多个label,但是每个label的key只能对应一个value。Labels是Service和Replication Controller运行的基础,为了将访问Service的请求转发给后端提供服务的多个容器,正是通过标识容器的labels来选择正确的容器。同样,Replication Controller也使用labels来管理通过pod 模板创建的一组容器,这样Replication Controller可以更加容易,方便地管理多个容器,无论有多少容器。
2. k8s分层架构
Kubernetes 设计理念和功能其实就是一个类似 Linux 的分层架构
- 核心层:Kubernetes 最核心的功能,对外提供 API 构建高层的应用,对内提供插件式应用执行环境
- 应用层:部署(无状态应用、有状态应用、批处理任务、集群应用等) 和路由(服务发现、DNS 解析等)
- 管理层:系统度量(如基础设施、容器和网络的度量) ,自动化(如自动扩展、动态 Provision 等) 以及策略管理(RBAC、Quota、PSP、NetworkPolicy 等)
- 接口层:kubectl 命令行工具、客户端 SDK 以及集群联邦
- 生态系统:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范畴
- Kubernetes 外部:日志、监控、配置管理、CI、CD、Workflow、FaaS、OTS应用、ChatOps 等
- Kubernetes 内部:CRI、CNI、CVI、镜像仓库、Cloud Provider、集群自身的配置和管理等
3. k8s核心组件
Kubernetes 主要由以下几个核心组件组成:
- etcd 保存了整个集群的状态;
- kube-apiserver 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;
- kube-controller-manager 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
- kube-scheduler 负责资源的调度,按照预定的调度策略将 Pod 调度到相应的机器上;
- kubelet 负责维持容器的生命周期,同时也负责 Volume(CVI) 和网络 (CNI) 的管理;
- Container runtime 负责镜像管理以及 Pod 和容器的真正运行 (CRI) ,默认的容器运行时为 Docker;
- kube-proxy 负责为 Service 提供 cluster 内部的服务发现和负载均衡;
除了核心组件,还有一些推荐的 Add-ons:
- kube-dns 负责为整个集群提供 DNS 服务
- Ingress Controller 为服务提供外网入口
- Heapster 提供资源监控
- Dashboard 提供 GUI
- Federation 提供跨可用区的集群
- Fluentd-elasticsearch 提供集群日志采集、存储与查询
4. 组件通信
Kubernetes 多组件之间的通信原理为
- API Server 负责 etcd 存储的所有操作,且只有 API Server 才直接操作 etcd 集群
- API Server 对内(集群中的其他组件) 和对外(用户) 提供统一的 REST API,其他组件均通过 API Server 进行通信
Controller Manager、Scheduler、Kube-proxy 和 Kubelet 等均通过 API Serverwatch API 监测资源变化情况,并对资源作相应的操作
所有需要更新资源状态的操作均通过 API Server 的 REST API 进行 - API Server 也会直接调用 Kubelet API(如 logs, exec, attach 等) ,默认不校验
- Kubelet 证书,但可以通过 --kubelet-certificate-authority 开启(而 GKE通过 SSH 隧道保护它们之间的通信)
比如典型的创建 Pod 的流程为:
- 用户通过 REST API 创建一个 Pod
- API Server 将其写入 etcd
- Scheduluer 检测到未绑定 Node 的 Pod,开始调度并更新 Pod 的 Node 绑定
- Kubelet 检测到有新的 Pod 调度过来,通过 Container Runtime 运行该 Pod
- Kubelet 通过 Container Runtime 取到 Pod 状态,并更新到 API Server 中