すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:DNSポリシーとドメイン名解決

最終更新日:Nov 12, 2024

このトピックでは、dnsPolicyパラメーターを設定して、Container Service for Kubernetes (ACK) クラスターの各ポッドにDNSポリシーを設定する方法について説明します。 このトピックでは、HostAliasesパラメーターを使用して、指定されたIPアドレスにドメイン名を解決するようにポッドを設定する方法についても説明します。

前提条件

背景情報

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アドレスを指定できます。 ポッドに対してdnsPolicyNoneに設定した場合、少なくとも1つのIPアドレスを指定する必要があります。 ポッドに対してdnsPolicyをNoneに設定しない場合、このパラメーターはオプションです。 リストされたDNSサーバーのIPアドレスは、dnsPolicyの値に基づいて生成されるDNS構成ファイルのnameserverパラメーターに追加されます。 重複したIPアドレスは削除されます。

    検索

    ポッド内のホスト名検索用の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アドレスにマッピングされます。

関連ドキュメント