Red Hat OpenShift での Docker の可視性の使用

このページでは、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
  2. アプリケーション サーバ エージェントを登録します。
    .
    -Dappdynamics.agent.uniqueHostId=$(sed -rn '1s#.*/##; 1s/docker-(.{12}).*/\1/p' /proc/self/cgroup) 
  3. マシンエージェントを登録します。
    -Dappdynamics.docker.container.containerIdAsHostId.enabled=true

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

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

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

oc new-project machine-agent

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

  1. 現在のプロジェクトがマシンエージェントであることを確認します。
    oc status
  2. サービス アカウントを作成します。
    oc create serviceaccount ma
    サービスアカウントは、通常のユーザのクレデンシャルを共有することなく、OpenShift API アクセスを制御する安全な方法を提供します。
  3. サービスアカウントに特権セキュリティコンテキスト制約(SCC)を割り当てます。SCC は、ポッドの権限と能力を決定します。
    oc adm policy add-scc-to-user privileged -z ma
    サービスアカウントの権限の詳細なリストについては、「サービスアカウントのセキュリティ権限」を参照してください。
  4. cluster-reader ロールをサービスアカウントに追加します。
    oc adm policy add-cluster-role-to-user cluster-reader -z ma

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

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

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

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

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

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

securityContext:
          privileged: true  

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

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

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

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

権限説明
cluster-reader ロール

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

例:

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

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

例:

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

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

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

securityContext:
privileged: true

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

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

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

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

  1. コントローラを指すようにサンプル DaemonSet を変更します。
    1. ワーカーノードを選択します。
      nodeSelector:
      node-role.kubernetes.io/compute: "true"
    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"
    3. Docker イメージを指定します。
      image: "<your image>"
    4. マシンエージェントを特権ユーザとして実行できるようにします。
      securityContext:
      privileged: true
    5. 別のサービスアカウント名がある場合は、それを既存のものに置き換えます。
      serviceAccount: ma
      serviceAccountName: ma
  2. 次の DaemonSet を作成します。
    1. 現在のプロジェクトがマシンエージェントであることを確認します。
      oc status
    2. マシンエージェント DaemonSet を作成します。
      oc create -f machine-agent-daemonset.yaml

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

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

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

  1. マシンエージェント DaemonSet を確認します。
    oc get ds
  2. マシンエージェントポッドを確認します。
    oc get pod
    ポッド名は machine-agent-daemonset-<XXXX> です。
  3. 最後の行に Started AppDynamics Machine Agent Successfully と表示されているかどうかログを確認します。
    oc get logs -f <machine-agent-daemonset-<XXXX>>

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

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

SampleDaemonSet

展開シナリオに合わせてサンプル 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

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"

サンプル開始スクリプト

#!/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/