ブログ

kube-proxyを監視する方法

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

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

この記事では、クラスターネットワークの正しい健全性を確保するためにkube-proxyを監視する方法を学びます。Kubernetesコントロールプレーンの主要なコンポーネントの1つであり、クラスターの頭脳です。

Kubernetesの利点の一つは、ネットワークやポッドが物理的にどのように相互接続しているかを気にしなくて済むことです。

kube-proxyから最も重要なメトリクスを収集し、このサービスを監視するためにそれらを使用する方法を学ぶために読み進めてください。

kube-proxy とは何ですか?

kube-proxy はネットワークプロキシとロードバランスの実装で、各ノードと api-server のリンクとして機能します。クラスタの各ノードで動作し、クラスタの内外からポッドに接続することができます。 kube-proxyは各ノードに存在します。

0.png

kube-proxyを監視する方法

マスターノードを除くすべてのクラスタノードで、kube-system ネームスペースの下にある kube-proxy を監視する必要があります。

kube-proxy からのメトリクスの取得

Kubernetes の他のコントロールプレーンパーツと同様に、kube-proxy には Prometheus のメトリクスがインスツルメントされており、デフォルトでは 10249 番ポートで公開されています。このメトリクスのエンドポイントは簡単にスクレイプすることができ、追加のスクリプトやエクスポーターを必要とせずに有用な情報を得ることができます。

メトリクスが公開されているので、curl で各 kube-proxy ポッドをスクレイプするだけです。

curl https://[kube_proxy_ip]:10249/metrics

これは、この構造を持つメトリクスの長いリスト(省略)を返します。

...
# HELP rest_client_request_duration_seconds Request latency in seconds. Broken down by verb and URL.
# TYPE rest_client_request_duration_seconds histogram
rest_client_request_duration_seconds_bucket{url="/https://XXXX%7Bprefix%7D",verb="GET",le="0.001"} 41
rest_client_request_duration_seconds_bucket{url="https://XXXX/%7Bprefix%7D",verb="GET",le="0.002"} 88
rest_client_request_duration_seconds_bucket{url="https://XXXX/%7Bprefix%7D",verb="GET",le="0.004"} 89
rest_client_request_duration_seconds_count{url="https://XXXX/%7Bprefix%7D",verb="POST"} 7
# HELP rest_client_request_latency_seconds (Deprecated) Request latency in seconds. Broken down by verb and URL.
# TYPE rest_client_request_latency_seconds histogram
rest_client_request_latency_seconds_bucket{url="https://XXXX/%7Bprefix%7D",verb="GET",le="0.001"} 41
...
rest_client_request_latency_seconds_sum{url="https://XXXX/%7Bprefix%7D",verb="POST"} 0.0122645
rest_client_request_latency_seconds_count{url="https://XXXX/%7Bprefix%7D",verb="POST"} 7
# HELP rest_client_requests_total Number of HTTP requests, partitioned by status code, method, and host.
# TYPE rest_client_requests_total counter
rest_client_requests_total{code="200",host="XXXX",method="GET"} 26495
rest_client_requests_total{code="201",host="XXXX",method="POST"} 1
rest_client_requests_total{code="<error>",host="XXXX",method="GET"} 91 

Prometheus サーバで kube-proxy をスクレイプするように設定したい場合は、次のジョブをスクレイプ設定に追加してください。

- job_name: kube-proxy
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/kube-proxy.+'
- source_labels:
   - __address__
   action: replace
   target_label: __address__
   regex: (.+?)(\\:\\d+)?
   replacement: $1:10249 

必要に応じて独自のラベルやリラベル設定でカスタマイズすることを忘れないでください。

kube-proxyの監視:何を見ればいいのか?

kube-proxyの監視にはGolden Signalsを使用する必要があります。Golden Signalsは、サービスが顧客のためにどのようにパフォーマンスを発揮しているかについて適切な洞察を与えるメトリクスを通してサービスを監視する技術です。これらのメトリクスは、レイテンシー、リクエスト、エラー、サチュレーションです。

免責事項: kube-proxyのメトリクスはKubernetesのバージョンによって異なる場合があります。ここではKubernetes 1.18を使用しました。バージョンに応じたメトリクスは Kubernetes repo で確認できます (1.18.3 バージョンの場合はリンク)。

Kubeのプロキシノードが立ち上がっている チェックすべき主要なメトリクスは、各作業ノードで kube-proxy が稼働しているかどうかです。Kube-proxy はデーモンセットとして動作しているため、up メトリクスの合計が作業ノードの数と同じであることを確認する必要があります。

Kube-proxy ポッドが起動していることを確認するアラートの例は次のようになります。

