目录
对象管理
参考资料
对象命名与ID
命名规范:
命名空间(namespace)
labels(标签)
Annotations(注释)
label与annotation的最佳实践
k8s对象管理方式分3类,
类型 | 操作对象 | 适用环境 | 优点 | 缺点 |
---|---|---|---|---|
命令式对象管理 | 活动对象 | 开发、测试 | 简单易学 | 只能操作活动对象。无法审计、跟踪 |
命令式对象配置 | 单个文件 | 生产 | 配置文件可以使用版本控制,可以审计、跟踪 | 项目大时,配置文件多,操作麻烦。只能通过配置文件更新活动对象 |
声明式对象配置 | 目录 | 生产 | 支持目录操作 | 意外情况下难以调试。可以直接更改活动对象并保留信息 |
【参考文档】:https://kubernetes.io/docs/concepts/overview/working-with-objects/object-management/
【参考博客】:https://blog.csdn.net/weixin_30745553/article/details/97155427
同一个集群,同类型的资源,资源名不能相同;
同一个集群,不同类型的资源,资源名可以相同;
同一个集群,不同资源其资源的UID一定是唯一的。
遵循RFC 1123
k8s能将物理机集群化成多个虚拟集群,不同项目、不同团队可使用不同的虚拟集群。这个虚拟集群就是命名空间(namespace)。同一个命名空间内的资源名必须要保持唯一。命名空间是集群资源划分的一种方式(通过resource quota划分)。
k8s默认创建4类命名空间:
不是所有资源对象都有归属的namespace,想namespace资源本身就不属于任何namespace。
查看哪些资源属于namespace,哪些不属于namespace:
# In a namespace
kubectl api-resources --namespaced=true
# Not in a namespace
kubectl api-resources --namespaced=false
集群资源划分:用namespace
namespace内的资源划分:用label(如用label区分不同版本的 软件)
Label 允许在 Kubernetes 资源上附加对于系统或者用户有意义的标示性属性,方便对 Kubernetes 资源进行分组管理。 这些属性对不会直接对 Kubernetes 核心组件产生语义,不过可能间接地被 Kubernetes 核心组件处理产生效果。例如:用户在 pod 或者 node 上加一些 label,然后配置一些调度策略,Kubernetes 的 scheduler 会基于这些 label 信息进行调度。
labels以“键/值”对的形式存在,可以将labels附加在对象上(可以在创建对象时直接编写label,也可以后期再通过api的方式附加上)。如下:
"metadata": {
"labels": {
"key1" : "value1",
"key2" : "value2"
}
}
不像name和UUID,label不需要保证唯一性。即不同资源语法上可以有相同的label(实际label的命名,要根据实际意义)。通过label selector(标签选择器)可以选择指定的对象。当前API支持两种类型的选择器:
如:
environment = production
tier != frontend
如:
environment in (production, qa)
tier notin (frontend, backend)
partition
!partition
Annotations 允许在 Kubernetes 资源上附加任意的非标识性元数据,用来记录资源的一些属性。这些元数据主要是给工具或者库来提取信息,一般不会直接开放给用户。绝大多数基于 Kubernetes 的开源项目都不依赖于 DB,完全可以利用 Kubernetes 的能力,满足对 DB 的需求。对于需要持久化的数据,除了定义 CRD,另一种通用的做法就是将数据存储在 annotation 中。
由于 annotation 的定位是 Kubernetes 资源上附加任意的非标识性元数据,除了在 key 上有跟 label key 完全一样的限制外,在 value 上没有任何限制:可长可短,可结构化可非结构化,可包含任意字符。