このトピックでは、Alibaba Cloud Container Service for Kubernetes (ACK) クラスタにおけるドメインネームシステム (DNS) 解決の仕組みと、さまざまなシナリオで異なるビジネス要件を満たすために DNS ポリシーを設定する方法について説明します。
背景情報
デフォルトでは、ACK クラスタは DNS 解決サービスを提供しません。ACK クラスタの DNS 解決を有効にするには、クラスタの作成時に CoreDNS を選択する必要があります。kube-dns という名前の Service が ACK クラスタにデプロイされ、DNS 解決サービスを提供します。次のコマンドを実行して、kube-dns Service に関する情報をクエリできます。ACK クラスタの作成方法の詳細については、ACK クラスタの作成 を参照してください。
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 27d
ACK クラスタにおける DNS 解決の仕組み
ACK クラスタの kubelet の起動パラメータには、--cluster-dns=<dns-service-ip>
と --cluster-domain=<default-local-domain>
が含まれています。これらのパラメータは、クラスタの DNS サーバーの IP アドレスと、DNS サーバーのベースドメイン名のサフィックスを指定します。
Pod の DNS 設定ファイルは /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アドレス。 |
検索 | DNS クエリに使用されるサフィックスです。サフィックスが多いほど、DNS クエリが多くなります。ACS クラスターの場合、サフィックスは |
オプション | DNS 設定ファイルのオプション。複数のキーと値のペアを指定できます。たとえば、パラメータを |
上記の設定に基づいて、内部ドメイン名と外部ドメイン名の DNS クエリは、DNS 解決のために ACS クラスタの DNS サーバーに送信されます。
さまざまなシナリオでACSクラスターのDNSポリシーを設定するためにdnsPolicyを使用する
dnsPolicy パラメーターを使用して、PodのさまざまなDNSポリシーを指定できます。ACSクラスターは、以下のポリシーをサポートしています。
ClusterFirst: このポリシーは、PodがCoreDNSを使用してドメイン名を解決することを示します。 /etc/resolv.conf ファイルには、CoreDNSによって提供されるDNSサーバーのアドレス(kube-dns)が含まれています。これは、ACSクラスターのワークロードのデフォルトのDNSポリシーです。
None: このポリシーは、PodがACSクラスターのDNS設定を無視することを示します。 dnsConfig フィールドを使用して、DNS設定をカスタマイズする必要があります。
Default: このポリシーは、PodがデプロイされているノードからDNS解決設定を継承することを示します。ACSクラスターでは、ノードはElastic Compute Service(ECS)インスタンスに基づいて作成されます。したがって、Podは、PodがデプロイされているECSインスタンスベースのノードの/etc/resolv.conf ファイルを直接使用します。このファイルには、Alibaba Cloud DNSによって提供されるDNSサーバーのアドレスが含まれています。
上記のDNSポリシーを使用して、さまざまなシナリオでさまざまなビジネス要件を満たすことができます。
シナリオ1: ACSクラスターによって提供されるCoreDNSを使用してドメイン名を解決する
このシナリオでは、DNSポリシー設定にdnsPolicy: ClusterFirst
を指定する必要があります。例:
apiVersion: v1
kind: Pod
metadata:
name: alpine
namespace: default
spec:
containers:
- image: alpine
command:
- sleep
- "10000"
imagePullPolicy: Always
name: alpine
dnsPolicy: ClusterFirst
シナリオ2: PodのDNS設定をカスタマイズする
DeploymentのDNS設定をカスタマイズするには、DNSポリシー設定にdnsPolicy: None
を指定する必要があります。例:
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"
次の表は、dnsConfig セクションのパラメーターについて説明しています。
パラメーター | 説明 |
nameservers | PodのDNSサーバーのIPアドレスのリスト。最大3つのIPアドレスを指定できます。PodのdnsPolicy を |
searches | Podでのホスト名ルックアップ用のDNS検索ドメインのリスト。このパラメーターはオプションです。リストされたDNS検索ドメインは、指定されたDNSポリシーに基づいて生成されるベース検索ドメインのリストに追加されます。重複するドメイン名は削除されます。最大6つの検索ドメインを指定できます。 |
options | オプション項目のリスト。各項目には、name(必須)とvalue(オプション)を含めることができます。指定された項目は、指定されたDNSポリシーに基づいて生成されるオプション項目のリストに追加されます。重複する項目は削除されます。 |
シナリオ3: Alibaba Cloudによって提供されるECSインスタンスのDNS設定を使用する
アプリケーションPodがACSクラスターにデプロイされた他のサービスにアクセスする必要がない場合は、DNSポリシー設定にdnsPolicy: Default
を指定できます。このシナリオでは、DNS解決は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
Pod 内の /etc/hosts ファイルを構成するための hostAliases パラメーターの使用
すべての Pod 内で DNS 解決のために指定されたドメイン名を静的 IP アドレスにマッピングする場合、CoreDNS の hosts プラグインを有効にすることができます。詳細については、CoreDNS 拡張機能の構成を参照してください。
指定された Pod 内で DNS 解決のために指定されたドメイン名を静的 IP アドレスにマッピングする場合、Pod の /etc/hosts ファイルに hostAliases
パラメーターを追加できます。例:
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 構成の spec セクションに hostAliases
パラメーターを追加した後に初期化された /etc/hosts ファイルの内容を示しています。
# Kubernetes-managed hosts file. // Kubernetes によって管理される hosts ファイルです。
127.0.**.** localhost
10.200.**.** hostaliases-pod
# Entries added by HostAliases. // HostAliases によって追加されたエントリです。
127.0.**.** foo.local bar.local
10.1.**.** foo.remote bar.remote
上記のコンテンツは、foo.local、bar.local、および foo.remote ドメイン名が静的 IP アドレスにマッピングされていることを示しています。