Kubernetes的“厨房”:架构是菜谱,组件是厨具,资源对象是食材(下)

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
可观测链路 OpenTelemetry 版,每月50GB免费额度
可观测监控 Prometheus 版,每月50GB免费额度
简介: 本文深入探讨了Kubernetes(K8s)的架构、核心组件以及资源对象。Kubernetes作为一个开源的容器编排系统,通过其独特的架构设计和丰富的组件,实现了对容器化应用程序的高效管理和扩展。通过本文的介绍,读者可以深入了解Kubernetes的架构、核心组件以及资源对象,从而更好地应用和管理容器化应用程序。Kubernetes的灵活性和可扩展性使得它成为容器编排领域的领先者,为企业提供了强大的容器运行环境。

 

image.gif 编辑

🐇明明跟你说过:个人主页

🏅个人专栏:《Kubernetes航线图:从船长到K8s掌舵者》 🏅

🔖行路有良友,便是天堂🔖

四、Kubernetes资源对象

1、Pod : Kubernetes的最小部署单元

在 Kubernetes 中,Pod 是最小的部署单元,它是一组紧密关联的容器的集合,共享相同的网络命名空间和存储卷。Pod 通常用于运行一个或多个紧密耦合的容器,并提供了一种简单而灵活的方式来管理这些容器的生命周期和资源。

Pod的一些特性和用途:

  1. 容器的逻辑组合:Pod 可以包含一个或多个容器,这些容器共享相同的网络命名空间、IP 地址和存储卷,可以相互通信和共享数据,从而实现了容器之间的紧密集成和协作。
  2. 共享网络命名空间:Pod 中的所有容器共享同一个网络命名空间,它们可以通过 localhost 来进行相互通信,无需额外的网络配置。这样可以简化容器之间的通信,并提高通信的性能和效率。
  3. 共享存储卷:Pod 中的所有容器可以共享同一个存储卷,用于共享数据和持久化存储。这样可以实现容器之间的数据共享和持久化,例如在多个容器之间共享配置文件、日志文件等。
  4. 生命周期管理:Pod 作为一个整体单元进行管理,可以统一管理 Pod 中的所有容器的生命周期,包括启动、停止、重启等操作。这样可以确保容器之间的一致性和可靠性。
  5. 调度和资源管理:Pod 可以被 Kubernetes 调度到集群中的任意节点上运行,根据节点的资源情况和调度策略进行分配。Pod 可以指定资源需求和限制,以便 Kubernetes 进行资源管理和调度。

image.gif 编辑

2、Service:服务发现与负载均衡

在 Kubernetes 中,Service 是一种抽象,用于定义一组 Pod 的逻辑集合,并为它们提供统一的访问入口。Service 提供了服务发现和负载均衡的功能,使得客户端可以通过访问 Service 的虚拟 IP 地址来访问后端 Pod,而无需直接关注后端 Pod 的具体 IP 地址和端口。

1. Service的一些特性和用途:

  1. 服务发现:Service 为后端 Pod 提供了稳定的虚拟 IP 地址和 DNS 记录,客户端可以通过访问 Service 的虚拟 IP 地址或 DNS 名称来发现和访问后端 Pod,无需直接关注后端 Pod 的具体地址和端口。
  2. 负载均衡:Service 可以将客户端的请求分发到后端 Pod 上,以实现负载均衡和高可用性。根据 Service 的类型和配置,Kubernetes 会使用不同的负载均衡算法,如轮询、最小连接数等,将请求分发到多个后端 Pod 上。
  3. 稳定的虚拟 IP 地址:Service 为后端 Pod 提供了一个稳定的虚拟 IP 地址,即 ClusterIP,这个 IP 地址由 Kubernetes 管理,并且在后端 Pod 发生变化时保持不变,从而确保了客户端与后端 Pod 之间的连接稳定性。
  4. 多种类型:Kubernetes 支持多种类型的 Service,包括 ClusterIP、NodePort、LoadBalancer 等。每种类型的 Service 都提供了不同的访问方式和负载均衡策略,可以根据实际需求选择合适的类型。
  5. 头部服务:Service 还可以作为其他资源对象的头部服务(Headless Service),不会分配 ClusterIP,但会为每个 Pod 分配一个 DNS 记录,用于服务发现和连接管理

