ブログ

coreDNSの監視方法

Google Cloudとコンテナの継続的なセキュリティ

本文の内容は、2020年11月3日にDavid Lorite Solanasが投稿したブログ(https://sysdig.com/blog/how-to-monitor-coredns/)を元に日本語に翻訳・再構成した内容となっております。

Kubernetes クラスターで最も一般的な問題や停止は coreDNS に起因する事象であり、coreDNS を監視する方法を学ぶことは非常に重要です。

フロントエンドアプリケーションが突然ダウンしたとしましょう。しばらく調査した後、DNSが500のエラーコードを返し続けているため、バックエンドのエンドポイントを解決できていないことがわかります。この結論に早くたどり着くことができれば、アプリケーションをより早く復旧させることができます。

coreDNSを監視することで、クラスターが最悪のタイミングでダウンして手遅れになる前に、問題を修正する時間を確保することができます。

落ち着いて DNS をチェックしましょう。

0.png

coreDNSとは?

coreDNSはKubernetesのバージョンv1.12以降のデフォルトのkube-DNSで、推奨されているDNSサーバーです。各ポッドやサービスが完全修飾ドメイン名(FQDN)を持つため、重要なコンポーネントです。kube-dnsがダウンすると、クラスタのすべてがダウンします。

1.png

coreDNS を監視する方法

通常はマスターノードで coreDNS を実行しているのを見ることができますが、Docker のようなコンテナを使用する非 Kubernetes 環境でサービスディスカバリを提供するためにベアメタルで実行することもできます。

coreDNS からのメトリクスの取得

CoreDNSはインストルメントされており、Kubernetesコントロールプレーンの他のコンポーネントと同様に、ポート9153でPrometheusメトリクスを公開しています。これはDNSサーバーへのリクエストと内部のプラグインに関する情報を提供します。クラスターのサイズに応じて、レプリカは1つまたは複数になります。各レプリカでCoreDNSをスクレイプする必要があります。

エンドポイントにアクセスしてメトリクスを取得することができます:

curl localhost:9153/metrics

そして、この構造を持つメトリクスのロングリストを返します。(省略)

# HELP coredns_build_info A metric with a constant '1' value labeled by version, revision, and goversion from which CoreDNS was built.
# TYPE coredns_build_info gauge
coredns_build_info{goversion="go1.14.4",revision="f59c03d",version="1.7.0"} 1
# HELP coredns_cache_entries The number of elements in the cache.
# TYPE coredns_cache_entries gauge
coredns_cache_entries{server="dns://:53",type="denial"} 41
coredns_cache_entries{server="dns://:53",type="success"} 15
# HELP coredns_cache_hits_total The count of cache hits.
# TYPE coredns_cache_hits_total counter
coredns_cache_hits_total{server="dns://:53",type="denial"} 366066
coredns_cache_hits_total{server="dns://:53",type="success"} 135
# HELP coredns_cache_misses_total The count of cache misses.
# TYPE coredns_cache_misses_total counter
coredns_cache_misses_total{server="dns://:53"} 106654
# HELP coredns_dns_request_duration_seconds Histogram of the time (in seconds) each request took.
# TYPE coredns_dns_request_duration_seconds histogram
coredns_dns_request_duration_seconds_bucket{server="dns://:53",type="A",zone=".",le="0.00025"} 189356
coredns_dns_request_duration_seconds_bucket{server="dns://:53",type="A",zone=".",le="0.0005"} 189945
coredns_dns_request_duration_seconds_bucket{server="dns://:53",type="A",zone=".",le="0.001"} 190102
coredns_dns_request_duration_seconds_bucket{server="dns://:53",type="A",zone=".",le="0.002"} 235026 

Prometheus で coreDNS を監視するには、対応するジョブを追加するだけです。

- job_name: kube-dns
  honor_labels: true
  kubernetes_sd_configs:
  - role: pod
  relabel_configs:
  - action: keep
    source_labels:
    - __meta_kubernetes_namespace
    - __meta_kubernetes_pod_name
    separator: '/'
    regex: 'kube-system/coredns.+'
  - source_labels:
    - __meta_kubernetes_pod_container_port_name
    action: keep
    regex: metrics
  - source_labels:
    - __meta_kubernetes_pod_name
    action: replace
    target_label: instance
  - action: labelmap 

coreDNSを監視:何を把握すべきか?

免責事項: coreDNSのメトリクスはKubernetesのバージョンによって異なる場合があります。ここでは、Kubernetes 1.18とcoreDNSのバージョンを使用しました。バージョンに応じたメトリクスはKubernetesのレポで確認できます。

リクエストレイテンシー:ゴールデンシグナルに続いて、リクエストの待ち時間は、サービスの劣化を検知するための重要なメトリックです。これをチェックするには、常にパーセンタイルと平均値を比較しなければなりません。Prometheus でこれを行うには、演算子ヒストグラムを使用します。

histogram_quantile(0.99, sum(rate(coredns_dns_request_duration_seconds_bucket{job="kube-dns"}[5m])) by(server, zone, le))

エラーレート:エラーレートは、監視しなければならないもう一つのゴールデンシグナルです。エラーはDNSの失敗が原因とは限りませんが、それでも注意深く監視しなければならない重要な指標です。エラーについての coreDNS の重要なメトリクスの 1 つは coredns_dns_responses_total であり、コードも関連しています。例えば、NXDOMAINエラーは、クエリされたドメイン名が存在しないためにDNSクエリーが失敗したことを意味します。

# HELP coredns_dns_responses_total Counter of response status codes.
# TYPE coredns_dns_responses_total counter
coredns_dns_responses_total{rcode="NOERROR",server="dns://:53",zone="."} 1336
coredns_dns_responses_total{rcode="NXDOMAIN",server="dns://:53",zone="."} 471519 

Sysdig Monitor で coreDNS メトリクスを監視する

etcdを監視するときと同様に、coreDNSのポッドはデフォルトではアノテーションされていません。Sysdigエージェントでメトリクスを取得するには、アノテーションを付ける必要があります。

さらに簡単なのは、 promcat で与えられた手順に従ってコントロールプレーン全体を監視し、必要なメトリクスだけを Prometheus サーバにフェデレートして、それ以外のものはすべて捨ててしまうことです。

既に helm と helmfile を持っていれば、プロセスは簡単です。そうでない場合は、公式の指示に従って helm をインストールし、次に helmfile をインストールすれば簡単にインストールできます。これら2つのアプリケーションを使用すると、適切なルールと設定でPrometheusサーバーをすぐにデプロイすることができます。これには、対応するファイル、helmfile.yaml、recording_rules.yaml、prometheus.yaml、およびprometheus.yml.getmplが含まれています。

この行を実行するだけです:

helmfile sync

Prometheusサーバーをインストールしたら、次はSysdigエージェントを設定します。configmapに以下をコピーすることで設定できます。

apiVersion: v1
kind: ConfigMap
metadata:
  name: sysdig-agent
  namespace: sysdig-agent
data:
  prometheus.yaml: |-
    global:
      scrape_interval: 15s
      evaluation_interval: 15s
    scrape_configs:
    - job_name: 'prometheus' # config for federation
      honor_labels: true
      metrics_path: '/federate'
      metric_relabel_configs:
      - regex: 'kubernetes_pod_name'
        action: labeldrop
      params:
        'match[]':
          - '{sysdig="true"}'
      sysdig_sd_configs:
      - tags:
          namespace: monitoring 

そして、このコントロールプレーンダッシュボードを promcat から追加します:

2.png

このコマンドを実行するだけです:

docker  run -it --rm \
    sysdiglabs/promcat-connect:0.1 \
    install \
    kubernetes-control-plane:1.18.0\
    -t YOUR-API-TOKEN 

まとめ

coreDNSはクラスタ内で最も一般的な問題の発生源です。DNSが障害を起こすと、多くのサービスが(すべてではないにしても)障害を起こし、アプリケーションがダウンしてしまいます。coreDNSを監視することで、問題が発生する前に問題を修正したり、トラブルシューティングをして問題から素早く回復することができます。

Sysdig MonitorでcoreDNSを監視するのはとても簡単です。たった1つのツールで、coreDNSとKubernetesの両方を監視することができます。Sysdig MonitorエージェントがすべてのcoreDNSのメトリクスを収集し、最も重要なcoreDNSのアラートを素早く設定できます。

まだSysdig Monitorをお試しになっていない方は、1クリックで無料トライアルをご利用いただけます。

Sysdigに関するお問い合わせはこちらから

最近の投稿

カテゴリー

アーカイブ

ご質問・お問い合わせはこちら

top