kun432's blog

Alexaなどスマートスピーカーの話題中心に、Voiceflowの日本語情報を発信してます。たまにAWSやkubernetesなど。

〜スマートスピーカーやVoiceflowの記事は右メニューのカテゴリからどうぞ。〜

podからcalicoのインタフェースを確認する

メモです。

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

参考