image.gif 编辑

2. Service的类型:

ClusterIP:

  • ClusterIP 类型的 Service 提供了集群内部的服务发现和负载均衡功能。它为 Service 分配一个集群内部的虚拟 IP 地址,该 IP 地址只能在集群内部访问,用于提供给集群内部的其他 Pod 使用。

NodePort:

  • NodePort 类型的 Service 在 ClusterIP 的基础上,通过在每个节点上暴露一个静态端口(NodePort)来提供集群外部的访问入口。外部客户端可以通过访问任意节点的 NodePort 来访问 Service,Kubernetes 将根据 NodePort 将流量转发到相应的后端 Pod。

LoadBalancer:

  • LoadBalancer 类型的 Service 是通过云服务提供商(如 AWS、GCP、Azure)提供的负载均衡器来实现服务的负载均衡和外部访问。Kubernetes 将通过云服务提供商的 API 创建一个负载均衡器,并将流量转发到后端 Pod。

ExternalName:

  • ExternalName 类型的 Service 用于将 Kubernetes 中的 Service 映射到集群外部的服务,例如 DNS 记录、外部负载均衡器等。它提供了一种简单的方式来访问集群外部的服务,而无需暴露集群内部的 IP 地址和端口。

Headless:

  • Headless 类型的 Service 不会为 Service 分配 ClusterIP,而是直接将 DNS 解析到后端 Pod 的 IP 地址。这种类型的 Service 通常用于需要直接访问每个 Pod 的场景,例如 StatefulSet。

 

image.gif 编辑

3. Service 与 Pod 的关联机制

在 Kubernetes 中,Service 与 Pod 之间的关联是通过标签选择器来实现的。Service 使用标签选择器来选择与之关联的一组 Pod,并为这些 Pod 提供统一的访问入口。

Service 与 Pod 的关联机制如下:

定义标签选择器:

  • 在创建 Service 时,需要指定一个标签选择器(label selector),用于选择与之关联的一组 Pod。标签选择器可以根据 Pod 的标签来选择 Pod,通常使用键值对的形式来定义。

匹配标签:

  • Kubernetes 根据标签选择器在集群中查找符合条件的 Pod。只有与标签选择器匹配的 Pod 才会被 Service 选中,并为其提供服务。

更新 Endpoints:

  • 一旦 Service 选择了一组符合条件的 Pod,它会将这些 Pod 的 IP 地址和端口信息存储到集群中的 Endpoints 对象中。Endpoints 对象记录了 Service 后端的实际地址,包括每个 Pod 的 IP 地址和端口。

流量转发:

  • 当外部客户端访问 Service 时,Kubernetes 将根据 Service 的类型将流量转发到对应的后端 Pod 上。对于 ClusterIP 类型的 Service,流量将被转发到集群内部的 Pod;对于 NodePort 类型的 Service,流量将被转发到每个节点上指定的 NodePort 上。

image.gif 编辑

 

3、Deployment:应用部署与管理

在 Kubernetes 中,Deployment 是用于管理应用程序部署的资源对象,它提供了一种声明式的方式来定义应用程序的部署配置,并确保部署的应用程序始终处于预期的状态。

