このページでは、Kubernetes アプリケーションで AppDynamics アプリケーション サーバ エージェントを使用してインストゥルメント化されたトランザクション分析とログ分析の展開オプションについて説明します。「エージェント側のコンポーネントのインストール」を参照してください。

トランザクション分析とログ分析では、Analytics エージェントがアプリケーション サーバ エージェントとともに展開されている必要があります。Java エージェント 4.5.15 以降または .NET エージェント 20.10 以降では、トランザクション分析用に Analytics エージェントを展開する必要はありません。詳細については、Analytics エージェントを使用しない分析の展開を参照してください。

トランザクション分析

Analytics エージェントは、アプリケーション サーバ エージェントとイベントサービスの間のプロキシとして機能します。「Analytics エージェントを使用した分析の展開」を参照してください。

Kubernetes アプリケーションでトランザクション分析をサポートするため、Analytics エージェントには 2 つの展開オプションがあります。

  1. アプリケーションコンテナのサイドカー。
    Transaction Analytics Sidecar Diagram
    このモデルでは、Analytics エージェントコンテナが各アプリケーションポッドに追加され、アプリケーションコンテナで開始/停止します。
  2. 各 Kubernetes ワーカーノードに単一の Analytics エージェントが展開される共有エージェント。ノード上の各ポッドは、その Analytics エージェントを使用してイベントサービスと通信します。 

Log Analytics Sidecar Diagram

このモデルでは、Analytics エージェントは Daemonset として展開されます。

ログ分析

展開されると、Analytics エージェントはアプリケーションのログにアクセスし、ログデータをイベントサービスに送信できます。

Kubernetes アプリケーションでログ分析をサポートするため、Analytics エージェントには 3 つの展開オプションがあります。

  1. アプリケーションコンテナのサイドカー。

    Log Analytics STDOUT Diagram
    このモデルでは、Analytics エージェントコンテナが各アプリケーションポッドに追加され、アプリケーションコンテナで開始/停止します。Analytics エージェントとアプリケーションコンテナは、アプリケーションログが書き込まれるボリュームを共有するように設定されます。
  2. アプリケーションがコンテナファイルシステムをバイパスし、ログデータを STDOUTSTDERR に送信する場合、Analytics エージェントは各 Kubernetes ワーカーノードに展開できます。Analytics エージェントは、ワーカーノードのファイルシステム上のすべてのアプリケーションコンテナに関するログ出力にアクセスできます。このログ出力は、Kubernetes によってコンテナごとに一意のファイルとして /var/log/containers に保存されています。

    Log Analytics STDOUT Diagram

    このモデルでは、Analytics エージェントは Daemonset として展開されます。

    OpenShift などの一部の Kubernetes ディストリビューションでは、/var/log/containers にあるファイルにアクセスするために昇格された権限が Analytics エージェントに必要です。

  3. syslog プロバイダーが Kubernetes クラスタで使用できる場合、TCP トランスポートで syslog メッセージを受信するように Analytics エージェントを展開できます。syslog プロバイダーごとに 1 つの Analytics エージェントインスタンスが必要です。「Syslog メッセージからのログ分析データの収集」を参照してください。

トランザクションおよびログ分析の場合、サイドカーアプローチのほうが簡単に展開できますが、アプリケーションポッドごとに 1 つの追加コンテナが必要になるため、より多くのクラスタリソースを消費します。共有エージェントアプローチは、管理する別の展開オブジェクトを追加しますが、クラスタの全体的なリソース消費を大幅に削減できます。

Analytics エージェントを展開するための設定例

次の導入仕様は、上記の展開オプションの実装方法の具体例です。さらに、Analytics エージェントのホスト、ポート、および SSL 環境変数の設定方法に関するベストプラクティスについては、「コンテナへの .NET Agent for Linux のインストール」および「コンテナへの Node.js エージェントのインストール」を参照してください。

トランザクション分析:サイドカーを使用した導入仕様

