Slide 1

Slide 1 text

さくらのクラウドでの cloud-initの実装と利⽤例の紹介 2022/12/16 さくらテックランチ#1 さくらインターネット株式会社 野村 孔命

Slide 2

Slide 2 text

⽬次 1. ⾃⼰紹介と本発表の⽬的 2. cloud-initの概要 3. さくらのクラウドでのcloud-init機能の実装 4. cloud-initの利⽤例

Slide 3

Slide 3 text

⾃⼰紹介と本発表の⽬的

Slide 4

Slide 4 text

• 名前:野村 孔命 • 所属:さくらインターネット株式会社 クラウド事業本部クラウドサービス部 • 業務: • さくらのクラウドのAPIの開発 • お客様の⾏動ログを収集する基盤の開発 • クラウドのシステムのログを収集する基盤の開発 ⾃⼰紹介

Slide 5

Slide 5 text

• cloud-initについて知ってもらう • cloud-initの概要やNoCloudでの実⾏の仕組みを説明する • さくらのクラウドでのcloud-init機能の実装について説明する • 私の考えるcloud-initの使い⽅の⽅針を共有する • ⽅針を共有した上で、⽅針に沿ったcloud-initの利⽤例を紹介する 本発表の⽬的

Slide 6

Slide 6 text

cloud-initの概要

Slide 7

Slide 7 text

• cloud-initはクラウドのインスタンスのセットアップを⾏う⽅法の⼀つ • 「メタデータとユーザデータ」を「何らかの⽅法」でVMが受け取り、これらの情報をもとに セットアップを⾏う • 様々なLinuxディストリビューションで利⽤可能 • Ubuntu, Debian, AlmaLinux, Rockylinux, Alpine, RHEL etc. • 余談:cloudbase-initを利⽤するとwindowsも対応化 • 様々なクラウドプロバイダで利⽤可能 cloud-initとは

Slide 8

Slide 8 text

• メタデータ • クラウドプロバイダが提供するインスタンス固有の情報を記述したファイル • インスタンスID, ホスト名, ディストリビューション名, etc. • クラウドプロバイダが⾃動的に⽣成 • メタデータの内容をユーザデータから参照して利⽤可能 • ユーザデータ • インスタンスのセットアップ内容を記述したyamlファイル • このファイルはユーザが記述し、記述内容に基づいてセットアップが⾏われる • 様々なセットアップの記述に便利なモジュールが⽤意されている メタデータとユーザデータ

Slide 9

Slide 9 text

メタデータとユーザデータの例 メタデータ ユーザデータ

Slide 10

Slide 10 text

• メタデータとユーザデータを渡す⽅法は、クラウドサービスに依存する • さくらのクラウドでは、Webフォーム、APIパラメータ、usacloud(CLIツール)から渡せる • AWSも同様に、WebフォームやCLIツールから渡せる • ローカルでVMを⽴てるときに利⽤するデータの受け渡し⽅法(NoCloud)が提供されている • SMBIOS(System Management BIOS)上のシリアル番号を利⽤して渡す • ラベル「cidata」がつけられたファイルシステムを利⽤して渡す ← さくらのクラウドで利⽤ メタデータとユーザデータをVMに渡す⽅法

Slide 11

Slide 11 text

• cloud-initがインストールされているアーカイブのディスクイメージ • 今回は ubuntu-20.04-server-cloudimg-amd64.img • メタデータ、ユーザデータを含むディスクイメージ • ファイルシステム: ISO9660 or FAT • ファイルシステムラベル: cidata or CIDATA NoCloudでのcloud-initの実⾏に必要なもの

Slide 12

Slide 12 text

NoCloudでのcloud-initの実⾏ Disk image 1 Disk image 2 ファイルシステム: ISO9660 or FAT ファイルシステムラベル: cidata or CIDATA /meta-data /user-data VM qemu-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が実⾏されセットアップが⾏われる

Slide 13

Slide 13 text

さくらのクラウドでの cloud-init機能の実装

Slide 14

Slide 14 text

• cloud-initは様々なクラウドサービスに対応しており、クラウドの利⽤者としては⼀般的なも のとなっている → さくらのクラウドでも提供し、利⽤者の利便性を向上させたい • パブリックアーカイブ提供の労⼒と速度の問題 • さくらのクラウドでは、お客様の⾯倒なインストール作業を減らすために、初期のインストールされ た状態のアーカイブを提供している • 各種ディストリビューションの新しいバージョンが公開される度に、設定を⾏うスクリプトの作成や 検証が必要となる • 結果、労⼒は増え、提供速度が遅くなっている → cloud-initを利⽤することで、パブリックアーカイブ提供の労⼒削減と速度向上を図りたい cloud-init機能の実装背景 1

