LoginSignup
1
0

More than 3 years have passed since last update.

MTUを変えなければ通信できない環境下におけるSelf-Hosted GitHub Actionsのコンテナ実行

Posted at

概要

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のみ。
つまり、今回のケースにおいてはこの方法は使えない。

daemon.json
{
    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を変更させる。

/etc/udev/rules.d/75-mtu-force-change.rules
ACTION=="add", SUBSYSTEM=="net", KERNEL=="veth*" , RUN+="/sbin/ifconfig $name mtu 1400"

あとがき

この問題はアップストリーム側でも報告され、議論がされているよう。
daemon.jsonで指定したMTUが自動的に適用されるようになると、一番良いとは思う。

1
0
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
1
0