podmanのネットワーク設定で出くわしたエラーについて
昨夜 podman を使って pod 間通信の実験をしていたのですが、その時にいくつかつまづいたところがあったので、誰かの役に立てばと思って記事にまとめます。
まず、何をやろうとしていたかというと、
- podman network create でネットワークを作成
- podman create pod –network でネットワークに紐付けた pod を作成
- 作った 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 間通信の実験についてですが、これについてはまた後日記事にできればと思っております。
とりあえず、今回はこんなところで。