Elastic Stack は統合監視機能を提供します。この機能を使用すると、Kibana を使用して、コンテナーサービス Kubernetes 版 (ACK) クラスターのログ、メトリクス、およびアプリケーションパフォーマンス監視 (APM) データを集中管理方式で分析および表示できます。ACK クラスターのポッドにアプリケーションをデプロイする場合、ポッドによって生成されたログ、ホストとネットワークのイベントメトリクス、および Kibana コンソールでの APM データを表示できます。これはトラブルシューティングに役立ちます。このトピックでは、ACK クラスターの統合監視を実装する方法について説明します。
前提条件
Alibaba Cloud Elasticsearch クラスターが作成され、クラスターのホワイトリストが構成され、クラスターの自動インデックス作成機能が有効になっています。この例では、Alibaba Cloud Elasticsearch V6.8 クラスターが作成されます。
詳細については、「Alibaba Cloud Elasticsearch クラスターを作成する」、「Elasticsearch クラスターのパブリックまたはプライベート IP アドレスホワイトリストを構成する」、および「YML ファイルを構成する」をご参照ください。
ACK クラスターが作成され、クラスターにポッドが作成されます。この例では、ACK クラスターバージョン 1.18.8-aliyun.1 が使用され、クラスターに使用される各 Elastic Compute Service (ECS) インスタンスには 2 個の vCPU と 8 GiB のメモリがあります。
詳細については、「ACK マネージドクラスターを作成する」をご参照ください。
kubectl クライアントが構成されており、ACK クラスターへのアクセスに使用できます。
詳細については、「クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続する」をご参照ください。
背景情報
このトピックでは、Elastic Stack を使用して ACK クラスターの統合監視を実装する方法について説明します。詳細については、以下のセクションをご参照ください。
Metricbeat、Filebeat、および Elastic APM の機能の詳細については、「インフラストラクチャ監視」、「ログ監視」、および「Elastic APM」をご参照ください。
Metricbeat を使用してメトリクスを収集する
Metricbeat を ACK クラスターにデプロイするには、次のコントローラーを使用できます。
DaemonSet:DaemonSet コントローラーは、クラスター内の各ノードで 1 つのポッドが実行されるようにします。これにより、Metricbeat は、ホストメトリクス、システムメトリクス、Docker 統計、および ACK クラスターで実行されているすべてのサービスのメトリクスを収集できます。
Deployment:Deployment コントローラーを使用して、単一の Metricbeat シッパーをデプロイできます。シッパーは、Kubernetes イベントや kube-state-metrics サービスのメトリクスなど、ACK クラスターの固有のメトリクスを取得するために使用されます。
この例では、DaemonSet コントローラーと Deployment コントローラーの両方を使用して、Metricbeat を ACK クラスターにデプロイします。DaemonSet または Deployment コントローラーのみを使用して Metricbeat をデプロイすることもできます。
Metricbeat は、kube-state-metrics サービスによって提供される監視機能に依存しています。Metricbeat をデプロイする前に、kube-state-metrics がデプロイされていることを確認する必要があります。デフォルトでは、kube-state-metrics は ACK クラスターのコンテナーの arms-prom ネームスペースにデプロイされます。
kubectl クライアントを使用して ACK クラスターにアクセスし、Metricbeat 構成ファイルをダウンロードします。
curl -L -O https://raw.githubusercontent.com/elastic/beats/6.8/deploy/kubernetes/metricbeat-kubernetes.yamlMetricbeat 構成ファイルを変更します。
重要公式の Metricbeat 構成ファイルでは、DaemonSet と Deployment に extensions/v1beta1 API バージョンが使用されています。この API バージョンは、ACK V1.18 以降では非推奨です。ACK V1.18 以降の Kubernetes、DaemonSet、Deployment、および ReplicaSet には、apps/v1 API バージョンを使用するように Metricbeat 構成ファイルを変更する必要があります。
kind: Deployment および kind: DaemonSet の構成を変更します。
環境変数を変更します。次のコードは例を示しています。
env: - name: ELASTICSEARCH_HOST value: es-cn-nif23p3mo0065****.elasticsearch.aliyuncs.com - name: ELASTICSEARCH_PORT value: "9200" - name: ELASTICSEARCH_USERNAME value: elastic - name: ELASTICSEARCH_PASSWORD value: **** - name: KIBANA_HOST value: es-cn-nif23p3mo0065****-kibana.internal.elasticsearch.aliyuncs.com - name: KIBANA_PORT value: "5601"説明デフォルトでは、ダウンロードされた Metricbeat 構成ファイルでは Kibana 変数は定義されていません。env パラメーターを使用して変数を渡すことができます。
パラメーター
説明
ELASTICSEARCH_HOST
Elasticsearch クラスターの内部エンドポイント。
ELASTICSEARCH_PORT
Elasticsearch クラスターのプライベートポート。
ELASTICSEARCH_USERNAME
Elasticsearch クラスターのユーザー名。このパラメーターのデフォルト値は elastic です。
ELASTICSEARCH_PASSWORD
elastic ユーザー名に対応するパスワード。
KIBANA_HOST
Kibana の内部エンドポイント。
KIBANA_PORT
Kibana のプライベートポート。
spec.selector 構成を追加します。次のコードは例を示しています。
## kind: DaemonSet spec: selector: matchLabels: k8s-app: metricbeat template: metadata: labels: k8s-app: metricbeat ## kind: Deployment spec: selector: matchLabels: k8s-app: metricbeat template: metadata: labels: k8s-app: metricbeat
name: metricbeat-daemonset-config および name: metricbeat-deployment-config の Kibana 出力情報を構成して、構成ファイルで構成されている環境変数を使用します。
output.elasticsearch: hosts: ['${ELASTICSEARCH_HOST:elasticsearch}:${ELASTICSEARCH_PORT:9200}'] username: ${ELASTICSEARCH_USERNAME} password: ${ELASTICSEARCH_PASSWORD} setup.kibana: host: "https://${KIBANA_HOST}:${KIBANA_PORT}" setup.dashboards.enabled: truemetricbeat-daemonset-modules に関連する構成を変更します。System モジュールによって監視されるシステムメトリクスと、Kubernetes モジュールによって取得できるメトリクスを定義します。System モジュールは、CPU、負荷、メモリ、およびネットワークのメトリクスを監視します。
説明Metricbeat のモジュールの構成とメトリクスの詳細については、「System モジュール」および「Kubernetes モジュール」をご参照ください。
apiVersion: v1 kind: ConfigMap metadata: name: metricbeat-daemonset-modules namespace: kube-system labels: k8s-app: metricbeat data: system.yml: |- - module: system period: 10s metricsets: - cpu - load - memory - network - process - process_summary - core - diskio - socket processes: ['.*'] process.include_top_n: by_cpu: 5 # CPU 使用率上位 5 つのプロセスを含める by_memory: 5 # メモリ使用量上位 5 つのプロセスを含める - module: system period: 1m metricsets: - filesystem - fsstat processors: - drop_event.when.regexp: system.filesystem.mount_point: '^/(sys|cgroup|proc|dev|etc|host|lib)($|/)' kubernetes.yml: |- - module: kubernetes metricsets: - node - system - pod - container - volume period: 10s host: ${NODE_NAME} hosts: ["localhost:10255"]metricbeat-deployment-modules に関連する構成を変更して、kube-state-metrics および Kubernetes イベントのメトリクスを取得します。
重要Metricbeat サービスは kube-system ネームスペースにデプロイされます。kube-state-metrics サービスは、デフォルトで arms-prom ネームスペースにデプロイされます。2 つのサービスは異なるネームスペースに属しています。したがって、hosts パラメーターを kube-state-metrics.<namespace>:8080 の形式で指定します。Metricbeat サービスと kube-state-metrics サービスが同じネームスペースにデプロイされている場合は、hosts パラメーターを kube-state-metrics:8080 に設定します。
apiVersion: v1 kind: ConfigMap metadata: name: metricbeat-deployment-modules namespace: kube-system labels: k8s-app: metricbeat data: # このモジュールには、「kube-system」ネームスペースで実行されている `kube-state-metrics` が必要です。 kubernetes.yml: |- - module: kubernetes metricsets: - state_node - state_deployment - state_replicaset - state_pod - state_container period: 10s host: ${NODE_NAME} hosts: ["kube-state-metrics.arms-prom:8080"] # k8s イベントを取得するには、これをコメント解除します。 - module: kubernetes metricsets: - eventロールを作成し、そのロールを Metricbeat に割り当てて、ロールベースのアクセス制御 (RBAC) を実装します。これにより、Metricbeat が ACK クラスターのリソース情報を取得できるようになります。
apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: name: metricbeat subjects: - kind: ServiceAccount name: metricbeat namespace: kube-system roleRef: kind: ClusterRole name: metricbeat apiGroup: rbac.authorization.k8s.io --- apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRole metadata: name: metricbeat labels: k8s-app: metricbeat rules: - apiGroups: [""] resources: - nodes - namespaces - events - pods verbs: ["get", "list", "watch"] - apiGroups: ["extensions"] resources: - replicasets verbs: ["get", "list", "watch"] - apiGroups: ["apps"] resources: - statefulsets - deployments verbs: ["get", "list", "watch"] - apiGroups: - "" resources: - nodes/stats verbs: - get --- apiVersion: v1 kind: ServiceAccount metadata: name: metricbeat namespace: kube-system labels: k8s-app: metricbeat ---
ACK クラスターに Metricbeat をデプロイし、クラスターのリソースを表示します。
kubectl クライアントを使用して、次のコマンドを実行します。
kubectl apply -f metricbeat-kubernetes.yaml kubectl get pods -n kube-system重要ポッド内のリソースが実行されていることを確認する必要があります。そうでない場合、Kibana コンソールにデータが表示されないことがあります。
Kibana コンソールで監視対象データを表示します。
Elasticsearch クラスターの Kibana コンソールにログオンします。
詳細については、「Kibana コンソールにログオンする」をご参照ください。
左側のナビゲーションペインで、[infrastructure] をクリックします。
ACK クラスターのホストとポッドのメトリクスの統計を表示します。
ホストのメトリクスの統計を表示する: [Infrastructure] ページで、右上隅にある [hosts] をクリックします。[map View] タブで、ホストをクリックし、[view Metrics] を選択します。CPU、負荷、およびメモリのメトリクスの統計を表示できます。


