SSHで接続できるようになるまで約3分かかる
一時ディスクなしのマシンサイズでRHEL VMを作ってみたところ、VM起動後3分程度経たないとSSHで接続できないという事象に遭遇しました。
事象が発生したのはRHEL7.6です。
そもそも一時ディスクあり・なしとは
Azureの仮想マシンサイズには世代があり、v3まではスワップファイルを配置するための一時ディスクが標準でついていました。一方でv4以降は一時ディスクありタイプと一時ディスクなしタイプに分かれています。一時ディスクの目的もスワップファイルを配置するためではなく、データベースの一時領域等消えてもいいけどパフォーマンスが必要な用途に変わっています。実際、ディスクサイズはスワップファイルを置くだけだと大きすぎるサイズ感になっています。また、一時ディスクありを選択すると課金額が増えます。スワップファイルのためだけに一時ディスクありを選ぶのはコストの観点からよくありません。
現在v5まで出ていて、最新世代のマシンサイズを選択した方がコストパフォーマンスはよいので、今回一時ディスクなしタイプの「D2s v5」を選択してRHELを作ってみたところ、この事象にハマりました。
起動時のログを確認
ブート診断で使うストレージアカウントをカスタムストレージアカウントにするとシリアルコンソールが使えます。
シリアルコンソールで起動中のログを観察します。すると処理に時間がかかっている箇所で以下のログが出ていました。
cloud-init[1607]: 2022-09-21 12:39:16,655 - DataSourceAzure.py[WARNING]: ephemeral device '/dev/disk/cloud/azure_resource' did not appear after 120 seconds.
存在しない一時ディスクを120秒間待機しているようなログに読み取れるので、明らかにこれがあやしいです。
原因と対処方法
出ているログから検索すると、まさにこの事象に関して記載しているMicrosoftのページが見つかりました。
Cloud–init-enabled VM takes a long time to start up
原因
During VM startup, cloud-init runs the DataSourceAzure.py file in Python, and then waits for the local ephemeral disks (/mnt/azure_resource) to become available. Because you're using an Azure VM that doesn't have local ephemeral disks, cloud-init must wait until the process times out. The timeout interval for ephemeral disks is 120 seconds before the startup process continues.
存在しない一時ディスクを120秒間待機する処理が入っていることがやはり原因のようです。
cloud-initを使うものでは同様の事象が起こりうるようなので、他のLinuxディストリビューションでも発生するのではないかと思います。
対処方法1:cloud-initのバージョンを上げる
Upgrade your copy of cloud-init to version 21.2 or a later version.
これは他への影響度が読めなかったので今回は試していません。
対処方法2:待機時間を短縮する
以下のコマンドを実行することで待機時間が2秒になります。
sudo sed -i 's/maxwait=120/maxwait=2/g' $(locate DataSourceAzure.py)
実際にこちらを試してみたところ、起動後SSHが接続できるようになるまでの時間が30秒程度に短縮されました。
まとめ
今回の事象は既存のOSイメージが一時ディスクなしの構成を元々想定していないことに起因しているのではないかと思います。今後の新しいLinuxイメージでは新しいcloud-initが搭載されて事象が起こらなくなるのではないかと推測されますが、一時ディスクなしのマシンサイズを使う場合、しばらくは上記のどちらかの対応が必要ですね。
追記
バージョンごとの事象発生有無を検証してみました。結果、RHEL8.1以降では発生しないことが確認できました。
RedHat社発行の公式イメージ「Red Hat Enterprise Linux」からバージョンを選択してデプロイしています。
VMの世代はGen2を指定しています。このイメージはLVM構成になります。
RHELバージョン | cloud-initバージョン | 事象発生有無 |
---|---|---|
7.6 | 19.4 | 発生する |
7.7 | 18.5 | 発生する |
8.0 | 入っていない? cloud-initコマンド自体が実行不可 |
一時ディスクなしだと そもそもVMデプロイが終わらない |
8.1 | 21.1-7.el8_5.3 | 発生しない |
8.2 | 21.1-7.el8_5.3 | 発生しない |
8.4 | 21.1-7.el8_5.3 | 発生しない |
8.6 | 21.1-15.el8_6.3 | 発生しない |