このページでは、Docker の可視性を有効にしてマシンエージェントを設定し、OpenShift クラスタで DaemonSet として実行する方法について説明します。

Docker の可視性は OpenShift バージョン 3 をサポートしています。マシンエージェントにより、OpenShift クラスタからパフォーマンスデータを収集できます。OpenShift クラスタ内の各ホストに DaemonSet としてエージェントをインストールすることで、DaemonSet は、OpenShift クラスタ上の各ホストと、Splunk AppDynamics アプリケーション エージェントが実行されている対応コンテナをモニターします。このプロセスは、Kubernetes クラスタのモニタリングに似ています。

OpenShift コンテナをモニターするための Docker の可視性の使用は、推奨オプションではなくなり、廃止されます。「クラスタエージェントを使用した Kubernetes のモニタリング」の説明に従って、代わりにクラスタエージェントを使用します。クラスタエージェントは、クラスタの正常性とキャパシティに対する可視性だけでなく、OpenShift コンテナの可視性もサポートします。

はじめる前に

この機能には、サーバーの可視性のライセンスが必要です。

  • system:admin などの cluster-admin ロールを持つ OpenShift ユーザーアカウントが必要です。
  • OpenShift コマンドラインツール(oc)をインストールします。
  • Docker CE/EE v17.03 または Docker Engine v1.13 以降はこの製品とともに使用することをお勧めします。以前のバージョンの Docker を使用している場合は、一部のデータが使用できない可能性があります。

Java オプションの設定

デフォルトでは、MaxMetaspaceSize が OpenShift で 100 MB に設定されています。ご使用のアプリケーションが既存のメモリリソース割り当てのわずかなマージン内で稼働している場合、アプリケーションの割り当てを増やします。マシンエージェントに対応するために追加のメタスペースサイズの空間を割り当てることをお勧めします。環境変数 GC_MAX_METASPACE_SIZE を直接構成し、構成マップを使用して展開の MaxMetaspaceSize パラメータを設定します。

ホスト ID としてコンテナ ID を登録する

アプリケーションメトリックを収集するには、Kubernetes ポッド内の各コンテナにアプリケーション サーバ エージェントをインストールします。たとえば、RedHat OpenShift プラットフォームで複数のアプリケーション サーバ エージェントが同じポッドで実行されている場合、ポッドからコンテナ固有のメトリックを収集するために、アプリケーション サーバ エージェントとマシンエージェントの両方で、コンテナ ID を一意のホスト ID として登録する必要があります。Kubernetes ポッドには複数のコンテナを含めることができ、同じホスト ID を共有することができます。マシンエージェントは、各コンテナ ID がホスト ID として登録されていない限り、ポッドで実行されているさまざまなコンテナを識別できません。 

コンテナ ID をホスト ID として登録するには、次のようにします。

  1. cgroup からコンテナ ID を取得します。

    cat /proc/self/cgroup | awk -F '/' '{print $NF}'  | head -n 1
    CODE
  2. アプリケーション サーバ エージェントを登録します。

    -Dappdynamics.agent.uniqueHostId=$(sed -rn '1s#.*/##; 1s/docker-(.{12}).*/\1/p' /proc/self/cgroup) 
    CODE
  3. マシンエージェントを登録します。

    -Dappdynamics.docker.container.containerIdAsHostId.enabled=true
    CODE

プロジェクトおよびサービスアカウントの作成

OpenShift の用語では、プロジェクトはユーザとそのリソースのグループを分離するメカニズムです。管理者は、プロジェクトの作成や特定のプロジェクトの管理に関する権限を持つ個々のユーザまたはグループを指定できます。

マシンエージェントを他のプロジェクトから分離するために、マシン エージェント プロジェクトを作成します。

oc new-project machine-agent
CODE

