New Relicは、インフラストラクチャエージェントと監視が必要な各ポッドのnri-kubernetes
統合を含むサイドカーを自動的に挿入することで、EKSFargateでのKubernetesワークロードの監視をサポートします。
同じKubernetesクラスターにEC2ノードも含まれている場合、ソリューションはそれらすべてにDaemonSet
としてデプロイされます。EC2ノードでスケジュールされたポッドにサイドカーが注入されることはなく、FargateノードにDaemonSet
がデプロイされることもありません。FargateノードとEC2ノードの両方を備えたハイブリッドインスタンスの例を次に示します。
混合環境では、統合はFargateノードにサイドカーのみを使用します。
New Relicは、FargateノードかEC2ノードかに関係なく、スケジュールされている場所に関係なく、すべてのKubernetesオブジェクトでサポートされているすべてのメトリックを収集します。Fargateによって課せられた制限により、NewRelic統合はFargateノードで非特権モードで実行するように制限されていることに注意してください。つまり、実行中のプロセスのように、通常はホストから直接フェッチされるメトリックは、Fargateノードでは使用できません。
両方のシナリオのエージェントは、Kube State Metrics(KSM)、Kubelet、およびcAdvisorからデータを取得し、同じ形式でデータを送信します。
重要
他のKubernetesクラスタと同様に、このソリューションでは、Kube State Metrics(KSM)インスタンスをデプロイして監視する必要があります。ヘルムチャートやインストーラーはデフォルトで自動的にこれを行いますが、クラスターにすでにKSMのインスタンスが動作している場合は、この動作を無効にすることができます。このKSMインスタンスは、他のワークロードと同様に監視されます。ファーゲートノードでスケジュールされている場合はサイドカーを注入し、EC2ノードでスケジュールされている場合はDaemonSet
のローカルインスタンスを注入します。
nri-prometheus
、 nri-metadata-injection
、 nri-kube-events
などのKubernetes用のNew Relicソリューションの他のコンポーネントには特別なものはなく、Fargate以外の環境の場合と同様に、HelmChartによって通常どおりデプロイされます。
EKS FargateクラスターにNewRelicの完全な可観測性をインストールするには、次の2つの方法から選択できます。
どのアプローチを選択しても、インストール後のエクスペリエンスはまったく同じです。唯一の違いは、コンテナーの注入方法です。New Relic インフラストラクチャ監視オペレーターを使用して自動インジェクションを設定することをお勧めします。これにより、監視する各デプロイメントを手動で編集する必要がなくなるからです。
自動注入(推奨)
デフォルトでは、Fargateサポートが有効になっている場合、New Relicはオペレーターをクラスター( newrelic-infra-operator
)にデプロイします。デプロイされると、このオペレーターは、監視サイドカーをFargateノードにスケジュールされているポッドに自動的に注入し、同時にSecrets
、 ClusterRoleBindings
、およびその他の関連リソースの作成と更新を管理します。
このオペレーターは、ポッドと名前空間の両方にラベルセレクターを使用することで、インジェクションの範囲を狭めたり広げたりするために使用できるさまざまな高度な構成オプションを受け入れます。
オペレーターが行うこと
舞台裏で、オペレーターはMutatingWebhookConfiguration
を設定します。これにより、クラスターで作成されようとしているポッドオブジェクトを変更できます。このイベントで、作成中のポッドがユーザーの構成と一致すると、オペレーターは次のことを行います。
NewRelicKubernetes統合を含むポッドにサイドカーコンテナを追加します。
シークレットが存在しない場合は、サイドカーがデータを報告するために必要なNew Relic
を含む、ポッドと同じ名前空間にシークレットを作成します。
ポッドのサービスアカウントを、オペレーターチャートが以前作成した
ClusterRoleBinding
に追加します。これにより、このサイドカーにKubernetesメトリクスエンドポイントにアクセスするために必要な権限が付与されます。
ClusterRoleBinding
は、注入されるポッドに次の権限を付与します。
- apiGroups: [""] resources: - "nodes" - "nodes/metrics" - "nodes/stats" - "nodes/proxy" - "pods" - "services" - "namespaces" verbs: ["get", "list"]- nonResourceURLs: ["/metrics"] verbs: ["get"]
ヒント
サイドカーが注入され、オペレーターがインストールされる前に展開されたポッドからメトリックを取得するには、影響を受ける展開のロールアウト(再起動)を手動で実行する必要があります。このようにして、ポッドが作成されると、オペレーターは監視サイドカーを注入できるようになります。New Relicは、予期しないサービスの中断やリソース使用量の急増を防ぐために、これを自動的に行わないことを選択しました。
重要
newrelic
名前空間 (またはインストール用に選択した名前空間) を宣言するセレクターを使用して Fargate プロファイルを作成してください。
インジェクションワークフローは次のとおりです。
ヒント
次の手順は、デフォルト設定用です。これらを完了する前に、以下の「構成」セクションを参照して、自動インジェクションのいずれかの側面を変更するかどうかを確認することをお勧めします。
New Relic Helmリポジトリを追加する
これまでに実行していない場合は、次のコマンドを実行して New Relic Helm リポジトリを追加します。
$helm repo add newrelic https://helm-charts.newrelic.com
という名前のファイルを作成します values.yaml
インフラストラクチャ サイドカーの挿入を担当するオペレーターをインストールするには、 values.yaml
という名前のファイルを作成します。 このファイルは設定を定義します:
## Global values
global:# -- The cluster name for the Kubernetes cluster.cluster: "_YOUR_K8S_CLUSTER_NAME_"
# -- The license key for your New Relic Account. This will be preferred configuration option if both `licenseKey` and `customSecret` are specified.licenseKey: "_YOUR_NEW_RELIC_LICENSE_KEY_"
# -- (bool) In each integration it has different behavior. Enables operating system metric collection on each EC2 K8s node. Not applicable to Fargate nodes.# @default -- falseprivileged: true
# -- (bool) Must be set to `true` when deploying in an EKS Fargate environment# @default -- falsefargate: true
## Enable nri-bundle sub-charts
newrelic-infra-operator:# Deploys the infrastructure operator, which injects the monitoring sidecar into Fargate podsenabled: truetolerations: - key: "eks.amazonaws.com/compute-type" operator: "Equal" value: "fargate" effect: "NoSchedule"config: ignoreMutationErrors: true infraAgentInjection: # Injection policies can be defined here. See [values file](https://github.com/newrelic/newrelic-infra-operator/blob/main/charts/newrelic-infra-operator/values.yaml#L114-L125) for more detail. policies: - namespaceName: namespace-a - namespaceName: namespace-b
newrelic-infrastructure:# Deploys the Infrastructure Daemonset to EC2 nodes. Disable for Fargate-only clusters.enabled: true
nri-metadata-injection:# Deploy our mutating admission webhook to link APM and Kubernetes entitiesenabled: true
kube-state-metrics:# Deploys Kube State Metrics. Disable if you are already running KSM in your cluster.enabled: true
nri-kube-events:# Deploy the Kubernetes events integration.enabled: true
newrelic-logging:# Deploys the New Relic's Fluent Bit daemonset to EC2 nodes. Disable for Fargate-only clusters.enabled: true
newrelic-prometheus-agent:# Deploys the Prometheus agent for scraping Prometheus endpoints.enabled: trueconfig: kubernetes: integrations_filter: enabled: true source_labels: ["app.kubernetes.io/name", "app.newrelic.io/name", "k8s-app"] app_values: ["redis", "traefik", "calico", "nginx", "coredns", "kube-dns", "etcd", "cockroachdb", "velero", "harbor", "argocd", "istio"]
デプロイ
ファイルを作成して調整した後、次の Helm コマンドを使用してソリューションをデプロイできます。
$helm upgrade --install newrelic-bundle newrelic/nri-bundle -n newrelic --create-namespace -f values.yaml
重要
ソリューションをハイブリッドクラスター(EC2ノードとFargateノードの両方)にデプロイする場合は、ソリューションがFargateプロファイルによって選択されていないことを確認してください。そうしないと、 DaemonSet
インスタンスは保留状態のままになります。ファーゲートのみの環境では、 DaemonSet
インスタンスが作成されないため、これは問題になりません。
自動インジェクション: 既知の制限
自動インジェクションを使用する際に注意すべきいくつかの問題があります。
- 現在、クラスター全体を監視して、不要になったシークレットがガベージコレクションされていることを確認するコントローラーはありません。ただし、すべてのオブジェクトは、必要に応じてすべてのリソースを削除するために使用できる同じラベルを共有します。ラベル
newrelic/infra-operator-created: true
を挿入します。これを使用して、1つのコマンドでリソースを削除できます。 - 現時点では、注入されたサイドカーを使用してポッドで実行されているサービスを監視することはできません。サイドカーはKubernetes自体のみを監視します。ただし、上級ユーザーは、これらのポッドを自動注入から除外し、それらを構成して適切な場所に構成をマウントすることにより、オンホスト統合が有効になっているカスタマイズされたバージョンのサイドカーを手動で注入したい場合があります。ヘルプについては、このチュートリアルを参照してください。
自動インジェクション: 設定
自動インジェクションのさまざまな側面を構成できます。デフォルトでは、オペレーターは、 Job
またはBatchJob
の一部ではないFargateノードにデプロイされたすべてのポッドに監視サイドカーを注入します。
この動作は設定オプションを通じて変更できます。 たとえば、セレクターを定義して、挿入されるポッドの選択範囲を狭めたり広げたり、オペレーターにリソースを割り当てたり、サイドカーを調整したりできます。 また、他の属性、ラベル、環境変数を追加することもできます。 表README.md
とvalues.yaml
を参照してください。
重要
独自のカスタムインジェクションルールを指定すると、Fargateでスケジュールされていないポッドへのサイドカーインジェクションを防ぐデフォルトのルールセットが破棄されます。カスタムルールが同じ効果を持つことを確認してください。そうしないと、 DaemonSet
もデプロイされているハイブリッドクラスターでは、EC2でスケジュールされたポッドが2回監視され、データが正しくないか重複することになります。
最新バージョンまたは新しい構成に更新します
EKS Fargate統合の最新バージョンに更新するには、 helm repo update newrelic
を使用してHelmリポジトリーをアップグレードし、上記のコマンドを再度実行してバンドルを再インストールします。
注入されたインフラストラクチャエージェントまたはオペレーター自体の構成を更新するには、 values-newrelic.yaml
を変更し、Helmリリースを新しい構成でアップグレードします。オペレーターはすぐに更新され、ワークロードは次回の再起動時に新しいバージョンで計測されます。それらをすぐにアップグレードしたい場合は、以下を実行してワークロードを強制的に再起動できます。
$kubectl rollout restart deployment YOUR_APP
自動インジェクション: アンインストール
自動インジェクションを実行しているサイドカーをアンインストールし、残りのNew Relicソリューションを保持するには、Helmを使用して、 values.yaml
ファイルまたはコマンドラインでinfra-operator.enabled
をfalse
に設定してインフラオペレーターを無効にします( --set
)、上記のインストールコマンドを再実行します。
--set global.fargate=true
フラグを保持することを強くお勧めします。これは、自動インジェクションを有効にしませんが、インストールの他のコンポーネントをFargate対応にし、望ましくない動作を防ぐためです。
ソリューション全体をアンインストールするには:
Helmリリースを完全にアンインストールします。
サイドカーを取り外すには、ポッドをロールアウトします。
bash$kubectl rollout restart deployment YOUR_APPガベージコレクションの秘密:
bash$kubectl delete secrets -n YOUR_NAMESPACE -l newrelic/infra-operator-created=true
手動注射
自動インジェクションについて懸念がある場合は、Fargate ノードでスケジュールされるワークロードのマニフェストを変更することで、サイドカーを手動で直接挿入できます。 EC2 ノードにスケジュールされたサイドカーを追加すると、特にそれらのノードがすでにDaemonSet
で監視されている場合は、不正確なデータや重複したデータが発生する可能性があることに注意してください。
サイドカーがデータを正常に報告するには、次のオブジェクトが必要です。
ClusterRole
は、nri-kubernetes
インテグレーションに必要な権限を提供します。ClusterRole
とポッドのサービス アカウントをリンクするClusterRoleBinding
。- 各 Fargate ネームスペースにNew Relic
licenseKey
を保存するシークレット。 - モニター ワークロードの特定のテンプレート内のサイドカー コンテナ。
ヒント
これらの手動セットアップ手順は、一般的なインストール用です。 これらを完了する前に、以下の設定セクションを参照して、自動インジェクションのいずれかの側面を変更するかどうかを確認してください。
手動インジェクションを実行するには、次の手順を実行します。
ClusterRole
ClusterRole
が存在しない場合は作成し、メトリックス エージェントにアクセスするために必要な権限を付与します。 同じクラスター内の複数のアプリケーションを監視する場合でも、これを 1 回だけ実行する必要があります。 このスニペットは、変更せずに以下のように使用できます。
apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata: labels: app: newrelic-infrastructure name: newrelic-newrelic-infrastructure-infra-agentrules: - apiGroups: - "" resources: - nodes - nodes/metrics - nodes/stats - nodes/proxy - pods - services verbs: - get - list - nonResourceURLs: - /metrics verbs: - get
インジェクションサイドカー
モニターする各トランザクションに対して、 newrelic/infrastructure-k8s
イメージ用のサイドカー コンテナーを追加します。 次のスニペットの コンテナを取得し、モニターするワークロードに挿入します。その際、 customAttributes
変数にFargateProfile
の名前を指定します。 ボリュームはemptyDir: {}
として定義できることに注意してください。
ヒント
KSMデプロイメントの特殊なケースでは、 DISABLE_KUBE_STATE_METRICS
環境変数を削除し、リソース要求と制限を増やす必要もあります。
apiVersion: apps/v1kind: Deploymentspec: template: spec: containers: - name: newrelic-infrastructure env: - name: NRIA_LICENSE_KEY valueFrom: secretKeyRef: key: license name: newrelic-newrelic-infrastructure-config - name: NRIA_VERBOSE value: "1" - name: DISABLE_KUBE_STATE_METRICS value: "true" - name: CLUSTER_NAME value: testing-injection - name: COMPUTE_TYPE value: serverless - name: NRK8S_NODE_NAME valueFrom: fieldRef: apiVersion: v1 fieldPath: spec.nodeName - name: NRIA_DISPLAY_NAME valueFrom: fieldRef: apiVersion: v1 fieldPath: spec.nodeName - name: NRIA_CUSTOM_ATTRIBUTES value: '{"clusterName":"$(CLUSTER_NAME)", "computeType":"$(COMPUTE_TYPE)", "fargateProfile":"[YOUR FARGATE PROFILE]"}' - name: NRIA_PASSTHROUGH_ENVIRONMENT value: KUBERNETES_SERVICE_HOST,KUBERNETES_SERVICE_PORT,CLUSTER_NAME,CADVISOR_PORT,NRK8S_NODE_NAME,KUBE_STATE_METRICS_URL,KUBE_STATE_METRICS_POD_LABEL,TIMEOUT,ETCD_TLS_SECRET_NAME,ETCD_TLS_SECRET_NAMESPACE,API_SERVER_SECURE_PORT,KUBE_STATE_METRICS_SCHEME,KUBE_STATE_METRICS_PORT,SCHEDULER_ENDPOINT_URL,ETCD_ENDPOINT_URL,CONTROLLER_MANAGER_ENDPOINT_URL,API_SERVER_ENDPOINT_URL,DISABLE_KUBE_STATE_METRICS,DISCOVERY_CACHE_TTL image: newrelic/infrastructure-k8s:2.4.0-unprivileged imagePullPolicy: IfNotPresent resources: limits: memory: 100M cpu: 200m requests: cpu: 100m memory: 50M securityContext: allowPrivilegeEscalation: false readOnlyRootFilesystem: true runAsUser: 1000 terminationMessagePath: /dev/termination-log terminationMessagePolicy: File volumeMounts: - mountPath: /var/db/newrelic-infra/data name: tmpfs-data - mountPath: /var/db/newrelic-infra/user_data name: tmpfs-user-data - mountPath: /tmp name: tmpfs-tmp - mountPath: /var/cache/nr-kubernetes name: tmpfs-cache[...]
サイドカーエージェントのマニフェストを手動で追加する場合は、任意のエージェント構成オプションを使用して、エージェントの動作を構成できます。ヘルプについては、 インフラストラクチャエージェントの構成設定を参照してください。
ClusterRoleBinding
ClusterRoleBinding
を作成するか、以前に作成したものに、監視対象のアプリケーションのServiceAccount
を追加します。すべてのワークロードが同じClusterRoleBinding
を共有する場合がありますが、各ワークロードのServiceAccount
を追加する必要があります。
監視するポッドのサービスアカウントをサブジェクトとして持つ次のClusterRoleBinding
を作成します。
ヒント
同じサービスアカウントを2回繰り返す必要はありません。まだ含まれていないサービスアカウントでポッドを監視するたびに、それをリストに追加するだけです。
apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata: name: newrelic-newrelic-infrastructure-infra-agentroleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: newrelic-newrelic-infrastructure-infra-agentsubjects: - kind: ServiceAccount name: [INSERT_SERVICE_ACCOUNT_NAME_OF_WORKLOAD] namespace: [INSERT_SERVICE_ACCOUNT_NAMESPACE_OF_WORKLOAD]
秘密を含む
New Relic を含むシークレットを作成します。各名前空間には独自のシークレットが必要です。
のBase64エンコード値を含むライセンスを持つ次のSecret
を作成します。監視するポッドが実行されている名前空間ごとに1つのシークレットが必要です。
apiVersion: v1data: license: INSERT_YOUR_NEW_RELIC_LICENSE_ENCODED_IN_BASE64kind: Secretmetadata: name: newrelic-newrelic-infrastructure-config namespace: [INSERT_NAMESPACE_OF_WORKLOAD]type: Opaque
マニュアルインジェクション: 最新バージョンにアップデート
いずれかのコンポーネントを更新するには、デプロイされたyamlを変更するだけです。 注入されたコンテナのいずれかのフィールドを更新すると、ポッドが再作成されます。
重要
エージェントはNew Relic をホットロードできません。シークレットを更新した後、デプロイメントを再度ロールアウトする必要があります。
手動インジェクション: Fargateインテグレーションのアンインストール
注入されたコンテナと関連リソースを削除するには、次のものを削除する必要があります。
- もはや監視されるべきではないワークロードからのサイドカー。
- newrelicライセンスを含むすべての秘密。
ClusterRole
およびClusterRoleBinding
オブジェクト。
サイドカーコンテナを削除すると、ポッドが再作成されることに注意してください。
ロギング
New Relic のログ記録は、AWS によって課されたセキュリティ制約のため、Fargate ノードでは利用できませんが、いくつかのログ記録オプションを次に示します。
- ログ記録に Fluentbit を使用している場合は、 「ログ転送用の Kubernetes プラグイン」を参照してください。
- ログデータがすでに AWS FireLens によって監視されている場合は、 「ログ転送用の AWS FireLens プラグイン」を参照してください。
- ログデータがすでに Amazon CloudWatch Logs によって監視されている場合は、 「Kinesis Data Firehose を使用したログのストリーミング」を参照してください。
- CloudWatch ログの送信については、「AWS Lambda」を参照してください。
- 「Amazon ECS から New Relic にログを転送する 3 つの方法」を参照してください。
トラブルシューティング
EKSデータを表示する
NewRelicUIでFargateノードがどのように表示されるかの例を次に示します。
AWSデータを表示するには:
one.newrelic.com > All capabilities > Infrastructure > Kubernetesに移動し、次のうち1つを行います。
- データを表示する統合名を選択します。
- AWSデータを表示するには、[データの探索]アイコンを選択します。
2つのFargateタグを使用してデータをフィルタリングします。
computeType=serverless
fargateProfile=[name of the Fargate profile to which the workload belongs]