掌握 Kubernetes 对象
学习目标
定义 Kubernetes 对象
列出 Kubernetes 对象的类型
解释 Kubernetes 对象如何在命名空间中组织
描述 Kubernetes 对象如何被定义和标识
Kubernetes 对象
简介
您已经了解了 Kubernetes 集群的核心组件。在本课中,您将学习 Kubernetes 对象以及它们如何协同工作。
什么是 Kubernetes 对象?
Kubernetes 对象是持久化存储在 Kubernetes 集群内部的实体。更准确地说,它们持久化存储在 etcd 键值存储中。Kubernetes 对象可以表示各种各样的资源,例如 Pod、Service、Deployment 等。
这些对象使用 YAML 或 JSON 格式定义,并可使用 RESTful Kubernetes API 进行管理,该 API 由 Kubernetes 控制平面的 kube-apiserver 组件公开。这意味着您可以使用该 API 创建、更新、删除和查询对象。
以下是一个用于获取 Pod 对象信息的示例请求:
GET https://<kubernetes-cluster>.com/api/v1/namespaces/<namespace>/pods/<pod-name>
每个 Kubernetes 对象都在 YAML 或 JSON 格式的配置文件中定义。该配置文件以声明式方式包含对象的规范。这使您能够定义对象的期望状态。Kubernetes 随后会持续检查对象的实际状态是否与期望状态匹配。如果不匹配,Kubernetes 会尝试使实际状态与期望状态匹配。这称为协调循环。
一个简单的 Kubernetes Pod 对象声明如下:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: nginx:1.21.3
让我们分解 Pod 对象的不同部分:
该 apiVersion 字段指定用于定义对象的 Kubernetes API 版本。每个对象可以有不同的 API 版本。
该 kind 字段指定 Kubernetes 对象的类型。
该 metadata 字段包含对象的元数据。
该 spec 字段包含对象的规范。该 spec 字段因对象类型而异。例如,该 spec 字段(Pod 对象的字段)包含作为 Pod 组成部分的容器的规范。
这些是 Kubernetes 对象的必填字段。不过,您也可以向对象添加其他字段。
上述对象创建了一个名为 my-pod 的 Pod,其中包含一个名为 my-container 的单个容器。该容器使用 1.21.3 版本的 nginx 镜像。
不同 Kubernetes 对象的类型
有几个核心对象几乎可以在每个 Kubernetes 集群中找到。以下是最重要的 Kubernetes 对象的概览:
Pods
如前所述,Pod 是 Kubernetes 中最小的可部署单元,是一个或多个容器的轻量封装。Pod 始终被调度到节点上。可以使用 Kubernetes API 创建、更新和删除 Pod。
在单个 Pod 中运行多个容器是一种反模式。主要原因是这会使容器的扩缩容和更新变得更加困难。由于容器之间紧密耦合,管理它们也更加困难。一个例子可能是运行两个容器的 Pod,例如一个 Web 服务器和一个数据库。如果您想对 Web 服务器进行扩缩容,也必须对数据库进行扩缩容,即使这并非必要。
不过,在一些常见场景中,在单个 Pod 中运行多个容器是合理的。例如,如果您想运行一个为主容器提供附加功能的 sidecar 容器,比如日志记录、监控或流量代理。稍后我们在学习基于 Istio 的服务网格时,会更详细地了解 sidecar 注入。

Services
Service 将一组 Pod 组合在一起,并为访问它们提供稳定的入口点。下图中的 Service 还提供负载均衡能力,可将流量分配到多个 Pod。Pod 通过标签(labels)和选择器(selectors)进行分组,我们稍后会介绍。

