- https://kubernetes.io/docs/concepts/overview/working-with-objects/#kubernetes-objects
- k8s objects 是 k8s 系统中的持久化实体(persistent entities)。k8s 使用这些实体代表集群的状态。
# Understanding k8s objects
- 它们可以描述:
- 正在运行哪些容器化的应用(以及在哪些 node 上)
- 这些应用可用的资源
- 这些应用行为的策略,如重试策略、更新和容错
- 一个 k8s object 是一个 "record of intent",一旦创建这个 object,k8s 系统会持久工作来确保这个 object 的存在。
- 通过创建一个 object 可以定义集群的 desired state。
- 需要使用 [Kubernetes API](https://kubernetes.io/docs/concepts/overview/kubernetes-api/) 来创建、修改和删除 k8s objects。
- 使用 `kubectl` 命令行时,内部会调用 k8s API
- 在程序中使用 [Client Libraries](https://kubernetes.io/docs/reference/using-api/client-libraries/).
## Object spec and status
- 几乎每个 object 都包含两个嵌套的 object fields,用于管理 object 的配置
- **`sepc`**:必须创建时设置,表示它的 desired state
- **`status`**:表示 object 的 current state,由 k8s 系统和它的组建来提供和更新。
- k8s 的控制面会持续管理每个 object 的实际 state,去匹配 desired state。
- 更多信息参考 [Kubernetes API Conventions](https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md).
## Describing a k8s object
- 当创建一个 object,在 API Request 中以 json 格式提供 object spec。
- kubectl 会将 YAML 格式(也可以使用 json 格式)的 manifest 转换为 JSON,再通过 HTTP API 发送。
## Required fields
- 用于创建 object 的 manifest 文件需要设置以下 fields:
- `apiVesion`:使用的 k8s API 版本
- `kind`:object 的种类
- `metadata`:用于唯一标识 object 的数据,包含 name、UID 和 可选的 namespace。
- `spec`:desired state
- 每个 k8s object 的规范格式各不相同,并可能包含它特有的嵌套字段。
-----------
# Server side field validation
- k8s v1.25 后,API server 提供了 server 侧的 [field validation](https://kubernetes.io/docs/reference/using-api/api-concepts/#field-validation), 检测无法识别或者重复的 object。
- 相当于在 server 侧提供了 `kubectl --validate`
----------
# Namespaces
- namespaces 作用:在单个 k8s 集群内隔离资源组。
- 资源的名字只需要在 namespace 内唯一。
- namespace 无法嵌套进另一个 namespace 中,每个 k8s 资源只能属于一个 namespace。
- 没有必要使用多个 ns 来分隔略有不同的资源,例如同一软件的不同版本:
- 可以使用 **labels** 在同一命名空间内区分资源。
------
# Labels and Selectors
- **Labels** 是附加到 objects 上的 KV 对,表示 object 的属性。可以在创建时指定,也可以后续添加和修改。
- Labels 可以应用组织和挑选 objects 的子集。
- 通过 **label selector**, client / user 可以识别一组对象。
- 当前支持两种 selector:
- equality-based
- set-based
- 可以指定多个 requiremnets,使用逗号分隔(相当于逻辑 AND,必须都满足)。