Download PDF
Download page クラスタエージェントを使用したアプリケーションの自動インストゥルメンテーション.
クラスタエージェントを使用したアプリケーションの自動インストゥルメンテーション
このページでは、クラスタエージェントが展開されているクラスタで実行されている Kubernetes ワークロードを自動でインストゥルメント化する方法について説明します。「クラスタエージェントのインストール」を参照してください。
インストゥルメンテーション オプションについては、「コンテナのインストールオプション」を参照してください。
操作を簡素化するため、自動インストゥルメンテーションの使用を推奨します。
自動インストゥルメンテーションでは、次のアプリケーションタイプのワークロードにアプリケーション サーバ エージェントを動的に追加できます。
- Java
- Linux 上の .NET Core
- Node.js
サポート対象となる Kubernetes ワークロードは、Deployments
、DeploymentConfigs
、StatefulSets
です。
自動インストゥルメンテーションの概要
自動インストゥルメンテーションを有効にするには、次の操作を行います。
cluster-agent.yaml
ファイルに設定を追加する、または- クラスタエージェント Helm チャートの
values.yaml
ファイルに設定を追加する。「Helm チャートを使用したクラスタエージェントのインストール」を参照してください。
次に、kubectl
を使用して変更を適用するか、クラスタエージェントの Helm チャートをアップグレードすることができます。
クラスタエージェントがサポートされているワークロードを検出し、そのワークロードが設定された自動インストゥルメンテーション ルールと一致すると、クラスタエージェントは Kubernetes API を使用してワークロードの仕様を変更します。クラスタエージェントは、Splunk AppDynamics .NET Core、Node.js、または Java エージェントイメージを含む init コンテナをワークロードにアタッチします。ボリュームに appd というプレフィックスが付いている場合、クラスタエージェントはワークロードからボリュームを削除して、次の自動インストゥルメンテーション中にエラーが発生しないようにします。アプリケーションが再起動すると、必須エージェントがアプリケーションコンテナにコピーされます。これで、アプリケーションコンテナが自動インストゥルメント化されたアプリケーションで Splunk AppDynamics エージェント(Node.js エージェント、Linux エージェント上の .NET Core、または Java エージェント)を参照するようになります。
要件
Splunk AppDynamics の要件
クラスタエージェント 20.5 以降。「クラスタエージェントの要件およびサポート対象環境」を参照してください。
- クラスタに最新バージョンのクラスタエージェントとオペレータがインストールされている。
cluster-agent-operator.yaml
で、クラスタエージェントが自動インストゥルメンテーションを実行するために必要な権限を設定します。「クラスタエージェントのインストール」を参照してください。 - 以前に必須の Splunk AppDynamics エージェントでインストゥルメント化されなかったアプリケーションが 1 つ以上クラスタに展開されている。
- 自動インストゥルメント化されるアプリケーションの数に基づいた十分なエージェントライセンスがコントローラにある。
- [Server Monitoring Administrator] ロールがあるコントローラでローカルユーザーを作成する。クラスタエージェントで、このユーザーのログイン情報が使用されて、自動インストゥルメント化されたポッドが削除されたときにノードが履歴としてマークされます。これらのログイン情報を使用して、クラスタエージェントの自動インストゥルメンテーションを有効にする際の最初の手順で
api-user
を設定します。Helm チャートを使用して自動インストゥルメンテーションを有効にする場合、これらのログイン情報を使用してユーザー名とパスワードの値を設定することもできます。 - ポッドの再起動を処理するのに十分なクラスタ容量があることを確認する。「ポッドの再起動の影響を最小化」を参照してください。
- アプリケーション、階層、およびノード名のタプルがすべての Kubernetes インスタンスで一意になるように指定したことを確認する。名前が一意でない場合、ノードが適切にレポートされない可能性があります。これは、Java エージェントや Node.js エージェントなどの、アプリケーション、階層、およびノードの一意性が必要なエージェントに適用されます。
言語固有の要件
Node.js 8.6 以降
- Java
- Java アプリケーションで、環境変数を使用して Java コマンドに
-javaagent
引数を含めるようサポートしている必要があります。デフォルトでは、クラスタエージェントでJAVA_TOOL_OPTIONS
を使用します。ただし、defaultEnv
プロパティを使用してこれを変更できます。 - Java エージェントのリソース要件に基づいて、アプリケーションポッドに設定されるメモリの要求または制限を調整する必要が生じる場合があります(「Javaエージェントのインストール」を参照)。
- Java アプリケーションで、環境変数を使用して Java コマンドに
- Linux 上の .NET Core および Node.js
アプリケーション ベース イメージのオペレーティング システム(OS)がアプリケーション サーバ エージェント ベース イメージ OS と一致することを確認します(Linux と Alpine)。たとえば、Linux 上の .NET Core アプリケーションで Ubuntu のベースイメージを使用している場合は、
imageInfo.image
タグを Linux バージョンに設定する必要があります。この例のイメージタグは、20.11.0-linux
です。
アプリケーションで Alpine Linux ベースイメージ OS を使用していた場合、タグは20.11.0-alpine
になります。Docker Hub ページを参照してください。apiVersion: cluster.appdynamics.com/v1alpha1 kind: Clusteragent metadata: name: k8s-cluster-agent namespace: appdynamics spec: # content removed for brevity instrumentationRules: - namespaceRegex: dev language: dotnetcore appName: MyDotNetAppOnUbuntu imageInfo: image: "docker.io/appdynamics/dotnet-core-agent:20.11.0-linux" agentMountPath: /opt/appdynamics
YMLベースイメージのオペレーティングシステムが一致しないと、アプリケーション サーバ エージェントが起動しない可能性があります。「自動インストゥルメンテーションの検証」を参照してください。Node.js エージェントにも、エージェントの起動を妨げる可能性がある特定の Node.js ランタイム要件があります。Node.js Supported Environmentsを参照してください。
- オンプレミスコントローラと通信する .NET Core および Node.js アプリケーションについては、「オンプレミスコントローラでの自動インストゥルメンテーションの使用」を参照してください。
- トランザクション分析データが必要な場合は、クラスタエージェントの
analyticsHost
およびanalyticsPort
プロパティを設定する必要があります。
クラスタエージェントの自動インストゥルメンテーションの有効化
クラスタエージェント機能を設定するには、次の手順を実行します。
削除したポッドを [Tiers & Nodes] コントローラダッシュボードから削除します。次に、「クラスタエージェントのインストール」で作成した
cluster-agent-secret
を再作成して、api-user
を追加します。kubectl -n appdynamics delete secret cluster-agent-secret kubectl -n appdynamics create secret generic cluster-agent-secret --from-literal=controller-key=<access-key> --from-literal=api-user="<username>@<customer>:<password>"
CODE[Server Monitoring Administrator] ロールがあるコントローラから、ローカルユーザーに
api-user
値を設定します。クラスタエージェントでapi-user
が使用されて、ポッドの削除時にコントローラ内の関連付けられたノードが履歴としてマークされます。cluster-agent.yaml
ファイルまたは Helm のvalues.yaml
ファイルに自動インストゥルメンテーションの設定を追加します。この設定により、自動インストゥルメンテーションの対象となるDeployments
、DeploymentConfigs
、およびStatefulSets
ワークロードと、使用するエージェントのタイプとバージョンが決まります。「自動インストゥルメンテーションの設定」を参照してください。設定を保存したら、クラスタエージェントの展開を適用またはアップグレードします。アプリケーションに関連付けられた展開ロールアウト戦略に基づいて、関連するポッドとコンテナが再起動されます。
kubectl apply -f cluster-agent.yaml
BASHhelm upgrade -f ./ca1-values.yaml "<my-cluster-agent-helm-release>" appdynamics-charts/cluster-agent --namespace appdynamics
BASH自動インストゥルメンテーションの検証とトラブルシューティングについては、「クラスタエージェントのインストールの検証」を参照してください。
- ワークロードが
instrumentationRules
内で定義されたプロパティと一致しない場合、自動インストゥルメンテーションは有効になりません。 - 自動インストゥルメンテーション プロパティがデフォルトでまたは
instrumentationRules
で定義されていない場合、クラスタエージェントは「自動インストゥルメンテーションの設定」で指定される、対応するデフォルト値を使用します。対応するデフォルト値がない場合、自動インストゥルメンテーションは有効になりません。
設定例
例 1 は、ecom.*
パターンに一致する名前空間の Java アプリケーションをターゲットとしています。一致する各アプリケーションは 20.20.1
Java エージェントでインストゥルメント化され、コントローラの Ecommerce
アプリケーションにレポートされます。デフォルトでは、階層名は Kubernetes ワークロードの名前ですが、tierName
プロパティを設定することでオーバーライドできます。
例 1:cluster-agent-auto-1.yaml
apiVersion: cluster.appdynamics.com/v1alpha1 kind: Clusteragent metadata: name: k8s-cluster-agent namespace: appdynamics spec: appName: "<cluster-name>" controllerUrl: "<protocol>://<appdynamics-controller-host>:8080" account: "<account-name>" image: "docker.io/appdynamics/cluster-agent:20.12.1" serviceAccountName: appdynamics-cluster-agent nsToMonitorRegex: ecom.* # # auto-instrumentation config # instrumentationMethod: Env nsToInstrumentRegex: ecom.* defaultAppName: Ecommerce instrumentationRules: - language: java imageInfo: image: docker.io/appdynamics/java-agent:20.20.1 agentMountPath: /opt/appdynamics
例 2 は、Java アプリケーションと Linux 上の .NET Core アプリケーションを含む名前空間をターゲットとし、次の詳細設定を組み込みます。
- Java アプリケーションと Linux 上の .NET Core アプリケーションをターゲットに、複数の
instrumentationRules
を使用します。 labelMatch
戦略を使用し、以下のワークロード仕様auto-instrumented-dotnet-app.yaml
およびauto-instrumented-java-app.yaml
のframework
ラベルの値に基づいてエージェントタイプと関連するエージェントイメージを決定します。- この設定では、
YAML
ファイルでコントローラのアプリケーション名を割り当てるのではなく、設定でappNameStrategy:
label
を使用し、ワークロード仕様のラベルに基づいてアプリケーション名を割り当てます。 - Java アプリケーションの場合は、
instrumentContainer: select
およびcontainerMatchString
:.*service
を使用して、アプリケーション サービス コンテナのみを自動インストゥルメント化するようにクラスタエージェントに指示し、定義されている他のコンテナは無視します。
例 2:cluster-agent-auto-2.yaml
apiVersion: cluster.appdynamics.com/v1alpha1 kind: Clusteragent metadata: name: k8s-cluster-agent namespace: appdynamics spec: appName: "<cluster-name>" controllerUrl: "<protocol>://<appdynamics-controller-host>:8080" account: "<account-name>" image: "docker.io/appdynamics/cluster-agent:20.12.1" serviceAccountName: appdynamics-cluster-agent nsToMonitorRegex: ecom.* # # auto-instrumentation config # instrumentationMethod: Env nsToInstrumentRegex: stage appNameStrategy: label instrumentationRules: - namespaceRegex: stage language: dotnetcore labelMatch: - framework: dotnetcore appNameLabel: appName imageInfo: image: "docker.io/appdynamics/dotnet-core-agent:20.11.0-linux" agentMountPath: /opt/appdynamics - namespaceRegex: stage language: java labelMatch: - framework: java appNameLabel: appName instrumentContainer: select containerMatchString: .*service imageInfo: image: "docker.io/appdynamics/java-agent:21.3.0" agentMountPath: /opt/appdynamics
例 3 および例 4 は、.NET および Java サービスの導入仕様を示しています。これらは、cluster-agent-auto-2.yaml:
の自動インストゥルメンテーション設定に基づいて appName
およびフレームワークラベルを定義します。
.NET
apiVersion: apps/v1 kind: Deployment metadata: name: dotnet-profile-service labels: appName: backend-services framework: dotnetcore spec: containers: - image: myrepo/profile-service:v2 name: profile-service # ...
Java
apiVersion: apps/v1 kind: Deployment metadata: name: java-account-service labels: appName: backend-services framework: java spec: containers: - image: myrepo/account-service:v2 name: account-service - image: myrepo/proxy-util:v1 name: proxy-util # ...
cluster-agent-auto-2.yaml
の containerMatchString
値は、account-service
コンテナのみが auto-instrumented-java-app.yaml
で自動インストゥルメント化されることを示します。
その他の設定例については、「自動インストゥルメンテーションの構成例」を参照してください。
アプリケーションコンテナとアプリケーション エージェントの関連付け(Kubernetes バージョン 1.25 以上)
エージェントとのアプリケーション相関を確立すると、[Application/Container] ビューでモニター対象のアプリケーションコンテナがコントローラに表示されます。[Cluster Agent Pod] ダッシュボードには、[Pod Details] ページの [APM Node] ダッシュボードへのリンクもあります。自動インストゥルメンテーション中に APM とコンテナの相関を有効にするには、構成ファイルの spec
セクションで containerAppCorrelationMethod
プロパティを構成する必要があります。Kubernetes 1.25 以降では、cgroup v1 ランタイムのサポートが cgroup v2 対応ランタイムに置き換えられているため、このプロパティは Kubernetes 1.25 以降を使用する環境に適用されます。
相関方式には、次のいずれかの値を選択できます。
proxy
(推奨):これがデフォルト値です。この値を指定すると、アプリケーション エージェントはクラスタエージェントからコンテナ ID をクエリします。kubeapi
:この値を指定すると、アプリケーション エージェントは Kubernetes API サーバーからコンテナ ID をクエリします。ただし、この方法を使用するには、追加の権限が必要です。権限の詳細については、「Kubernetes API サーバーからのクエリに必要な権限」を参照してください。none
:この値を指定すると、相関関係はありません。
例:
apiVersion: cluster.appdynamics.com/v1alpha1 kind: Clusteragent metadata: name: k8s-cluster-agent namespace: appdynamics spec: containerAppCorrelationMethod: proxy appName: "<cluster-name>" controllerUrl: "<protocol>://<appdynamics-controller-host>:8080" account: "<account-name>" image: "docker.io/appdynamics/cluster-agent:20.12.1" serviceAccountName: appdynamics-cluster-agent nsToMonitorRegex: ecom.* # # auto-instrumentation config # instrumentationMethod: Env nsToInstrumentRegex: ecom.* defaultAppName: Ecommerce instrumentationRules: - language: java imageInfo: image: docker.io/appdynamics/java-agent:20.20.1 agentMountPath: /opt/appdynamics
Kubernetes API サーバーからコンテナ ID をクエリするために必要な権限
containerAppCorrelationMethod
プロパティが kubeapi として指定されている場合、次の権限が必要です。
apiGroups | リソース | 権限 |
---|---|---|
"" | serviceaccounts |
|
rbac.authorization.k8s.io |
|
|
アプリケーション名戦略
コントローラのアプリケーション ダッシュボードでは、3 つのアプリケーション名戦略を提供しています。次のいずれかの値に appNameStrategy
プロパティを割り当てて、戦略を選択します。
manual:
cluster-agent.yaml
ファイル内のdefaultAppName
またはappName
パラメータを使用して、アプリケーション名を設定します。label:ワークロードの仕様のラベルをアプリケーション名として使用します。
- namespace:Kubernetes 名前空間をアプリケーション名として使用します。
手動戦略
デフォルトでは appNameStrategy
が手動
となり、defaultAppName
または appName
パラメータを使用してアプリケーション名を設定します。
defaultAppName
が指定されている場合は、インストゥルメンテーション ルールで上書きされない限り、これを使用します。appName
がインストゥルメンテーション ルールで指定されている場合は、それを使用します。
たとえば、次の仕様で、ECommerce
は ecom
および groceries
名前空間に適用されるデフォルトのアプリケーション名であり、BookStore
は books
名前空間に適用されるアプリケーション名です。
apiVersion: cluster.appdynamics.com/v1alpha1 kind: Clusteragent metadata: name: k8s-cluster-agent namespace: appdynamics spec: appName: "<cluster-name>" # ... # auto-instrumentation config instrumentationMethod: Env nsToInstrumentRegex: ecom|books|groceries appNameStrategy: manual defaultAppName: ECommerce instrumentationRules: - namespaceRegex: books appName: BookStore
ラベル戦略
このオプションでは、アプリケーション名の戦略として label
パラメータを使用します。ラベルオプションを使用するには、appNameLabel
パラメータに値を指定します。appNameLabel
値は、ワークロード仕様で指定されたラベルを参照します。
Spec.appNameLabel
が指定されている場合は、仕様レベルの値が使用されます。- インストゥルメンテーション ルールで
appNameLabel
が指定されている場合は、仕様で別の appNameLabel が指定されていない限り、その値が使用されます。 - インストゥルメンテーション ルールで指定された appNameLabel が展開の仕様で見つからない場合は、仕様レベルの
appNameLabel
値が使用されます。
次の仕様例では、appNameLabel: app
がインストゥルメンテーション ルールで使用されていますが、展開の仕様には app
ラベルがありません。仕様には、値が eCommerce
の appname
というラベルがあります。
したがって、コントローラには eCommerce
アプリケーションにレポートするデータが表示されます。
次の仕様では、ワークロード仕様のラベル appname
を使用して ecom
および groceries
名前空間のアプリケーション名を設定し、books
名前空間で app
ラベルが使用されます。
apiVersion: cluster.appdynamics.com/v1alpha1 kind: Clusteragent metadata: name: k8s-cluster-agent namespace: appdynamics spec: appName: "<cluster-name>" # ... # auto-instrumentation config instrumentationMethod: Env nsToInstrumentRegex: ecom|books|groceries appNameStrategy: label appNameLabel: appname instrumentationRules: - namespaceRegex: books appNameLabel: app
次の導入仕様のスニペットに示すように、appname
ラベルを設定する ecom
または groceries
名前空間に導入されたアプリケーションの場合、コントローラのアプリケーション ダッシュボードで eCommerce
アプリケーションにレポートされます。
apiVersion: apps/v1 kind: Deployment metadata: name: ecom-app labels: appname: eCommerce spec: ...
名前空間戦略
このオプションで Kubernetes の namespace
パラメータをアプリケーション名戦略として使用すると、コントローラのアプリケーション ダッシュボードでアプリケーションが展開されている名前空間名をアプリケーション名として使用できます。
次の仕様では、ecom
、books
、および groceries
名前空間の各アプリケーションで、展開先の名前空間に基づいてアプリケーション名を使用します。
apiVersion: cluster.appdynamics.com/v1alpha1 kind: Clusteragent metadata: name: k8s-cluster-agent namespace: appdynamics spec: appName: "<cluster-name>" # ... # auto-instrumentation config instrumentationMethod: Env nsToInstrumentRegex: ecom|books|groceries appNameStrategy: namespace
階層名戦略
コントローラの [Application Dashboard] > [Tiers and Nodes] では、2 つの階層名戦略を提供しています。次のいずれかの値に tierNameStrategy
プロパティを割り当てて、戦略を選択します。
手動戦略
デフォルトでは tierNameStrategy
が手動となり、デプロイメント名または tierName
パラメータを使用して階層名を設定します。
tierName
が指定されていない場合は、デプロイメント名にtiername
を使用します。tierName
がインストゥルメンテーション ルールで指定されている場合は、それを使用します。
たとえば、この仕様では、<deployment name> は、ecom および groceries 名前空間に適用されるデフォルトの階層名であり、BookStore は books 名前空間に適用される階層名です。
apiVersion: cluster.appdynamics.com/v1alpha1 kind: Clusteragent metadata: name: k8s-cluster-agent namespace: appdynamics spec: appName: "<cluster-name>" # ... # auto-instrumentation config instrumentationMethod: Env nsToInstrumentRegex: ecom|books|groceries tierNameStrategy: manual instrumentationRules: - namespaceRegex: books tierName: BookStore
ラベル戦略
このオプションでは、階層名の戦略として label
パラメータを使用します。ラベル
オプションを使用するには、tierNameLabel
パラメータに値を指定します。tierNameLabel
値は、ワークロード仕様で指定されたラベルを参照します。
spec.tierNameLabel
が指定されている場合は、インストゥルメンテーション ルールで上書きされない限り、これを使用します。tierNameLabel
がインストゥルメンテーション ルールで指定されている場合は、それを使用します。
たとえば、次の仕様では、ワークロード仕様のラベル tiername
を使用して ecom および groceries 名前空間の階層名を設定し、books 名前空間で tier
ラベルが使用されます。
apiVersion: cluster.appdynamics.com/v1alpha1 kind: Clusteragent metadata: name: k8s-cluster-agent namespace: appdynamics spec: appName: "<cluster-name>" # ... # auto-instrumentation config instrumentationMethod: Env nsToInstrumentRegex: ecom|books|groceries tierNameStrategy: label tierNameLabel: tiername instrumentationRules: - namespaceRegex: books tierNameLabel: tier
次の導入仕様のスニペットに示すように、tiername
ラベルを設定する ecom
または groceries
名前空間に導入されたアプリケーションの場合、コントローラのダッシュボードで eCommerce
階層にレポートされます。
apiVersion: apps/v1 kind: Deployment metadata: name: ecom-app labels: tiername: eCommerce spec: ...
ポッドの再起動の影響を最小化
自動インストゥルメンテーションを有効にすると、ワークロードに関連付けられた展開ロールアウト戦略に基づいて、関連するポッドが再起動されます。ポッドを再起動すると、CPU とメモリの使用率が急上昇し、パフォーマンスに悪影響を与えたり、使用可能な容量を使い果たしたりすることがよくあります。ポッドの再起動に対応するには、影響を受ける名前空間に関連付けられているメモリと CPU クォータを増やす必要があります。多数のポッドの再起動による影響を軽減するため、クラスタエージェントではデフォルトで 2 つの同時自動インストゥルメンテーション タスクのみを許可しています。後続のワークロード(resourcesToInstrument
)は、インストゥルメント化されたワークロードのロールアウト後に自動インストゥルメント化されます。ただし、パラメータ numberOfTaskWorkers
を設定し、クラスタの要件に基づいて同時自動インストゥルメンテーション タスクの数を指定できます。