1. Deployment 的一些关键特性和用途:

  1. 应用程序部署:Deployment 允许用户定义应用程序的容器镜像、副本数量、资源需求、网络和存储配置等部署规格。用户可以通过编写 Deployment 配置文件来描述应用程序的部署配置,然后将配置文件提交到 Kubernetes 集群中进行部署。
  2. 滚动更新:Deployment 支持滚动更新功能,允许用户在不影响应用程序可用性的情况下对应用程序进行更新。用户可以通过修改 Deployment 配置文件中的容器镜像版本或配置信息来触发滚动更新,Deployment 会自动逐步更新旧版本的 Pod,直至所有 Pod 都更新为新版本。
  3. 自愈机制:Deployment 具有自愈机制,可以自动检测和修复应用程序的异常状态。当发现 Pod 处于异常状态(如崩溃、无响应等)时,Deployment 会自动重新创建新的 Pod,确保应用程序始终处于可用状态。
  4. 水平扩展:Deployment 允许用户根据应用程序的负载情况进行水平扩展,自动调整副本数量以满足需求。用户可以通过修改 Deployment 配置文件中的副本数量来手动或自动进行水平扩展,Deployment 会根据集群的资源情况和负载情况自动调整副本数量。
  5. 版本回滚:Deployment 支持版本回滚功能,允许用户在更新失败或出现问题时回滚到先前的版本。用户可以通过执行 kubectl rollout undo 命令来触发版本回滚操作,Deployment 会自动将应用程序回滚到上一个稳定版本。

 

image.gif 编辑

2. Deployment的滚动更新与回滚

在 Kubernetes 中,Deployment 提供了滚动更新和回滚的功能,使得在不中断服务的情况下,可以轻松地对应用程序进行更新和版本回退。

滚动更新(Rolling Updates):

滚动更新允许用户将旧版本的 Pod 逐步替换为新版本的 Pod,从而实现无缝更新应用程序。在滚动更新过程中,Deployment 会逐步增加新版本的 Pod,同时逐步减少旧版本的 Pod,以确保应用程序的稳定性和可用性。

滚动更新的步骤如下:

  1. 用户修改 Deployment 的 Pod 模板或更新容器镜像的版本。
  2. Deployment 检测到配置变化后,开始逐步创建新版本的 Pod。
  3. Deployment 逐步停止和删除旧版本的 Pod,同时增加新版本的 Pod。
  4. 当所有 Pod 都已更新为新版本后,滚动更新完成。

image.gif 编辑

版本回滚(Rollback):

版本回滚允许用户在更新失败或出现问题时,将应用程序回滚到之前的稳定版本,以恢复应用程序的可用性和稳定性。在版本回滚过程中,Deployment 会自动将应用程序的副本数量调整为旧版本,并删除新版本的 Pod。

版本回滚的步骤如下:

  1. 用户触发版本回滚操作,通过执行 kubectl rollout undo 命令或通过编辑 Deployment 配置文件中的历史记录。
  2. Deployment 将应用程序的副本数量调整为旧版本,并开始删除新版本的 Pod。
  3. Deployment 逐步增加旧版本的 Pod,直至所有 Pod 都回滚到旧版本。
  4. 当所有 Pod 都已回滚到旧版本后,版本回滚完成。

 

image.gif 编辑

3. Deployment的伸缩策略

在 Kubernetes 中,Deployment 具有强大的伸缩策略,可以根据应用程序的负载情况和资源需求自动调整 Pod 的副本数量,从而实现应用程序的水平伸缩和自动化运维。

Deployment 的伸缩策略的几种常见方式:

  1. 手动伸缩 用户可以通过修改 Deployment 配置文件中的副本数量来手动伸缩应用程序的副本数量。通过增加或减少副本数量,用户可以手动调整应用程序的容量以满足需求。
  2. 自动伸缩 Kubernetes 支持基于 CPU 和内存等指标进行自动伸缩。用户可以创建 HorizontalPodAutoscaler (HPA) 对象来定义自动伸缩的规则和目标,HPA 会根据监控的指标动态调整 Deployment 中 Pod 的副本数量。例如,当 CPU 使用率超过一定阈值时,HPA 可以自动增加 Pod 的副本数量,以应对负载增加的情况。
  3. 基于时间的伸缩 Kubernetes 也支持基于时间的伸缩,用户可以根据特定的时间段或时间表来调整应用程序的副本数量。通过设置定时任务或计划任务,用户可以在高峰时段增加副本数量,而在低峰时段减少副本数量,以实现资源的最优利用。
  4. 事件驱动伸缩 Kubernetes 还支持基于事件的伸缩,用户可以根据特定的事件或触发器来自动调整应用程序的副本数量。例如,用户可以定义一个自定义的触发器,当收到特定的消息或事件时,自动触发 Deployment 的伸缩操作。

