私が現在勤めている会社でCentOS 8でPodmanを利用している環境があり、とある作業をするアプリケーションがコンテナーで動いているのですが、コンテナーが名前解決をできず、正常に動いていませんでした。
以前ブログでも書きましたが、以下の回避策で解決できるんじゃないかなと思いました。
また同じ事象がRHEL 8.1で起きていたのですが、RHEL 8.2にアップグレードしたらなんか解消したので、「CentOS 8-2004に更新すれば解決できるのでは」みたいな回答をしたと思います。
そこでアップグレードしようという話になりました。アップグレード後は新しいカーネルで起動するためにシステムの再起動を行いました。
# yum check-update (アップデートパッケージが何個あるか確認) # yum update -y (アップグレード) # reboot (再起動)
起動後、Podmanのコンテナーを起動します。
# podman start hogehuga
起動後、名前解決を試してみました。ん?OCI runtime error??
# podman exec -it hogehuga ping 8.8.8.8 PING 8.8.8.8 (8.8.8.8): 56 data bytes 64 bytes from 8.8.8.8: seq=0 ttl=112 time=2.181 ms 64 bytes from 8.8.8.8: seq=1 ttl=112 time=2.177 ms ^C --- 8.8.8.8 ping statistics --- 2 packets transmitted, 2 packets received, 0% packet loss round-trip min/avg/max = 2.177/2.179/2.181 ms # podman exec -it hogehuga ping tooyama.org ping: bad address 'tooyama.org' Error: non zero exit code: 1: OCI runtime error
アップグレードしたのに解消しない。なぜ? 症状で調べたところ、次のような情報を見つけました。
実行したのは次のコマンドです。
# sysctl -w net.ipv4.ip_forward=1 # firewall-cmd --zone=public --add-masquerade # firewall-cmd --permanent --zone=public --add-masquerade # firewall-cmd --reload
ちなみにこのままだとsysctlコマンドの設定変更は次の再起動の際に消えてしまうので、永続化が必要です。
UbuntuやRHEL7、CentOS7などでは /etc/sysctl.conf
を編集していたのですが、 8世代では一つのファイルに列挙するのではなく、設定ごとにconfファイルを作って記述する方が推奨されているようです。というわけで、 /usr/lib/sysctl.d/
ディレクトリー以下に、次のファイルを置いて設定を記述しました。
# cat 50-ip_forward.conf net.ipv4.ip_forward=1
設定としてはこれだけです。
結果、問題がなくなりました。
# podman exec -it hogehuga sh / # ping tooyama.org PING tooyama.org (150.95.9.135): 56 data bytes 64 bytes from 150.95.9.135: seq=0 ttl=51 time=9.217 ms ^C --- tooyama.org ping statistics --- 1 packets transmitted, 1 packets received, 0% packet loss round-trip min/avg/max = 9.217/9.217/9.217 ms / #
問題が解決したものの、RHEL 8.2相当と思われるCentOS 8-2004に更新しても引き続き問題が発生するのが、ちょっと気になりました。 差分を確認しようといくつかコマンドを実行したところ、Podmanのバージョンが違うことがわかりました。
それは挙動が違っても仕方ないわ。
OS | Podmanバージョン |
---|---|
RHEL 8.2 | 1.9.3 |
CentOS 8-2004 | 1.6.4 |
CentOS Stream 8 | 1.6.4 |
というわけでクローズ。