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 的 hostname 和 subdomain 字段设置主机名

Pod 规约包含一个可选的 hostname 字段。 当此字段被设置时,其取值优先于 Pod 的 metadata.name,作为 Pod 的主机名(从 Pod 内部观察)。 例如,如果将 Pod 的 spec.hostname 设置为 my-host,则 Pod 的主机名会被设置为 my-host

Pod 规约还包含一个可选的 subdomain 字段,表示 Pod 属于其命名空间中的某个子域。 如果 Pod 的 spec.hostname 设置为 foospec.subdomain 设置为 my-namespace 命名空间中的 bar, 则其主机名为 foo,完全限定域名(FQDN)为 foo.bar.my-namespace.svc.cluster-domain.example(从 Pod 内部观察)。

hostnamesubdomain 都被设置时,集群的 DNS 服务器会基于这些字段创建 A 和/或 AAAA 记录。参考 Pod 的 hostname 和 subdomain 字段

使用 Pod 的 setHostnameAsFQDN 字段设置主机名

特性状态: Kubernetes v1.22 [stable]

当 Pod 被配置为使用完全限定域名(FQDN)时,则其主机名是短的主机名。 例如,如果 Pod 的完全限定域名是 busybox-1.busybox-subdomain.my-namespace.svc.cluster-domain.example, 那么该 Pod 内的 hostname 命令默认返回 busybox-1,而 hostname --fqdn 命令返回 FQDN。

当在 Pod 规约中同时设置了 setHostnameAsFQDN: truesubdomain 字段时, kubelet 会将 Pod 的 FQDN 写入该 Pod 命名空间的主机名中。 在这种情况下,hostnamehostname --fqdn 都会返回 Pod 的 FQDN。

Pod 的 FQDN 构建方式与前面定义的方式相同。 它由 Pod 的 spec.hostname(如果指定)或 metadata.name 字段、 spec.subdomainnamespace 名称以及集群域名后缀组成。

使用 Pod 的 hostnameOverride 设置主机名

特性状态: Kubernetes v1.34 [alpha] (enabled by default: false)

在 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

如果同时设置了 hostnameOverridehostnamesubdomain 字段:

  • Pod 内部的主机名会被覆盖为 hostnameOverride 值。
  • 集群 DNS 服务器中 Pod 的 A 和/或 AAAA 记录仍然基于 hostnamesubdomain 字段生成。

注意:如果设置了 hostnameOverride,则你不能同时设置 hostNetworksetHostnameAsFQDN 字段。 API 服务器将显式拒绝任何尝试这种组合的创建请求。

关于在 hostnameOverride 与其他字段(hostname、subdomain、setHostnameAsFQDN、hostNetwork) 组合使用时的行为详情,请参阅 KEP-4762 设计细节中的表格。

最后修改 September 01, 2025 at 3:57 PM PST: [zh] Add pods/pod-hostname.md (2e23a2a1ab)