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

Container Service for Kubernetes:CoreDNSログの収集と分析

最終更新日:Nov 21, 2024

CoreDNSはContainer Service for Kubernetes (ACK) クラスターにデプロイされ、DNSサーバーとして機能します。 CoreDNSのログを確認して、DNS解決が遅い原因を特定したり、リスクの高いドメイン名のDNSクエリを分析したりできます。 このトピックでは、CoreDNSログを収集および分析してCoreDNSを監視する方法について説明します。

前提条件

  • logtail-dsコンポーネントがクラスターにインストールされます。

    ACKクラスターを作成すると、システムは自動的にlogtail-dsコンポーネントを選択します。 logtail-dsコンポーネントがインストールされていない場合は、まずコンポーネントをインストールします。 logtail-dsコンポーネントのインストール方法の詳細については、「log Serviceを使用したコンテナーからのログデータの収集」をご参照ください。

  • alibaba-log-controllerのバージョンが0.2.0.0-76648ee-aliyun以降であることを確認してください。logcontroller

    以前のバージョンのalibaba-log-controllerが使用されている場合は、logtail-dsコンポーネントを更新します。 詳細については、「システムコンポーネントの管理」をご参照ください。

ステップ1: CoreDNSのlogtail-dsを有効にする

注意事項

  • logtail-dsを有効にする前に、CoreDNSが最新バージョンに更新されていることを確認してください。 詳細については、「システムコンポーネントの管理」をご参照ください。

  • デフォルトでは、CoreDNSのデプロイ後、logtail-dsはCoreDNSに対して有効になります。 logtail-dsが既に有効になっている場合は、この手順をスキップします。

手順

説明

CoreDNSのlogtail-dsを有効にすると、CPU使用率が約10% 増加し、データ転送も増加します。 CoreDNSのレプリケートされたポッドが高いCPU使用率で実行されている場合は、さらにCoreDNSポッドを追加できます。 CoreDNSポッドを追加する方法の詳細については、「アプリケーションのポッドを手動でスケーリングする」をご参照ください。

ACKは、クラスターのkube-system名前空間にcorednsという名前のConfigMapを作成します。 Corefile設定のlogフィールドでログコンポーネントを指定することで、coredns ConfigMapを変更できます。 これにより、CoreDNSのlogtail-dsが有効になります。 ConfigMapを変更する方法の詳細については、「ConfigMapの変更」をご参照ください。

次の内容は、デフォルトのログ形式を使用するcoredns ConfigMapの例です。

Corefile: |
    .:53 {
        errors
        log # Specify the logging component. 
        health {
           lameduck 5s
        }
        ready
        kubernetes cluster.local in-addr.arpa ip6.arpa {
          pods insecure
          upstream
          fallthrough in-addr.arpa ip6.arpa
          ttl 30
        }
        prometheus :9153
        forward . /etc/resolv.conf
        cache 30
        loop
        reload
        loadbalance
    }
    # If you want to log DNS queries of containers in other domains, you must specify the logging component for these domains by using the same configuration format. 
    demo.com:53 {
        ... 
        log # Specify the logging component. 
    }

ステップ2: CoreDNSのロギングを有効にする

方法1: ACKコンソールを使用する

  1. ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、[操作] > [ログセンター] を選択します。

  3. [ログセンター] ページで、[ネットワークコンポーネントログ] タブをクリックし、[インストール] をクリックします。

    その後、システムは関連コンポーネントを自動的にインストールし、CoreDNSのロギングを有効にします。

方法2: CLIを使用する

AliyunLogConfig CustomResourceDefinitions (CRD) を使用して、ログ設定を記述できます。 alibaba-log-controllerは自動的にLog Service設定を構成し、ログ設定に基づいてログレポートを作成します。 AliyunLogConfig CRDの作成方法の詳細については、「カスタムリソースの管理」をご参照ください。

    重要

    次の設定は、CoreDNSのデフォルトのログ形式が使用されている場合にのみ有効です。 CoreDNSがカスタムログ形式を使用している場合は、Regexフィールドの正規表現を変更する必要があります。

    CoreDNSのログ形式をカスタマイズする方法の詳細については、「log」をご参照ください。

    ログ収集の構成と手順の詳細については、「CRDを使用してDaemonSetモードでコンテナログを収集する」をご参照ください。

  1. k8s-coredns-log.yamlという名前のYAMLファイルを作成します。 次のコードブロックに例を示します。

    apiVersion: log.alibabacloud.com/v1alpha1
    kind: AliyunLogConfig
    metadata:
      #     Your config name, must be unique in you k8s cluster.
      name: k8s-coredns-log
      namespace: kube-system
    spec:
      # logstore name to upload log
      logstore: coredns-log
      # logtail config detail
      productCode: k8s-coredns
      logtailConfig:
        inputType: plugin
        # logtail config name, should be same with [metadata.name]
        configName: k8s-coredns-log
        inputDetail:
          plugin:
            inputs:
            - type: service_docker_stdout
              detail:
                IncludeLabel:
                  io.kubernetes.container.name: coredns
                Stderr: true
                Stdout: true
            processors:
            - type: processor_regex
              detail:
                KeepSource: false
                KeepSourceIfParseError: true
                Keys:
                - level
                - remote
                - port
                - id
                - type
                - class
                - name
                - proto
                - size
                - do
                - bufsize
                - rcode
                - rflags
                - rsize
                - duration
                NoKeyError: true
                NoMatchError: false
                FullMatch: false
                Regex: \[([^]]+)]\s([^:]+):(\S+)\s+-\s+(\S+)\s+"(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+([^"]+)"\s+(\S+)\s+(\S+)\s+(\S+)\s+([\d\.]+).*
                SourceKey: content
            - type: processor_regex
              detail:
                KeepSource: false
                KeepSourceIfParseError: true
                Keys:
                - error
                - rcode
                - name
                - type
                - errorMsg
                NoKeyError: false
                NoMatchError: false
                FullMatch: false
                Regex: \[ERROR]\s+(plugin/errors):\s+(\S)+\s+(\S+)\s+([^:]*):\s+(.*)
                SourceKey: content
  2. 次のコマンドを実行して、CoreDNSのロギングを有効にします。

    kubectl apply -f k8s-coredns-log.yaml

