Kubernetes 对象是 K8s 系统的持久实体,它们共同代表系统的状态。一个对象包括两个属性规范和状态。 Spec 是期望或请求的状态,而 status 是对象的当前状态。这些对象类型在 K8s 生态系统中也称为 API 资源。

在这个博客系列中,我们将了解一些 K8s 对象背后的概念并创建它们。我们可以使用 Yaml 文件和 Kubectl 创建 K8s 对象(Kubernetes 命令行界面用于与 K8s 集群通信)。您需要设置 Kubernetes(如果您是 K8s 生态系统的新手,请使用 minikube)并安装 Kubectl 以便在您的机器中创建 K8s 对象。

让我们开始!

K8s 对象介绍 - Yaml 文件:

Yaml 描述符文件中提供了资源规范,Kubectl 使用该文件创建具有给定规范的所需 K8s 对象。

让我们了解用于创建 K8s 对象的 Yaml 描述符文件中的四个基本/广泛使用的字段。

apiVersion-> 这是我们用来创建 Pod 的 Kubernetes 版本。我们需要确保给定版本支持我们要创建的对象。

示例:v1、apps/v1

Kind-> 我们打算创建的对象/资源类型。

示例:Pod、ReplicaSet、部署

Metadata-> 这是关于对象的数据。

例子:

name -> 取一个字符串值,表示对象的名称

标签 -> 它是键值对的列表。您可以在此处添加自定义键和值。我们将在本系列博客后面看到如何使用它。

Spec-> 此字段用于描述您希望 Kubernetes 构建的确切内容。本节的价值观/结构因对象而异。

例子:

对于 Pod 对象,此部分将包含容器规范

对于 Service 对象,此部分将包含 Pod 选择器规范

鉴于我们知道如何使用上述字段创建 yaml 描述符文件,让我们了解并创建一些 K8s 对象。

在 K8s 架构中可以创建和管理的最小可部署单元是 Pod。它是一个或多个容器的集合,以及卷存储、网络堆栈和命名空间。

在微服务架构中,每个服务都可以类比为具有多个容器的单个 Pod。是的,即使单个容器足以运行您的应用程序,作为容器集合的 Pod 也被可视化为单个应用程序/服务。

这是因为 Pod 中的所有容器都是相对紧密耦合的。其他容器充当辅助应用程序来支持主应用程序。例如,帮助应用程序可以是数据拉取器、数据推送器或代理。这种一个容器是主应用程序而另一个容器支持/改进主应用程序功能的模式称为 Sidecar 模式

可扩展性因素

  • 假设您想扩展容器化应用程序的实例,正确的方法是增加 Pod 的数量,而不是同一 Pod 内的容器数量。

  • 您需要“复制” Pod - 使用相同数量的容器来实现 K8s 世界中的可扩展性。

网络

  • K8s中涉及Pods的通信有两种,Intra-Pod和Inter-Pod通信。

  • Intra-Pod 通信是指同一个 Pod 中的两个或多个容器相互通信。这些容器通过 localhost 通过每个容器的端口绑定共享相同的网络命名空间。

  • Pod 间通信,每个 Pod 都分配有一个集群私有 IP 地址。因此,Pod 使用分配的 IP 地址与同一 K8s Cluster 私有网络中的其他 Pod 进行通信。

韧性

  • 当你的容器中运行的进程由于某种原因崩溃时,K8s 会确保 Pod 恢复重新启动它。

  • 在根进程崩溃时,容器状态将进入“错误”状态。 K8s 会在同一个 Pod 中重启容器。它会随着重新启动计数的增加返回到“运行”状态。

让我们看看它的实际效果

为了创建 Pod 对象,我们需要一个类似于下面给出的 Yaml 文件,

pod-demo.yaml

