Podのホスト名
このページでは、Podのホスト名を設定する方法、その設定後に起こり得る副作用、そして基盤となる仕組みについて説明します。
Podのデフォルトのホスト名
Podが作成されると、(Pod内部から観測される)そのホスト名は、Podのmetadata.nameの値から導き出されます。 ホスト名と、それに対応する完全修飾ドメイン名(FQDN)の両方が(Podの視点からは)metadata.nameの値に設定されます。
apiVersion: v1
kind: Pod
metadata:
name: busybox-1
spec:
containers:
- image: busybox:1.28
command:
- sleep
- "3600"
name: busybox
このmanifestで作成されたPodは、ホスト名と完全修飾ドメイン名(FQDN)がbusybox-1
に設定されます。
Podのhostnameとsubdomainフィールド
Podのspecには、オプションのhostname
フィールドがあります。
この値が設定されると、Podのmetadata.name
よりも優先され、(Pod内部から観測される)ホスト名として使われます。
例えば、spec.hostnameがmy-host
に設定されているPodは、ホスト名がmy-host
です。
また、Podのspecにはオプションのsubdomain
フィールドもあり、Podが自分のNamespace内のサブドメインに属していることを示します。
もしPodのspec.hostname
が"foo"、spec.subdomainが"bar"に設定され、さらにNamespaceがmy-namespace
の場合、ホスト名はfoo
で、完全修飾ドメイン名(FQDN)は(Podの内部から観測される)foo.bar.my-namespace.svc.cluster-domain.example
です。
hostnameとsubdomainの両方が設定されていると、クラスターの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が返ります。
setHostnameAsFQDN: true
とsubdomainフィールドがPodのspecに設定されている場合、kubeletはそのPodのNamespaceに対してFQDNをホスト名として書き込みます。
この場合、hostname
とhostname --fqdn
の両方がPodのFQDNを返します。
PodのFQDNは前述と同じ方法で構築されます。
つまり、Podのspec.hostname
(設定されている場合)またはmetadata.name
フィールド、spec.subdomain
、namespace
名、そしてクラスタードメインサフィックスで構成されます。
備考:
Linuxでは、kernelのhostnameフィールド(struct utsname
のnodename
フィールド)は64文字に制限されています。
Podがこの機能を有効にし、そのFQDNが64文字を超える場合、起動に失敗します。
そのPodはPending
ステータスのままになり(kubectl
からはContainerCreating
と表示)、"Failed to construct FQDN from Pod hostname and cluster domain"などのエラーイベントが生成されます。
つまり、このフィールドを使う場合、Podのmetadata.name
(またはspec.hostname
)とspec.subdomain
フィールドを組み合わせた長さが64文字を超えないようにする必要があります。
PodのhostnameOverride
Kubernetes v1.34 [alpha]
(enabled by default: false)PodのspecでhostnameOverride
に値を設定すると、kubeletは無条件にその値をPodのホスト名とFQDN両方に設定します。
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の設計詳細の表を参照してください。