TL;DR;
iptablesでMagic IP Addressを特定のPodにDNATするか、podのspec.nodeIP+Downward APIを使う
iptablesを使う場合
ノードローカルなdnsmasq + Daemonset kube-dnsの事例と同じようなことをDatadog Agentでもやる。
iptablesの設定
- Datadogメトリクスを受け付けるためのdd-agentのポートは8125
- Datadog APMトレースを受け付けるためのdd-agentのポートは8126
- ZipkinスパンをDatadog APMに送りたい場合はdd-zipkin-proxy/zipkinの9411
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現在はまだマージされてないので、興味のある方はぜひ応援してください。