0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Elastic Stack (Elasticsearch) Advent Calendar 2023Advent Calendar 2023

Day 8

GKE上のOpenTelemetry DemoアプリケーションをさくっとElasticでAPM・ログ・インフラ+eBPFプロファイリング監視する

Posted at

はじめに

こちらのOpenTelemetry Demoを使うと、簡単にKubernetes上でアプリケーションを動かして、そしてElasticオブザーバビリティ機能を色々試すことができます。
https://opentelemetry.io/docs/demo/kubernetes-deployment/

本記事はGKEを使い、そのやり方をまとめました。

手順

GKEクラスタ作成とOtel Demoアプリのデプロイ

以下でGKEクラスタ作ります。Otel Demoアプリのデプロイは上のDemoアプリドキュメントの通りに行います。

sh
CLUSTER_NAME=nobu-test-cluster
REGION=us-east4
gcloud container clusters create $CLUSTER_NAME --region=$REGION
gcloud components install gke-gcloud-auth-plugin
gcloud container clusters get-credentials $CLUSTER_NAME --region=$REGION
kubectl get namespaces

helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts
helm install $CLUSTER_NAME open-telemetry/opentelemetry-demo
kubectl get deployments

Elastic Cloudへの接続情報を取得

KibanaのAPM画面からAdd dataをクリックします。

image.png

OTEL_EXPORTER_OTLP_ENDPOINT と OTEL_EXPORTER_OTLP_HEADERSの値をコピーしてメモしてください。
image.png

DemoアプリのOTel CollectorにElasticへの接続を反映

以下のHelmのvaluesファイルを作成してください。メモしておいたURLとトークンを下の<ELASTIC_APM_SERVER_URL><ELASTIC_APM_SECRET_TOKEN>へ置き換えてください。(トークンは: Authorization: "Bearer QlXHQrkIEFY6IMiNCl" のような形となります。)

my-values-file.yaml
default:
  envOverrides:
    - name: OTEL_RESOURCE_ATTRIBUTES
      value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo,deployment.environment=sample-GKE

opentelemetry-collector:
  config:
    exporters:
      otlphttp/elastic:
        endpoint: "<ELASTIC_APM_SERVER_URL>"
        headers:
        # Elastic APM Server secret token
          Authorization: "Bearer <ELASTIC_APM_SECRET_TOKEN>" 

    service:
      pipelines:
        traces:
          receivers: [otlp]
          processors: [batch]
          exporters: [otlphttp/elastic]
        metrics:
          receivers: [otlp]
          exporters: [logging, otlphttp/elastic]
        logs: 
          receivers: [otlp]
          exporters: [logging, otlphttp/elastic]

以下のコマンドで上記の設定をKubernetesに反映させます。

sh
helm upgrade $CLUSTER_NAME open-telemetry/opentelemetry-demo --values my-values-file.yaml

数分すれば、以下のようにAPM画面でデータが確認できます。
image.png

Elastic Agentのインストール

上記にてOpenTelemetryのテレメトリーはElasticに取り込むことができました。
さらにElastic Agentを監視対象のKubernetesクラスタのDaemonsetとしてインストールすることで、Kubernetesの各種メトリクスや、コンテナログを収集することができます。

Elastic Agentのインストールは、Fleet機能で集中管理するタイプと、スタンドアロンで集中管理しないタイプがあります。今回はさくっとできるスタンドアロンでの手順です。以下のドキュメントを参照しています。
https://www.elastic.co/guide/en/fleet/current/running-on-kubernetes-standalone.html

その前に、Kubernetes用のダッシュボードなどのアセットをElastic Cloud側にインストールするため、以下のIntegrationsのKubenretesのSettingsからアセットをインストールしてください。(これは一度だけの作業です)
image.png

その後、Elastic Agentのインストール手順を実施していきます。
Kubernetesのメトリック収集のために以下を実施

git clone https://github.com/kubernetes/kube-state-metrics.git
kubectl apply -k kube-state-metrics

Elastic AgentをKubernetesに入れるためのデプロイメントファイルをダウンロードします。

curl -L -O https://raw.githubusercontent.com/elastic/elastic-agent/8.11/deploy/kubernetes/elastic-agent-standalone-kubernetes.yaml

ダウンロードしたファイルを開き、以下の部分のES_USERNAME, ES_PASSWORD, ES_HOSTに値を入れます。
image.png

ES_HOSTに入れるURLはこちらから取得できます。ESのユーザーは手っ取り早くやるならElastic Cloudのデプロイメントを作成した時に表示されたelasticユーザーとそのパスワードを使うことができます。(その他のやり方としてCloud IDやAPIキーを使うことも可能です)
image.png

以下でElastic AgentをDaemonsetとしてデプロイします。

kubectl create -f elastic-agent-standalone-kubernetes.yaml
kubectl -n kube-system get pods

無事にデプロイが成功したら、データが取り込まれるので、ElasticのDashboardメニューから色々なKubernetesのダッシュボードにメトリックスが表示されるようになります。
image.png

APMからログの相関を見る

Elastic Agentを入れると、自動的にOpenTelemetryで収集している情報と紐づきが行われます。

例えば、APM(アプリ)の各サービスのInfrastructureタブからそれが属するPodやk8sのノード(Host)の情報を見ることができます。

image.png

Podのメトリクス
image.png

Hostのメトリクス
image.png

Hostのログ
image.png

コンテナログ
image.png

APMトレースから、コンテナログに飛ぶこともできます
image.png

image.png

eBPF Profiling

必要に応じてUniversal Profilingの機能も簡単にインストールできました。
Universal Profilingメニューで表示される手順を実施するだけです。
image.png

helm repo add elastic https://helm.elastic.co

helm install --create-namespace -n=universal-profiling universal-profiling-agent \
--set "projectID=1,secretToken=qsaJN8eynrQxQQea" \
--set "collectionAgentHostPort=xxxxxxx.profiling.us-west1.gcp.cloud.es.io:443" \
--set "version=8.11.1" \
--version=8.11.1 \
elastic/pf-host-agent

kubectl -n universal-profiling get pods

詳しくは解説しませんが、このようにKubernetesのホスト・コンテナ両方のプロセスのスタックトレースを低負荷で取得できます。それにより、CPUを使っているプロセスとその内部のコード箇所まで追うことが可能です。
image.png

以上

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?