Slide 15

Slide 15 text

• ディスク修正機能の負荷が⾼い • さくらのクラウドでは、基本的な初期設定(パスワードやネットワークなど)を⾏うための機能とし て、ディスク修正を提供している • ディスク修正では、修正対象のディスクを特定のサーバにマウントして設定の処理をしている • ⼤量にディスク修正リクエストが来ると、処理を⾏うサーバに負荷が集中してしまう → cloud-initによって、それぞれのVMで初期設定の処理をできるようにし、負荷を分散したい cloud-init機能の実装背景 2

Slide 16

Slide 16 text

cloud-init機能の実装

Slide 17

Slide 17 text

cloud-init機能の実装

Slide 18

Slide 18 text

cloud-init機能の実装

Slide 19

Slide 19 text

• Ubuntu20.04ではcloud-initが実⾏されるが、Almalinux8.6では実⾏されない! • 初期実装の時は、メタデータ、ユーザデータの保管場所としてフロッピーを利⽤してた • メタデータ、ユーザデータはそれほど⼤きいファイルにならない想定 • アーカイブにインストールされているcloud-initのバージョン違いが原因 • cidataラベルつけててもフロッピー参照しない 実装時に当たった問題の⼩話

Slide 20

Slide 20 text

cloud-initの利⽤例の紹介

Slide 21

Slide 21 text

• cloud-initには、多様なモジュールが⽤意されており、様々なセットアップ処理を記述できる • ミドルウェアをインストールして設定ファイルを置くこともできる • 複雑なセットアップ処理をユーザデータに書いてしまうと、可読性が悪くなりメンテナンスが ⼤変になることが予想できる ユーザデータを記述する上での⽅針 ⽅針: 1. ユーザデータの内容は、基本的なセットアップに抑える • user/passwordの設定、ssh-keyの設定、ネットワークの設定、パッケージのインストールなど 2. 複雑なセットアップは構成管理ツールに任せる、もしくはシェルスクリプトに切り出す • 複数のミドルウェアのインストールし、それらの設定ファイルをたくさん配置するなど

Slide 22

Slide 22 text

• 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/

Slide 23

Slide 23 text

• 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

Slide 24

Slide 24 text

• k0sはKubernetesディストリビューションの⼀つ • クラスタの構築に必要な機能を持っている • ワンバイナリになっていて、インストールはシェルスクリプトで記述されている • 追加設定をせずに、クラスタを構築することができる → インストール処理はシェルスクリプトで隠蔽されており、⼗分にシンプルな構築⽅法 • 今回はcontrol-plane 1台、worker node 1台を構築してみました 利⽤例2:k0s環境のセットアップ

Slide 25

Slide 25 text

利⽤例2:k0s環境のセットアップ control-planeで発⾏した tokenを設定 Github Komei22/play-k0s:https://github.com/Komei22/play-k0s/tree/main/user-data controll-planeのユーザデータ worker-nodeのユーザデータ control-planeとして起動 workerとして起動

Slide 26

Slide 26 text

利⽤例2:k0s環境のセットアップ controll-planeのみ起動した状態 control-planeでtokenを発⾏ & worker-nodeのVMを作成 worker-nodeがクラスタに参加している様⼦ シンプルなユーザデータを記述することで、クラスタの構築を簡単に⾏うことができている 以降、worker-nodeの追加もユーザデータを利⽤することで⾃動的にクラスタに参加させられる

Slide 27

Slide 27 text

• cloud-initの概要を説明 • cloud-initの基本的な使い⽅などを説明 • NoCloudでのcloud-init実⾏の仕組みを説明 • さくらのクラウドでのcloud-initの実装を説明 • クラウドが抱えていた問題の背景を説明 • ユーザデータのシステム間の渡し⽅やNoCloudを使ったさくらのクラウドでの実装を説明 • cloud-initの利⽤例を紹介 • ユーザデータ記述の⽅針を説明 • ISUCON環境のセットアップを紹介 • k0s環境のセットアップを紹介 まとめ

Slide 28

Slide 28 text

ありがとうございました