2022/12/16 さくらテックランチ#1の発表資料になります。
connpass: https://sakura-tokyo.connpass.com/event/266667/ youtube: https://www.youtube.com/watch?v=WaKq_xz6iq4
さくらのクラウドでのcloud-initの実装と利⽤例の紹介2022/12/16 さくらテックランチ#1さくらインターネット株式会社野村 孔命
View Slide
⽬次1. ⾃⼰紹介と本発表の⽬的2. cloud-initの概要3. さくらのクラウドでのcloud-init機能の実装4. cloud-initの利⽤例
⾃⼰紹介と本発表の⽬的
• 名前:野村 孔命• 所属:さくらインターネット株式会社 クラウド事業本部クラウドサービス部• 業務:• さくらのクラウドのAPIの開発• お客様の⾏動ログを収集する基盤の開発• クラウドのシステムのログを収集する基盤の開発⾃⼰紹介
• cloud-initについて知ってもらう• cloud-initの概要やNoCloudでの実⾏の仕組みを説明する• さくらのクラウドでのcloud-init機能の実装について説明する• 私の考えるcloud-initの使い⽅の⽅針を共有する• ⽅針を共有した上で、⽅針に沿ったcloud-initの利⽤例を紹介する本発表の⽬的
cloud-initの概要
• cloud-initはクラウドのインスタンスのセットアップを⾏う⽅法の⼀つ• 「メタデータとユーザデータ」を「何らかの⽅法」でVMが受け取り、これらの情報をもとにセットアップを⾏う• 様々なLinuxディストリビューションで利⽤可能• Ubuntu, Debian, AlmaLinux, Rockylinux, Alpine, RHEL etc.• 余談:cloudbase-initを利⽤するとwindowsも対応化• 様々なクラウドプロバイダで利⽤可能cloud-initとは
• メタデータ• クラウドプロバイダが提供するインスタンス固有の情報を記述したファイル• インスタンスID, ホスト名, ディストリビューション名, etc.• クラウドプロバイダが⾃動的に⽣成• メタデータの内容をユーザデータから参照して利⽤可能• ユーザデータ• インスタンスのセットアップ内容を記述したyamlファイル• このファイルはユーザが記述し、記述内容に基づいてセットアップが⾏われる• 様々なセットアップの記述に便利なモジュールが⽤意されているメタデータとユーザデータ
メタデータとユーザデータの例メタデータ ユーザデータ
• メタデータとユーザデータを渡す⽅法は、クラウドサービスに依存する• さくらのクラウドでは、Webフォーム、APIパラメータ、usacloud(CLIツール)から渡せる• AWSも同様に、WebフォームやCLIツールから渡せる• ローカルでVMを⽴てるときに利⽤するデータの受け渡し⽅法(NoCloud)が提供されている• SMBIOS(System Management BIOS)上のシリアル番号を利⽤して渡す• ラベル「cidata」がつけられたファイルシステムを利⽤して渡す ← さくらのクラウドで利⽤メタデータとユーザデータをVMに渡す⽅法
• cloud-initがインストールされているアーカイブのディスクイメージ• 今回は ubuntu-20.04-server-cloudimg-amd64.img• メタデータ、ユーザデータを含むディスクイメージ• ファイルシステム: ISO9660 or FAT• ファイルシステムラベル: cidata or CIDATANoCloudでのcloud-initの実⾏に必要なもの
NoCloudでのcloud-initの実⾏Disk image 1Disk image 2ファイルシステム: ISO9660 or FATファイルシステムラベル: cidata or CIDATA/meta-data/user-dataVMqemu-system-x86_64 -m 2G -nographic-drive file=./archive/ubuntu-20.04-cloudimg.img,format=qcow2-drive file=disk2.img,if=virtio,format=raw,readonly=onホストサーバVM起動後、cloud-initが実⾏されセットアップが⾏われる
さくらのクラウドでのcloud-init機能の実装
• cloud-initは様々なクラウドサービスに対応しており、クラウドの利⽤者としては⼀般的なものとなっている→ さくらのクラウドでも提供し、利⽤者の利便性を向上させたい• パブリックアーカイブ提供の労⼒と速度の問題• さくらのクラウドでは、お客様の⾯倒なインストール作業を減らすために、初期のインストールされた状態のアーカイブを提供している• 各種ディストリビューションの新しいバージョンが公開される度に、設定を⾏うスクリプトの作成や検証が必要となる• 結果、労⼒は増え、提供速度が遅くなっている→ cloud-initを利⽤することで、パブリックアーカイブ提供の労⼒削減と速度向上を図りたいcloud-init機能の実装背景 1
• ディスク修正機能の負荷が⾼い• さくらのクラウドでは、基本的な初期設定(パスワードやネットワークなど)を⾏うための機能として、ディスク修正を提供している• ディスク修正では、修正対象のディスクを特定のサーバにマウントして設定の処理をしている• ⼤量にディスク修正リクエストが来ると、処理を⾏うサーバに負荷が集中してしまう→ cloud-initによって、それぞれのVMで初期設定の処理をできるようにし、負荷を分散したいcloud-init機能の実装背景 2
cloud-init機能の実装
• Ubuntu20.04ではcloud-initが実⾏されるが、Almalinux8.6では実⾏されない!• 初期実装の時は、メタデータ、ユーザデータの保管場所としてフロッピーを利⽤してた• メタデータ、ユーザデータはそれほど⼤きいファイルにならない想定• アーカイブにインストールされているcloud-initのバージョン違いが原因• cidataラベルつけててもフロッピー参照しない実装時に当たった問題の⼩話
cloud-initの利⽤例の紹介
• cloud-initには、多様なモジュールが⽤意されており、様々なセットアップ処理を記述できる• ミドルウェアをインストールして設定ファイルを置くこともできる• 複雑なセットアップ処理をユーザデータに書いてしまうと、可読性が悪くなりメンテナンスが⼤変になることが予想できるユーザデータを記述する上での⽅針⽅針:1. ユーザデータの内容は、基本的なセットアップに抑える• user/passwordの設定、ssh-keyの設定、ネットワークの設定、パッケージのインストールなど2. 複雑なセットアップは構成管理ツールに任せる、もしくはシェルスクリプトに切り出す• 複数のミドルウェアのインストールし、それらの設定ファイルをたくさん配置するなど
• ISUCON過去問題を解く環境をさくらのクラウドで構築するという記事がさくらのナレッジに公開されています• ISUCON環境の構築には、cloud-initとAnsibleが利⽤されています• Ansibleで競技⽤VMやベンチマーク⽤VMのセットアップ処理を記述• Ansibleの適⽤ホストに127.0.0.1を指定することで新規作成したインスタンス⾃⾝に適⽤• ユーザデータでAnsibleの実⾏準備を⾏い、Ansibleの実⾏をruncmdで⾏なっている• ISUCONに興味がある⽅も是⾮記事を読んでみてください!利⽤例1:ISUCON環境のセットアップISUCON過去問題の環境をさくらのクラウドで構築する:https://knowledge.sakura.ad.jp/31520/
• cloud-init ver 22.4からAnsibleモジュールが追加され、VM起動時にansible-playbookの適⽤を記述できるようになりました余談:Ansibleモジュールcloud-init releases 22.4:https://github.com/canonical/cloud-init/releases/tag/22.4
• k0sはKubernetesディストリビューションの⼀つ• クラスタの構築に必要な機能を持っている• ワンバイナリになっていて、インストールはシェルスクリプトで記述されている• 追加設定をせずに、クラスタを構築することができる→ インストール処理はシェルスクリプトで隠蔽されており、⼗分にシンプルな構築⽅法• 今回はcontrol-plane 1台、worker node 1台を構築してみました利⽤例2:k0s環境のセットアップ
利⽤例2:k0s環境のセットアップcontrol-planeで発⾏したtokenを設定Github Komei22/play-k0s:https://github.com/Komei22/play-k0s/tree/main/user-datacontroll-planeのユーザデータ worker-nodeのユーザデータcontrol-planeとして起動workerとして起動
利⽤例2:k0s環境のセットアップcontroll-planeのみ起動した状態control-planeでtokenを発⾏&worker-nodeのVMを作成worker-nodeがクラスタに参加している様⼦シンプルなユーザデータを記述することで、クラスタの構築を簡単に⾏うことができている以降、worker-nodeの追加もユーザデータを利⽤することで⾃動的にクラスタに参加させられる
• cloud-initの概要を説明• cloud-initの基本的な使い⽅などを説明• NoCloudでのcloud-init実⾏の仕組みを説明• さくらのクラウドでのcloud-initの実装を説明• クラウドが抱えていた問題の背景を説明• ユーザデータのシステム間の渡し⽅やNoCloudを使ったさくらのクラウドでの実装を説明• cloud-initの利⽤例を紹介• ユーザデータ記述の⽅針を説明• ISUCON環境のセットアップを紹介• k0s環境のセットアップを紹介まとめ
ありがとうございました