はじめに
こちらのOpenTelemetry Demoを使うと、簡単にKubernetes上でアプリケーションを動かして、そしてElasticオブザーバビリティ機能を色々試すことができます。
https://opentelemetry.io/docs/demo/kubernetes-deployment/
本記事はGKEを使い、そのやり方をまとめました。
手順
GKEクラスタ作成とOtel Demoアプリのデプロイ
以下でGKEクラスタ作ります。Otel Demoアプリのデプロイは上のDemoアプリドキュメントの通りに行います。
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をクリックします。
OTEL_EXPORTER_OTLP_ENDPOINT と OTEL_EXPORTER_OTLP_HEADERSの値をコピーしてメモしてください。
DemoアプリのOTel CollectorにElasticへの接続を反映
以下のHelmのvaluesファイルを作成してください。メモしておいたURLとトークンを下の<ELASTIC_APM_SERVER_URL>
と<ELASTIC_APM_SECRET_TOKEN>
へ置き換えてください。(トークンは: Authorization: "Bearer QlXHQrkIEFY6IMiNCl" のような形となります。)
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に反映させます。
helm upgrade $CLUSTER_NAME open-telemetry/opentelemetry-demo --values my-values-file.yaml
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からアセットをインストールしてください。(これは一度だけの作業です)
その後、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に値を入れます。
ES_HOSTに入れるURLはこちらから取得できます。ESのユーザーは手っ取り早くやるならElastic Cloudのデプロイメントを作成した時に表示されたelasticユーザーとそのパスワードを使うことができます。(その他のやり方としてCloud IDやAPIキーを使うことも可能です)
以下でElastic AgentをDaemonsetとしてデプロイします。
kubectl create -f elastic-agent-standalone-kubernetes.yaml
kubectl -n kube-system get pods
無事にデプロイが成功したら、データが取り込まれるので、ElasticのDashboardメニューから色々なKubernetesのダッシュボードにメトリックスが表示されるようになります。
APMからログの相関を見る
Elastic Agentを入れると、自動的にOpenTelemetryで収集している情報と紐づきが行われます。
例えば、APM(アプリ)の各サービスのInfrastructureタブからそれが属するPodやk8sのノード(Host)の情報を見ることができます。
eBPF Profiling
必要に応じてUniversal Profilingの機能も簡単にインストールできました。
Universal Profilingメニューで表示される手順を実施するだけです。
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を使っているプロセスとその内部のコード箇所まで追うことが可能です。
以上