[Pod演示配置yaml文件](https://res.cloudinary.com/practicaldev/image/fetch/s--0Mytlz2Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev -to-uploads.s3.amazonaws.com/uploads/articles/il14t8ypt2cw2z5njm25.png)

 Kubectl apply -f pod-demo.yaml

进入全屏模式 退出全屏模式

执行上述命令将创建一个名为 frontend-pod 的 Pod。它将使用值为“front-tier”的“tier”标签创建。这将包装一个容器,该容器使用 nginx 映像并具有一个名称为 some-key 和 value 为 some-value 的环境变量

kubectl get pods 

进入全屏模式 退出全屏模式

此命令将显示在默认命名空间中运行的 Pod,您可以在其中找到 frontend-pod。

或者只是通过为您的 Pod 名称添加后缀来获取您的 pod

kubectl get pods frontend-pod

进入全屏模式 退出全屏模式

要获取详细报告,您可以后缀-o wide

kubectl get pods frontend-pod -o wide

进入全屏模式 退出全屏模式

[Kubectl 命令](https://res.cloudinary.com/practicaldev/image/fetch/s--gdROtGLS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/yhotzu3dfe4gfonn6fnj.png)

现在了解 Pods,让我们看看 Replicaset!

副本集

“有助于部署可扩展的应用程序”

这是 K8s 为您提供的承诺之一。但是要扩展 Pod... 我们应该继续手动创建/删除 Pod 吗?

如果其中一个正在运行的 Pod 出现故障怎么办?是否应该手动恢复?

当然不是!

通过增加可扩展性和可靠性来增强 Pod 的能力是我们的下一个 K8s 对象。让我们探索 Replicaset!

Replicaset 是对 Pod 的抽象,它确保给定数量的 Pod 始终处于启动和运行状态。

听起来像一些魔术,对吧? :)

好吧,它是在 Reconciliation 控制循环的帮助下完成的。

对账控制回路

  • 第一阶段是“观察”。 K8s 不断观察两种状态。

\u003d> 所需状态 -> 请求中提供的状态。

\u003d> 当前状态 -> K8s 集群的状态

  • 接下来它“检测”出两种状态之间的差异。

  • 然后,采取必要的步骤来“调整”差异。如果发生故障,它可以移除一个额外的 Pod 或添加另一个 Pod。

调节控制回路

顾名思义,这会一直循环下去。

有关 K8s 内部如何做到这一点的解释,请查看 K8s 架构博客。

[

ktnl

](/ktnl)[

了解 Kubernetes 架构

Nithyalakshmi Kamalakkanan ・ 21 年 10 月 10 日 ・ 4 分钟阅读

#kubernetes #架构 #beginners

](/ktnl/get-introduced-to-kubernetes-architecture-14fo)

.

那么,replicaset 如何能够跟踪其 Pod 以达到计数?它是否有任何基于 Pod 配置的哈希键/标识符。放松,没那么复杂🧘u200d♀️。它使用标签和选择器。

标签和选择器

我们已经知道什么是标签,Pod Yaml 文件的元数据部分让我们可以定义我们的自定义标签。根据这些标签,对 Pod 进行分组。但是要将这个组附加到副本集,我们需要选择器。

选择器也是类似于标签的键值对,在副本集级别定义。

让我们看看它的实际效果

一个典型的副本集 yaml 文件如下所示,

rs-demo.yaml

[复制 yaml 文件](https://res.cloudinary.com/practicaldev/image/fetch/s--JiSGn9eD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to -uploads.s3.amazonaws.com/uploads/articles/4d6uzo41aie5cpeb00ua.png)

  • 正如突出显示的那样,Pod 配置在模板下给出 - 这就像只是将 Pod yaml 的元数据和规范部分复制到副本集 yaml 的模板部分。

  • Spec 部分中的副本属性给出了副本集应创建和管理的 Pod 数量。

  • 选择器部分的 matchLabels 和容器模板标签应该匹配。

kubectl apply -f rs-demo.yaml

进入全屏模式 退出全屏模式

这将创建一个副本集,该副本集负责维护配置了上述规范的 3 个 Pod。

要检查创建使用的副本集,

 Kubectl get replicaset 

进入全屏模式 退出全屏模式

或者

 Kubectl get rs 

进入全屏模式 退出全屏模式

rs 是副本集的缩写形式。replicasetrs可以互换用于 Kubectl 命令。

rs的功率

  • 当由副本集管理的 Pod 出现故障时 💥 ... 让我们删除上面由副本集创建的 Pod 之一。
kubectl delete pod {pod_name}

进入全屏模式 退出全屏模式

在几秒钟内,您将看到一个具有相同配置的新 Pod 启动。

[删除Replicaset管理的Pod](https://res.cloudinary.com/practicaldev/image/fetch/s--E2bUHJgS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https:// dev-to-uploads.s3.amazonaws.com/uploads/articles/5ybdedkd3ubnqppvi0pm.png)

  • 敢(你不能😛)创建一个副本集管理的 Pod 的额外副本现在,让我们手动创建另一个具有相同标签的 Pod。

相同的 pod-config-demo.yaml

[same-pod-config-demo yaml 文件](https://res.cloudinary.com/practicaldev/image/fetch/s--qgYDRnuE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https ://dev-to-uploads.s3.amazonaws.com/uploads/articles/mdwotae92ya0u65ii1ru.png)

正如猜测的那样,K8s 将在几秒钟内删除最新的或第 4 个或额外的 Pod,以确保只有 3 个(所需数量)Pod 正在运行。

[创建具有相同标签的额外 Pod](https://res.cloudinary.com/practicaldev/image/fetch/s--DRJLecEh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https:// dev-to-uploads.s3.amazonaws.com/uploads/articles/crglrpppf1zpouxcw7bc.png)

  • 缩放您的 Pod

如果您想扩大/缩小您的 Pod 数量,您可以修改副本集 yaml 并应用更改。

假设您需要 4 个 Pod,只需将副本集 yaml 中的replicas属性从 3 更改为 4。

并使用相同的命令应用更改。

您会注意到将启动一个具有相同配置的新 Pod。

[横向扩展 Pod](https://res.cloudinary.com/practicaldev/image/fetch/s--uUKiDI2y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to -uploads.s3.amazonaws.com/uploads/articles/tsx98b1rb3j52ov34ux1.png)

如果您也想在 Pod 中进行扩展,则同样适用。

和...

  • 摆脱它,放心!

如果您想删除此副本集管理的所有 Pod... 不用担心,您只需一个命令即可。

[删除 rs](https://res.cloudinary.com/practicaldev/image/fetch/s--L1X4Xaz9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/l4b4n2dgmajv50ozglkm.png)

希望你喜欢了解 Pod 和 Replicaset 的概念,并准备在实际项目中练习一些。

请继续关注在即将发布的同系列博客中了解其他 K8s 对象。

快乐学习!

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