ACK クラスターのポッドのメトリクスの統計を表示する: [Infrastructure] ページで、右上隅にある [kubernetes] をクリックします。[map View] タブで、ポッドをクリックし、[view Metrics] を選択します。CPU、メモリ、およびネットワークのメトリクスの統計を表示できます。

ACK クラスターのリソースの全体的な統計を表示します。
左側のナビゲーションペインで [dashboard] をクリックします。[Dashboards] ページで、[Metricbeat Kubernetes] Overview をクリックします。ACK クラスターのリソースの全体的な統計を表示できます。

Filebeat を使用してログを収集する
この例では、DaemonSet コントローラーを使用して Filebeat をデプロイします。DaemonSet コントローラーは、ACK クラスターの各ノードでポッドを実行してデータを収集するようにします。Filebeat 構成ファイルのリソースは、kube-system ネームスペースにデプロイされます。リソースがデプロイされるネームスペースを変更する場合は、構成ファイルを変更できます。
Filebeat 構成ファイルをダウンロードします。
kubectl クライアントを使用して ACK クラスターにアクセスし、Filebeat 構成ファイルをダウンロードします。
curl -L -O https://raw.githubusercontent.com/elastic/beats/6.8/deploy/kubernetes/filebeat-kubernetes.yamlFilebeat 構成ファイルを変更します。
kind: DaemonSet の構成を変更します。
env: - name: ELASTICSEARCH_HOST value: es-cn-nif23p3mo0065****.elasticsearch.aliyuncs.com - name: ELASTICSEARCH_PORT value: "9200" - name: ELASTICSEARCH_USERNAME value: elastic - name: ELASTICSEARCH_PASSWORD value: **** - name: KIBANA_HOST value: es-cn-nif23p3mo0065****-kibana.internal.elasticsearch.aliyuncs.com - name: KIBANA_PORT value: "5601" - name: NODE_NAME valueFrom: fieldRef: fieldPath: spec.nodeNameパラメーター
説明
ELASTICSEARCH_HOST
Elasticsearch クラスターの内部エンドポイント。
ELASTICSEARCH_PORT
Elasticsearch クラスターのプライベートポート。
ELASTICSEARCH_USERNAME
Elasticsearch クラスターのユーザー名。このパラメーターのデフォルト値は elastic です。
ELASTICSEARCH_PASSWORD
elastic ユーザー名に対応するパスワード。
KIBANA_HOST
Kibana の内部エンドポイント。
KIBANA_PORT
Kibana のプライベートポート。
NODE_NAME
ACK クラスターのホスト。
name: filebeat-config の ConfigMap 構成を変更し、構成ファイルで構成されている環境変数を使用するように Kibana 出力情報を構成します。
output.elasticsearch: hosts: ['${ELASTICSEARCH_HOST:elasticsearch}:${ELASTICSEARCH_PORT:9200}'] username: ${ELASTICSEARCH_USERNAME} password: ${ELASTICSEARCH_PASSWORD} setup.kibana: host: "https://${KIBANA_HOST}:${KIBANA_PORT}"ACK クラスターのコンテナーからログを収集するように Filebeat を構成します。
apiVersion: v1 kind: ConfigMap metadata: name: filebeat-inputs namespace: kube-system labels: k8s-app: filebeat data: kubernetes.yml: |- - type: docker containers.ids: - "*" processors: - add_kubernetes_metadata: host: ${NODE_NAME} in_cluster: true ---
ACK クラスターに Filebeat をデプロイし、クラスターのリソースを表示します。
kubectl クライアントを使用して、次のコマンドを実行します。
kubectl apply -f filebeat-kubernetes.yaml kubectl get pods -n kube-system重要ポッド内のリソースが実行されていることを確認する必要があります。そうでない場合、Kibana コンソールにデータが表示されないことがあります。
Kibana コンソールでリアルタイムログを表示します。
Elasticsearch クラスターの Kibana コンソールにログオンします。
詳細については、「Kibana コンソールにログオンする」をご参照ください。
ACK クラスターのホストとポッドのログを表示します。
ホストのログを表示する: [Infrastructure] ページで、右上隅にある [hosts] をクリックします。[map View] タブで、ホストをクリックし、[view Logs] を選択します。ホストのリアルタイムログを表示できます。
ACK クラスターのポッドのログを表示する: [Infrastructure] ページで、右上隅にある [kubernetes] をクリックします。[map View] タブで、ポッドをクリックし、[view Logs] を選択します。ポッドのリアルタイムログを表示できます。

