Cloud-initを用いたOracle Container Engine for Kubernetes (OKE) のBoot Volume拡張


# はじめに
OKEに巨大なContainerイメージを使ってContainer立てて検証をしようとしたとき、すぐに容量が枯渇することがありました。実はOKEのNodeのBoot Volumeはデフォルトで50GBなので、巨大なイメージを使う場合は十二分に容量があるとは言えません。大きなContainerイメージや複数のイメージを使用する場合、容量不足になることがあります。例えば、流行りのAI周りで使われるLLMのイメージなどを使う場合は容量の拡張は必須ですね。
この記事では、Oracle Container Engine for Kubernetes (OKE) でyamlファイルを指定してCloud-initを実行することでBoot Volumeを拡張する方法を紹介します。

# Oracle Container Engine for Kubernetes (OKE)とは
Oralce Cloudでは、KubernetesのマネージドサービスとしてOracle Container Engine for Kubernetes (OKE) が提供されています。

OKEクラスターの作成にはクイック作成とカスタム作成の２つの作成方法があります。
詳細は、以前投稿した記事に記載しています。

https://qiita.com/s_obata/items/4431d5cac2addd0b9809

# Oracle Container Engine for Kubernetes (OKE) のBoot Volumeの拡張
## 前提
【ネットワークリソースの事前構築】
・VCN
・Public Subnet
・Internet Gateway

## 手順
1. [アーキテクチャ](#アーキテクチャ)
2. [DefaultのBoot Volumeの確認](#defaultのboot-volumeの確認)
3. [Boot Volumeの拡張](#boot-volumeの拡張)
4. [拡張されたBlock Volumeの確認](#拡張されたblock-volumeの確認)

## アーキテクチャ
今回は以下のようなアーキテクチャを作成し、OKEのカスタム作成で作成時にBoot Volumeを拡張します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633103/89934ec9-2500-b4a2-afa8-122a399714d5.png)

## DefaultのBoot Volumeの確認
まず、比較対象としてデフォルトのBoot Volumeを確認します。OKEのBoot Volumeはデフォルトで50GB(正確には46.6GB)です。

```console
$ lsblk
NAME               MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                  8:0    0 46.6G  0 disk 
├─sda1               8:1    0  100M  0 part /boot/efi
├─sda2               8:2    0    1G  0 part /boot
└─sda3               8:3    0 45.5G  0 part 
  ├─ocivolume-root 252:0    0 35.5G  0 lvm  /
  └─ocivolume-oled 252:1    0   10G  0 lvm  /var/oled
```

ではBoot Volumeを拡張したOKEクラスタを作成していきます。
OKEのカスタム作成を選択します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633103/bd696ee2-90be-c515-8e5f-bbc17d4f84c8.png)

次に、「ネットワーク設定」のページの必要な項目を記載します。ここで,Public Subnetを持つVCNを指定してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633103/4e987553-1a77-761e-152f-b71aa94bbee4.png)

ここでNodeをPublic Subnetに配置させます。Node Place Configurationの項目にPublic Subnetを指定してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633103/e39db47c-da64-9850-e74a-754ef373de59.png)

次に、「拡張オプションの表示」をクリックします。拡張オプションでBoot Volumeのサイズや初期化スクリプトを指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633103/5e93b3f9-1ec0-e19a-63c3-a67f84ad55ec.png)

次に、Boot Volumeの項目で「カスタム・ブート・ボリューム・サイズを指定します」を選択します。Boot Volumeのサイズを100GBと記載します。Boot Volumeは50GB~32TBの範囲で選択することができます。[Boot Volume](https://docs.oracle.com/ja-jp/iaas/Content/Block/Concepts/bootvolumes.htm#BootVolumePerformance)に関する詳細はドキュメントをご確認ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633103/a1f2616a-4036-e36f-0918-5bd94a38268b.png)


次に、「初期化スクリプト」の項目で、Cloud-initのスクリプトを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633103/c884b603-dc91-9bfd-7cd0-8e229a628cff.png)

このCloud-initには、Boot Volume用に紐づけたBlock Volumeをscanしてパーティションを拡張するスクリプトが書かれています。Cloud-initをインスタンスの起動時に実行します。今回は`sample-cloud-init.yaml`というファイルを指定しています。

`sample-cloud-init.yaml`
```yml
#!/bin/bash
curl --fail -H "Authorization: Bearer Oracle" -L0 http://169.254.169.254/opc/v2/instance/metadata/oke_init_script | base64 --decode >/var/run/oke-init.sh
bash /var/run/oke-init.sh
sudo dd iflag=direct if=/dev/oracleoci/oraclevda of=/dev/null count=1
echo "1" | sudo tee /sys/class/block/`readlink /dev/oracleoci/oraclevda | cut -d'/' -f 2`/device/rescan
sudo /usr/libexec/oci-growfs -y
```