当应用程序扩展为在集群中的多个 Pod 上运行时,这尤其有用,因为 Service 可以有效地对它们进行分组并提供稳定的访问入口点。
提示
Kubernetes Service 将应用程序 Pod 作为网络服务公开,在 Kubernetes 集群内提供一致的 DNS 名称和 IP。要将内部 Kubernetes Service 公开到互联网,您必须创建 APIRule 自定义资源。此方法类似于在 Cloud Foundry 运行时中创建路由。您将在以下单元中了解更多关于公开 Service 的内容:
在 Kubernetes 中探索服务。
ReplicaSets
ReplicaSet 是一组在任意给定时刻于整个集群中运行的特定类型的 Pod。ReplicaSet 确保始终运行所需数量的 Pod。如果某个 Pod 被删除,ReplicaSet 会创建一个新 Pod 来替代它。这种校验在协调循环中执行,该循环将期望状态(Pod 数量)与实际状态(正在运行的 Pod 数量)进行比较。ReplicaSet 是确保应用程序高可用性并利用 Kubernetes 自愈能力的好方法。
注意
同样重要的是要了解,ReplicaSet 并不拥有 Pod。相反,它负责确保运行所需数量的 Pod。如果您删除某个 Pod,ReplicaSet 会创建一个新 Pod 来替代它。您也可以在不删除 Pod 的情况下删除 ReplicaSet。

Deployments
Deployment 是位于 ReplicaSet 之上的高层抽象。您可以使用 Deployment 以声明方式定义应用程序的期望状态。这包括副本数量、容器镜像以及更多配置。Deployment 管理 ReplicaSet,ReplicaSet 管理 Pod。
借助 Deployment,您可以推出应用程序的新版本。此类推出是以高度受控的方式执行的。Deployment 会在旧 ReplicaSet 旁边创建一个新的 ReplicaSet。随后,它启动新的 ReplicaSet 并将其扩展至所需的副本数量。一旦新的 ReplicaSet 启动并运行,它便开始缩减旧的 ReplicaSet。这确保了始终至少有一个 ReplicaSet 在运行。这称为滚动更新(rolling update),它是 Deployment 的一项强大功能,因为它是零停机(Zero Downtime Deployment)安全推出应用程序新版本的方式。

提示
要在 Kyma 中应用 Deployment,您可以使用以下命令 kubectl apply -f deployment.yaml。此命令类似于以下命令 cf push 在 Cloud Foundry 运行时中。不过,在 Kubernetes 中,Deployment 必须包含有关工件(Docker 镜像)的信息。在 Cloud Foundry 运行时中不需要创建和存储工件。
注意
还有许多其他的 Kubernetes 对象,其中一些将在本课程后续部分介绍。事实上,Kubernetes 也是可扩展的。您可以使用 Custom Resource Definitions(CRDs) 定义自定义对象并扩展 Kubernetes API。
要了解有关其他对象或 CRD 的更多信息,请查看官方 Kubernetes 文档。
在命名空间中组织 Kubernetes 对象
在 Kubernetes 集群中,每个对象在其命名空间内必须具有唯一的名称。换言之,在单个命名空间中不能有两个同名的 Pod,但如果它们位于不同的命名空间中,则可以具有相同的名称。命名空间是对 Kubernetes 对象进行分组并提供对象逻辑隔离的一种方式。这种隔离允许并行运行应用程序的两个不同版本,或使不同的团队能够在同一集群中工作而互不干扰。您还可以限制对所选命名空间的访问,以便仅向某些用户提供集群的一部分。
在 Kubernetes 集群中,有一个名为 default 的默认命名空间。如果您在对象定义或 API 请求中未指定命名空间,则使用该命名空间。您也可以创建自己的命名空间。
使用标签和选择器标识 Kubernetes 对象
每个 Kubernetes 对象都可以使用键值对进行标记。标签用于标识对象。例如,您可以使用标签 app: my-app 为某个特定应用程序的所有 Pod 添加标签。
这是 Service 如何将 Pod 组合在一起的一个示例。Service 使用标签选择器来标识应属于该 Service 的 Pod。标签选择器是用于根据标签选择对象的查询。例如,标签选择器 app: my-app 选择所有带有标签 app: my-app 的 Pod。
您可以在对象定义的 metadata 部分中定义标签:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
labels:
app: my-app
spec:
containers:
- name: my-container
image: nginx
注解
注解(Annotations)与标签类似,但与标签不同的是,注解不用于标识、过滤或选择对象。注解以语义元数据丰富对象。通常,不同的工具利用注解来存储有关对象的附加详细信息。
小结
现在,您可以区分不同的 Kubernetes 对象及其用途。您还了解了它们之间的相互关系,以及如何为它们添加标签并在命名空间中对它们进行分组。
关于 Kubernetes 对象的延伸阅读
在此处查找更多信息:
Kubernetes 文档
Kubernetes 对象
Kubernetes 命名空间
Kubernetes 标签和选择器