Kubernetes详解:了解驱动现代基础设施的关键组件⚙️
由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!
📖 简介
大家好,在今天的节目中,我们将探讨 Kubernetes 的关键组件。在上一集中,我们了解了 Kubernetes 对软件工程的重要性,以及几乎所有大型公司都依赖它的原因。我们将通过示例和图示来帮助大家理解 Kubernetes 的基本功能。
让我们深入了解一下!🚢
📒 词汇表:
以下是本文中使用的一些常用词汇和术语。这将有助于您在阅读全文之前建立基本的理解。
容器:
容器是一种标准化的软件单元,它将应用程序的代码及其所有依赖项、库和运行所需的配置文件打包在一起。容器确保软件无论在何种环境下都能保持一致的运行状态。常见的容器技术包括 Docker 和 Kubernetes。
分布式系统:
分布式系统是由多个独立的计算机或节点组成的集合,这些计算机或节点协同工作,最终向用户呈现为一个统一的系统。这些系统通过网络相互通信,协调任务、共享资源并实现共同目标。
守护进程:
在容器编排领域,守护进程指的是无需用户干预即可持续运行和管理任务的后台服务或进程。
生产环境:
生产环境是指应用程序或服务向最终用户开放的环境。在此环境中,应用程序需要稳定、高效、安全地运行,通常是在真实的流量条件下,并且配置已针对性能进行了优化。
API:
API(应用程序编程接口)是一组规则和定义,它允许不同的软件应用程序相互通信。API 定义了请求的发送方式、数据的结构以及响应的接收方式。API 通常用于 Web 服务(例如 REST、GraphQL)、硬件、操作系统等领域。
YAML:
YAML(YAML Ain't Markup Language,意为“YAML 不是标记语言”)是一种易于阅读的数据序列化格式,常用于配置文件。YAML 使用层次化缩进来表示数据结构,例如映射、列表和标量值。它易于读写,因此在容器配置和资源编排中非常流行。
🏗️建筑
什么是Kubernetes集群?
Kubernetes 集群是由一组称为节点的机器组成,这些机器可以运行容器化应用程序。Kubernetes 采用基于客户端-服务器模型的分布式架构来编排容器。Kubernetes 架构由两个核心组件构成:
👨🏻⚖️ 主节点
🧠 控制平面
集群的大脑,负责管理集群状态。在生产环境中,控制平面通常运行在跨多个数据中心区域的多个节点上。第二部分是一组工作节点。这些节点运行容器化应用程序工作负载。容器化应用程序运行在 Pod 中。
什么是Pod?
Pod 是 Kubernetes 中最小的可部署单元。一个 Pod 可以托管一个或多个容器,并为这些容器提供共享存储和网络。Pod 由 Kubernetes 控制平面创建和管理,是 Kubernetes 应用的基本构建模块。
现在让我们更深入地了解一下控制平面。它由几个核心组件组成,例如 API 服务器、调度器和控制器管理器等。
🤖 API 服务器:
这是控制平面与集群其他部分之间的主要接口。它公开了一个 RESTful API,允许客户端与控制平面交互并提交管理集群的请求。API 服务器是 kubectl 的网关,kubectl是一个命令行工具,用于通过 API 与控制平面通信。
例如该命令
kubectl run "pod-name" --image="image-name"
用于创建具有所需pod 名称和所需镜像名称的Pod。
💾等等
etcd 是一个开源的分布式键值存储系统,在 Kubernetes 控制平面中扮演着至关重要的角色。它存储集群的持久状态。在 Kubernetes 中,etcd 作为主数据存储,存储所有集群数据,包括配置、状态和元数据。API 服务器使用 etcd 来检索和更新集群状态,确保集群的实际状态与用户和管理员定义的期望状态保持一致。
有趣的是:ETCD 由“etc”和“d”两个词组成。“etc”源自 UNIX 目录“/etc”,该目录用于存放配置文件,“d”代表“分布式”。
📓 日程安排:
调度器负责将 Pod 调度到集群中的工作节点上。它利用 Pod 所需的资源信息以及工作节点上的可用资源来做出放置决策。
在集群中,满足 Pod 调度要求的节点被称为可行节点。如果没有合适的节点,Pod 将保持未调度状态,直到调度器能够将其放置到合适的节点上。
Kube-scheduler 分两步为 Pod 选择节点:
-
过滤:
过滤步骤用于识别可以调度 Pod 的节点。完成此步骤后,节点列表将包含合适的节点(通常不止一个)。如果列表为空,则表示 Pod 尚不可调度。 -
评分:
在评分步骤中,调度器对剩余节点进行排名,以选择最适合 Pod 的放置位置。每个通过筛选的节点都会根据生效的评分规则获得一个分数。
最后,kube-scheduler 将 Pod 分配给排名最高的节点。如果存在多个得分相同的节点,kube-scheduler 会随机选择其中一个。
🧑🏻💼 控制器经理:
控制器管理器负责运行管理集群状态的控制器。复制控制器确保 Pod 的所需副本数量正在运行,部署控制器管理部署的滚动更新和回滚,端点控制器管理服务的端点。
图 1:主节点主要组件概览
👷🏻 工作节点
运行在工作节点上的 Kubernetes 的核心组件包括 kubelet、容器运行时和 kube-proxy。
📦 Kubelet
kubelet 是一个运行在每个工作节点上的守护进程。它是每个节点上运行的主要节点代理,负责与控制平面通信。它可以通过以下方式之一向 API 服务器注册节点:主机名;用于覆盖主机名的标志;或云提供商的特定逻辑。它从控制平面接收关于要在节点上运行哪些 Pod 的指令,并确保 Pod 维持在期望的状态。kubelet
基于 PodSpec 工作。它接收一组 PodSpec,并确保这些 PodSpec 中描述的容器正在运行且健康。kubelet
不管理非 Kubernetes 创建的容器。
以下是一个 PodSpec 示例:
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
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:
name: nginx-config-map
restartPolicy: Always
在此上下文中,Kubelet 读取 PodSpec 文件,并指示容器运行时下载容器镜像“nginx:latest”。接下来,它运行容器并挂载 spec.volumes 中定义的卷。Kubelet 分配 spec.resources 中定义的资源,并监控容器的运行状况。
⚙️容器运行时
容器运行时在工作节点上运行容器。它负责从镜像仓库拉取容器镜像,启动和停止容器,并管理容器资源。Kubernetes 支持多种容器运行时,例如 containerd、CRI-O 以及 Kubernetes CRI(容器运行时接口)的任何其他实现。容器运行时分为两种类型:底层容器运行时和高层容器运行时。由于这是一个广泛的主题,我将在以后的文章中详细阐述运行时容器的概念。
💻 代理
kube-proxy 是一个运行在每个工作节点上的网络代理。它负责将流量路由到正确的 Pod,并为 Pod 提供负载均衡,确保流量均匀分布在各个 Pod 之间。kube-proxy 安装完成后,会向 API 服务器进行身份验证。当添加或删除新的服务或端点时,API 服务器会将这些更改通知给 kube-proxy,然后 kube-proxy 会将这些更改应用为 NAT 规则。当流量发送到某个服务时,它会根据这些规则被重定向到后端 Pod。以上是对容器运行时的简要介绍,主要内容是 kube-proxy 及其主要功能,我将在后续文章中详细阐述所有这些概念。
图2:Kubernetes集群主要组件概览,包括一个主节点和两个工作节点。第一个工作节点上运行着5个微服务Pod,第二个工作节点上运行着3个微服务Pod。
🚀 结论
Kubernetes 组件是技术和复杂基础设施的绝佳范例。今天我们探讨了核心组件如何工作和交互,从而实现高效的应用程序部署和扩展。在下一集中,我将向您展示如何启动您的第一个 Kubernetes 集群以及如何部署应用程序!
感谢阅读!🙏
文章来源:https://dev.to/lorenzo_tettamanti/kubernetes-explained-understanding-the-key-components-driven-modern-infrastruct-4eef