image.gif 编辑

4、其他常用资源对象

1. Volume:存储卷管理

在 Kubernetes 中,Volume(存储卷)是一种用于持久化存储数据的抽象概念,它提供了一种将存储与 Pod 中的容器进行解耦的方式,使得容器可以在不受影响的情况下挂载和共享存储资源。

Volume 的特性和用途:

  1. 持久化存储Volume 允许将数据持久化存储到独立于容器的存储介质中,如云存储、网络存储、本地磁盘等。这样可以确保数据在容器重新启动或迁移时不丢失。
  2. 共享存储Volume 允许多个容器共享同一个存储卷,从而实现容器之间的数据共享和通信。这对于需要多个容器之间共享数据的应用场景非常有用,如微服务架构中的共享配置文件、日志文件等。
  3. 解耦存储和容器Volume 将存储和容器解耦,使得容器可以在不同的节点上启动和迁移,而不受存储位置的限制。这样可以提高容器的灵活性和可移植性。
  4. 多种类型支持Kubernetes 支持多种类型的存储卷,包括空白存储卷、主机路径存储卷、空白存储卷、持久卷存储(Persistent Volume)、持久卷声明(Persistent Volume Claim)等。用户可以根据需求选择合适的存储卷类型。
  5. 动态创建Kubernetes 支持动态创建存储卷,可以根据用户的需求动态创建存储资源,并将其绑定到 Pod 中。这样可以简化存储管理和资源分配,提高了存储资源的利用率和效率。

image.gif 编辑

 

2. ConfigMap与Secret:配置信息管理

在 Kubernetes 中,ConfigMap 和 Secret 是用于管理应用程序配置信息的资源对象,它们可以帮助用户将配置信息从应用程序中解耦,并安全地传递给 Pod 中的容器。

ConfigMap

  • ConfigMap 是用于存储应用程序配置信息的资源对象,如环境变量、配置文件、命令行参数等。用户可以创建 ConfigMap 对象,并将配置信息存储为键值对的形式。
  • ConfigMap 可以通过多种方式注入到 Pod 中,如环境变量、卷挂载、命令行参数等。容器可以通过读取 ConfigMap 来获取应用程序的配置信息。
  • ConfigMap 是非敏感的信息,适用于存储不敏感的配置信息,如应用程序的默认配置、环境变量等。

image.gif 编辑

 

Secret

  • Secret 是用于存储敏感数据的资源对象,如密码、证书、密钥等。Secret 中的数据会被加密存储,并且只有授权的用户可以访问。
  • Secret 通常用于存储敏感的配置信息,如数据库密码、API 密钥、TLS 证书等。用户可以创建 Secret 对象,并将敏感数据存储到其中。
  • Secret 与 ConfigMap 类似,可以通过多种方式注入到 Pod 中,并提供给容器使用。容器可以通过读取 Secret 来获取敏感数据,并在应用程序中进行安全地使用。

3. DaemonSet、StatefulSet等高级对象介绍

在 Kubernetes 中,除了 Deployment、Service、ConfigMap 和 Secret 等基本对象外,还有一些高级对象用于管理特定类型的工作负载或提供特定的功能。其中包括 DaemonSet、StatefulSet 等。

DaemonSet(守护进程集)

 

  • 作用:DaemonSet 用于确保集群中每个节点都运行一个副本的 Pod,通常用于运行一些在集群中每个节点上都需要运行的守护进程或服务,如监控代理、日志收集器等。
  • 特点
  • 每个节点只能运行一个副本的 Pod,如果节点数量发生变化,DaemonSet 会自动调整 Pod 的数量,确保每个节点都有一个副本在运行。
  • 可以通过 NodeSelector、NodeAffinity 或 Taints/Tolerations 等方式控制 Pod 的调度策略,使得 Pod 可以被调度到特定的节点上运行。

