嗨,大家好,今天我们这期节目将探讨 Kubernetes 的关键组件。在上一期节目里,我们了解了 Kubernetes 对软件工程为何如此重要,以及为什么几乎每一家大公司都离不开它。我们会通过示例和插图来帮助大家理解 Kubernetes 的核心功能。
让我们开船啦!🚀
📒 词汇表:这里有一些本文中常见的词汇和术语。这将帮助你在阅读完整文章前建立基本的理解。
容器:
容器是一种标准化的软件包,它打包了应用代码及其所有运行所需的依赖项、库和配置文件。容器确保软件在不同环境中也能保持一致的行为。常见的容器技术有 Docker 和 Kubernetes。
分布式系统:
分布式系统是一组独立的计算机或节点,它们共同为用户提供一个统一的系统视图。这些系统通过网络互相通信,任务协调,资源共享,以实现共同目标。
守护进程:
在容器编排领域,守护进程指的是一个后台进程,它会持续运行并管理任务,不需要用户干预。
生产环境:
生产环境是指应用或服务提供给最终用户使用的环境。在此环境中,应用程序需要稳定、高效且安全地运行,通常是在实际流量条件下运行,并且配置已经过优化以提高性能。
API(接口):
API(接口)是一套规则和定义,它让不同的软件应用程序能够互相通信。API 规定了如何发送请求、数据的格式以及如何接收响应。API 常用于 web 服务(比如 REST 和 GraphQL)、硬件、操作系统等。
YAML:
YAML (YAML 不是标记语言) 是一种易于阅读和书写的序列化格式,通常用于配置文件。YAML 使用分层缩进表示数据结构,如键值对、列表和标量值。它因此在容器配置和资源编排等领域非常流行。
Kubernetes 集群是什么?
Kubernetes集群是一组可以运行容器化应用程序的机器,这些机器被称为节点。Kubernetes采用基于客户端-服务器架构的分布式模型来管理容器。Kubernetes架构由两个核心组件组成:
👨🏻⚖️ 主节点(Master Node)🧠 控制台
集群的中枢。它负责管理集群的状态。在生产环境中,控制平面通常分布在多个节点上运行,这些节点跨越多个数据中心区域。第二个部分是一组工作节点。这些节点运行容器化应用程序工作负载。容器化应用程序则运行在 Pod 中。
什么是 Pod?(Pod 是 Kubernetes 中的基本部署单元。)Pod 是 Kubernetes 中最小的可部署单元,用于部署应用程序。一个 Pod 可以托管一个或多个容器,同时为这些容器提供共享存储和网络资源。Pod 由 Kubernetes 控制平面创建和管理,以确保它们的正常运行。它们是 Kubernetes 应用程序的基本构建块,构成更复杂的系统。
现在让我们深入了解一下控制面。它由几个核心组件组成,例如,API服务器、调度器和控制器管理器。
🤖 API接口:
这是控制平面和其他集群部分之间的主要接口。它提供了一个RESTful API,允许客户端通过API与控制平面交互并管理集群。API服务器是kubectl的网关,用于支持用户通过API与控制平面进行交互。
例如,这个命令
运行命令:kubectl run "pod名称" --image="镜像名称"
请点击这里进入全屏模式 请点击这里退出全屏模式
用于创建一个名为 pod-name 的 Pod,并使用所需的 image-name 镜像。
💾 etcd (一个分布式键值存储系统)
Etcd 是一个开源的分布式键值存储,在 Kubernetes 控制平面中扮演着至关重要的角色。在 Kubernetes 中,etcd 作为主要的数据存储,存储了所有的集群数据,包括配置信息、状态信息和元数据。API 服务器使用 etcd 来检索和更新集群的状态,以确保集群的实际状态与用户和管理员定义的理想状态一致。
有趣的事实:ETCD 由 “etc” 和 “d” 这两个词组成。“etc” 来自 UNIX 目录 “/etc”,存放各种配置文件,而 “d” 代表 “分布式”
📓 日程安排器:
调度器负责将 pod 安排到集群中的工作节点上。它利用 pod 所需的资源需求信息和工作节点上可用的资源需求信息来做出调度决定。
在集群中,满足 Pod 调度要求的节点被称为符合条件的节点。如果没有合适的节点,pod 将未被调度,直到调度器能安排它为止。
Kube 调度器通过两步流程为容器 Pod 选择一个合适的节点,
-
过滤:
过滤步骤确定哪些节点可以调度 Pod。经过这一步骤后,列表中包含合适的节点(通常不止一个)。如果列表为空,则 Pod 当前无法被调度。 - 打分:
在打分步骤中,调度器会根据通过过滤的节点进行排名,以选择最佳的 Pod 安置。根据当前的打分规则,每个通过过滤的节点都会得到一个分数。
最后,kube-scheduler 将 Pod 分配给得分最高之一的 Node。如果有多个 Node 得分一样,kube-scheduler 就会随机挑选一个。
🧑💼 控制台负责人:
控制管理器负责运行管理集群状态的控制器。副本控制器确保期望的副本数量在运行中,部署控制器管理部署的滚动更新与回滚,而端点控制器管理服务端点。
图1:如图所示,主节点的主要组件摘要
👷🏻 工节点 (即工人节点)运行在工作节点上的Kubernetes的核心组成部分包括kubelet、容器运行时环境和kube-proxy。
📦 Kubelet
kubelet 是在每个工作节点上运行的一个守护进程。它是运行在每个节点上的主要节点代理。它负责与控制平面通信。它可以通过以下几种方式将节点注册到 apiserver:主机名,一个覆盖主机名的标志,或特定于云提供商的逻辑。它从控制平面接收关于在节点上运行哪些 Pod 的指令,并确保这些 Pod 的状态符合期望。
kubelet 根据 PodSpec 进行工作。它接收一组 PodSpec 并确保其中描述的容器在运行且健康。
kubelet 不管理由其他程序创建的容器。
这里有一个 PodSpec 的示例:
apiVersion: v1
kind: Pod # Pod: 单元
metadata:
name: nginx-pod
labels:
app: nginx # nginx: 一个流行的 Web 服务器
spec:
containers:
- name: nginx-container
image: nginx:latest
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
volumeMounts:
- name: nginx-config
mountPath: /etc/nginx/conf.d
volumes:
- name: nginx-config
configMap: # configMap: 配置映射,用于存储配置数据
name: nginx-config-map
restartPolicy: Always # restartPolicy: 重启策略,定义了容器在何时重启
全屏 / 退出全屏
在此上下文中,Kubelet 读取 PodSpec 并告诉容器运行时去下载容器镜像 "nginx:latest",接着它运行容器并挂载定义的卷。Kubelet 分配所需资源并监控容器的健康。
⚙️ 容器运行时环境
容器运行时在工作节点上运行容器,并负责从注册表中拉取容器镜像,启动和停止容器,管理容器的资源。Kubernetes支持诸如containerd、CRI-O以及其他实现了Kubernetes CRI(容器运行时接口)的容器运行时。容器运行时有两种类型:底层容器运行时和高层容器运行时。由于这个话题很广泛,我会在以后的文章中进一步讨论容器运行时的相关概念。
💻 代理
kube-proxy 是运行在每个工作节点上的网络代理组件,负责将流量导向正确的 pod。它还为 pod 提供负载均衡,确保流量均匀分布在它们之间。安装 kube-proxy 后,它会与 API 服务器进行认证,当添加或移除新的服务或端点时,API 服务器会通知 kube-proxy 这些变更,然后 kube-proxy 会根据这些变更应用 NAT 规则。当流量发送到服务时,会根据这些规则被重定向到后端的 Pod。关于容器运行时,这是关于 kube-proxy 及其主要功能的一个简短介绍,我将在专门的文章中详细讲解这些概念。
图2:Kubernetes集群主要组件的概述,该集群包含一个主节点和两个工作节点。第一个工作节点上有5个运行微服务的Pod,第二个工作节点上有3个运行类似服务的Pod
🚀 总结Kubernetes组件是技术和复杂的基础架构美妙的例证。今天,我们探讨了核心组件的工作原理及其交互方式,以实现高效的应用部署和扩展性。下一期我们将教你如何启动你的第一个Kubernetes集群,以及如何部署你的第一个应用程序!
谢谢大家的阅读!希望你喜欢!🙏