次の導入仕様では、2 つのコンテナを定義します。アプリケーションコンテナ flight-services(アプリケーション サーバ エージェントでインストゥルメントされたイメージを使用)と、Analytics エージェントコンテナ appd-analytics-agent(Docker Hub docker.io/appdynamics/machine-agent-analytics:latest から Analytics エージェントを使用)です。

appd-analytics-agent コンテナは ConfigMap と Secret を使用して、Analytics エージェントに必要なイベントサービスログイン情報(アカウントアクセスキーとグローバルアカウント名を含む)を構成します。詳細については、エージェント側のコンポーネントのインストールを参照してください。

サイドカーとしての Analytics エージェントは localhost で使用でき、デフォルトのポート 9090 を使用します。アプリケーション サーバ エージェントは自動的に接続し、追加の構成は必要ありません。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: flight-services
spec:
  selector:
    matchLabels:
      name: flight-services
  replicas: 1
  template:
    metadata:
      labels:
        name: flight-services
    spec:
      containers:
      - name: flight-services
        image: sashaz/ad-air-nodejs-services-analytics:latest
        imagePullPolicy: IfNotPresent
        envFrom:
          - configMapRef:
              name: controller-info
        env:
        - name: APPDYNAMICS_AGENT_ACCOUNT_ACCESS_KEY
          valueFrom:
            secretKeyRef:
              key: appd-key
              name: appd-secret
        - name: APPDYNAMICS_AGENT_TIER_NAME
          value: flight-services
        ports:
        - containerPort: 8080
          protocol: TCP
        restartPolicy: Always
      - name: appd-analytics-agent
        envFrom:
        - configMapRef:
            name: controller-info
        env:
        - name: APPDYNAMICS_AGENT_ACCOUNT_ACCESS_KEY
          valueFrom:
            secretKeyRef:
              key: appd-key
              name: appd-secret
        - name: APPDYNAMICS_EVENTS_API_URL
          valueFrom:
            configMapKeyRef:
              key: EVENT_ENDPOINT
              name: controller-info
        - name: APPDYNAMICS_GLOBAL_ACCOUNT_NAME
          valueFrom:
            configMapKeyRef:
              key: FULL_ACCOUNT_NAME
              name: controller-info
        image: docker.io/appdynamics/machine-agent-analytics:latest
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 9090
          protocol: TCP
        resources:
          limits:
            cpu: 200m
            memory: 900M
          requests:
            cpu: 100m
            memory: 600M
...
CODE

controller-info ConfigMap は、コントローラ情報 YAML ファイルに記載されています。appd-secret を作成するコマンドは、Secret にあります。

トランザクション分析:共有 Analytics エージェントを使用した導入仕様

次の導入仕様は同じ flight-services アプリケーション用ですが、サイドカーを使用する代わりに、Daemonset として個別に導入された共有 Analytics エージェントを参照します。flight-services コンテナは、エージェント環境変数 APPDYNAMICS_ANALYTICS_HOST および APPDYNAMICS_ANALYTICS_PORT を、次の例で定義されている共有 Analytics エージェントの analytics-proxy サービスに設定します。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: flight-services
spec:
  selector:
    matchLabels:
      name: flight-services
  replicas: 1
  template:
    metadata:
      labels:
        name: flight-services
    spec:
      containers:
      - name: flight-services
        image: sashaz/ad-air-nodejs-services-analytics:latest
        imagePullPolicy: IfNotPresent
        envFrom:
          - configMapRef:
              name: controller-info
        env:
        - name: APPDYNAMICS_AGENT_ACCOUNT_ACCESS_KEY
          valueFrom:
            secretKeyRef:
              key: appd-key
              name: appd-secret
        - name: APPDYNAMICS_AGENT_TIER_NAME
          value: flight-services
        - name: APPDYNAMICS_ANALYTICS_HOST
          value: analytics-proxy
        - name: APPDYNAMICS_ANALYTICS_PORT
          value: "9090"
        ports:
        - containerPort: 8080
          protocol: TCP
      restartPolicy: Always
...
CODE

次の analytics-agent.yaml ファイルでは、共有 Analytics エージェントが Daemonset として展開されます。このファイルは、共有 Analytics エージェントに到達できる名前空間でエンドポイントを公開するサービス appd-infra-agent-service も定義します。

