这是非云环境中 Kubernetes 的配置和运行系列的第四篇文章,本文将主要介绍 Kubernetes 的架构及主要组件,包括 Pods、服务、卷、命名空间等。
想要先睹为快的读者,可直接克隆该项目的 GitHub 代码库。代码库中的文档正在持续改进中,并完全可用。代码库地址为: mvallim/kubernetes-under-the-hood
Kubernetes
“Kubernetes 是一种用于管理容器化工作负载和服务的可移植、可扩展的开源平台,便于声明式配置和自动化。Kubernetes 生态系统规模庞大,且增长快速,其服务,支持和工具已得到广泛使用。
“Google 于 2014 年开源了 Kubernetes 项目。Kubernetes 的建立基于 Google 十五年大规模生产工作负载的经验,并综合了来自社区的最佳思考和实践。
引用自: https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/
Kubernetes 的优点包括:
敏捷应用开发和部署:与使用虚拟机镜像相比,Kubernetes 改进了容器镜像创建的便捷性和效率。
容器开发、集成和部署:支持高频次、可靠的容器镜像构建和部署,并由于镜像的不可更改性,使得回滚更为快速和简单
有效隔离开发(Dev)和运维(Ops):应用容器镜像创建是在构建/发布阶段,而非部署阶段,使应用得以从架构中解耦。
可观察性(Observability):不仅涵盖操作系统层级的信息和度量,而且涉及应用健康等深层信息。
跨开发、测试和生产的环境一致性:无论对于云环境中,还是在个人笔记本上,都具有一致的运行环境。
云/操作系统发行版的可移植性:可运行在任何环境中,包括 Debian、Ubuntu、CoreOS、本地部署、Google Kubernetes Engine、Amazon Elastic Container Service 等。
以应用为中心的管理:将抽象层级从在虚拟硬件上运行操作系统,提升为使用逻辑资源在操作系统上运行应用。
松耦合、分布式、弹性、无约束的微服务:应用切分为可动态部署并管理的更小尺度独立部分,而非运行在专用机器上的单体应用。
资源隔离:支持应用性能可预测。
资源使用:更高效、更紧密。
引用自: https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/
为尽可能提供完备的功能,Kubernetes 依赖并使用了其它一些开源工具。其中包括:
注册:例如 Docker Registry。
遥测:例如 Prometheus、 Sysdig和 Istio。
服务:对于过去常用应用模式创建的内容,支持以多种目录形式提供。
Kubernetes 架构
图 Kubernetes 架构
Kubernetes 管理的集群通常具有两个主要操作单元:主节点(Master)和工作节点(Worker)。
主节点(Master):负责编排运行在工作节点上的所有容器相关活动。其中,主节点负责安排和部署集群应用,获取工作节点和 Pod 的相关信息。
工作节点(Worker):是支持 Kubernetes 所管理容器得以有效运行的机器(节点)。工作节点可以是物理机,也可以是虚拟机。为了使工作节点可被 Kubernetes 管理,必须在其上安装 Kubernetes 的 Kubelet 代理。工作节点通过 Kubelet 代理完成与主机的所有通信,实现执行集群操作。
Kubernetes 主节点从开发人员/运维人员(即 DevOps)处接收指令,并传递给工作节点。这些指令由一组服务做处理,并重新传输。上述服务可自动确定最适合处理所请求任务的工作节点,然后将资源分配并指定给满足所请求指令的选定工作节点。
容器管理运行在更高层级上,其中已充分考虑工作细节。容器和工作节点的运作,无需手工主动干预。
主节点和工作节点的组件
容器网络接口(CNI,Container network interface):该网络插件遵循 appc/CNI 规范。规范支持运行在不同节点上的 Pod 间的连接,并支持灵活集成 overlays、纯第三层网络(pure L3)等多种网络解决方案。
Kubernetes 和 CNI 相关信息,可参见官方文档“ Network plugins”。
etcd:支持高可用和一致性的键值存储,用于 Kubernetes 中所有集群数据的存储。如果 Kubernetes 集群的后台存储使用 etcd,需确保具有针对集群数据的备份计划。
api-server: 用于提供 Kubernetes API 的主节点组件。API 服务是 Kubernetes 控制平台(Control Plane)的前端,设计上考虑了水平扩展,即随部署实例数量而扩展的能力。
控制平台:容器编排层,提供用于定义、部署和管理容器生命周期的 API 和接口。
调度程序(Scheduler):主节点上的组件,用于监视新创建且未分配给工作节点的 Pod,并调度一个工作节点运行该 Pod。调度策略中考虑的因素包括:个体和全部资源需求、硬件/软件/策略约束,亲和性和反亲和性(affinity and anti-affinity)规范、数据的本地性、工作负载间的干扰和最后期限等。
Controller manager:主节点上运行控制器的组件。每个控制器在逻辑上是独立的进程,但是为了降低复杂性,它们被编译为一个二进制文件,以单个进程运行。
kubelet:运行在工作节点上的服务。kubelet 读取 Pod 清单(manifests),确保清单中定义的容器已启动并处于运行状态。
containerd:容器运行时,注重于容器的简单性、鲁棒性和可移植性。在 Linux 或 Windows 上,containerd 是以守护程序形式运行的容器运行时,负责获取和存储容器映像、执行容器、提供网络访问等。在我们的解决方案中,我们使用 Docker 实现上述功能。
Kube Proxy:运行在群集中每个工作节点上的网络代理。Kube-proxy 负责请求转发,通过一组后端功能支持 TCP/UDP 流转发和轮询转发。
参考资料: https://kubernetes.io/docs/reference/glossary/?fundamental=true
Kubectl
图片来源: RisingStack
kubectl 命令行工具提供与 Kubernetes API 服务的交互。用户可使用 kubectl 创建、更新和删除 Kubernetes 对象。
Docker 简述
Docker 功能可直接使用。不同之处在于,Kubernetes 在配置 Pod 时,将指令发送给选定工作节点的 kubelet,其中指定 Docker 去启动或停止容器。进而,kubelet 继续从 Docker 及其容器中收集信息,并将所有这些信息汇总给主节点。其中的主要差异之处在于,所有这些操作都是自动进行的,无需管理员必须手动完成配置和信息收集。
Kubernetes 的关键对象
下面简要介绍 Kubernetes 所管理的每个关键对象。细节将在 Kubernetes 之旅系列的下一篇文章中推出。
Pod:最小、最简的 Kubernetes 对象。Pod 表示了一组集群中正在运行的容器。Pod 的运行模式通常设置为单个主容器,也可选择添加对日志支持等辅助功能的挎斗模式(sidecar)容器。Pod 通常由 Deployment 管理。
Deployment:管理复制(replicated)应用的 API 对象。 每个副本表示为一个分布在集群工作节点间的 Pod。
Service:描述 Pods 等应用访问方式的 API 对象,支持对端口和负载平衡器的描述。访问接入点可位于群集的内部或外部。
卷(Volume):是包含数据并对 Pod 容器可访问的目录。Kubernetes 卷的生命周期与包含它的 Pod 一致。因此,卷的寿命超过 Pod 中运行的所有容器,并且在容器重启后保留数据。
文件系统:在 Kubernetes 中,每个容器都可以在其自身的文件系统中执行读写操作。但是,容器重启或删除后,写入该文件系统的数据将被破坏。
卷:Kubernetes 具有卷。只要 Pod 存在,Pod 中的卷就将存在。卷可在同一 Pod 容器间共享。Pod 重启或移除后,卷将被破坏。
持久卷:Kubernetes 具有持久卷。持久卷提供 Kubernetes 集群中的长期存储。持久卷寿命超出容器、Pods 和工作节点。只要 Kubernetes 集群存在,持久卷就存在。Pod 可声明使用持久卷读取、写入和读写。
命名空间(Namespace):一种 Kubernetes 用于支持在同一物理集群上的多个虚拟集群的抽象。命名空间用于组织集群中的对象,并提供了一种集群资源的划分方法。资源名称在同一命名空间中必须唯一,但在多个命名空间之间则不必唯一。
参考资料: https://kubernetes.io/docs/reference/glossary/?fundamental=true
原文链接:
Kubernetes Journey — Up and running out of the cloud — Kubernetes Overview
评论