🔭

Splunk OpenTelemetry Collector for Kubernetesのカスタム設定

2023/04/25に公開

はじめに

Splunk Observability Cloud(以下、Splunk o11y)では、Kubernetes用のOpenTelemetry CollectorとしてSplunk OpenTelemetry Collector for Kubernetesが提供されています。
※もちろん中身はOtelなので、Splunk o11yへのテレメトリーデータ送信に限ったものはありません。

標準デプロイ方法

最低限、これを打てば完了でメトリクスとトレースが送られます(ログについては後述)。

helm repo add splunk-otel-collector-chart https://signalfx.github.io/splunk-otel-collector-chart
helm install <リリース名:my-test など> --set="splunkObservability.realm=<REALM名>,splunkObservability.accessToken=<アクセストークン>,clusterName=<クラスター名>" splunk-otel-collector-chart/splunk-otel-collector

詳細はこちら。
https://qiita.com/symmr/items/20f58522d7c1bcb8eb91

カスタマイズ方法

Otel Collectorのコンフィグについてはvalues.yamlで諸々変更できます。どのような設定が可能かはこちらにまとまっています。

特に、ログの送信についてはこちらです。
Splunk o11yでは、ログはSplunk Platform(Cloud / Enterprise)へHECで送信します。

参考
https://qiita.com/symmr/items/f6b1fea26db9c7a33e1e

ログ送信例(SplunkへのHEC送信)
splunkPlatform:
  endpoint: 'https://<ホスト名>:<ポート番号>/services/collector'
  token: '<HECトークン>' 
  #任意のIndexに送信したい場合。デフォルトはmain。
  index: '<任意のindex>'
  #HEC側でIndexを設定している場合
  index: null 
  
#デフォルトのfluentdではなくOtel Filelog Receiverを使う場合
logsEngine: otel

また、既存のコンフィグに追加、上書きしたい場合はこちらの通り、agent.config配下に書いてあげればOKです。

任意のコンフィグ追加、上書き
agent:
  config:
    exporters: (とか)

そもそもデフォルトのコンフィグはどうなっているでしょうか?
とりあえず標準デプロイした内容をConfigMapから見てみます。

ConfigMap一覧取得
kubectl get configmap

Otel関係のものが2つ出てくると思います。

<リリース名>-splunk-otel-collector-otel-agent                 
<リリース名>-splunk-otel-collector-otel-k8s-cluster-receiver 

確認するのは<リリース名>-splunk-otel-collector-otel-agentの方です。
※k8s-cluster-receiverはその名の通り、クラスターのメトリクスを取得する設定です。

コンフィグ確認
kubectl get configmap <リリース名>-splunk-otel-collector-otel-agent -o yaml

このようにreceiver、processorに色々と設定してくれていて、exporterでSplunk o11yに送る設定になっています。

data:
  relay: |
	・・・中略・・・
      pipelines:
	・・・中略・・・
        traces:
          exporters:
          - sapm
          - signalfx
          processors:
          - memory_limiter
          - k8sattributes
          - batch
          - resourcedetection
          - resource
          receivers:
          - otlp
          - jaeger
          - smartagent/signalfx-forwarder
          - zipkin
	・・・略・・・

設定例で上がっている、K8sのAPIサーバーへの通信をデフォルトの443から3443に変えたい場合をそのままやってみます。

デフォルト設定はこうです。

k8s API receiver(デフォルト)
    receivers:
      receiver_creator:
        receivers:
          smartagent/kubernetes-apiserver:
            config:
              extraDimensions:
                metric_source: kubernetes-apiserver
              skipVerify: true
              type: kubernetes-apiserver
              useHTTPS: true
              useServiceAccount: true
            rule: type == "port" && port == 443 && pod.labels["k8s-app"] == "kube-apiserver"

変更を加えてupgradeしてみます。ruleのportを3443にし、configにclientCertPath、clientKeyPathを追加、useServiceAccountをfalseにしています。

変更してみる
cat > my_values.yaml <<EOF
agent:
  config:
    receivers:
      receiver_creator:
        receivers:
          smartagent/kubernetes-apiserver:
            rule: type == "port" && port == 3443 && pod.labels["k8s-app"] == "kube-apiserver"
            config:
              clientCertPath: /etc/myapiserver/clients-ca.crt
              clientKeyPath: /etc/myapiserver/clients-ca.key
              skipVerify: true
              useHTTPS: true
              useServiceAccount: false
EOF

helm upgrade <リリース名> splunk-otel-collector-chart/splunk-otel-collector --set="splunkObservability.realm=<REALM>,splunkObservability.accessToken=<アクセストークン>,clusterName=<クラスター名>" -f ./my_values.yaml

もう一度ConfigMapの該当箇所を見ると行の追加または変更が行われました(#は私の方で入れています)。

k8s API receiver(変更後)
agent:
  config:
    receivers:
      receiver_creator:
        receivers:
          smartagent/kubernetes-apiserver:
            config:
              clientCertPath: /etc/myapiserver/clients-ca.crt #追加
              clientKeyPath: /etc/myapiserver/clients-ca.key #追加
              extraDimensions:
                metric_source: kubernetes-apiserver
              skipVerify: true
              type: kubernetes-apiserver
              useHTTPS: true
              useServiceAccount: false #true⇒falseに変更
            rule: type == "port" && port == 3443 && pod.labels["k8s-app"] == "kube-apiserver" #443⇒3443に変更

このように、Receiver、Processor、Exporterについて任意の変更が可能そうです。

まとめ

Splunk OpenTelemetry Collector for Kubernetesについて簡単にカスタマイズ方法を見ました。
デプロイがhelmでお手軽にできるのとカスタマイズ方法が用意されているので、なかなか使いやすいのではないかと思います。

Discussion