はじめに
本記事の想定読者です:
- Linux のネットワーク設定について ip link, ip addr, ip route, ip netns 等のコマンドを使うことは知っている
- Kubernetes は使うけれどネットワークまわりは苦手。CNI(Container Network Interface)がうまくやってくれることは知っているが、最終的に CNI が Linux ネットワークをどう設定するかよくわからない。特に1. のコマンドと Kubernetes の関連がわからない
上記の様な方向けに、理解の助けになりそうなコマンドをまとめました。最終的に2つの Pod 間通信を確認するので、同様にたどって頂ければきっとわかったような気になれます。
なお、一つ目の項目がピンとこない方はこちらの記事が参考になるかもしれません。
今回の環境はオンプレサーバ上の Ubuntu に Kubernetes をインストールし、Calico CNI を使って確認しました(構成図)。
背景知識の復習
コンテナランタイムとは
Kubernetes はコンテナプラットフォームであるにもかかわらず出しゃばりません。コンテナを動かすための仕組みは持っておらず「コンテナランタイム」がその役割を担います。どのランタイムを使うかは管理者が自由に選んでインストールできます。
コンテナランタイムと CNI の関係
どのコンテナランタイムを選んだとしても、ランタイムは Linux 自身のネットワーク機能に対して設定を行う必要があります。もしそのコマンドが数行で済むのであれば各種ランタイム内に実装するのがシンプルですが、実際には構成上の選択肢が複数あり分量もあることから、図のように CNI プラグインとして別途取り出されています。ランタイム同様、管理者が自由に選んでインストールできます。
今回 Linux のネットワーク設定を行う CNI プラグインは Calico です。
利用したコマンド
まずは今回利用した検証環境の Kubernetes ノード数と、CNI、アプリケーション(Pod)をコマンドで確認します。
Kubernetes ノードの台数と IP アドレスを知りたい場合
kubectl get nodes -o wide
$ kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
smm-cluster-vlan71-control-p-b67219b9fc Ready control-plane,master 5d8h v1.21.14 172.16.30.19 172.16.30.19 Ubuntu 20.04.4 LTS 5.4.0-113-generic containerd://1.6.13
smm-cluster-vlan71-worker-pr-30f48e8223 Ready <none> 5d8h v1.21.14 172.16.30.20 172.16.30.20 Ubuntu 20.04.4 LTS 5.4.0-113-generic containerd://1.6.6
smm-cluster-vlan71-worker-pr-a1f2650dc7 Ready <none> 5d8h v1.21.14 172.16.30.21 172.16.30.21 Ubuntu 20.04.4 LTS 5.4.0-113-generic containerd://1.6.6
smm-cluster-vlan71-worker-pr-a9c5bc874f Ready <none> 5d8h v1.21.14 172.16.30.22 172.16.30.22 Ubuntu 20.04.4 LTS 5.4.0-113-generic containerd://1.6.6
上記出力より
Kubernetes コントロールノード x 1
Kubernetes ワーカーノード x 3
であることがわかります。
ノード名 | ノード役割 | ノード IP |
---|---|---|
smm-cluster-vlan71-control-p-b67219b9fc | control | 172.16.30.19 |
smm-cluster-vlan71-worker-pr-30f48e8223 | worker | 172.16.30.20 |
smm-cluster-vlan71-worker-pr-a1f2650dc7 | worker | 172.16.30.21 |
smm-cluster-vlan71-worker-pr-a9c5bc874f | worker | 172.16.30.22 |
インストールされている CNI プラグインを知りたい場合
kubectl get pods -n kube-system -o wide | grep calico
$ kubectl get pods -n kube-system -o wide | grep calico
calico-kube-controllers-7f6f95d7c9-dtr6k 1/1 Running 0 5d21h 10.201.159.1 smm-cluster-vlan71-worker-pr-30f48e8223 <none> <none>
calico-node-4ljt9 1/1 Running 0 5d21h 172.16.30.19 smm-cluster-vlan71-control-p-b67219b9fc <none> <none>
calico-node-5lsqw 1/1 Running 0 5d21h 172.16.30.21 smm-cluster-vlan71-worker-pr-a1f2650dc7 <none> <none>
calico-node-9m82p 1/1 Running 0 5d21h 172.16.30.20 smm-cluster-vlan71-worker-pr-30f48e8223 <none> <none>
calico-node-pkvk5 1/1 Running 0 5d21h 172.16.30.22 smm-cluster-vlan71-worker-pr-a9c5bc874f <none> <none>
calico-node- で始まるのが CNI プラグイン。calico-node は DaemonSet なのでノードの数(=4)分存在します。なお、calico-kube-controllers は Deployment。
ノード名 | ノード役割 | ノード IP | CNI プラグイン |
---|---|---|---|
smm-cluster-vlan71-control-p-b67219b9fc | control | 172.16.30.19 | calico-node-4ljt9 |
smm-cluster-vlan71-worker-pr-30f48e8223 | worker | 172.16.30.20 | calico-node-9m82p |
smm-cluster-vlan71-worker-pr-a1f2650dc7 | worker | 172.16.30.21 | calico-node-5lsqw |
smm-cluster-vlan71-worker-pr-a9c5bc874f | worker | 172.16.30.22 | calico-node-pkvk5 |
Kubernetes クラスタ内に存在する Pod がどのノード上に存在するか知りたい場合
kubectl get pod -n (namespace) -o wide
$ kubectl get pod -n sock-shop -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
carts-b4d4ffb5c-bctkd 1/1 Running 0 2d2h 10.201.218.240 smm-cluster-vlan71-worker-pr-a9c5bc874f <none> <none>
carts-db-6c6c68b747-v59xs 1/1 Running 0 3d4h 10.201.117.232 smm-cluster-vlan71-worker-pr-a1f2650dc7 <none> <none>
catalogue-759cc6b86-7txsp 1/1 Running 0 3h42m 10.201.159.42 smm-cluster-vlan71-worker-pr-30f48e8223 <none> <none>
catalogue-db-96f6f6b4c-dd6rf 1/1 Running 0 2d8h 10.201.117.240 smm-cluster-vlan71-worker-pr-a1f2650dc7 <none> <none>
front-end-bfb8dd57b-9cvvd 1/1 Running 1 2d1h 10.201.218.245 smm-cluster-vlan71-worker-pr-a9c5bc874f <none> <none>
orders-7664c64d75-8gb6n 1/1 Running 0 3d 10.201.117.238 smm-cluster-vlan71-worker-pr-a1f2650dc7 <none> <none>
orders-db-659949975f-rdp8n 1/1 Running 0 3d4h 10.201.218.230 smm-cluster-vlan71-worker-pr-a9c5bc874f <none> <none>
payment-7bcdbf45c9-25ck8 1/1 Running 0 3d4h 10.201.117.234 smm-cluster-vlan71-worker-pr-a1f2650dc7 <none> <none>
queue-master-5f6d6d4796-2l84g 1/1 Running 0 3d4h 10.201.159.34 smm-cluster-vlan71-worker-pr-30f48e8223 <none> <none>
rabbitmq-5bcbb547d7-8v8p7 2/2 Running 0 3d4h 10.201.218.231 smm-cluster-vlan71-worker-pr-a9c5bc874f <none> <none>
session-db-798976d799-xplw6 1/1 Running 0 2d 10.201.117.243 smm-cluster-vlan71-worker-pr-a1f2650dc7 <none> <none>
shipping-7f7999ffb7-5j2wk 1/1 Running 0 3d4h 10.201.159.35 smm-cluster-vlan71-worker-pr-30f48e8223 <none> <none>
user-68df64db9c-rl48g 1/1 Running 0 3d4h 10.201.159.36 smm-cluster-vlan71-worker-pr-30f48e8223 <none> <none>
user-db-6df7444fc-wvccc 1/1 Running 0 3d4h 10.201.218.232 smm-cluster-vlan71-worker-pr-a9c5bc874f <none> <none>
user-load-59b58b868f-xrsgp 1/1 Running 1 2d2h 10.201.159.41 smm-cluster-vlan71-worker-pr-30f48e8223 <none> <none>
この環境には複数の Kubernetes namespace が存在するのですが、今回は namespace=sock-shop に着目します。その中でも2つの Pod
- front-end-bfb8dd57b-9cvvd
- catalogue-759cc6b86-7txsp
が互いにどうつながっているかを以下で順に見ていきます。
出力より Pod がどのノードに存在するかわかります:
ノード名 | ノード役割 | ノード IP | CNI プラグイン | Pod 名 | Pod IP |
---|---|---|---|---|---|
smm-cluster-vlan71-control-p-b67219b9fc | control | 172.16.30.19 | calico-node-4ljt9 | ||
smm-cluster-vlan71-worker-pr-30f48e8223 | worker | 172.16.30.20 | calico-node-9m82p | catalogue-759cc6b86-7txsp | 10.201.159.42 |
smm-cluster-vlan71-worker-pr-a1f2650dc7 | worker | 172.16.30.21 | calico-node-5lsqw | ||
smm-cluster-vlan71-worker-pr-a9c5bc874f | worker | 172.16.30.22 | calico-node-pkvk5 | front-end-bfb8dd57b-9cvvd | 10.201.218.245 |
Kubernetes クラスタ内に存在する Pod の仮想 NIC 設定を見たい場合
kubectl exec (Pod名) -n (namespace名) -- ip link
kubectl exec (Pod名) -n (namespace名) -- ip addr
$ kubectl exec front-end-bfb8dd57b-9cvvd -n sock-shop -- ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
4: eth0@if58: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1440 qdisc noqueue state UP
link/ether 6a:fb:66:55:31:66 brd ff:ff:ff:ff:ff:ff
$ kubectl exec front-end-bfb8dd57b-9cvvd -n sock-shop -- ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
4: eth0@if58: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1440 qdisc noqueue state UP
link/ether 6a:fb:66:55:31:66 brd ff:ff:ff:ff:ff:ff
inet 10.201.218.245/32 brd 10.201.218.245 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::68fb:66ff:fe55:3166/64 scope link
valid_lft forever preferred_lft forever
$ kubectl exec catalogue-759cc6b86-7txsp -n sock-shop -- ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
4: eth0@if47: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1440 qdisc noqueue state UP
link/ether 82:01:d4:3d:46:1b brd ff:ff:ff:ff:ff:ff
$ kubectl exec catalogue-759cc6b86-7txsp -n sock-shop -- ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
4: eth0@if47: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1440 qdisc noqueue state UP
link/ether 82:01:d4:3d:46:1b brd ff:ff:ff:ff:ff:ff
inet 10.201.159.42/32 brd 10.201.159.42 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::8001:d4ff:fe3d:461b/64 scope link
valid_lft forever preferred_lft forever
上記より、front-end-bfb8dd57b-9cvvd は仮想インターフェイスとして eth0@if58 を、catalogue-759cc6b86-7txsp は eth0@if47 を使っていることがわかります。
表だけではわかりづらくなってきたので構成図を示します:
ノード名 | ノード役割 | ノード IP | CNI プラグイン | Pod 名 | Pod IP | 仮想NIC 名 |
---|---|---|---|---|---|---|
smm-cluster-vlan71-control-p-b67219b9fc | control | 172.16.30.19 | calico-node-4ljt9 | |||
smm-cluster-vlan71-worker-pr-30f48e8223 | worker | 172.16.30.20 | calico-node-9m82p | catalogue-759cc6b86-7txsp | 10.201.159.42 | eth0@if47 |
smm-cluster-vlan71-worker-pr-a1f2650dc7 | worker | 172.16.30.21 | calico-node-5lsqw | |||
smm-cluster-vlan71-worker-pr-a9c5bc874f | worker | 172.16.30.22 | calico-node-pkvk5 | front-end-bfb8dd57b-9cvvd | 10.201.218.245 | eth0@if58 |
各ノード(Linux)に存在するネットワーク名前空間を確認したい場合
ip netns list
$ ip netns list # ノード1台目(172.16.30.19)
cni-b7126e4b-07da-9588-f1ab-7ee867ad8eb3 (id: 9)
cni-736e638f-4756-fcda-296b-e37cd51b82de (id: 8)
cni-895ebed2-f047-d246-b036-3da24349f94d (id: 6)
cni-636d9085-9f01-b95e-f8a1-2f6b46cc75e1 (id: 7)
cni-2bde22dc-c73d-c956-127c-f46f78e4a20e (id: 2)
cni-fa585526-b04c-2cae-8069-e40b72096c56 (id: 5)
cni-c5d507ed-d8b2-8577-84a1-dd7e775a78c5 (id: 4)
cni-bb19dc80-c17a-c628-0214-18d1648d0a19 (id: 3)
cni-58569b83-2137-bc53-5fba-555b2567fe23 (id: 1)
cni-a1d4ea6d-c30f-e29e-b093-25f261b6e19c (id: 0)
$ ip netns list # ノード2台目(172.16.30.20)
cni-657fc591-9264-089d-bd18-1b92e7ac24f5 (id: 6)
cni-1abaf3d8-5ddc-a65b-a555-c40a51e3c471 (id: 7)
cni-2e16ac48-25cd-705e-99ad-90a1a2e20d77 (id: 11)
cni-9d92aedc-16bf-3023-eff9-dc0493847877 (id: 10)
cni-38b06ac8-71fe-9461-e7d7-2fb86a37941b (id: 9)
cni-785ee754-6a99-dab3-5098-1e81b7af7dd3 (id: 8)
cni-762721e8-25fc-da78-2e8b-800d5f9e7587 (id: 5)
cni-61c6f26e-b17e-a5d9-f8e4-e7492926e32b (id: 4)
cni-8b698ab2-4c2d-ef3b-16d0-3bb90037c958 (id: 3)
cni-0f29e5e5-72a8-5a30-a2c7-a701196377ce (id: 2)
cni-53a556c1-4acf-a283-eef0-e4e25dab5cd3 (id: 1)
cni-a81d977a-562e-73c8-5f52-ebfba88781fa (id: 0)
$ ip netns list # ノード3台目(172.16.30.21)
cni-9644408b-762c-530c-d33b-d23e5c22ad13 (id: 11)
cni-39291a48-267d-d520-730a-433bc61c3be8 (id: 7)
cni-f1abaa73-25c1-feea-f9a0-ba04436173e8 (id: 10)
cni-8539b279-ad7a-5ab8-bcb1-37be1ccba91e (id: 9)
cni-c2d14ca4-6a8f-cb54-724d-aff088f1f670 (id: 6)
cni-415652a8-5ebe-48e4-8b05-f5be35399bb8 (id: 4)
cni-5066b426-b01a-f473-6493-3fc8b0625b28 (id: 8)
cni-72199866-c6f8-e4b7-a412-dca0a0726456 (id: 2)
cni-b5cc7320-b99d-4e08-1bf3-f7da631b8611 (id: 3)
cni-9f956e49-6b46-4616-5f4f-6e811f0a2279 (id: 1)
cni-40cc3af4-16fa-e25f-5d11-92234b56258d (id: 0)
$ ip netns list # ノード4台目(172.16.30.22)
cni-2c7b5137-57c5-9d23-4fa9-6094f85baa62 (id: 10)
cni-4f06a22e-f0a5-e189-8505-dfd2ed7c048c (id: 4)
cni-cec32e52-7306-1a2b-bd57-428718d2e7b2 (id: 9)
cni-caf5fd89-8c07-3c72-229b-1f8aac6ec3bb (id: 8)
cni-dad94b22-f619-c59f-3f88-3ca2534dafc4 (id: 7)
cni-f878435e-b213-446b-735b-80983ef16085 (id: 6)
cni-bb23c97f-4c91-1124-d5fb-2a75e053500e (id: 2)
cni-30e152e3-3b47-e4ee-e82c-7adaff51d10a (id: 3)
cni-9d417753-6cab-dabb-27c4-cb3981bc6d76 (id: 1)
cni-a8141bb8-5dec-2737-9bdf-432ee7ef0ec3 (id: 0)
4台存在するノードそれぞれでコマンドを実行しています。Linux としてはローカルにネットワーク名前空間(netns) を認識しているだけなので、例え id が同じでも異なるノードのネットワーク名前空間は別物です。
各ノード(Linux)のネットワークインターフェイスを確認したい場合
ip link
$ ip link # ノード1台目(172.16.30.19)
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether 00:50:56:ad:73:5f brd ff:ff:ff:ff:ff:ff
3: tunl0@NONE: <NOARP,UP,LOWER_UP> mtu 1440 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
6: cali6dbaa0b6eb8@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-a1d4ea6d-c30f-e29e-b093-25f261b6e19c
7: calia4c07d2f21d@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-58569b83-2137-bc53-5fba-555b2567fe23
9: cali7e0d5690946@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-bb19dc80-c17a-c628-0214-18d1648d0a19
12: cali076c032ebf9@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-c5d507ed-d8b2-8577-84a1-dd7e775a78c5
13: calibe439ad9911@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-fa585526-b04c-2cae-8069-e40b72096c56
14: cali37b196c10e9@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-2bde22dc-c73d-c956-127c-f46f78e4a20e
15: cali21557d4a37b@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-895ebed2-f047-d246-b036-3da24349f94d
16: cali4900a23f762@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-636d9085-9f01-b95e-f8a1-2f6b46cc75e1
17: cali370f4329889@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-736e638f-4756-fcda-296b-e37cd51b82de
19: calic583c4042b9@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-b7126e4b-07da-9588-f1ab-7ee867ad8eb3
20: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default
link/ether 02:42:c1:42:0c:19 brd ff:ff:ff:ff:ff:ff
$ ip link # ノード2台目(172.16.30.20)
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether 00:50:56:ad:46:78 brd ff:ff:ff:ff:ff:ff
3: tunl0@NONE: <NOARP,UP,LOWER_UP> mtu 1440 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
6: cali57e9f47b88e@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-a81d977a-562e-73c8-5f52-ebfba88781fa
7: cali4a61435109e@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-53a556c1-4acf-a283-eef0-e4e25dab5cd3
8: caliabcb62efb03@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-0f29e5e5-72a8-5a30-a2c7-a701196377ce
9: calia90e7ec2f30@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-8b698ab2-4c2d-ef3b-16d0-3bb90037c958
10: cali709e68f89a9@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-61c6f26e-b17e-a5d9-f8e4-e7492926e32b
11: calie97a80d5363@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-762721e8-25fc-da78-2e8b-800d5f9e7587
39: caliac6f3bca913@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-785ee754-6a99-dab3-5098-1e81b7af7dd3
40: calif20a1e7e87b@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-38b06ac8-71fe-9461-e7d7-2fb86a37941b
41: calicffe2b56320@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-9d92aedc-16bf-3023-eff9-dc0493847877
42: cali571e21ae838@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-2e16ac48-25cd-705e-99ad-90a1a2e20d77
46: cali86eef9672d0@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-1abaf3d8-5ddc-a65b-a555-c40a51e3c471
47: caliee67f0787ef@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-657fc591-9264-089d-bd18-1b92e7ac24f5
$ ip link # ノード3台目(172.16.30.21)
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether 00:50:56:ad:c2:2b brd ff:ff:ff:ff:ff:ff
3: tunl0@NONE: <NOARP,UP,LOWER_UP> mtu 1440 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
6: cali0ff8169d5b8@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-40cc3af4-16fa-e25f-5d11-92234b56258d
7: cali3b1cde005d0@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-9f956e49-6b46-4616-5f4f-6e811f0a2279
8: cali4e778b7eb57@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-72199866-c6f8-e4b7-a412-dca0a0726456
9: calic54a5bbc4cd@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-b5cc7320-b99d-4e08-1bf3-f7da631b8611
33: cali85701cf7472@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-5066b426-b01a-f473-6493-3fc8b0625b28
45: cali9c1a9145193@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-415652a8-5ebe-48e4-8b05-f5be35399bb8
47: cali04036866d60@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-c2d14ca4-6a8f-cb54-724d-aff088f1f670
49: cali9015f6da995@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-8539b279-ad7a-5ab8-bcb1-37be1ccba91e
51: calic63d3be9b0c@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-f1abaa73-25c1-feea-f9a0-ba04436173e8
53: cali16b637c22f3@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-39291a48-267d-d520-730a-433bc61c3be8
56: calie7064a7470b@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-9644408b-762c-530c-d33b-d23e5c22ad13
$ ip link # ノード4台目(172.16.30.22)
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether 00:50:56:ad:8a:5d brd ff:ff:ff:ff:ff:ff
3: tunl0@NONE: <NOARP,UP,LOWER_UP> mtu 1440 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
7: calidc1704b74d9@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-a8141bb8-5dec-2737-9bdf-432ee7ef0ec3
8: calif7016bda7ed@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-9d417753-6cab-dabb-27c4-cb3981bc6d76
10: cali8290ed6e542@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-30e152e3-3b47-e4ee-e82c-7adaff51d10a
11: calic5b910a5410@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-bb23c97f-4c91-1124-d5fb-2a75e053500e
43: calia894cb6bec1@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-f878435e-b213-446b-735b-80983ef16085
44: calib226f7a2af8@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-dad94b22-f619-c59f-3f88-3ca2534dafc4
45: cali38cca553800@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-caf5fd89-8c07-3c72-229b-1f8aac6ec3bb
46: cali63d772f6ef1@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-cec32e52-7306-1a2b-bd57-428718d2e7b2
53: cali25d2776e403@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-4f06a22e-f0a5-e189-8505-dfd2ed7c048c
58: cali8aaa1d0088c@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-2c7b5137-57c5-9d23-4fa9-6094f85baa62
Pod名 front-end-bfb8dd57b-9cvvd は4台目のノードに存在していることが分かっているので、4台目の if58 を読み取ります。ネットワーク名前空間が cni-2c7b5137-57c5-9d23-4fa9-6094f85baa62 であり、Calico の仮想 NIC が cali8aaa1d0088c@if4 であることがわかります。以下に該当部分を抜き出します:
58: cali8aaa1d0088c@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-2c7b5137-57c5-9d23-4fa9-6094f85baa62
Pod 名 catalogue-759cc6b86-7txsp は2台目のノードに存在していることが分かっているので、2台目の if47 を読み取ります。ネットワーク名前空間が cni-657fc591-9264-089d-bd18-1b92e7ac24f5 であり、Calico の仮想 NIC が caliee67f0787ef@if4 であることがわかります。以下に該当部分を抜き出します:
47: caliee67f0787ef@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-657fc591-9264-089d-bd18-1b92e7ac24f5
ノード名 | ノード役割 | ノード IP | CNI プラグイン | Pod 名 | Pod IP | 仮想NIC 名 | netns | Calico NIC 名 |
---|---|---|---|---|---|---|---|---|
smm-cluster-vlan71-control-p-b67219b9fc | control | 172.16.30.19 | calico-node-4ljt9 | |||||
smm-cluster-vlan71-worker-pr-30f48e8223 | worker | 172.16.30.20 | calico-node-9m82p | catalogue-759cc6b86-7txsp | 10.201.159.42 | eth0@if47 | cni-657fc591-9264-089d-bd18-1b92e7ac24f5 | caliee67f0787ef@if4 |
smm-cluster-vlan71-worker-pr-a1f2650dc7 | worker | 172.16.30.21 | calico-node-5lsqw | |||||
smm-cluster-vlan71-worker-pr-a9c5bc874f | worker | 172.16.30.22 | calico-node-pkvk5 | front-end-bfb8dd57b-9cvvd | 10.201.218.245 | eth0@if58 | cni-2c7b5137-57c5-9d23-4fa9-6094f85baa62 | cali8aaa1d0088c@if4 |
CNI(Calico)の BGP ルーティングテーブルを調べる
kubectl exec -it (CNIプラグイン名) -n kube-system -- /bin/bash を実施後、
ip route (参考)
birdcl
show route
exit
Calico の中の Felix というコンポーネントは、Pod が正しく通信できる様インターフェイス・ルーティングテーブル・ACL の情報を Linux カーネルにプログラミングします。
ノードをまたぐ通信を行うために Calico は BGP でルート情報を交換するのですが、その役割を担うのが同じく Calico のコンポーネントである BIRD です。Felix から受け取ったルート情報を BPG ピアへ配信します。
以下、
frontend の CNI が calico-node-pkvk5、
catalogue の CNI が calico-node-9m82p
であることに着目して BGP ルートテーブルを確認します。まずは frontend から:
$ kubectl exec -it calico-node-pkvk5 -n kube-system -- bash
Defaulted container "calico-node" out of: calico-node, upgrade-ipam (init), install-cni (init), flexvol-driver (init)
[root@smm-cluster-vlan71-worker-pr-a9c5bc874f /]# ip route
default via 172.16.30.30 dev ens192 proto static
10.201.63.192/26 via 172.16.30.19 dev tunl0 proto bird onlink
10.201.117.192/26 via 172.16.30.21 dev tunl0 proto bird onlink
10.201.159.0/26 via 172.16.30.20 dev tunl0 proto bird onlink
blackhole 10.201.218.192/26 proto bird
10.201.218.194 dev calidc1704b74d9 scope link
10.201.218.195 dev calif7016bda7ed scope link
10.201.218.197 dev cali8290ed6e542 scope link
10.201.218.198 dev calic5b910a5410 scope link
10.201.218.230 dev calia894cb6bec1 scope link
10.201.218.231 dev calib226f7a2af8 scope link
10.201.218.232 dev cali38cca553800 scope link
10.201.218.233 dev cali63d772f6ef1 scope link
10.201.218.240 dev cali25d2776e403 scope link
10.201.218.245 dev cali8aaa1d0088c scope link
172.16.30.16/28 dev ens192 proto kernel scope link src 172.16.30.22
[root@smm-cluster-vlan71-worker-pr-a9c5bc874f /]# birdcl
BIRD v0.3.3+birdv1.6.8 ready.
bird> show route
0.0.0.0/0 via 172.16.30.30 on ens192 [kernel1 2022-12-13] * (10)
10.201.63.192/26 via 172.16.30.19 on ens192 [Mesh_172_16_30_19 2022-12-13] * (100/0) [i]
10.201.218.245/32 dev cali8aaa1d0088c [kernel1 2022-12-16] * (10)
10.201.218.240/32 dev cali25d2776e403 [kernel1 2022-12-16] * (10)
10.201.218.233/32 dev cali63d772f6ef1 [kernel1 2022-12-15] * (10)
10.201.218.232/32 dev cali38cca553800 [kernel1 2022-12-15] * (10)
10.201.117.192/26 via 172.16.30.21 on ens192 [Mesh_172_16_30_21 2022-12-13] * (100/0) [i]
10.201.218.231/32 dev calib226f7a2af8 [kernel1 2022-12-15] * (10)
10.201.218.230/32 dev calia894cb6bec1 [kernel1 2022-12-15] * (10)
10.201.159.0/26 via 172.16.30.20 on ens192 [Mesh_172_16_30_20 2022-12-13] * (100/0) [i]
172.16.30.16/28 dev ens192 [direct1 2022-12-13] * (240)
10.201.218.197/32 dev cali8290ed6e542 [kernel1 2022-12-13] * (10)
10.201.218.198/32 dev calic5b910a5410 [kernel1 2022-12-13] * (10)
10.201.218.192/26 blackhole [static1 2022-12-13] * (200)
10.201.218.192/32 dev tunl0 [direct1 2022-12-13] * (240)
10.201.218.195/32 dev calif7016bda7ed [kernel1 2022-12-13] * (10)
10.201.218.194/32 dev calidc1704b74d9 [kernel1 2022-12-13] * (10)
front-end-bfb8dd57b-9cvvd (10.201.218.245)→ catalogue-759cc6b86-7txsp(10.201.159.42)
方向について、10.201.159.42 のネクストホップは 172.16.30.20 on ens192 であることがわかります。これは2台目ノードの物理インターフェイスですので期待通りの結果です。
次に catalogue の BGP ルートテーブルを確認します:
$ kubectl exec -it calico-node-9m82p -n kube-system -- bash
Defaulted container "calico-node" out of: calico-node, upgrade-ipam (init), install-cni (init), flexvol-driver (init)
# ip route
default via 172.16.30.30 dev ens192 proto static
blackhole 10.201.63.192/26 proto bird
10.201.63.193 dev cali6dbaa0b6eb8 scope link
10.201.63.194 dev calia4c07d2f21d scope link
10.201.63.196 dev cali7e0d5690946 scope link
10.201.63.199 dev cali076c032ebf9 scope link
10.201.63.200 dev calibe439ad9911 scope link
10.201.63.201 dev cali37b196c10e9 scope link
10.201.63.202 dev cali21557d4a37b scope link
10.201.63.203 dev cali4900a23f762 scope link
10.201.63.204 dev cali370f4329889 scope link
10.201.63.206 dev calic583c4042b9 scope link
10.201.117.192/26 via 172.16.30.21 dev tunl0 proto bird onlink
10.201.159.0/26 via 172.16.30.20 dev tunl0 proto bird onlink
10.201.218.192/26 via 172.16.30.22 dev tunl0 proto bird onlink
172.16.30.16/28 dev ens192 proto kernel scope link src 172.16.30.19
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
# birdcl
BIRD v0.3.3+birdv1.6.8 ready.
bird> show route
0.0.0.0/0 via 172.16.30.30 on ens192 [kernel1 2022-12-13] * (10)
10.201.63.196/32 dev cali7e0d5690946 [kernel1 2022-12-13] * (10)
10.201.63.199/32 dev cali076c032ebf9 [kernel1 2022-12-13] * (10)
10.201.63.192/26 blackhole [static1 2022-12-13] * (200)
10.201.63.192/32 dev tunl0 [direct1 2022-12-13] * (240)
10.201.63.193/32 dev cali6dbaa0b6eb8 [kernel1 2022-12-13] * (10)
10.201.63.194/32 dev calia4c07d2f21d [kernel1 2022-12-13] * (10)
10.201.63.204/32 dev cali370f4329889 [kernel1 2022-12-13] * (10)
10.201.63.206/32 dev calic583c4042b9 [kernel1 2022-12-15] * (10)
10.201.63.200/32 dev calibe439ad9911 [kernel1 2022-12-13] * (10)
10.201.63.201/32 dev cali37b196c10e9 [kernel1 2022-12-13] * (10)
10.201.63.202/32 dev cali21557d4a37b [kernel1 2022-12-13] * (10)
10.201.63.203/32 dev cali4900a23f762 [kernel1 2022-12-13] * (10)
10.201.117.192/26 via 172.16.30.21 on ens192 [Mesh_172_16_30_21 2022-12-13] * (100/0) [i]
10.201.159.0/26 via 172.16.30.20 on ens192 [Mesh_172_16_30_20 2022-12-13] * (100/0) [i]
172.16.30.16/28 dev ens192 [direct1 2022-12-13] * (240)
172.16.30.18/32 dev ens192 [direct1 2022-12-13] * (240)
172.17.0.0/16 dev docker0 [direct1 2022-12-16] * (240)
10.201.218.192/26 via 172.16.30.22 on ens192 [Mesh_172_16_30_22 2022-12-13] * (100/0) [i]
catalogue-759cc6b86-7txsp(10.201.159.42)→ front-end-bfb8dd57b-9cvvd (10.201.218.245)
方向について、10.201.218.245 のネクストホップは 172.16.30.22 on ens192 であることがわかります。これは4台目ノードの物理インターフェイスですのでこちらも期待通りの結果です。
ネットワーク名前空間内から ping で疎通確認を行いたい場合
最後に front-end-bfb8dd57b-9cvvd の存在するノード4号機から catalogue-759cc6b86-7txsp(10.201.159.42)宛に ping で疎通確認をしてみます。
$ sudo ip netns exec cni-2c7b5137-57c5-9d23-4fa9-6094f85baa62 ping 10.201.159.42
PING 10.201.159.42 (10.201.159.42) 56(84) bytes of data.
64 bytes from 10.201.159.42: icmp_seq=1 ttl=62 time=0.125 ms
64 bytes from 10.201.159.42: icmp_seq=2 ttl=62 time=0.204 ms
64 bytes from 10.201.159.42: icmp_seq=3 ttl=62 time=0.100 ms
64 bytes from 10.201.159.42: icmp_seq=4 ttl=62 time=0.113 ms
確かに通信できることを確認しました。
構成図
構成図の最終形はこちらです:
利用した環境
オンプレミス Kubernetes
CNI: Calico
Ubuntu: 20.04.4 LTS
Kubernetes: v1.21.14