マシンエージェントがメトリックを取得するために必要な権限を持つサービスアカウント ma を作成するには、次の手順を実行します。

  1. 現在のプロジェクトが machine-agent であることを確認します。

    oc status
    CODE
  2. サービス アカウントを作成します。

    oc create serviceaccount ma
    CODE

    サービスアカウントは、通常のユーザのクレデンシャルを共有することなく、OpenShift API アクセスを制御する安全な方法を提供します。

  3. サービスアカウントに特権セキュリティコンテキスト制約(SCC)を割り当てます。SCC は、ポッドの権限と能力を決定します。 

    oc adm policy add-scc-to-user privileged -z ma
    CODE

    サービスアカウントの権限の詳細なリストについては、「サービスアカウントのセキュリティ権限」を参照してください。

  4. cluster-reader ロールをサービスアカウントに追加します。

    oc adm policy add-cluster-role-to-user cluster-reader -z ma
    CODE

マシンエージェントの保護

セキュリティを強化してマシンエージェントを展開できます。プロジェクトのセキュリティレベルを決定し、セキュリティ権限を活用してマシンエージェントを保護します。

cluster-reader ロールを持たないマシンエージェントの実行

cluster-reader ロールを持たない場合、マシンエージェントは OpenShift クラスタからポッドや ReplicaSet などの情報を読み取ることができません。ただし、エージェントはアプリケーション サーバ エージェント コンテナのタグを除き、他のメトリックを収集することもできます。

特権コンテナモードを使用しないマシンエージェントの実行

この権限を無効にするには、次のセクションを DaemonSet YAML ファイルから削除します。

securityContext:
          privileged: true  
CODE

特権コンテナモードでないと、マシンエージェントは /hostroot/etc/passwd/hostroot/proc/<pid>/etc などのファイルを読み取ることができません。そのため、プロセスやネットワークなどのメトリックを収集できません。

この権限を無効にしても、アプリケーション サーバ エージェントのコンテナメトリックの収集には影響しません。

サービスアカウントのセキュリティ権限

サービスアカウントには、マシンエージェントが実行されているプロジェクトで最大の分離を提供するために、次のセキュリティ権限が必要です。

権限説明
cluster-reader ロール

この cluster-reader ロールを使用すると、マシンエージェントは OpenShift クラスタからタグを読み取ることができます。

次に例を示します。

oc adm policy add-cluster-role-to-user cluster-reader -z ma
CODE
特権 SCC

特権 SCC を使用すると、マシンエージェントをルートユーザとして実行できます。

例:

oc adm policy add-scc-to-user privileged -z ma
CODE
特権コンテナとして実行

特権コンテナとして実行すると、マシンエージェントは /etc からのファイルの読み取りや、/proc からのプロセス情報の読み取りができます。

この権限は、次のように DaemonSet YAML ファイルで設定されます。

securityContext:
          privileged: true
CODE

マシンエージェントの Docker イメージの作成

Docker イメージを作成できるマシン上のディレクトリに次のファイルをコピーします。

目的の方法を使用してイメージを作成し、イメージレジストリで使用できるようにします。

DaemonSet としてのマシンエージェントの展開

  1. コントローラを指すようにサンプル DaemonSet を変更します。
    1. ワーカーノードを選択します。

      nodeSelector:
              node-role.kubernetes.io/compute: "true"
      CODE
    2. サンプル DaemonSet で次のコントローラ情報を変更します。

      containers:
           - env:
              - name: APPDYNAMICS_CONTROLLER_HOST_NAME
                value: "<controller-host-name>"
              - name: APPDYNAMICS_CONTROLLER_PORT
                value: "<controller-port>"
              - name: APPDYNAMICS_CONTROLLER_SSL_ENABLED
                value: "true"
              - name: APPDYNAMICS_AGENT_ACCOUNT_ACCESS_KEY
                value: "<account-access-key>"
              - name: APPDYNAMICS_AGENT_ACCOUNT_NAME
                value: "<your-account>" 
              - name: APPDYNAMICS_SIM_ENABLED
                value: "true" 
              - name: APPDYNAMICS_DOCKER_ENABLED
                value: "true"  
      CODE
    3. Docker イメージを指定します。

      image: "<your image>"
      CODE
    4. マシンエージェントを特権ユーザとして実行できるようにします。

      securityContext:
                privileged: true
      CODE
    5. 別のサービスアカウント名がある場合は、それを既存のものに置き換えます。

      serviceAccount: ma
            serviceAccountName: ma
      CODE
  2. 次のように DaemonSet を作成します。
    1. 現在のプロジェクトがマシンエージェントであることを確認します。

      oc status
      CODE
    2. machine-agent DaemonSet を作成します。

      oc create -f machine-agent-daemonset.yaml
      CODE

      マシンエージェントが UI に表示されます。 