ストレージ、ネットワーク、および自動スケーリングリソースにAliyunLogConfig CRDを設定する方法の詳細については、「手順1: システムコンポーネントのログファイルを収集するための設定ファイルの作成」をご参照ください。

ステップ3: CoreDNSログの照会と分析 (ログストア)

  1. ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、[操作] > [ログセンター] を選択します。

  3. [ログセンター] ページで、[ネットワークコンポーネントログ] タブをクリックします。 CoreDNSタブで、Logstoresをクリックして、CoreDNSログを照会および分析します。

  4. 検索と分析ボックスにクエリと分析ステートメントを入力し、1週間 (相対) をクリックして時間範囲を指定します。

  5. [検索と分析] をクリックして、クエリと分析結果を表示します。

    Log Serviceを使用すると、クエリ結果と分析結果の分布をヒストグラムで表示したり、生のログを分析したり、さまざまな種類のグラフでクエリ結果と分析結果を確認したりできます。 ログのクエリと分析の詳細については、「ログのクエリと分析」をご参照ください。

    • クエリ結果ヒストグラム

      ログ分布ヒストグラムは、照会されたログの経時的な変化を表示します。

      image..png

    • 生ログ

      現在のクエリ結果が [生ログ] タブに表示されます。 [テーブル] または [生データ] をクリックして、ログを分析して現在のドメイン名を期待どおりに解決できるかどうかを確認できます。 返されたレスポンスコードに注意してください。 レスポンスコードの定義の詳細については、「DNSトラブルシューティング」をご参照ください。

      image..png

      下表に、各パラメーターを説明します。

      パラメーター

      説明

      {level}

      ログの重大度レベル。

      INFO

      {remote}

      クライアントが使用するIPアドレス。

      172.16.0.10

      {port}

      クライアントが使用するポート。

      58008

      {id}

      リクエスト ID。

      34518

      {type}

      リクエストタイプ。

      A

      {class}

      リクエストクラス。

      IN

      {name}

      照会されるドメイン名。

      kube-dns.kube-system.svc.cluster.local.

      {proto}

      使用されるプロトコル。

      tcp

      {size}

      リクエストサイズ 単位はバイトです。

      56

      {do}

      EDNS0 DO (DNSSEC OK) ビットが設定されているかどうかを照会します。

      false

      {bufsize}

      リクエストで定義されているEDNS0バッファのサイズ。 単位はバイトです。

      65535

      {rcode}

      応答コード。

      NOERROR

      {rflags}

      応答フラグ。 指定されたすべてのフラグが表示されます。

      qr,aa,rd

      {rsize}

      圧縮前のレスポンスのサイズ。 単位はバイトです。

      110

      {duration}

      応答時間。 単位は秒です。

      0.00011

    • チャートの表示

      クエリおよび分析ステートメントを実行した後、[グラフ] タブでクエリおよび分析結果を表示できます。

    • LogReduce

      [LogReduce] タブで、[LogReduceの有効化] をクリックして、同様のログを集計できます。 詳細は、「LogReduce」をご参照ください。

ステップ4: ダッシュボードで収集したCoreDNSログを表示する

  1. ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、[操作] > [ログセンター] を選択します。

  3. [Log Center] ページで、[Network Component Logs] タブをクリックします。 [CoreDNS] タブで、[ダッシュボード] をクリックして、[Kubernetes CoreDNSログ分析] ページを表示します。

    [Kubernetes CoreDNSログ分析] ページでは、CoreDNSへのクエリ数、DNSクエリの成功率、および応答レイテンシに関する集計情報を表示できます。 また、最も頻繁にアクセスされるドメイン名のリスト、無効なドメイン名のリスト、低速解決のリスト、およびリスクの高いドメイン名のクエリのリストを表示することもできます。

ステップ5: CoreDNSログに基づいてアラートルールを設定する

[Kubernetes CoreDNSログ分析] ページで、各グラフまたはリストに基づいてアラートルールを設定できます。 この操作は、Log Serviceコンソールでのみ実行できます。

  1. ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、[クラスター情報] をクリックします。

  3. [クラスター情報] ページで、[基本情報] タブをクリックします。 次に、Log Service Projectの右側にあるハイパーリンクをクリックして、log Serviceコンソールにログインします。

  4. Logstoresページの左側のナビゲーションページで、[仪表盘] をクリックします。 次に、ダッシュボードリストで [Kubernetes CoreDNSログ分析] を見つけてクリックします。

  5. で管理したいカードの右上隅にKubernetes CoreDNSログ分析ページ、選択more > アラートとして保存.

    アラートパラメーターの詳細については、「ログアラートルールの作成」をご参照ください。alert

    アラートルールの作成後、アラートルールを表示、変更、および無効化できます。 詳細については、「アラートルールの管理」をご参照ください。

次に何をすべきか

ログ収集の無効化

CoreDNSのログ収集を無効にする場合は、次のコマンドを実行して関連するCRDを削除します。

kubectl -n kube-system delete AliyunLogConfig k8s-coredns-log

CRDが削除されると、CoreDNSログはLog Serviceに配信されなくなります。