Kubernetes での Docker の可視性の使用
このページでは、Docker の可視性を有効にしてマシンエージェントを設定し、Kubernetes クラスタで DaemonSet として実行する方法について説明します。
コンテナの可視性により、Kubernetes ポッド内で実行されているコンテナ化されたアプリケーションをモニタし、アプリケーションのパフォーマンスに影響を与えるコンテナの問題を特定できます。Kubernetes クラスタのすべてのノードで、マシンエージェントを Kubernetes DaemonSet として展開します。マシンエージェントを DaemonSet として展開すると、すべての Kubernetes ワーカーノードがマシンエージェントを実行して、ノードホストおよび関連付けられた Docker コンテナの両方から重要なリソースメトリックを収集するようになります。
Kubernetes を使用したコンテナの可視性
Docker 対応モードでマシンエージェントを展開します。Docker を使用してマシンエージェントを設定および実行するには、「Docker の可視性の設定」を参照してください。
マシンエージェント:
- Kubernetes によって管理されているコンテナを特定します。
- これらのコンテナにアプリケーション サーバ エージェントが含まれているかどうかを確認します。
- アプリケーション サーバ エージェントが含まれるコンテナを、そのアプリケーションの APM ノードと関連付けます。
次の図は、Kubernetes でのコンテナの可視性の展開シナリオを示しています。
- マシンエージェントコンテナ(
)を各 Kubernetes ノードの
DaemonSetとしてインストールします。 - ポッド内の任意のコンテナから APM メトリックを収集するには、ポッドを展開する前に、正しいアプリケーション サーバー エージェント(
)をコンテナにインストールします。
- マシンエージェントは、モニタ対象(
)の各コンテナのリソース使用率メトリック、およびホストのマシンとサーバのメトリックを収集し、このメトリックをコントローラに転送します。
- (オプション)モニターするノードでネットワークエージェント(
)を
DaemonSetとしてインストールします。
ネットワークエージェントは、モニター対象のアプリケーション コンポーネント間のネットワーク接続すべてのメトリックを収集し、それらのメトリックをコントローラに送信します。
はじめる前に
Kubernetes を使用したコンテナの可視性については、次の要件を確認します。
- マシンエージェントは、モニターするすべての Kubernetes ノードで
DaemonSetとして実行する必要があります。 - モニタ対象のすべてのノードにサーバの可視性ライセンスが必要です。
- 各マシンエージェントで Docker の可視性を有効にする必要があります。
- アプリケーション サーバー エージェントとマシンエージェントの両方が同じアカウントによって登録されていて、同じコントローラを使用します。
- 同じポッドで複数のアプリケーション サーバ エージェントを実行している場合は、アプリケーション サーバ エージェントとマシンエージェントのそれぞれで、ホスト ID としてコンテナ ID を登録します。
制限事項
- Docker コンテナランタイムのみがサポートされています。
- ポッドと ReplicaSet ラベルのみがサポートされています。
手順
マシンエージェントが Kubernetes に展開されたら、アプリケーション サーバ エージェントをイメージに追加できます。
コンテナの可視性の有効化
コントローラを 4.4.3 以降に更新します。
環境での Kubernetes の可視性を有効にするには、次のパラメータを編集します。
- SaaS コントローラ 4.5.11 以降。
sim.machines.tags.k8s.enabled:値のデフォルトは true です。グローバルタグに対応するフラグはこれよりも優先されます。sim.machines.tags.k8s.pollingInterval:値のデフォルトは 1 分です。ポーリング間隔に設定できる最小値は 30 秒です。
- マシンエージェント
k8sTagsEnabled:値のデフォルトは true で、ServerMonitoring.yml ファイルで指定されています。
「Red Hat OpenShift での Docker の可視性の使用」に記載されている手順を続行します。DaemonSet の例、マシンエージェントのサンプル Docker イメージ、およびサンプル Docker 開始スクリプトを使用すると、マシンエージェントを設定できます。
ホスト ID としてコンテナ ID を登録する
アプリケーションメトリックを収集するには、Kubernetes ポッド内のすべてのコンテナにアプリケーション サーバ エージェントをインストールします。たとえば、RedHat OpenShift プラットフォームで複数のアプリケーション サーバ エージェントが同じポッドで実行されている場合、ポッドからコンテナ固有のメトリックを収集するために、アプリケーション サーバ エージェントとマシンエージェントの両方で、コンテナ ID を一意のホスト ID として登録する必要があります。Kubernetes ポッドには複数のコンテナを含めることができ、同じホスト ID を共有することができます。マシンエージェントは、各コンテナ ID がホスト ID として登録されていない限り、ポッドで実行されているさまざまなコンテナを識別できません。
コンテナ ID をホスト ID として登録するには、次のようにします。
クラスタロールの設定
次に、さまざまな Kubernetes リソースへの読み取りアクセスを提供するクラスタロール定義の例を示します。これらの権限によって、マシンエージェントおよびポッドメタデータの収集に対して Kubernetes 拡張機能を有効にします。ロールは appd-cluster-reader という名前ですが、変更することもできます。クラスタロールの定義には、このロールのメンバーが使用できるさまざまな API グループの概要が表示されます。各 API グループに対して、アクセスできるリソースとアクセス方式のリストを定義します。これらの API エンドポイントから情報を取得する必要があるため、「get」、「list」、および「watch」の動詞で表される読み取り専用アクセスが必要になります。
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: appd-cluster-reader
rules:
- nonResourceURLs:
- '*'
verbs:
- get
- apiGroups: ["batch"]
resources:
- "jobs"
verbs: ["get", "list", "watch"]
- apiGroups: ["extensions"]
resources:
- daemonsets
- daemonsets/status
- deployments
- deployments/scale
- deployments/status
- horizontalpodautoscalers
- horizontalpodautoscalers/status
- ingresses
- ingresses/status
- jobs
- jobs/status
- networkpolicies
- podsecuritypolicies
- replicasets
- replicasets/scale
- replicasets/status
- replicationcontrollers
- replicationcontrollers/scale
- storageclasses
- thirdpartyresources
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources:
- bindings
- componentstatuses
- configmaps
- endpoints
- events
- limitranges
- namespaces
- namespaces/status
- nodes
- nodes/status
- persistentvolumeclaims
- persistentvolumeclaims/status
- persistentvolumes
- persistentvolumes/status
- pods
- pods/binding
- pods/eviction
- pods/log
- pods/status
- podtemplates
- replicationcontrollers
- replicationcontrollers/scale
- replicationcontrollers/status
- resourcequotas
- resourcequotas/status
- securitycontextconstraints
- serviceaccounts
- services
- services/status
verbs: ["get", "list", "watch"]
- apiGroups:
- apps
resources:
- controllerrevisions
- daemonsets
- daemonsets/status
- deployments
- deployments/scale
- deployments/status
- replicasets
- replicasets/scale
- replicasets/status
- statefulsets
- statefulsets/scale
- statefulsets/status
verbs:
- get
- list
- watch
- apiGroups:
- apiextensions.k8s.io
resources:
- customresourcedefinitions
- customresourcedefinitions/status
verbs:
- get
- list
- watch
- apiGroups:
- apiregistration.k8s.io
resources:
- apiservices
- apiservices/status
verbs:
- get
- list
- watch
- apiGroups:
- events.k8s.io
resources:
- events
verbs:
- get
- list
- watchロールを定義したら、クラスタ ロール バインディングを作成して、そのロールをサービスアカウントに関連付ける必要があります。この ClusterRoleBinding の仕様例では、appd-cluster-reader サービスアカウントがプロジェクト「myproject」内の appd-cluster-reader-role のメンバーになります。命名は単に偶然によるものです。サービスアカウントとクラスタロールの名前が一致している必要はありません。
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: cluster-reader-role-binding
subjects:
- kind: ServiceAccount
name: appd-cluster-reader
namespace: myproject
roleRef:
kind: ClusterRole
name: appd-cluster-reader
apiGroup: rbac.authorization.k8s.ioKubernetes でのマシンエージェントの展開
マシンエージェントは、init コンテナを必要としない単一のコンテナイメージで展開できます。デフォルトでは、マシンエージェントは DaemonSet としてクラスターに展開され、すべてのクラスターノードに対してすべてのエージェントインスタンスを均等に分散します。必要に応じて、ノードのアフィニティルールまたはアンチアフィニティルールを使用して DaemonSet を構成し、クラスター全体ではなく、必要なノードセットに展開されるようにすることができます。ノードアフィニティについては、「Assigning Pods to Nodes」を参照してください。
ポッドメタデータを収集するには、マシンエージェントの展開に使用されるサービスアカウントに OpenShift の cluster-reader ロールが必要です。マシンエージェントへの Kubernetes 拡張機能には、cluster-reader ロールも必要です。
# assigning cluster-reader role in OpenShift
oc adm policy add-cluster-role-to-user cluster-reader -z appd-accountvanilla Kubernetes ディストリビューションを使用している場合は、OpenShift の cluster-reader に類似したビルド済みクラスターロールがない可能性があります。「ClusterRole の設定」を参照してください。
Kubernetes を使用したアプリケーションのインストゥルメント化
Kubernetes を使用して展開されたアプリケーションのインストゥルメント化にはいくつかの方法があり、選択する方法は、特定の要件と DevOps プロセスによって異なります。Splunk AppDynamics を使用してアプリケーションコンテナをモニターするには、次の方法でそのコンテナにアプリケーション サーバー エージェントを含める必要があります。
- アプリケーション サーバ エージェントが事前にインストールされている適切なベースイメージを使用する。
- init コンテナを使用して、コンテナの起動の一部としてアプリケーション サーバ エージェントを動的にロードする。
- アプリケーション サーバ エージェントをロードして、実行中のプロセスへ動的に接続する(言語ランタイムをサポートしている場合)。
3 つ目のオプションは、通常、Java ベースのアプリケーションにのみ適用されます。これは、JVM がダイナミック接続をサポートし、Java APM エージェントの標準機能だからです。「Dynamic Java Instrumentation」を参照してください。
その他のオプションについては、「Deploying Agents to OpenShift Using Init Containers」で説明されているように、Init コンテナ、ConfigMaps、および Secrets などの標準的な Kubernetes 機能を使用することが一般的な方法です。
リソース制限値
モニタ対象のメインアプリケーションでは、リソース制限が定義されている必要があります。CPU に 2% のパディングを提供し、最大 100 MB のメモリを追加します。
最大 500 個のコンテナをサポートするために、次のリソースの要求(Mem = 400M, CPU = "0.1")と制限(Mem = 600M, CPU = "0.2")を使用してマシンエージェントを構成できます。
DaemonSet には含めないでください。その代わり、DaemonSet に加えて、この拡張機能を備えたマシンエージェントのインスタンスを、サーバーの可視性のために 1 つのレプリカを持つ個別の展開として展開することを検討してください。この場合、マシンエージェントの SIM と Docker を無効にして、メモリ要求を 250 M に下げることができます。