podmanのネットワーク設定で出くわしたエラーについて

昨夜 podman を使って pod 間通信の実験をしていたのですが、その時にいくつかつまづいたところがあったので、誰かの役に立てばと思って記事にまとめます。

まず、何をやろうとしていたかというと、

  1. podman network create でネットワークを作成
  2. podman create pod –network でネットワークに紐付けた pod を作成
  3. 作った pod の中にコンテナをデプロイ

これを pod ふたつ分作って、片方の pod のコンテナからもう片方の pod のコンテナと通信をする、というものです。
具体的な手順は以下のとおり。今回はコンテナで作ったメールサーバの動作試験をしたかったので、デプロイするコンテナは どちらも postfix です。

$ sudo buildah bud -t postfix:test

$ sudo podman network create --subnet 192.168.100.0/24 --gateway 192.168.100.1 network_1
$ sudo podman network create --subnet 192.168.200.0/24 --gateway 192.168.200.1 network_2

$ sudo podman pod create -p 25:25 --network=network_1 --name=pod1
$ sudo podman pod create --network=network_2 --name=pod2

$ sudo podman run -d --name postfix_1 --pod=pod1 postfix:test
$ sudo podman run -d --name postfix_2 --pod=pod2 postfix:test

これで、pod2 から 192.168.100.1:25 に向けてメールを送ることができれば成功、という目論見でした。

が、コンテナを run するところでエラーが発生。

ERRO[0000] Error adding network: unable to locate dnsmasq in path
ERRO[0000] Error while adding pod to CNI network "network_1": unable to locate dnsmasq in path
Error: error configuring network namespace for container ceb07f5850a0f9bacd346ee6a1831553152af7445c8b7fd64b5258bb8c2800fb: unable to locate dnsmasq in path

ぐぬぬぬぬ。
いったい何が起きているというのか?
こちらの記事では同じことをしていてすんなり動いているのに?

というわけで、「podman dnsmasq」でいろいろ調べてみたところ、こんな issue が見つかりました。

https://github.com/coreos/fedora-coreos-tracker/issues/519

ざっくり要約すると、Fedora の CoreOS から dnsmasq が削除されたので、今回の私の件と同じエラーが出るようになった、ということです。
podman のネットワークで DNS を動かすための DNSNAME というプラグインがあって、これが dnsmasq を必要としているために、dnsmasq がないと件のようなエラーが出る、というわけ。
私が今回実験に使った環境は CentOS8 の「最小限のインストール」だったので、dnsmasq は入っていませんでした。
というわけで、dnsmasq をインストールします。

$ sudo dnf install dnsmasq

で、ネットワークを作り直して、pod も作り直して、コンテナを run させてみたところ・・・・・・ノーエラーで起動できました。やれやれ。
ちなみに、もし dnsmasq をインストールしたくない、もしくは諸事情でできないという場合は、ネットワーク作成時に「–disable-dns」オプションをつけるとこのエラーを回避できます。
たとえば、こんな感じで。

$ sudo podman network create --subnet 192.168.100.0/24 --gateway 192.168.100.1 --disable-dns network_1

podman はまだ歴史が浅いせいか、調べようとしても情報が少なくて、ちょっと難渋します。まだまだ発展途上な技術ですね。

以下、余録。

今回の問題を調べている時に何度かネットワークを削除したり作り直したりしていたのですが、こんなエラーに出くわすことがありました。

$ sudo podman network rm network_1
network_1
$ sudo podman network create --subnet 192.168.100.0/24 --gateway 192.168.100.1 network_1
$ sudo podman run -d --network network_1 --ip 192.168.100.10 --name postfix_1 postfix:test
ERRO[0000] Error adding network: failed to allocate for range 0: requested IP address 192.168.100.10 is not available in range set 192.168.100.1-192.168.100.254
ERRO[0000] Error while adding pod to CNI network "network_1": failed to allocate for range 0: requested IP address 192.168.100.10 is not available in range set 192.168.100.1-192.168.100.254
Error: error configuring network namespace for container b0e4acc278c6b1f75d476fa30d4b50e194272b839a1f6550034bb7f59f7e3ddc: failed to allocate for range 0: requested IP address 192.168.100.10 is not available in range set 192.168.100.1-192.168.100.254

192.168.100.10 が 192.168.100.0/24 のレンジに入っていない・・・・・・?
そんなバカな。おかしいのは podman の方か、私の頭か?

というわけで、これも原因を調べてみました。
手がかりは、kube-router の issue にありました。

https://github.com/cloudnativelabs/kube-router/issues/383

$ sudo podman network rm network_1
network_1
$ sudo su
# cd /var/lib/cni/networks/
# ls
network_1  podman
# ls network_1/
192.168.100.10  last_reserved_ip.0  lock

おや、削除したはずの network_1 の情報がまだ残っている?
というわけで、これを削除します。

# rm -rf network_1

で、もう一度ネットワークを作成→コンテナを run させると、ちゃんと動きました。
これ、podman のバグなのか、それとも私のネットワークの削除方法が間違っていたのか、ちょっとよくわかりませんが。
(件の issue では「CNI 自体のバグなんでないの?」という言及があります)
まあ、とりあえずネットワーク関係をリセットしたい時の workaround としては使えそうです。ご参考までに。

ところで、本来の目的であった pod 間通信の実験についてですが、これについてはまた後日記事にできればと思っております。
とりあえず、今回はこんなところで。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

This site uses Akismet to reduce spam. Learn how your comment data is processed.