メモです。
kubernetesでCNIにcalicoを使っている場合、こんな感じでpodごとにvethインタフェースが割り当てられます。パッと見ただけではどのpodに割り当てられているかわかりません。
$ ip a ...snip... 9: caliaad70479a6d@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP group default link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netnsid 1 inet6 fe80::ecee:eeff:feee:eeee/64 scope link valid_lft forever preferred_lft forever 10: cali931bd67f307@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP group default link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netnsid 2 inet6 fe80::ecee:eeff:feee:eeee/64 scope link valid_lft forever preferred_lft forever 11: cali7015be84f88@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP group default link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netnsid 3 inet6 fe80::ecee:eeff:feee:eeee/64 scope link valid_lft forever preferred_lft forever 12: calif4ef4175352@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP group default link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netnsid 4 inet6 fe80::ecee:eeff:feee:eeee/64 scope link valid_lft forever preferred_lft forever 13: cali386e731fa78@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP group default link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netnsid 5 inet6 fe80::ecee:eeff:feee:eeee/64 scope link valid_lft forever preferred_lft forever
ということで、podからどのインタフェースが対応するのかを確認してみます。
まず最初に該当のnode上で動いているpodを確認します。worker-2では5つのpodが動いています。ちなみにdeploymentでkubernetes bootcampのpodを動かしています。一番最初のpodのインタフェースを追いかけるものとします。
$ kubectl get pod -o wide | grep worker-2 bootcamp-7465f56-4jx4f 1/1 Running 0 2m44s 192.168.133.208 worker-2 <none> <none> bootcamp-7465f56-b4zvg 1/1 Running 0 2m44s 192.168.133.209 worker-2 <none> <none> bootcamp-7465f56-bj222 1/1 Running 0 2m44s 192.168.133.206 worker-2 <none> <none> bootcamp-7465f56-gjflf 1/1 Running 4 13h 192.168.133.205 worker-2 <none> <none> bootcamp-7465f56-qfv9w 1/1 Running 0 2m44s 192.168.133.207 worker-2 <none> <none>
該当node上でdockerのコンテナを確認します。pod名の後ろのランダムな文字列でgrepすると出てきます。
$ docker ps | grep 4jx4f e45b586ecd6f 8fafd8af70e9 "/bin/sh -c 'node se…" 7 minutes ago Up 7 minutes k8s_bootcamp_bootcamp-7465f56-4jx4f_default_6334a2ed-c22a-41d3-91f5-e00c628310bc_0 7166eaf0d70a k8s.gcr.io/pause:3.2 "/pause" 7 minutes ago Up 7 minutes k8s_POD_bootcamp-7465f56-4jx4f_default_6334a2ed-c22a-41d3-91f5-e00c628310bc_0
docker inspectでこのコンテナのpidを調べます。複数ありますが、同じpodなのでどちらでもよいです。
$ docker inspect k8s_bootcamp_bootcamp-7465f56-4jx4f_default_6334a2ed-c22a-41d3-91f5-e00c628310bc_0 | grep "Pid" "Pid": 20517, "PidMode": "", "PidsLimit": null,
pidが取れたらnsenterで該当プロセスにアタッチして、ethtoolでpod側のeth0の統計情報からveth pairのインデックス番号が取れます。
$ sudo nsenter -t 20517 -n ethtool -S eth0 NIC statistics: peer_ifindex: 12
node側でこのインデックス番号のインタフェースを確認すればOKです。
$ ip a | grep "^12" 12: calif4ef4175352@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP group default
nsenterほんと便利ですね。こんな感じでpod側のIPアドレスを直接確認できたりしますし、コンテナイメージ内にないコマンドでも、node側にあれば使えたりするので、パケットキャプチャなんかで便利です。
きちんと理解して使いこなしたいですね。
$ sudo nsenter -t 20517 -n ip -d addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 promiscuity 0 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000 link/ipip 0.0.0.0 brd 0.0.0.0 promiscuity 0 ipip any remote any local any ttl inherit nopmtudisc numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 4: eth0@if12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP group default link/ether 1e:f7:da:82:61:08 brd ff:ff:ff:ff:ff:ff link-netnsid 0 promiscuity 0 veth numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 inet 192.168.133.208/32 scope global eth0 valid_lft forever preferred_lft forever