kubernetes
Datadog
zipkin

KubernetesでPodからそのホスト専用のDatadog Agentにアクセスする

TL;DR;

iptablesでMagic IP Addressを特定のPodにDNATするか、podのspec.nodeIP+Downward APIを使う

iptablesを使う場合

ノードローカルなdnsmasq + Daemonset kube-dnsの事例と同じようなことをDatadog Agentでもやる。

iptablesの設定

MAGIC_IP=169.254.123.123
HOST_INTERFACE=cni0
POD_IP=10.2.91.68

curl http://$POD_IP:9411
echo $MAGIC_IP

# dd-agent (statsd)
sudo iptables -t nat -I PREROUTING --dest $MAGIC_IP -p udp --dport 8125 -j DNAT --to-dest $POD_IP:9411 -i $HOST_INTERFACE

# dd-agent (trace)
sudo iptables -t nat -I PREROUTING --dest $MAGIC_IP -p udp --dport 8126 -j DNAT --to-dest $POD_IP:8126 -i $HOST_INTERFACE

# dd-zipkin-proxy (dd-agent内包)
sudo iptables -t nat -I PREROUTING --dest $MAGIC_IP -p tcp --dport 9411 -j DNAT --to-dest $POD_IP:9411 -i $HOST_INTERFACE

dd-agentやdd-zipkin-proxyはDaemonSetでデプロイする

dd-agentやdd-zipkin-proxyはそれぞれDaemonSetとしてデプロイし、hostNetwork: trueにする。hostPort: ...でもいいのでは?と思うかもしれないが、そうするとdd-agentがPod名をホスト名と誤認してしまい、Datadogにhostname=pod名のメトリクスやトレースが溜まってしまう。結果的にホスト名でメトリクスやトレースを検索することができなくなってしまうので、避けたほうがいい。

spec.nodeIPを使う場合

ここで案内されているように、Downward APIを使えばコンテナの環境変数にNodeのIPアドレスをセットできる。

アプリ側で送信先IPアドレスを環境変数で設定できるようにする。

まとめ

Dockerコンテナからの$MAGIC_IP宛のパケットがホストの同ポートに転送される状態になる。$MAGIC_IPはアクセス元のコンテナがいるノードに読み替えられるので、Podからホスト専用のdd-agentにアクセスできることになる。

おまけ: Kubernetesのサポートはないの?

  • Node Localサービスの提案が出されています。2017/12/2現在はまだマージされてないので、興味のある方はぜひ応援してください。

参考