マシンエージェントのステータスの確認

マシンエージェントが UI に表示されない場合は、次のようにステータスを確認します。

  1. マシンエージェント DaemonSet を確認します。

    oc get ds
    CODE
  2. マシンエージェントポッドを確認します。 

    oc get pod
    CODE

    ポッド名は machine-agent-daemonset-<XXXX> です。

  3. 最後の行に Started AppDynamics Machine Agent Successfully と表示されているかどうかログを確認します。

    oc get logs -f <machine-agent-daemonset-<XXXX>>
    CODE

サンプルマシンエージェント展開ファイル

マシンエージェントを展開するためのリファレンスとして使用できる、DaemonSet、Dockerfile、および起動スクリプトのサンプルを以下に示します。

サンプルDaemonSet

展開シナリオに合わせてサンプル DaemonSet を変更します。

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: machine-agent-daemonset 
  namespace: machine-agent 
spec:
  selector:
    matchLabels:
      name: appdynamics-machine-agent
  template:
    metadata:
      labels:
        name: appdynamics-machine-agent
    spec:
      nodeSelector:
        node-role.kubernetes.io/compute: "true"
      containers:
      - env:
        - name: APPDYNAMICS_CONTROLLER_HOST_NAME
          value: "<your-hostname>"
        - name: APPDYNAMICS_CONTROLLER_PORT
          value: "<your-port>"
        - name: APPDYNAMICS_CONTROLLER_SSL_ENABLED
          value: "true"
        - name: APPDYNAMICS_AGENT_ACCOUNT_ACCESS_KEY
          value: "<your-access-key>"
        - name: APPDYNAMICS_AGENT_ACCOUNT_NAME
          value: "<your-account>" 
        - name: APPDYNAMICS_SIM_ENABLED
          value: "true" 
        - name: APPDYNAMICS_DOCKER_ENABLED
          value: "true" 
        image: <your-image>
        name: machine-agent 
        securityContext:
          privileged: true
        volumeMounts:
        - mountPath: /hostroot
          name: hostroot
          readOnly: true
        - mountPath: /var/run/docker.sock
          name: docker-sock
      restartPolicy: Always
      imagePullPolicy: Always
      serviceAccount: ma
      serviceAccountName: ma
      volumes:
      - name: hostroot
        hostPath:
          path: /
      - name: docker-sock
        hostPath:
          path: /var/run/docker.sock
CODE

Dockerfile の例

この Dockerfile のサンプルを使用するか、OpenShift の可視性マニフェストの Dockerfile を使用することができます。

# Sample Dockerfile for the Machine Agent
# This is provided for illustration purposes only

FROM ubuntu:16.04
# Install required packages
RUN apt-get update && \
    apt-get install -y unzip && \
    apt-get clean
# Install Machine Agent
ENV MACHINE_AGENT_HOME /opt/appdynamics/machine-agent/
ADD machine-agent.zip /tmp/machine-agent.zip
RUN mkdir -p ${MACHINE_AGENT_HOME} 
# Include start script to configure and start MA at runtime
ADD start-appdynamics ${MACHINE_AGENT_HOME}
RUN chmod 774 ${MACHINE_AGENT_HOME}/start-appdynamics
# change files and directories to be owned by root so MA container user in root 
group can access
RUN chgrp -R 0 /opt && \
    chmod -R g=u /opt
RUN chgrp -R 0 /tmp/machine-agent.zip && \
    chmod g=u /tmp/machine-agent.zip 
# Changing directory to MACHINE AGENT HOME
WORKDIR ${MACHINE_AGENT_HOME}
# Configure and Run Machine Agent
CMD "./start-appdynamics"
CODE

サンプル開始スクリプト

#!/bin/bash
unzip -oq /tmp/machine-agent.zip -d ${MACHINE_AGENT_HOME} && \
    rm /tmp/machine-agent.zip
# Start Machine Agent
./bin/machine-agent -j jre/
CODE