apiVersion: apps/v1
kind: DaemonSet
metadata: 
  name: appd-infra-agent
spec: 
  selector:
    matchLabels:
      name: appd-infra-agent
  template: 
    metadata: 
      labels: 
        name: appd-infra-agent
    spec:
      serviceAccountName: appdynamics-infraviz
      containers:
      - name: appd-analytics-agent
        envFrom:
        - configMapRef:
            name: controller-info
        env:
        - name: APPDYNAMICS_AGENT_ACCOUNT_ACCESS_KEY
          valueFrom:
            secretKeyRef:
              key: appd-key
              name: appd-secret
        - name: APPDYNAMICS_EVENTS_API_URL
          valueFrom:
            configMapKeyRef:
              key: EVENT_ENDPOINT
              name: controller-info
        - name: APPDYNAMICS_GLOBAL_ACCOUNT_NAME
          valueFrom:
            configMapKeyRef:
              key: FULL_ACCOUNT_NAME
              name: controller-info
        image: docker.io/appdynamics/machine-agent-analytics:latest
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 9090
          protocol: TCP
        resources:
          limits:
            cpu: 200m
            memory: 900M
          requests:
            cpu: 100m
            memory: 600M
        volumeMounts:
        - name: ma-log-volume
          mountPath: /opt/appdynamics/conf/logging/log4j.xml
          subPath: log4j.xml
        - mountPath: /hostroot
          name: hostroot
          readOnly: true
      restartPolicy: Always
      volumes:
      - name: ma-log-volume
        configMap:
          name: ma-log-config
      - name: hostroot
        hostPath:
          path: /
          type: Directory
---
apiVersion: v1
kind: Service
metadata:
  name: appd-infra-agent-service
spec:
  selector:
    name: appd-infra-agent
  ports:
  - name: "9090"
    port: 9090
    targetPort: 9090
status:
  loadBalancer: {}
CODE

完全な導入仕様は、マシンエージェント YAML ファイルに記載されています。appdynamics-infraviz サービスアカウントは、RBAC YAML ファイルで定義されます。ma-log-config ConfigMap は、マシンエージェントのログ設定ファイルで定義されます。

ベストプラクティスは、アプリケーションによって使用される名前空間とは別の専用の名前空間(通常は appdynamics)に共有 Analytics エージェントを展開することです。

$ kubectl -n appdynamics apply -f analytics-agent.yaml
CODE

アプリケーションの名前空間から共有 Analytics エージェントへのアクセスを提供するには、次の手順を実行します。

  1. ExternalName サービスは、サービス名(この例の analytics-proxy)を以前に作成した appd-infra-agent-service の DNS 名にマッピングするために必要です。

    kind: Service
    apiVersion: v1
    metadata:
      name: analytics-proxy
    spec:
      type: ExternalName
      externalName: appd-infra-agent-service.appdynamics.svc.cluster.local
      ports:
      - port: 9090
        targetPort: 9090
    CODE
  2. アプリケーション サーバ エージェントが展開されている各アプリケーションの名前空間でこのサービスを作成します。

    $ kubectl -n <app namespace> apply -f analytics-proxy.yaml
    CODE
  3. analytics-proxy は、flight-services 導入仕様で使用される APPDYNAMICS_ANALYTICS_HOST の値であることに注意してください。

    - name: APPDYNAMICS_ANALYTICS_HOST
      value: analytics-proxy
    CODE

ログ分析:サイドカーを使用した導入仕様

次の導入仕様スニペットは、アプリケーションコンテナ client-api と、そのアプリケーションコンテナのサイドカーとして機能する Analytics エージェントコンテナ appd-analytics-agent を定義する Java アプリケーションを示しています。init コンテナ(appd-agent-attach)も定義されていますが、例を簡単にするために関連する定義は削除されています。