Elastic APM を使用してアプリケーションのパフォーマンスを監視する
Elastic APM は、Elastic Stack 上に構築されたアプリケーションパフォーマンス監視システムです。Elastic APM を使用すると、ソフトウェアサービスとアプリケーションをリアルタイムで監視できます。監視を実装し、トラブルシューティングを容易にするために、Elastic APM は、リクエストの応答時間、データベースクエリ、キャッシュへの呼び出し、および外部 HTTP リクエストに関する詳細なパフォーマンス情報を収集します。Elastic APM は、処理されていないエラーと例外も自動的に収集します。エラーは、スタックトレースに基づいてグループ化されます。これにより、新しいエラーを特定し、特定のエラーが発生する回数を把握できます。
Elastic APM の詳細については、「Elastic APM の概要」をご参照ください。
APM Server をコンテナーにデプロイします。
この例では、APM Server は ACK クラスターにデプロイされます。ConfigMap コントローラーを使用して apm-server.yml ファイルを定義し、ポッドを初期化することで APM Server を起動できます。その後、Service オブジェクトを使用して、サービスの自己発見と負荷分散を実装できます。
apm-server-yml ファイルを構成します。
ファイルには次のコードが含まれています。
--- apiVersion: v1 kind: ConfigMap metadata: name: apm-deployment-config namespace: kube-system labels: k8s-app: apmserver data: apm-server.yml: |- apm-server.host: "0.0.0.0:8200" output.elasticsearch: hosts: ['${ELASTICSEARCH_HOST:elasticsearch}:${ELASTICSEARCH_PORT:9200}'] username: ${ELASTICSEARCH_USERNAME} password: ${ELASTICSEARCH_PASSWORD} setup.kibana: host: "https://${KIBANA_HOST}:${KIBANA_PORT}" --- apiVersion: apps/v1 kind: Deployment metadata: name: apmserver namespace: kube-system labels: k8s-app: apmserver spec: selector: matchLabels: k8s-app: apmserver template: metadata: labels: k8s-app: apmserver spec: serviceAccountName: apmserver hostNetwork: true dnsPolicy: ClusterFirstWithHostNet containers: - name: apmserver image: docker.elastic.co/apm/apm-server:6.8.14 args: [ "-c", "/etc/apm-server.yml", "-e", ] env: - name: ELASTICSEARCH_HOST value: es-cn-oew20i5h90006****.elasticsearch.aliyuncs.com - name: ELASTICSEARCH_PORT value: "9200" - name: ELASTICSEARCH_USERNAME value: elastic - name: ELASTICSEARCH_PASSWORD value: **** - name: KIBANA_HOST value: es-cn-oew20i5h90006****-kibana.internal.elasticsearch.aliyuncs.com - name: KIBANA_PORT value: "5601" - name: NODE_NAME valueFrom: fieldRef: fieldPath: spec.nodeName securityContext: runAsUser: 0 resources: limits: memory: 50Mi requests: cpu: 20m memory: 30Mi volumeMounts: - name: config mountPath: /etc/apm-server.yml readOnly: true subPath: apm-server.yml volumes: - name: config configMap: defaultMode: 0600 name: apm-deployment-config --- apiVersion: v1 kind: Service metadata: name: apmserver namespace: kube-system labels: k8s-app: apmserver spec: clusterIP: None ports: - name: http-metrics port: 8200 targetPort: 8200 selector: k8s-app: apmserver --- apiVersion: v1 kind: ServiceAccount metadata: name: apmserver namespace: kube-system labels: k8s-app: apmserver ---重要Deployment コントローラーを使用して APM Server をデプロイする場合、docker.elastic.co/apm/apm-server:6.8.14 イメージを使用してポッドをデプロイします。イメージのバージョンは、Elasticsearch クラスターのバージョンと一致している必要があります。
ポート 8200 は、Service オブジェクトを使用して ACK クラスターに公開されます。これにより、APM エージェントが APM Server と通信できるようになります。
パラメーター
説明
ELASTICSEARCH_HOST
Elasticsearch クラスターの内部エンドポイント。
ELASTICSEARCH_PORT
Elasticsearch クラスターのプライベートポート。
ELASTICSEARCH_USERNAME
Elasticsearch クラスターのユーザー名。このパラメーターのデフォルト値は elastic です。
ELASTICSEARCH_PASSWORD
elastic ユーザー名に対応するパスワード。
KIBANA_HOST
Kibana の内部エンドポイント。
KIBANA_PORT
Kibana のプライベートポート。
NODE_NAME
ACK クラスターのホスト。
APM Server をコンテナーにデプロイし、APM Server のステータスを表示します。
kubectl クライアントを使用して、次のコマンドを実行します。
kubectl apply -f apm-server.yml kubectl get pods -n kube-system重要ポッド内のリソースが実行されていることを確認する必要があります。そうでない場合、Kibana コンソールにデータが表示されないことがあります。
APM エージェントを構成します。
この例では、Spring Boot を使用して単純な Spring アプリケーションを作成し、アプリケーションを JAR パッケージに圧縮します。次に、JAR パッケージと Maven Central Repository からダウンロードした最新の Java エージェントを APM Server にアップロードします。詳細については、「Spring Boot」および「Maven Central」をご参照ください。
ACK クラスターのノードにログオンし、作業ディレクトリに myapply という名前の Dockerfile を作成します。
Dockerfile には次の情報が含まれている必要があります。
FROM frolvlad/alpine-oraclejdk8 MAINTAINER peterwanghao.com VOLUME /tmp ADD spring-boot-0.0.1-SNAPSHOT.jar spring-boot-0.0.1-SNAPSHOT.jar ADD elastic-apm-agent-1.21.0.jar elastic-apm-agent-1.21.0.jar EXPOSE 8080 ENTRYPOINT ["java","-javaagent:/elastic-apm-agent-1.21.0.jar","-Delastic.apm.service_name=my-application","-Delastic.apm.server_url=http://apmserver:8200","-Delastic.apm.application_packages=com.example","-jar","/spring-boot-0.0.1-SNAPSHOT.jar"]ENTRYPOINT では、ポッドの起動に使用するパラメーターと Java コマンドが定義されています。次の表に、これらのパラメーターを示します。
パラメーター
説明
-javaagent
APM エージェントの JAR パッケージ。
-Delastic.apm.service_name
Service オブジェクトの名前。名前には、文字、数字、ハイフン (-)、アンダースコア (_)、およびスペースを含めることができます。
-Delastic.apm.server_url
APM Server の URL。http://apmserver:8200 は、apm-server.yml ファイルで指定されています。
-Delastic.apm.application_packages
アプリケーションの基本ソフトウェアパッケージ。
-jar
アプリケーションの JAR パッケージ。
docker buildコマンドと Dockerfile myapply を使用してイメージをビルドします。現在のパスで次のコマンドを実行します。
docker build -t myapply .ビルドしたイメージを他のコンテナーにロードします。
ポッドのデプロイメントファイルを構成します。ファイル名は my-application.yaml です。
ファイルには次のコードが含まれています。
--- apiVersion: v1 kind: Pod metadata: name: my-apply namespace: kube-system labels: app: my-apply spec: containers: - name: my-apply image: myapply:latest ports: - containerPort: 8080 imagePullPolicy: Never --- apiVersion: v1 kind: Service metadata: name: my-apply namespace: kube-system labels: app: my-apply spec: type: NodePort ports: - name: http-metrics port: 8080 nodePort: 30000 selector: app: my-apply ---説明image は、ビルドされたイメージを指定します。
kubectl クライアントを使用して次のコマンドを実行し、ポッドをデプロイします。
kubectl apply -f my-application.yamlポッド内のすべてのリソースが実行された後、curl コマンドを使用してポート 30000 経由でホストにアクセスします。
次の curl コマンドを実行します。
curl http://10.7.XX.XX:30000説明10.7.XX.XX は、ACK クラスター内のノードの IP アドレスを指定します。
ホストへのアクセスが成功した場合、APM エージェントがデプロイされます。
Kibana コンソールで Elastic APM によって取得された監視データを表示します。
Elasticsearch クラスターの Kibana コンソールにログオンします。
詳細については、「Kibana コンソールにログオンする」をご参照ください。
左側のナビゲーションペインで、[APM] をクリックします。
パフォーマンスが監視されているアプリケーションを見つけ、アプリケーション名をクリックします。アプリケーションの全体的なパフォーマンス統計が表示されます。この例では、my-application が使用されています。

リクエストされたインターフェースをクリックします。リクエストの詳細情報が表示されます。

ホストとポッドのログとメトリクスの統計を表示します。
[actions] をクリックし、[show Pod Logs] または [show Pod Metrics] を選択します。ログまたはメトリクスの統計が表示されます。


FAQ
問題の説明:ACK クラスターの構成ファイルで、resources.requests パラメーターが大きな値に設定されています。その結果、ポッドが起動に失敗します。
解決策:resource.requests パラメーターの値を変更します。resources.requests パラメーターは、Metricbeat、Filebeat、および Elastic APM の構成ファイルで指定する必要があります。ACK クラスターの仕様に基づいて、このパラメーターを適切な値に設定することをお勧めします。
問題の説明:Metricbeat、Filebeat、および Elastic APM をデプロイすると、エラーが繰り返し発生します。エラーメッセージは
no matches for kind "DaemonSet" in version "extensions/v1beat1"のようになります。解決策:apps/v1 API バージョンを使用します。これは、公式の構成ファイルで DaemonSet と Deployment に extensions/v1beta1 API バージョンが使用されているためです。ただし、ACK V1.18 以降では、DaemonSet、Deployment、および ReplicaSet で extensions/v1beta1 API バージョンは非推奨です。