LoginSignup
26
14

More than 1 year has passed since last update.

「Kubernetes → CNI → Linux ネットワーク」のつながりを実感するためのコマンド例

Posted at

はじめに

本記事の想定読者です:

  1. Linux のネットワーク設定について ip link, ip addr, ip route, ip netns 等のコマンドを使うことは知っている
  2. Kubernetes は使うけれどネットワークまわりは苦手。CNI(Container Network Interface)がうまくやってくれることは知っているが、最終的に CNI が Linux ネットワークをどう設定するかよくわからない。特に1. のコマンドと Kubernetes の関連がわからない

上記の様な方向けに、理解の助けになりそうなコマンドをまとめました。最終的に2つの Pod 間通信を確認するので、同様にたどって頂ければきっとわかったような気になれます。

なお、一つ目の項目がピンとこない方はこちらの記事が参考になるかもしれません。

今回の環境はオンプレサーバ上の Ubuntu に Kubernetes をインストールし、Calico CNI を使って確認しました(構成図)。

背景知識の復習

コンテナランタイムとは

Kubernetes はコンテナプラットフォームであるにもかかわらず出しゃばりません。コンテナを動かすための仕組みは持っておらず「コンテナランタイム」がその役割を担います。どのランタイムを使うかは管理者が自由に選んでインストールできます。

image.png

コンテナランタイムと 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 を使っていることがわかります。

表だけではわかりづらくなってきたので構成図を示します:

image.png

ノード名 ノード役割 ノード 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

確かに通信できることを確認しました。

構成図

構成図の最終形はこちらです:

image.png

利用した環境

オンプレミス Kubernetes
CNI: Calico
Ubuntu: 20.04.4 LTS
Kubernetes: v1.21.14

26
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
14