StatefulSet(有状态副本集)

  • 作用:StatefulSet 用于管理有状态应用程序的部署,如数据库、缓存、队列等。StatefulSet 提供了对每个 Pod 的标识、稳定的网络标识符和持久化存储的支持,以确保有状态应用程序的稳定性和可靠性。
  • 特点
  • 每个 Pod 都有一个唯一的标识符和网络标识符(如 DNS 名称),使得 Pod 可以在重启、迁移或扩容时保持稳定。
  • 支持有状态应用程序的数据持久化存储,可以使用持久卷 (Persistent Volume) 或持久卷声明 (Persistent Volume Claim) 来为 Pod 提供持久化存储。
  • 支持有序的 Pod 启动和停止顺序,可以确保有状态应用程序在启动、扩容、迁移或停止时的稳定性和可靠性。

image.gif 编辑

 

除了 DaemonSet 和 StatefulSet 外,Kubernetes 还提供了其他一些高级对象,如 Job、CronJob、HorizontalPodAutoscaler 等,用于管理特定类型的工作负载或提供特定的功能。这些高级对象都可以帮助用户更好地管理和运维 Kubernetes 中的应用程序,并提供了丰富的功能和特性,以满足不同场景下的需求。

五、总结

1、Kubernetes在容器编排领域的地位

Kubernetes 在容器编排领域的地位可以说是非常显著的,它是目前最流行、最广泛使用的容器编排平台之一

 

领导地位:

  • Kubernetes 是由 Google 开源的容器编排平台,自从发布以来一直得到了全球开发者社区的广泛关注和支持。它已经成为了容器编排领域的事实标准,被广泛认可为业界最强大和成熟的容器编排解决方案。

生态系统:

  • Kubernetes 拥有庞大的生态系统,包括各种基于 Kubernetes 的开源项目、第三方工具和服务提供商。这些生态系统的发展和壮大为用户提供了丰富的功能和解决方案,使得 Kubernetes 可以在不同的场景下得到广泛应用和支持。

跨平台支持:

  • Kubernetes 提供了跨多种云平台和部署环境的支持,包括公有云、私有云、混合云、多云等环境。无论是在本地数据中心、公有云平台还是混合云环境中,都可以轻松地部署和管理 Kubernetes 集群。

开放标准:

  • Kubernetes 是一个开放标准的容器编排平台,符合 CNCF(Cloud Native Computing Foundation)制定的容器编排规范。它支持容器化应用程序的部署、扩展、管理和调度,并提供了丰富的 API 和插件机制,以满足不同场景下的需求。

持续创新:

  • Kubernetes 社区积极推动着 Kubernetes 平台的持续创新和发展,不断推出新的功能、特性和改进。每个版本的发布都带来了更多的新功能和改进,使得 Kubernetes 可以更好地满足用户不断增长的需求。

 

image.gif 编辑

2、未来发展趋势与挑战

  1. 多集群管理: 随着云原生应用的规模和复杂性不断增加,多集群管理将成为一个重要的趋势。Kubernetes 需要提供更强大和灵活的多集群管理功能,以支持在不同的环境中管理和协调多个 Kubernetes 集群。
  2. 混合云和多云: 混合云和多云环境的兴起将带来新的挑战和需求。Kubernetes 需要支持在不同的云平台和部署环境中无缝运行和管理应用程序,实现跨云的应用部署和数据管理。
  3. 服务网格和微服务治理: 随着微服务架构的普及,服务网格和微服务治理将成为 Kubernetes 的重要组成部分。Kubernetes 需要提供更强大和灵活的服务发现、负载均衡、流量管理、故障恢复等功能,以支持微服务应用程序的部署和运行。
  4. 安全和合规性: 安全和合规性将始终是 Kubernetes 发展的重要关注点。Kubernetes 需要提供更加严格和可靠的安全机制,包括身份认证、访问控制、网络隔离、加密通信等,以确保应用程序和数据的安全性和合规性。
  5. 自动化运维: 自动化运维是 Kubernetes 发展的重要趋势之一。Kubernetes 需要提供更多的自动化运维功能,包括自动化部署、滚动更新、自动伸缩、故障自愈等,以减少人工操作和提高运维效率。
  6. 生态系统发展: Kubernetes 的生态系统将继续发展壮大,包括各种基于 Kubernetes 的开源项目、第三方工具和服务提供商。Kubernetes 需要与更多的生态系统整合,以满足用户不断增长的需求和场景。

 

