- 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,必须都满足)。