この起動スクリプトの内容を解説します。
```yml
#!/bin/bash
curl --fail -H "Authorization: Bearer Oracle" -L0 http://169.254.169.254/opc/v2/instance/metadata/oke_init_script | base64 --decode >/var/run/oke-init.sh
```
このスクリプトは、デフォルトのOKEの起動スクリプトです。OKEの管理対象ノードでカスタムでCloud-initの初期化スクリプトを作成する場合は、このデフォルトの起動スクリプトの前後に追加のスクリプトを記載します。詳細は「[カスタムのCloud-init初期化スクリプトを使用した管理対象ノードの設定](
https://docs.oracle.com/ja-jp/iaas/Content/ContEng/Tasks/contengusingcustomcloudinitscripts.htm)」をご確認ください。


```yml
sudo dd iflag=direct if=/dev/oracleoci/oraclevda of=/dev/null count=1
echo "1" | sudo tee /sys/class/block/`readlink /dev/oracleoci/oraclevda | cut -d'/' -f 2`/device/rescan
```
このスクリプトは、Block Volumeのディスクの再scanを行っています。追加でアタッチされたBlock Volumeを再scanして認識しています。詳細は「[Linuxベースのインスタンスにアタッチされたボリュームのディスクの再スキャン](https://docs.oracle.com/ja-jp/iaas/Content/Block/Tasks/rescanningdisk.htm#Rescanni)」をご確認ください。


```yml
sudo /usr/libexec/oci-growfs -y
```
このスクリプトは、OCIユーティリティの`oci-growfs`を実行しています。`oci-growfs`ユーティリティを使用して、ルート・パーティションを拡張できます。デフォルトでは、Boot Volumeが50 GB以上の場合、Linuxベースのインスタンスは拡張したBoot Voluem全体を自動的には使用しません。詳細は「[oci-growfs](https://docs.oracle.com/ja-jp/iaas/oracle-linux/oci-utils/index.htm#oci-growfs)」のドキュメントをご確認ください。

次に、ノードに対してssh接続を可能にします。この作業はBoot Volumeの拡張をSSH接続で確認するために行っていますが、必須の作業ではないです。
「SSHキーの追加」からSSH公開キーを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633103/876791e3-45db-2e57-80fd-665b2d32ba0d.png)


OKEのクラスタの設定項目は以上です。このままOKEのクラスタを作成します。

## 拡張されたBlock Volumeの確認
クラスタが立ち上がり、ノードプールとノードが作成されます。クラスタのノードに該当するインスタンスを確認します。SSH接続をするためにPublic IPアドレスをコピーしておきます。

秘密キーを指定して、SSH接続をします。問題なく動作していると、OKEのNodeにSSH接続できます。
```console
$ ssh -i ~/.ssh/id_rsa.key opc@132.145.69.184
...
[opc@oke-c23xxylolma-nde35tb4pdq-sxxjqdbsu5a-0 ~]$
```

`lsblk`コマンドでNodeのBoot Volumeを確認します。sdaが100GBとなっているので問題なく拡張できています。
```
[opc@oke-c23xxylolma-nde35tb4pdq-sxxjqdbsu5a-0 ~]$ lsblk
NAME               MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                  8:0    0  100G  0 disk 
├─sda1               8:1    0  100M  0 part /boot/efi
├─sda2               8:2    0    1G  0 part /boot
└─sda3               8:3    0 45.5G  0 part 
  ├─ocivolume-root 252:0    0 35.5G  0 lvm  /
  └─ocivolume-oled 252:1    0   10G  0 lvm  /var/oled
```
以上が、OKEのNodeにおけるBlock Volumeの拡張方法です。

# まとめ
今回の記事では、OCIのマネージドKubernetesサービスであるOKEのBoot Volumeの拡張を行いました。Volume Sizeの指定と、Cloud-initを書くだけで意外と簡単に拡張することができました。ただVolume Sizeの指定だけでは自動的にBoot Volumeが拡張されなかったり、OKE作成時のみBoot Volumeの拡張が可能なことなどいくつか注意点があります。詰まった方はこの記事を参考にしていただければ幸いです。


# 参考
[カスタムのCloud-init初期化スクリプトを使用した管理対象ノードの設定](
https://docs.oracle.com/ja-jp/iaas/Content/ContEng/Tasks/contengusingcustomcloudinitscripts.htm)

[Linuxベースのインスタンスにアタッチされたボリュームのディスクの再スキャン](
https://docs.oracle.com/ja-jp/iaas/Content/Block/Tasks/rescanningdisk.htm#ariaid-title3)

[OCIユーティリティ](
https://docs.oracle.com/ja-jp/iaas/oracle-linux/oci-utils/index.htm#oci-growfs)