sum(up{job=\"kube-proxy\"}) < number of working nodes

Rest クライアントの待ち時間:この情報はメトリクスrest_client_request_duration_seconds_bucketにあります。

# HELP rest_client_request_duration_seconds Request latency in seconds. Broken down by verb and URL.
# TYPE rest_client_request_duration_seconds histogram
rest_client_request_duration_seconds_bucket{url="https://URL/%7Bprefix%7D",verb="GET",le="0.001"} 41
rest_client_request_duration_seconds_bucket{url="https://URL/%7Bprefix%7D",verb="GET",le="0.002"} 88
rest_client_request_duration_seconds_bucket{url="https://URL/%7Bprefix%7D",verb="GET",le="0.004"} 89
rest_client_request_duration_seconds_bucket{url="https://URL/%7Bprefix%7D",verb="GET",le="0.008"} 91
rest_client_request_duration_seconds_bucket{url="https://URL/%7Bprefix%7D",verb="GET",le="0.016"} 93
rest_client_request_duration_seconds_bucket{url="https://URL/%7Bprefix%7D",verb="GET",le="0.032"} 93
rest_client_request_duration_seconds_bucket{url="https://URL/%7Bprefix%7D",verb="GET",le="0.064"} 93
rest_client_request_duration_seconds_bucket{url="https://URL/%7Bprefix%7D",verb="GET",le="0.128"} 93
rest_client_request_duration_seconds_bucket{url="https://URL/%7Bprefix%7D",verb="GET",le="0.256"} 93
rest_client_request_duration_seconds_bucket{url="https://URL/%7Bprefix%7D",verb="GET",le="0.512"} 93
rest_client_request_duration_seconds_bucket{url="https://URL/%7Bprefix%7D",verb="GET",le="+Inf"} 93
rest_client_request_duration_seconds_sum{url="https://URL/%7Bprefix%7D",verb="GET"} 0.11051893900000001
rest_client_request_duration_seconds_count{url="https://URL/%7Bprefix%7D",verb="GET"} 93 

このアラートは、過去5分間にクラスターネットワークで遅いPOSTリクエストが60件以上あった場合に警告します。

histogram_quantile(0.99, sum(rate(rest_client_request_duration_seconds_bucket{job="kube-proxy",verb="POST"}[5m])) by (verb, url, le)) > 60

ルール syncレイテンシー:kube-proxy は常にノード間でネットワークルールを同期しています。このプロセスにかかる時間をチェックするのは良いアイデアです。

# HELP kubeproxy_sync_proxy_rules_duration_seconds SyncProxyRules latency in seconds
# TYPE kubeproxy_sync_proxy_rules_duration_seconds histogram
kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="0.001"} 2
kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="0.002"} 2
kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="0.004"} 2
kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="0.008"} 2
kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="0.016"} 2
kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="0.032"} 75707
kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="0.064"} 199584
kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="0.128"} 209426
kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="0.256"} 210353
kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="0.512"} 210411
kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="1.024"} 210429
kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="2.048"} 210535
kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="4.096"} 210550
kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="8.192"} 210562
kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="16.384"} 210565
kubeproxy_sync_proxy_rules_duration_seconds_bucket{le="+Inf"} 210567
kubeproxy_sync_proxy_rules_duration_seconds_sum 8399.833554354082
kubeproxy_sync_proxy_rules_duration_seconds_count 210567 

リクエストのコード:クラスタ内のすべての HTTP リクエストの HTTP レスポンスコードを監視する必要があります。エラーのあるリクエストの数が増えている場合は、何かが間違っている可能性があります。

# HELP rest_client_requests_total Number of HTTP requests, partitioned by status code, method, and host.
# TYPE rest_client_requests_total counter
rest_client_requests_total{code="200",host="host_url",method="GET"} 26495
rest_client_requests_total{code="201",host="host_url",method="POST"} 1
rest_client_requests_total{code="<error>",host="host_url",method="GET"} 91
rest_client_requests_total{code="<error>",host="host_url",method="POST"} 6 

例えば、コード5xxでリクエスト数の増加を警告するには、以下のようなアラートを作成します。

sum(rate(rest_client_requests_total{job="kube-proxy",code=~"5.."}[5m])) by (host,method)/sum(rate(rest_client_requests_total{job="kube-proxy"}[5m])) by (host,method) > 0.10

kube-proxyのメトリクスをSysdig Monitorで監視する

Sysdig Monitorでkube-proxyをトラッキングするためには、SysdigエージェントのYAML設定ファイルにいくつかのセクションを追加し、Prometheusサーバーを使用してメトリクスをフィルタリングする必要があります。

中間のPrometheusサーバーを使わないという選択もできますが、kube-proxyは多くのメトリクスを提供していることを覚えておかなければなりません。必要なのはそのうちのいくつかだけなので、この戦略は物事を非常に単純化します。

まず第一に、Prometheus サーバが稼働している必要があります。

もし、それを持っていないのであれば、心配する必要はありません。新しいPrometheusのデプロイは、2つのコマンドを実行するだけで簡単です。1つ目はPrometheus用のネームスペースを作成し、2つ目はhelm 3を使ってデプロイします。

kubectl create ns monitoring
helm install -f values.yaml prometheus -n monitoring stable/prometheus 

values.yamlファイルの内容は以下のようになります。

server:
strategy:
   type: Recreate
podAnnotations:
   prometheus.io/scrape: "true"
   prometheus.io/port: "9090" 

Prometheus が稼働したら、必要なメトリクスを選択するためのフィルタリングルールを作成する必要があります。これらのルールは、どのメトリクスが収集されるべきかを知るためにSysdigエージェントによって使用されるカスタムラベルを持つ新しいメトリクスを作成します。

ルールはPromCat.ioで見つけることができます。また、Sysdigでkube-proxyを監視するために必要な全てのステップを見つけることができます。

これはエージェントの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
          deployment: prometheus-server 
1.png

まとめ

kube-proxy は通常、クラスターの中で忘れ去られている部分ですが、kube-proxy に問題があるとクラスターネットワークがダウンしてしまうことがあります。何か変なことが起こっているときには、それについてアラートを出しておく必要があります。

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

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

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

最近の投稿

カテゴリー

アーカイブ

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

top