このトピックでは、dnsPolicyパラメーターを設定して、Container Service for Kubernetes (ACK) クラスターの各ポッドにDNSポリシーを設定する方法について説明します。 このトピックでは、HostAliases
パラメーターを使用して、指定されたIPアドレスにドメイン名を解決するようにポッドを設定する方法についても説明します。
前提条件
ACKマネージドクラスターまたはACKサーバーレスクラスターが作成されます。 詳細については、「ACK管理クラスターの作成」および「ACK Serverlessクイックスタート」をご参照ください。
背景情報
ACKクラスターでのDNS解決の仕組みの詳細については、「DNSの概要」をご参照ください。
デフォルトでは、ACKは一連のワークロードをクラスターにデプロイしてCoreDNSを実行します。 kube-dnsという名前のサービスがデプロイされ、クラスター内のDNSクエリにこれらのワークロードが公開されます。 corednsには、CoreDNSという名前の2つのバックエンドポッドがデプロイされています。 クラスター内のDNSクエリは、corednsポッド構成で指定されたDNSサーバーに送信されます。
次のコマンドを実行して、kube-dns Serviceに関する情報を照会できます。
kubectl get svc kube-dns -n kube-system
次のコマンドを実行して、corednsポッドに関する情報を照会できます。
kubectl get deployment coredns -n kube-system
dnsPolicyパラメーターを設定して、ポッドのDNSポリシーを設定します。
dnsPolicyパラメーターを使用して、ポッドのDNSポリシーを指定できます。 ACKクラスターは、次のDNSポリシーをサポートします。
ClusterFirst: このポリシーは、ポッドがCoreDNSを使用してドメイン名を解決することを示します。 これはデフォルトのDNSポリシーです。 /etc/resolv.confファイルには、CoreDNSによって提供されるDNSサーバーのアドレス (kube-dns) が含まれています。
なし: このポリシーは、ポッドがACKクラスターのDNS設定を無視することを示します。 dnsConfigパラメーターを使用してDNS設定をカスタマイズする必要があります。 それ以外の場合、ポッドはドメイン名を解決できません。
デフォルト: このポリシーは、ポッドがデプロイされているノードからDNS解決設定を継承することを示します。 ACKクラスターでは、Elastic Compute Service (ECS) インスタンスに基づいてノードが作成されます。 したがって、ポッドは、ポッドがデプロイされているECSベースのノードの /etc/resolv.confファイルを直接使用します。 このファイルには、Alibaba Cloud DNSによって提供されるDNSサーバーのアドレスが含まれています。
ClusterFirstWithHostNet: このポリシーは、HostNetworkモードのポッドがClusterFirstポリシーを使用することを示します。 ポッドにポリシーを指定しない場合、ポッドはデフォルトポリシーを使用します。
上記のDNSポリシーを使用して、さまざまなシナリオでビジネス要件を満たすことができます。
シナリオ1: ACKクラスターが提供する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: ポッドのDNS設定のカスタマイズ
デプロイの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セクションのパラメーターを示します。
パラメーター | 説明 |
ネームサーバー | ポッドのDNSサーバーのIPアドレスのリスト。 最大3つのIPアドレスを指定できます。 ポッドに対してdnsPolicyを |
検索 | ポッド内のホスト名検索用のDNS検索ドメインのリスト。 このパラメーターはオプションです。 リストされたDNS検索ドメインは、指定されたDNSポリシーに基づいて生成されたベース検索名のリストに追加されます。 重複するドメイン名が削除されます。 最大6つの検索ドメインを指定できます。 説明 DNSサーバーに到達できない場合、最初の検索ドメインのみが試行されます。 |
オプション | オプションアイテムのリスト。 各アイテムには、name (必須) とvalue (オプション) を含めることができます。 指定されたアイテムは、指定されたDNSポリシーに基づいて生成されるオプションのアイテムのリストに追加されます。 重複アイテムは削除されます。 オプションの詳細については、「DNS解決とキャッシュポリシー」をご参照ください。 |
詳細については、「サービスとポッドのDNS」をご参照ください。
シナリオ3: ECSインスタンスのDNS設定の使用
アプリケーションポッドがACKクラスターにデプロイされた他のサービスにアクセスする必要がない場合は、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
シナリオ4: HostNetworkモードでポッドがACKクラスターのサービスにアクセスできるようにする
アプリケーションポッドのネットワーク設定にhostNetwork:trueを指定した場合、アプリケーションポッドはホストネットワークを直接使用できます。 この場合、ポッドのデフォルトDNSポリシーはdefaultです。 その結果、アプリケーションポッドはACKクラスターにデプロイされたサービスにアクセスできません。 HostNetworkモードのポッドを有効にしてACKクラスターにデプロイされたサービスにアクセスする場合は、DNSポリシー設定にdnsPolicy: ClusterFirstWithHostNet
を指定する必要があります。 例:
apiVersion: v1
kind: Pod
metadata:
name: alpine
namespace: default
spec:
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
containers:
- image: alpine
command:
- sleep
- "10000"
imagePullPolicy: Always
name: alpine
hostAliases
パラメーターを使用して、指定されたIPアドレスにドメイン名を解決するようにポッドを設定します。
次のいずれかの方法を使用して、指定したIPアドレスにドメイン名を解決できます。
グローバル設定 (すべてのポッドが指定されたIPアドレスにドメイン名を解決する): 指定されたIPアドレスにドメイン名を解決するようにすべてのポッドを設定するには、CoreDNSのhostsプラグインを有効にします。 詳細については、「CoreDNSに基づく拡張機能の設定」をご参照ください。
個々のポッド構成: 指定されたIPアドレスにドメイン名を解決するようにポッドを構成するには、HostAliasesパラメーターを使用してポッドの /etc/hostsファイルを変更します。 例:
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"
hostAliases
パラメーターをポッドのspecセクションに追加した後、初期化された /etc/hostsファイルの内容を次のコードブロックに示します。# Kubernetes-managed hosts file. 127.0.**.** localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet fe00::0 ip6-mcastprefix fe00::1 ip6-allnodes fe00::2 ip6-allrouters 10.200.**.** hostaliases-pod # Entries added by HostAliases. 127.0.**.** foo.local bar.local 10.1.**.** foo.remote bar.remote
foo.local、bar.local、foo.remoteのドメイン名は、特定のIPアドレスにマッピングされます。
関連ドキュメント
DNS設定を最適化する方法の詳細については、「DNSサービスのベストプラクティス」をご参照ください。
DNS解決ポリシーとキャッシュポリシーの詳細については、「DNS解決ポリシーとキャッシュポリシー」をご参照ください。