共有ボリューム appd-volume が、マウントパス /opt/appdlogs を使用してアプリケーションコンテナと Analytics エージェントコンテナにマウントされます。Java アプリケーションはこのパスにログを書き込むように設定され、Analytics エージェントはこのパスからログを読み取り、イベントサービスに送信するように設定されます。

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    name: client-api
  name: client-api
spec:
  selector:
    matchLabels:
      name: client-api
  template:
    metadata:
      labels:
        name: client-api
    spec:
      containers:
      - name: client-api
        envFrom:
        - configMapRef:
            name: agent-config
        env:
        - name: APPDYNAMICS_AGENT_ACCOUNT_ACCESS_KEY
          valueFrom:
            secretKeyRef:
              key: appd-key
              name: appd-secret
        - name: JAVA_OPTS
          ...
        image: sashaz/java-services:v5
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
          protocol: TCP
        resources: {}
        volumeMounts:
        - mountPath: /opt/appdlogs
          name: appd-volume
          ...
      - name: appd-analytics-agent
        env:
        - name: APPDYNAMICS_AGENT_ACCOUNT_ACCESS_KEY
          valueFrom:
            secretKeyRef:
              key: appd-key
              name: appd-secret
        envFrom:
        - configMapRef:
            name: agent-config
        image: docker.io/appdynamics/machine-agent-analytics:latest
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 9090
          protocol: TCP
        resources:
          limits:
            cpu: 200m
            memory: 900M
          requests:
            cpu: 100m
            memory: 600M
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /opt/appdlogs
          name: appd-volume
      dnsPolicy: ClusterFirst
      initContainers:
      - name: appd-agent-attach
      ...
      restartPolicy: Always
      schedulerName: default-scheduler
      serviceAccountName: appd-account
      volumes:
      - emptyDir: {}
        name: appd-volume
...
CODE

ログ分析:共有 Analytics エージェントの導入仕様(STDOUT/STDERR サポート)

次の導入仕様は、アプリケーションコンテナがアプリケーション コンテナ ファイルシステムにではなく、STDOUT および STDERR にログを送信する使用例をサポートしています。

Kubernetes はホストの /var/log/containers にコンテナログを書き込むので、Analytics エージェントはそこでログを読み取ることができます。Analytics エージェントは Daemonset として展開されます。ホストパス /var/log/containers へのアクセス権を持つボリューム varlog が定義され、Analytics エージェントコンテナ appd-analytics-agent にマウントされます。Analytics エージェントは、/var/log/containers に書き込まれたコンテナ固有のログを読み取るように設定されます。詳細については、ソースルールを使用したログ分析の構成を参照してください。

apiVersion: v1
kind: ServiceAccount
metadata:
  name: appdynamics-loganalytics
  namespace: appdynamics
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  labels:
    name: appd-analytics
  name: appd-analytics
spec:
  selector:
    matchLabels:
      name: appd-analytics
  template:
    metadata:
      labels:
        name: appd-analytics
    spec:
      nodeSelector:
        kubernetes.io/os: linux
      containers:
      - name: appd-analytics-agent
        env:
        - name: APPDYNAMICS_AGENT_ACCOUNT_ACCESS_KEY
          valueFrom:
            secretKeyRef:
              key: controller-key
              name: appd-secret
        envFrom:
        - configMapRef:
            name: agent-config
        image: docker.io/appdynamics/analytics-agent:log-20.6.0
        imagePullPolicy: Always
        ports:
        - containerPort: 9090
          protocol: TCP
        - containerPort: 5144
          hostPort: 5144
          protocol: TCP
        resources:
          limits:
            cpu: 300m
            memory: 900M
          requests:
            cpu: 200m
            memory: 800M
        volumeMounts:
        - name: varlog
          mountPath: /var/log
          readOnly: true
        - name: dockerlog
          mountPath: /var/lib/docker/containers
          readOnly: true
      restartPolicy: Always
      serviceAccountName: appdynamics-loganalytics
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
      - name: dockerlog
        hostPath:
          path: /var/lib/docker/containers
CODE

完全な仕様については、ログ分析 YAML ファイルに記載されています。OpenShift の例は、ログ分析 OpenShift YAML ファイルにあります。