概述
概述
Kubernetes 这个名字源于希腊语,意为“舵手”或“飞行员”。K8s 这个缩写是因为 K 和 s 之间有 8 个字符的关系。Google 在 2014 年开源了 Kubernetes 项目。
Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,方便进行声明式配置和自动化。
Kubernetes 为你提供了一个可弹性运行分布式系统的框架。具体而言,Kubernetes 为你提供:
服务发现和负载均衡:Kubernetes 可以使用 DNS 名称或自己的 IP 地址来暴露容器。 如果进入容器的流量很大, Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。
存储编排:Kubernetes 允许你自动挂载你选择的存储系统,例如本地存储、公共云提供商等。
自动部署和回滚:你可以使用 Kubernetes 描述已部署容器的所需状态, 它可以以受控的速率将实际状态更改为期望状态。 例如,你可以自动化 Kubernetes 来为你的部署创建新容器, 删除现有容器并将它们的所有资源用于新容器。
自动完成装箱计算:你为 Kubernetes 提供许多节点组成的集群,在这个集群上运行容器化的任务。 你告诉 Kubernetes 每个容器需要多少 CPU 和内存 (RAM)。 Kubernetes 可以将这些容器按实际情况调度到你的节点上,以最佳方式利用你的资源。
自我修复:Kubernetes 将重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器, 并且在准备好服务之前不将其通告给客户端。
密钥与配置管理:Kubernetes 允许你存储和管理敏感信息,例如密码、OAuth 令牌和 SSH 密钥。 你可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。
批处理执行:除了服务外,Kubernetes 还可以管理你的批处理和 CI(持续集成)工作负载,如有需要,可以替换失败的容器。
水平扩缩:使用简单的命令、用户界面或根据 CPU 使用率自动对你的应用进行扩缩。
IPv4/IPv6 双栈:为 Pod(容器组)和 Service(服务)分配 IPv4 和 IPv6 地址。
为可扩展性设计:在不改变上游源代码的情况下为你的 Kubernetes 集群添加功能。
架构与组件
Kubernetes 集群由控制平面和一个或多个工作节点(Node)组成。工作节点托管着组成应用负载的 Pod,控制平面管理集群中的工作节点和 Pod。在生产环境中,控制平面通常跨多台计算机运行,而一个集群通常运行多个节点,以提供容错和高可用。下面描述了一个正常运行的 Kubernetes 集群所需的各种组件:
组件图 | 架构图 |
---|---|
PS:Kubernetes 允许灵活地部署和管理这些组件。此架构可以适应各种需求,从小型开发环境到大规模生产部署。有关每个组件的详细信息以及配置集群架构的各种方法, 请参阅集群架构页面。
组件
控制平面组件
管理集群的整体状态,在老版本中称之为 Master。
- apiserver:核心的组件 server,用以暴露 Kubernetes HTTP API
- etcd:具备一致性和高可用性的键值存储,用于所有 API 服务器的数据存储
- scheduler:查找尚未绑定到节点的 Pod,并将每个 Pod 分配给合适的节点
- controller-manager:运行控制器来实现 Kubernetes API 行为
- cloud-controller-manager(可选):与底层云驱动集成
Node 组件
在每个节点上运行,维护运行的 Pod 并提供 Kubernetes 运行时环境。
- kubelet:确保 Pod 及其容器正常运行。
- kube-proxy(可选):维护节点上的网络规则以实现 Service 的功能。
- Container runtime:容器运行时,负责运行容器的软件(阅读容器运行时以了解更多信息)。
插件
插件扩展了 Kubernetes 的功能。一些重要的例子包括:
- DNS:集群范围内的 DNS 解析
- Web 界面(Dashboard):通过 Web 界面进行集群管理
- 容器资源监控:用于收集和存储容器指标
- 集群层面日志:用于将容器日志保存到中央日志存储
分层架构
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、集群自身的配置和管理等
Kubernetes API
Kubernetes API 使你可以查询和操纵 Kubernetes 中对象的状态。Kubernetes 控制平面的核心是 API 服务器和它暴露的 HTTP API,用户、集群的不同部分以及外部组件都通过 API 服务器相互通信。
大部分操作都可以通过 kubectl
命令行接口或类似 kubeadm
这类命令行工具来执行, 这些工具在背后也是调用 API。不过,你也可以使用 REST 调用来访问这些 API。 Kubernetes 为那些希望使用 Kubernetes API 编写应用的开发者提供一组客户端库。
Node
Pod 总是运行在**节点(Node)**上,节点可以是一个虚拟机或者物理机器,取决于所在的集群配置。每个节点包含运行 Pod 所需的服务,这些节点由控制面负责管理。节点可以有多个 Pod,Kubernetes 控制面会自动处理在集群中的节点上调度 Pod。通常集群中会有若干个节点,而在一个学习所用或者资源受限的环境中,你的集群中也可能只有一个节点。
节点上的组件至少包括:
- kubelet:负责 Kubernetes 控制面和节点之间通信的进程,它管理机器上运行的 Pod 和容器。
- 容器运行时:负责从镜像仓库中提取容器镜像、解压缩容器以及运行应用,如 Docker。
无状态服务 vs 有状态服务
无状态:
- 代表应用:Nginx
- 优点:对客户端透明,无依赖关系,可以高效实现扩容、迁移
- 缺点:不能存储数据,需要额外的数据服务支撑
有状态:
- 代码应用:MySQL, Redis
- 优点:可以独立存储数据,实现数据管理
- 缺点:集群环境下需要实现主从、数据同步、备份、水平扩容复杂