Pod 主机名
本页面解释了如何设置 Pod 的主机名、配置后的潜在副作用以及底层机制。
默认 Pod 主机名
创建 Pod 时,其主机名(从 Pod 内部观察)派生自 Pod 的 `metadata.name` 值。主机名及其对应的完全限定域名(FQDN)都被设置为 `metadata.name` 值(从 Pod 的角度来看)。
apiVersion: v1
kind: Pod
metadata:
name: busybox-1
spec:
containers:
- image: busybox:1.28
command:
- sleep
- "3600"
name: busybox
通过此清单创建的 Pod 的主机名和完全限定域名(FQDN)将设置为 busybox-1
。
带有 Pod 主机名和子域字段的主机名
Pod 规范包含一个可选的 hostname
字段。设置此值后,它将优先于 Pod 的 metadata.name
作为主机名(从 Pod 内部观察)。例如,spec.hostname
设置为 my-host
的 Pod 的主机名将设置为 my-host
。
Pod 规范还包含一个可选的 subdomain
字段,表示 Pod 属于其命名空间中的一个子域。如果 Pod 在命名空间 my-namespace
中将 spec.hostname
设置为 "foo",将 spec.subdomain
设置为 "bar",则其主机名将变为 foo
,其完全限定域名(FQDN)将变为 foo.bar.my-namespace.svc.cluster-domain.example
(从 Pod 内部观察)。
当同时设置了主机名和子域时,集群的 DNS 服务器将根据这些字段创建 A 和/或 AAAA 记录。请参阅:Pod 的主机名和子域字段。
带有 Pod 的 setHostnameAsFQDN 字段的主机名
当 Pod 配置为具有完全限定域名 (FQDN) 时,其主机名是短主机名。例如,如果你有一个 FQDN 为 `busybox-1.busybox-subdomain.my-namespace.svc.cluster-domain.example` 的 Pod,那么默认情况下,该 Pod 内部的 `hostname` 命令返回 `busybox-1`,而 `hostname --fqdn` 命令返回 FQDN。
当 Pod 规范中同时设置了 `setHostnameAsFQDN: true` 和子域字段时,kubelet 会将 Pod 的 FQDN 写入该 Pod 命名空间的主机名。在这种情况下,`hostname` 和 `hostname --fqdn` 都返回 Pod 的 FQDN。
Pod 的 FQDN 以之前定义的方式构建。它由 Pod 的 spec.hostname
(如果指定)或 metadata.name
字段、spec.subdomain
、namespace
名称和集群域后缀组成。
注意
在 Linux 中,内核的主机名字段(`struct utsname` 的 `nodename` 字段)限制为 64 个字符。
如果 Pod 启用此功能且其 FQDN 超过 64 个字符,则将无法启动。Pod 将保持在 `Pending` 状态(由 `kubectl` 看到为 `ContainerCreating`),并生成错误事件,例如“无法从 Pod 主机名和集群域构造 FQDN”。
这意味着在使用此字段时,您必须确保 Pod 的 metadata.name
(或 spec.hostname
)和 spec.subdomain
字段的组合长度不超过 64 个字符。
带有 Pod 的 hostnameOverride 的主机名
Kubernetes v1.34 [alpha]
(默认禁用)在 Pod 规范中设置 `hostnameOverride` 的值会导致 kubelet 无条件地将 Pod 的主机名和完全限定域名(FQDN)都设置为 `hostnameOverride` 值。
hostnameOverride
字段有 64 个字符的长度限制,并且必须符合 RFC 1123 中定义的 DNS 子域名标准。
示例
apiVersion: v1
kind: Pod
metadata:
name: busybox-2-busybox-example-domain
spec:
hostnameOverride: busybox-2.busybox.example.domain
containers:
- image: busybox:1.28
command:
- sleep
- "3600"
name: busybox
注意
这仅影响 Pod 内部的主机名;它不影响集群 DNS 服务器中 Pod 的 A 或 AAAA 记录。如果 hostnameOverride
与 hostname
和 subdomain
字段同时设置
Pod 内的主机名将被
hostnameOverride
值覆盖。集群 DNS 服务器中 Pod 的 A 和/或 AAAA 记录仍根据
hostname
和subdomain
字段生成。
注意:如果设置了 `hostnameOverride`,则不能同时设置 `hostNetwork` 和 `setHostnameAsFQDN` 字段。API 服务器将明确拒绝任何尝试这种组合的创建请求。
有关 `hostnameOverride` 与其他字段(hostname、subdomain、setHostnameAsFQDN、hostNetwork)组合时的行为详情,请参阅 KEP-4762 设计细节 中的表格。