CDKでEKSクラスタにnewrelic-bundleをインストールしてモニタリングする

kubernetesawsnewrelic

NewRelic の Kubernetes Integration の各種コンポーネントをまとめた nri-bundle という Helm Chart が提供されており、Guided install を進めると渡すパラメータが生成されるのでこれを CDK に書き写した。

Chart を見ると認証情報はそのまま文字列で渡すほか Secret を指定することもできたので、External Secrets で SecretsManager から取り込む。

CDK で External Secrets Operator をインストールし Secrets Manager のデータを Kubernetes の Secret として読めるようにする - sambaiz-net

const newrelicNamespace = cluster.addManifest('newrelic-namespace', {
  apiVersion: 'v1',
  kind: 'Namespace',
  metadata: {
    name: 'newrelic'
  }
})

const secretName = 'newrelic-bundle-secret'

const newrelicBundleSecret = cluster.addManifest('NewrelicBundleSecret', {
  apiVersion: 'external-secrets.io/v1beta1',
  kind: 'ExternalSecret',
  metadata: {
    name: secretName,
    namespace: 'newrelic'
  },
  spec: {
    refreshInterval: '1h',
    secretStoreRef: {
      name: 'secretsmanager',
      kind: 'ClusterSecretStore'
    },
    data: [{
      secretKey:  'newrelic-license-key',
      remoteRef: {
        key: secretName,
        property: 'newrelic-license-key'
      }
    }, {
      secretKey:  'pixie-api-key',
      remoteRef: {
        key: secretName,
        property: 'pixie-api-key'
      }
    }, {
			// key of the deploy key is "deploy-key".
			// https://github.com/pixie-io/pixie/blob/release/vizier/v0.14.8/k8s/operator/helm/values.yaml#L37
      secretKey:  'deploy-key',
      remoteRef: {
        key: secretName,
        property: 'pixie-deploy-key'
      }
    }]
  }
})

newrelicBundleSecret.node.addDependency(newrelicNamespace)
newrelicBundleSecret.node.addDependency(secretStore)

現状、Pixie のバージョンが古く ARM インスタンスで動かすとエラーになる。PRは出ている。

const newrelicBundle = cluster.addHelmChart('newrelic-bundle', {
  chart: 'nri-bundle',
  release: 'newrelic-bundle',
  repository: 'https://helm-charts.newrelic.com',
  namespace: 'newrelic',
  createNamespace: false,
  values: {
    global: {
      customSecretName: secretName,
      customSecretLicenseKey: 'newrelic-license-key',
      cluster: cluster.clusterName,
      lowDataMode: true,
    },
    "newrelic-infrastructure": {
      privileged: true,
    },
    "kube-state-metrics": {
      enabled: true,
      image: {
        tag: "v2.10.0"
      }
    },
    "kubeEvents": {
      enabled: true,
    },
    "newrelic-prometheus-agent": {
      enabled: true,
      lowDataMode: true,
      config: {
        kubernetes: {
          integrations_filter: {
            enabled: true,
          }
        }
      },
    },
    logging: {
      enabled: true,
    },
    "newrelic-logging": {
      lowDataMode: true
    },
    "newrelic-pixie": {
      enabled: true,
      customSecretApiKeyName: secretName,
      customSecretApiKeyKey: "pixie-api-key"
    },
    "pixie-chart": {
      enabled: true,
      customDeployKeySecret: secretName,
      clusterName: cluster.clusterName,
    }
  },
  wait: false
})

newrelicBundle.node.addDependency(newrelicBundleSecret)

インストールするとコンテナやノードレベルのメトリクスやログに加えeventsなども確認できる。

また、Linuxカーネル内のサンドボックスでネットワークなどのイベントによって動く eBPF プログラムでデータを収集する Pixie によってサービスマップや通信量などが可視化され、

アプリケーションのフレームグラフも見ることができる。

参考

eBPFとは何か、なぜそれがオブザーバビリティに関係するのか?