OKEのSelf Managed Nodesを試してみる

# はじめに

先日以下の機能がリリースされました。

https://docs.oracle.com/en-us/iaas/releasenotes/changes/da5f7092-29ab-4838-8e5f-447b488c2c4c/

この機能は、OKEのNodePool(Worker Nodeのグループ)とは別にユーザ管理のWorker NodeをOKEの管理対象として組み込める機能です。

まずは、言葉だけだと何を言っているかわからないと思うので、早速触ってみましょう。

# 前提条件

Self Managed Nodesを利用するには以下の2つの条件があります。

* 利用するOKEクラスタはv1.25以上の拡張クラスタであること
* OKEクラスタが利用するCNIはflannelであること(VCN Native Pod NetworkingはNG)

また、Worker NodeとするOSイメージは現時点ではOKE Worker Nodeイメージ(Oracle Linux7 or 8)のみです。

今後は様々なOSイメージがサポートされてくると思います。

# 事前準備

Self Managed Nodesを利用するには以下の2ステップが必要です。

1. 動的グループおよびポリシーの作成
1. Cloud-initスクリプトの作成

それぞれの手順を行っていきます。なお、今回はOKEクラスタが事前に作成されているものとして進めます。

## 1.動的グループおよびポリシーの作成

今回はNodeが所属するコンパートメント内の全てのインスタンスを対象としたグループを作成します。
このグループ名を`oke-self-managed-nodes-dyn-group`とします。

```
ALL {instance.compartment.id = '<compartment-ocid>'}
```

ポリシーは以下のようにします。

```
Allow dynamic-group oke-self-managed-nodes-dyn-group to {CLUSTER_JOIN} in compartment <compartment-name>
```

これで動的グループとポリシーの作成は完了です。

## 2.　Cloud-initスクリプトの作成

ここでは、インスタンス起動時にOKEクラスタに参加するための初期化スクリプトを作成します。

手順は以下のドキュメントにもあります。

https://docs.oracle.com/ja-jp/iaas/Content/ContEng/Tasks/contengcloudinitforselfmanagednodes.htm


ベースとなるのは以下のスクリプトです。

```sh
#!/usr/bin/env bash
bash /etc/oke/oke-install.sh \
  --apiserver-endpoint "<cluster-endpoint>" \
  --kubelet-ca-cert "<base64-encoded-certificate>"
```

"\<cluster-endpoint>"と"\<base64-encoded-certificate>"の部分を埋めます。

まず、"\<cluster-endpoint>"はOKEクラスタのプライベートAPIエンドポイントです。

以下のようにOKEのコンソール画面で確認できます。

![スクリーンショット 2023-07-25 15.09.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40392/f1e9322f-1ba7-d636-da03-092d79c5c3b4.png)

ポート番号である`6443`は除きます。

次に"\<base64-encoded-certificate>"は、OKEクラスタのCA証明書です。
例えば、東京リージョンにあるクラスタの場合、以下のコマンドで取得できます。

```sh
oci ce cluster create-kubeconfig --cluster-id ocid1.cluster.oc1.ap-tokyo-1.aaaaaaaaj5fsxxxxxxxxxxxwiducguq --region ap-tokyo-1 --file - | grep -oE "LS0t.*"
```

クラスタOCIDである”ocid1.cluster.oc1.ap-tokyo-1.aaaaaaaaj5fsxxxxxxxxxxxwiducguq”とリージョン識別子である”ap-tokyo-1”はご自身の環境で置き換えてください。

これでCloud-initスクリプトの作成は完了です。

事前準備は以上です。

# Nodeの追加

いよいよ、Self Managed Nodesを追加します。

まずは、OCIコンソール画面から通常のComputeインスタンス画面を起動します。

この記事では`Oracle-Linux-8.7-2023.05.24-0-OKE-1.26.2-625`のイメージを利用します。
OCIDで指定しますが、リージョンによって異なるので、以下のドキュメントでご確認ください。

https://docs.oracle.com/en-us/iaas/images/image/48e6f7f3-0f88-4bc0-848f-ec743b180960/

以下のようになります。シェイプは任意で問題ありません。

![スクリーンショット 2023-07-25 15.27.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40392/61a70718-9190-1398-b655-813b972d35ec.png)

本来は、Object Storageなどにエスクポートしたカスタムイメージなどを指定しますが、今回は真っ新な`Oracle-Linux-8.7-2023.05.24-0-OKE-1.26.2-625`イメージを指定しています。

インスタンスで利用するVCNは既存のOKEクラスタで利用しているWorker Nodeサブネットを利用するのがいいと思います。

最後にcloud-initを指定します。

これは事前準備で作成したスクリプトを貼り付けるだけです。例えば以下のようなイメージです。

```sh
#!/usr/bin/env bash
bash /etc/oke/oke-install.sh \
  --apiserver-endpoint "10.0.0.5" \
  --kubelet-ca-cert "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURpVENDQW5HZ0F3SUJBZ0lSQU9LaXR0WWlLd0trYzlYWlMrcXBzZm93RFFZxxxxxxxTFZ6aS8zRk1vL0xoRHRXNHJFN0lrcExYemwKSklubW9IL2oyNExiSnE4MGNtOEVWSFhLMWQyUlEzQjUzelROMUpXaTl3SxxxxxxxxxxhXVzEzNWdzNmFzS2ZvczgzV2ZWT3JFZzhmYlllRUI3NXg0N1BCaCtCMmhwdkhFb0Q2djNhRHF0b0V4dgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg=="
```

![スクリーンショット 2023-07-25 15.44.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40392/4bc210a6-e484-4f04-f56d-ea5e7b03c2cc.png)

これでインスタンスを作成します。

Nodeの状態を確認してみます。

```sh
$ kubectl get node
NAME         STATUS     ROLES    AGE   VERSION
10.0.10.22   Ready      node     78d   v1.26.2
10.0.10.4    NotReady   <none>   76s   v1.26.2
```

`ROLES`カラムが\<none>のNodeが表示されています。これが上記で作成したインスタンスです。

しばらくすると以下のようにSTATUSがREADYになります。

```sh
$ kubectl get node
NAME         STATUS   ROLES    AGE     VERSION
10.0.10.22   Ready    node     78d     v1.26.2
10.0.10.4    Ready    <none>   2m46s   v1.26.2
```

これでSelf Managed Nodeの追加ができました！

# Self Managed Nodesのユースケース

ここまでざっと機能だけ見てきましたが、実際にどのようなユースケースがあるのかを考えてみます。

OKEではサポートされていない機能が以下のようにいくつか存在します。

* RDMAネットワークを利用するベアメタル・インスタンス(HPC)
* 最近リリースされたVirtual NodesとVMを同時に使いたいケース(ロードマップにはあるが、まだ未サポート）

特に前者については、昨今のLLM機運の高まりにより、利用されるケースも多くあると思います。

このようなユースケースにSelf Managed Nodesは利用できます。

ただし、Self Managed Nodesでは現在以下の機能がサポートされていないので、注意が必要です。

* Kubernetes Cluster Autoscaler
* OKEによるdrain/cordonオプションの利用
* オンデマンドノードサイクルによるバージョンアップ

# まとめ

Self Managed Nodesを利用すると　従来のOKEではサポートされていない機能もカバーすることができます！
この機能を利用して、どんどんOKEクラスタを有効活用していきましょう！

# 参考資料

https://docs.oracle.com/ja-jp/iaas/Content/ContEng/Tasks/contengworkingwithselfmanagednodes.htm