Alibaba Cloud Container Compute Service (ACS) クラスターでは、DNS 解決に CoreDNS を使用します。本トピックでは、クラスター内における DNS の動作原理およびワークロード要件に応じた dnsPolicy の設定方法について説明します。
クラスター内での DNS 解決の有効化
ACS クラスターでは、DNS 解決はデフォルトで無効になっています。有効化するには、クラスター作成時に CoreDNS を選択してください。CoreDNS は、kube-dns という名前の Service として、kube-system 名前空間内でクラスター内部に公開されます。
kube-dns Service の状態を確認するには、以下のコマンドを実行します:
kubectl get svc kube-dns -n kube-system期待される出力例:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 172.24.0.10 <none> 53/UDP,53/TCP,9153/TCP 27dCoreDNS を有効化した ACS クラスターの作成方法については、「ACS クラスターの作成」をご参照ください。
ACS クラスター内における DNS 解決の仕組み
Pod が起動すると、kubelet は以下の 2 つのパラメーターを使用してその DNS 設定を構成します:
--cluster-dns=<dns-service-ip>:クラスター内の DNS サーバの IP アドレス--cluster-domain=<default-local-domain>:ベースとなるドメイン名のサフィックス
これらのパラメーターにより、各 Pod 内の /etc/resolv.conf の内容が決定されます:
nameserver xx.xx.0.10
search kube-system.svc.cluster.local svc.cluster.local cluster.local
options ndots:5| パラメーター | 説明 |
|---|---|
nameserver | DNS サーバの IP アドレスです。 |
search | DNS 検索時に短いホスト名に付加されるドメインサフィックスです。ACS クラスターでは、3 つのサフィックス(kube-system.svc.cluster.local、svc.cluster.local、cluster.local)が設定されており、単一の検索で最大 4 回の DNS クエリが生成される可能性があります。 |
options | キーと値のペア形式で指定される追加のリゾルバーオプションです。デフォルトの ndots:5 は、以下を意味します:ドメイン名に含まれるドットの数が ndots の値より多い場合、完全修飾ドメイン名(FQDN)と見なされ、直接解決されます。ドットの数が少ない場合は、まず search サフィックスが付加されてから解決が試行されます。 |
DNS ポリシーの選択
Pod の仕様(spec)内で dnsPolicy を設定することで、Pod によるドメイン名解決の方法を制御できます。ACS クラスターでは、以下のポリシーがサポートされています:
| ポリシー | 使用される DNS サーバ | 使用タイミング |
|---|---|---|
ClusterFirst | CoreDNS(kube-dns) | クラスター内の他のサービスにアクセスする必要がある Pod に使用します。これがデフォルトのポリシーです。 |
None | dnsConfig | 完全にカスタマイズされた DNS 設定が必要な Pod に使用します。 |
Default | ノードの /etc/resolv.conf(Alibaba Cloud DNS) | クラスター内部のサービスにアクセスしない Pod |
Defaultはデフォルトの DNS ポリシーではありません。dnsPolicyが明示的に指定されていない場合、ClusterFirstが使用されます。
CoreDNS を使用したクラスター内ドメイン名の解決
クラスター内の他のサービスと通信する Pod には、dnsPolicy: ClusterFirst を設定します。これは、ACS ワークロードにおけるデフォルトの動作です。
apiVersion: v1
kind: Pod
metadata:
name: alpine
namespace: default
spec:
containers:
- image: alpine
command:
- sleep
- "10000"
imagePullPolicy: Always
name: alpine
dnsPolicy: ClusterFirstPod の DNS 設定のカスタマイズ
Pod の DNS 設定を完全に制御するには、dnsPolicy: None を設定し、dnsConfig ブロックを提供します。dnsPolicy が None の場合、dnsConfig 内に少なくとも 1 つの nameserver を指定する必要があります。
dnsConfig は任意の項目であり、dnsPolicy と組み合わせて使用できます(None に限定されません)。他のポリシーと併用することで、既存の設定に追加の nameserver や search ドメインを付与できます。
apiVersion: v1
kind: Pod
metadata:
name: alpine
namespace: default
spec:
containers:
- image: alpine
command:
- sleep
- "10000"
imagePullPolicy: Always
name: alpine
dnsPolicy: None
dnsConfig:
nameservers: ["169.254.xx.xx"]
searches:
- default.svc.cluster.local
- svc.cluster.local
- cluster.local
options:
- name: ndots
value: "2"Pod が起動すると、上記の設定により以下の /etc/resolv.conf が生成されます:
nameserver 169.254.xx.xx
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:2以下の表に、dnsConfig の各フィールドについて説明します:
| フィールド | 説明 |
|---|---|
nameservers | Pod が使用する DNS サーバの IP アドレスの一覧です。最大 3 つの IP アドレスを指定できます。dnsPolicy が None の場合、少なくとも 1 つを指定する必要があります。重複するアドレスは自動的に削除されます。 |
searches | ホスト名検索に使用される DNS search ドメインの一覧です。最大 6 個のドメインを指定できます。これらは、DNS ポリシーから導出された基本リストに追加されます。重複するドメインは自動的に削除されます。 |
options | リゾルバーのオプションの一覧です。各オプションは name(必須)および value(任意)で構成されます。これらのオプションは、DNS ポリシーによって生成されたオプションにマージされます。重複する項目は自動的に削除されます。 |
CoreDNS を経由せずにノードレベルの DNS を使用
Pod が ACS クラスター内のサービスに一切アクセスしない場合、dnsPolicy: Default を設定します。DNS 解決は、ノードの /etc/resolv.conf を使用した Alibaba Cloud DNS によって処理され、CoreDNS は関与しません。
apiVersion: v1
kind: Pod
metadata:
name: alpine
namespace: default
spec:
containers:
- image: alpine
command:
- sleep
- "10000"
imagePullPolicy: Always
name: alpine
dnsPolicy: Default静的ホスト名と IP アドレスのマッピング
特定の Pod に対して静的なホスト名と IP アドレスのマッピングを追加するには、Pod の仕様(spec)に hostAliases フィールドを追加します。kubelet は、Pod の /etc/hosts ファイルを管理し、起動時にこれらのエントリを書き込みます。
実行中のコンテナ内で /etc/hosts を手動で編集しないでください。コンテナが再起動すると、kubelet がこのファイルを上書きするため、手動で行った変更は失われます。
単一の Pod ではなく、クラスター内のすべての Pod に静的マッピングを適用するには、CoreDNS の hosts プラグインを有効化します。「CoreDNS 拡張機能の構成」をご参照ください。
以下の例では、foo.local、bar.local、foo.remote を静的 IP アドレスにマップしています:
apiVersion: v1
kind: Pod
metadata:
name: hostaliases-pod
spec:
hostAliases:
- ip: "127.0.**.**"
hostnames:
- "foo.local"
- "bar.local"
- ip: "10.1.**.**"
hostnames:
- "foo.remote"
containers:
- name: cat-hosts
image: busybox:1.28
command:
- cat
args:
- "/etc/hosts"Pod が起動後、/etc/hosts には以下の内容が含まれます:
# Kubernetes-managed hosts file.
127.0.**.** localhost
10.200.**.** hostaliases-pod
# Entries added by HostAliases.
127.0.**.** foo.local bar.local
10.1.**.** foo.remote bar.remote