对象名称和 ID
集群中的每个对象都有一个在该资源类型中唯一的名字(Name)。每个 Kubernetes 对象还有一个在整个集群中唯一的UID。
例如,在同一个名字空间(namespace)中,你只能有一个名为 myapp-1234
的 Pod,但你可以有一个 Pod 和一个 Deployment,它们都名为 myapp-1234
。
对于非唯一的用户提供的属性,Kubernetes 提供了标签(labels)和注解(annotations)。
名字 (Names)
客户端提供的字符串,用于在资源 URL 中引用一个对象,例如 /api/v1/pods/some-name
。
在同一时间,给定类型的资源只能有一个具有给定名字的对象。但是,如果你删除了该对象,你可以创建一个具有相同名字的新对象。
同一资源的所有 API 版本中的名字都必须是唯一的。API 资源通过其 API 组、资源类型、名字空间(对于名字空间资源)和名字来区分。换句话说,在这种情况下,API 版本是无关紧要的。
注意
在对象代表物理实体(例如 Node 代表物理主机)的情况下,如果在未删除并重新创建 Node 的情况下以相同名字重新创建主机,Kubernetes 会将新主机视为旧主机,这可能导致不一致性。在资源创建请求中,当提供 generateName
而不是 name
时,服务器可能会生成一个名字。使用 generateName
时,提供的值将用作名字前缀,服务器会在其后附加一个生成的后缀。即使名字是生成的,它也可能与现有名字冲突,导致返回 HTTP 409 响应。在 Kubernetes v1.31 及更高版本中,这种情况发生的可能性大大降低了,因为服务器在返回 HTTP 409 响应之前最多会尝试生成 8 次唯一的名字。
以下是资源常用的四种名字约束类型。
DNS 子域名
大多数资源类型要求名字符合 RFC 1123 中定义的可用作 DNS 子域名的要求。这意味着名字必须:
- 不能超过 253 个字符
- 只包含小写字母数字字符、'-' 或 '.'
- 以字母数字字符开头
- 以字母数字字符结尾
RFC 1123 标签名
某些资源类型要求名字遵循 RFC 1123 中定义的 DNS 标签标准。这意味着名字必须:
- 最多包含 63 个字符
- 只包含小写字母数字字符或 '-'
- 以字母数字字符开头
- 以字母数字字符结尾
RFC 1035 标签名
某些资源类型要求名字遵循 RFC 1035 中定义的 DNS 标签标准。这意味着名字必须:
- 最多包含 63 个字符
- 只包含小写字母数字字符或 '-'
- 以字母字符开头
- 以字母数字字符结尾
注意
RFC 1035 和 RFC 1123 标签标准的唯一区别在于,RFC 1123 标签允许以数字开头,而 RFC 1035 标签只能以小写字母字符开头。路径段名字
某些资源类型要求它们的名字可以安全地编码为路径段。换句话说,名字不能是 "." 或 "..",并且名字不能包含 "/" 或 "%"。
这里有一个名为 nginx-demo
的 Pod 的清单(manifest)示例。
apiVersion: v1
kind: Pod
metadata:
name: nginx-demo
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
注意
某些资源类型对名字还有额外的限制。UID
Kubernetes 系统生成的用于唯一标识对象的字符串。
在 Kubernetes 集群的整个生命周期中创建的每个对象都有一个独特的 UID。它旨在区分相似实体的历史出现情况。
Kubernetes 的 UID 是全局唯一标识符(也称为 UUID)。UUID 根据 ISO/IEC 9834-8 和 ITU-T X.667 进行标准化。
下一步
- 阅读关于 Kubernetes 中的标签(labels)和注解(annotations)。
- 请参阅Kubernetes 中的标识符和名字设计文档。