image.gif 编辑

💕💕💕每一次的分享都是一次成长的旅程,感谢您的陪伴和关注。希望这些关于Docker的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!😺😺😺

🧨🧨🧨让我们一起在技术的海洋中探索前行,共同书写美好的未来!!!

 

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
5天前
|
弹性计算 Kubernetes 安全
Kubernetes 的架构问题之在Serverless Container中保障应用的安全防护如何解决
Kubernetes 的架构问题之在Serverless Container中保障应用的安全防护如何解决
31 8
|
5天前
|
Kubernetes 监控 Cloud Native
"解锁K8s新姿势!Cobra+Client-go强强联手,打造你的专属K8s监控神器,让资源优化与性能监控尽在掌握!"
【8月更文挑战第14天】在云原生领域,Kubernetes以出色的扩展性和定制化能力引领潮流。面对独特需求,自定义插件成为必要。本文通过Cobra与Client-go两大利器,打造一款监测特定标签Pods资源使用的K8s插件。Cobra简化CLI开发,Client-go则负责与K8s API交互。从初始化项目到实现查询逻辑,一步步引导你构建个性化工具,开启K8s集群智能化管理之旅。
15 2
|
5天前
|
Kubernetes Serverless API
Kubernetes 的架构问题之利用不可变性来最小化对API Server的访问如何解决
Kubernetes 的架构问题之利用不可变性来最小化对API Server的访问如何解决
37 7
|
5天前
|
弹性计算 Kubernetes Serverless
Kubernetes 的架构问题之ACK/ASK支持ECI的Serverless Container如何解决
Kubernetes 的架构问题之ACK/ASK支持ECI的Serverless Container如何解决
23 7
|
5天前
|
弹性计算 Kubernetes Serverless
Kubernetes 的架构问题之Serverless Container中不支持特权模式的问题如何解决
Kubernetes 的架构问题之Serverless Container中不支持特权模式的问题如何解决
34 6
|
5天前
|
Kubernetes 安全 Serverless
Kubernetes 的架构问题之Serverless Container中提供对外服务如何解决
Kubernetes 的架构问题之Serverless Container中提供对外服务如何解决
29 5
|
5天前
|
运维 Kubernetes Serverless
Kubernetes 的架构问题之在ECI中Logtail agent作为Hidecar实现如何解决
Kubernetes 的架构问题之在ECI中Logtail agent作为Hidecar实现如何解决
33 3
|
6天前
|
存储 算法 前端开发
JVM架构与主要组件:了解Java程序的运行环境
JVM的架构设计非常精妙,它确保了Java程序的跨平台性和高效执行。通过了解JVM的各个组件,我们可以更好地理解Java程序的运行机制,这对于编写高效且稳定的Java应用程序至关重要。
20 3
|
5天前
|
运维 Kubernetes 大数据
Kubernetes 的架构问题之在Serverless Container场景下尚不支持资源超售如何解决
Kubernetes 的架构问题之在Serverless Container场景下尚不支持资源超售如何解决
25 0
|
4天前
|
存储 缓存 Java
Eureka原理与实践:深入探索微服务架构的核心组件
在微服务架构日益盛行的今天,服务之间的注册与发现成为了保证系统高可用性和灵活性的关键。Eureka,作为Netflix开源的服务注册与发现框架,凭借其简单、健壮的特性,在微服务领域占据了举足轻重的地位。本文将深入剖析Eureka的原理,并通过实践案例展示其在实际项目中的应用,以期为开发者提供一个高端、深入的视角。
11 0

相关产品

  • 容器服务Kubernetes版
  • 推荐镜像

    更多