概要
Self-HostedなGitHub Actionsでコンテナ実行する際、毎回コンテナネットワークが作成される。
仮に、その環境がMTUを調整しなければいけないNW環境である場合、コンテナ内部から大きなパケット通信が不可能になる。
何故か?現状のSelf-Hosted GitHub Actionsにおいては、デフォのMTU:1500でコンテナネットワークが作成されてしまうから。
もちろんコンテナNWが作成後に手動でMTU変更させれば良いが面倒くさい。コンテナNWも毎回名前が異なるし。
ということで、一応自動的に適用させる方法があるので、そのメモ的な記事。
ただもっと良い方法がある気もするので、ご存知の方は是非教えてください!
前提
- 仮想環境やNW環境によりMTU1500ではIPフラグメントが発生する環境
- つまりMTUを1400などに下げなければ、大きなパケットが発生する通信が不可能になってしまう
- Self-Hosted GitHub Actionsであること
- コンテナ実行アクションであること
注意
MTUを変更するときは、daemon.jsonに設定を書く方法がよく使われるが、あれが適用されるのはデフォルトのコンテナNWのみ。
つまり、今回のケースにおいてはこの方法は使えない。
{
mtu: 1400
}
方法1: ジョブの中でMTU変更
一番手軽。ただし、毎回指定しなければならないので、個人的には面倒くさいと思う。
自分1人で使っているならまだしも、チームとかで使っている環境だと、毎回これ指定してね、と徹底する必要がある。
- optionsで
--cap-add NET_ADMIN
を付与 - runで
ip link set eth0 mtu [mtu_num]
を付与
jobs:
conversion:
runs-on: example-runner
container:
image: hogehoge:latest
options: --cap-add NET_ADMIN
steps:
- run: ip link set eth0 mtu 1400
方法2: コンテナNW作成時にudevで自動的にMTUを変更
個人的にはこちらのほうがオススメ。自分自身、この方法を使っている。
/etc/udev/rules.d配下にudevルールファイルを置いて、コンテナNW作成時に自動的にMTUを変更してもらう。
KERNELにはコンテナNWの識別するための文字列を指定。
コンテナNWの場合、veth
というプリフィックスがつく。そこにさらに*
つけてどんなコンテナNWであっても判定されるようにしておく。
$name
にNICの名前が代入されている。そのNIC名を使ってコマンド叩いてMTUを変更させる。
ACTION=="add", SUBSYSTEM=="net", KERNEL=="veth*" , RUN+="/sbin/ifconfig $name mtu 1400"
あとがき
この問題はアップストリーム側でも報告され、議論がされているよう。
daemon.jsonで指定したMTUが自動的に適用されるようになると、一番良いとは思う。