OCIのマネージドKubernetesサービス (OKE) をカスタム作成してみた

# 背景
この記事は、[Oracle Cloud Infrastructure Advent Calendar 2023](https://qiita.com/advent-calendar/2023/oci) Day 25 の記事として書かれています。
今回はOracle CloudでKubernetesの環境であるOKEをカスタム作成してみます。クイックスタートでは、Kubernetes環境の作成は簡単ですが、自動でVCNとサブネットが作られたり、CIDRが決まっていたりと限定的な構成になってしまいます。そこでより詳細な設定が可能で自由度の高いカスタム作成を使って、Kubernetesクラスタを作成し、kubectlコマンドで疎通確認して基本的なOKE環境を構築したいと思います。

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

OKEクラスターの作成にはクイック作成とカスタム作成の２つの作成方法があります。

### クイック作成
Kubetnetesのクラスタとクラスタのネットワーク、Kubernetes APIエンドポイントなど作成に必要な周辺のリソースも含めて、自動的に作成される方法です。Kubenetesクラスタで使われるCIDRは固定で作成されます。
クイック作成についてはOCI Tutorialがあるのでこちらをご確認ください。

https://oracle-japan.github.io/ocitutorials/cloud-native/oke-for-commons/

#### 作成されるリソース
* Kubernetes API Endpoint
* 仮想クラウド・ネットワーク
* Internet Gateway
* NAT Gateway
* Service Gateway
* Kubernetesクラスタ
* Kubernetesワーカー・ノード、ノードプール

### カスタム作成
Kubernetesクラスタとワーカーノード、ノードプールのみ作成され、Kubernetestクラスタを最大限に制御できる作成方法です。クイック作成と比べて、CIDR範囲を決められたりとネットワークの自由度が高く、LBやノードを置くサブネットの指定をはじめ様々な設定ができます。

#### 作成されるリソース
* Kubernetesクラスタ
* Kubernetesワーカー・ノード、ノードプール


# 手順
では、実際に構築していきます。今回はこの基本的なKubernetesの環境を構築します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633103/7768eb75-4bbd-57d7-efc1-cf81749d17ba.png)



## VCNの作成
まずVCNを作成します。今回はVCNウィザードを使用して、サブネットやゲートウェイを自動で作成しました。ここでパブリック・サブネットやプライベートサブネットのCIDRを自由に指定できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633103/ae76cb28-7786-eb32-c848-0ef1184aef9f.png)

次に、OKEへの接続とOKE内の通信を通すためパブリック・サブネットとプライベート・サブネットに追加で紐づけるセキュリティ・リストを作成します。今回は以下のようなセキュリティ・リストを作成しました。
+ パブリック・サブネット用
    + oke_public（イングレス・ルール）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633103/a8b081b0-6af0-e642-3d15-6140b9b20b6c.png)

    + oke_public（エグレス・ルール）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633103/149b9323-2638-41a4-da73-50c3049bd3b6.png)

+ プライベート・サブネット用
    + oke_private（イングレス・ルール）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633103/22318926-f67c-58cf-f633-da822e25afdd.png)

    + oke_private（エグレス・ルール）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633103/425280d5-8733-5b0e-5682-5efb7a1c6094.png)


セキュリティ・リストをそれぞれのサブネットに紐づけます。(VCNウィザードを使って作成した場合は、すでにセキュリティ・リストが1つ紐づいているので２つめとして紐づけます。）より詳細なネットワークを構築する場合は[クラスタの作成とデプロイメントのためのネットワーク・リソース構成](https://docs.oracle.com/ja-jp/iaas/Content/ContEng/Concepts/contengnetworkconfig.htm#securitylistconfig)を参考に作成してください。
これでVCNの構築は終了です。


## OKEクラスタの作成
次にOKEクラスタをカスタム作成します。OKEの画面に遷移して、クラスタの作成からカスタム作成を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633103/25a14348-a191-d695-788d-2cb40f841355.png)

クラスタ名を入力し「Kubernetesのバージョン」を指定します。「Kubernetesのバージョン」とは、クラスタのコントロール・プレーン・ノードで実行するKubernetesのバージョンのことを指します。バージョンによってデフォルトで有効になるアドミッション・コントローラが変わります。詳細は[サポートされているアドミッション・コントローラ]


(https://docs.oracle.com/ja-jp/iaas/Content/ContEng/Reference/contengadmissioncontrollers.htm#Supported_Admission_Controllers)をご確認ください。
今回はv1.28.2を使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633103/37a9e62e-f782-841a-97d4-8f8a5fa4f6df.png)

続いて「拡張オプションの表示」をクリックすると、様々なオプションを設定することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633103/1cd183d4-1586-dfb9-ad57-bfbce78e9a54.png)


#### イメージの検証
イメージの検証は、指定したマスター暗号化キーによって署名されたOracle Cloud Infrastructre Registry (OCIR)からのイメージをデプロイに使用することを許可するかを選択できます。ボールトとキーを選択することで利用できます。(クイック作成でも可能。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633103/3d6558b4-dc72-9e1d-275a-934716bdcc35.png)

#### Kubetnetesシークレットの暗号化
クラスタのetcd key value storeのKubetnetesシークレットを暗号化する方法を指定できます。Oralce管理キーを使用する暗号化と自分が管理するキーをする暗号化が選択できます。

#### クラスタ・アドオンの構成
クラスタ・アドオンの管理方法を指定します。（拡張クラスタでのみ指定可能です。）CoreDNS, Kube-proxy, Kubernetesダッシュボード, 証明書マネージャ, データベース・オペレータ, WLSオペレータを有効または無効にしたり、アドオンのバージョンを変更することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633103/1fd1fa54-2b7a-c2a8-6fbe-c9bd63655865.png)


#### ネットワーク・タイプ
ネットワーク・タイプはクラスタ内のポッドが通信する方法を選択できます。VCNネイティブ・ポッド・ネットワーキングとFlannel Overayが選択できます。

+ VCNネイティブ・ポッド・ネットワーキング
    OKEのノードをVCNのサブネットにポッド接続します。VCN内のポッドのIPアドレスに対して他のVCNから直接ルーティングが可能になります。仮想ノードと管理対象ノードを作成することができます。

+ Flannel Overay
    独自のCIDRブロックを使用して、ポッド、ワーカー・ノードをIPアドレスでプロビジョニングします。ノード当たりのポッドの数がVCNネイティブ・ポッド・ネットワーキングCNIの制限を超える場合は、flannel Overayを選択してください。管理対象ノードのみを作成することができます。

今回はVCNネイティブ・ポッド・ネットワーキングを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633103/be3cf89a-275e-33ce-c93c-9ed06ba9b6d6.png)

次に、[VCNの作成](#vcnの作成)で作成したVCNを指定します。

KubernetesサービスLBサブネットを指定します。これは、ロードバランサをホストするためのサブネットで、ワーカー・ノード・サブネットとは異なる必要があります。パブリックやプライベートにすることも、リージョナルやAD固有にすることも可能です。

次にKubernetesAPIエンドポイント・サブネットを指定します。これはKubernetes APIエンドポイントをホストするサブネットを選択できます。サブネットはパブリックとプライベートを選択することができます。Kubernetes APIエンドポイントには常にプライベートIPアドレスが割り当てられます。パブリックサブネットを指定した場合は、パブリックIPアドレスとプライベートIPアドレスが割り当てることができます。
APIエンドポイントへのパブリックIPアドレスの割り当てにチェックを入れると、エンドポイントをインターネットに公開できます。今回はパブリックIPアドレスを割り当てます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633103/c9ef080d-765e-83a0-a3d0-90b479ba8788.png)

次に、「拡張オプションの表示」をクリックするとKubernetsサービスCIDRブロックとポッドCIDRブロックを指定することができます。

+ Kubernetesサービスブロック
Kubernetsサービスで公開できるCIDRブロックを指定できます。

+ ポッドCIDRブロック
クラスタ内のポッドに割り当てることができるCIDRブロックを指定できます。Flannel Overayを選択した場合のみ指定できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633103/06f80ac1-f9bd-a1a0-69f5-7e226d811596.png)

### ノード・プール
次に、ノードプールの構成の詳細を指定していきます。
まずNode Poolの名前、コンパートメント、ノードタイプ、バージョンを指定します。ノードタイプは、ワーカー・ノードのタイプとして、管理対象ノードと仮想ノードが選択できます。詳細は[仮想ノードと管理対象ノード](https://docs.oracle.com/ja-jp/iaas/Content/ContEng/Concepts/contengclustersnodes.htm#contengclustersnodes_topic-Provisioned_Virtual_Nodes)を参照してください。今回は管理対象ノードを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633103/c2091f6f-34cf-e34f-1b52-a60b1f8edf5d.png)

次にノード配置構成を指定します。可用性ドメインワーカー・ノード・サブネット、フォルトドメインを指定します。
「拡張オプションの表示」をクリックすると容量タイプを指定できます。
ノード配置を他のドメインやサブネットに追加したい場合は、「+1行」をクリックして、２つ目のノード配置構成を追加します。ワーカー・ノードが作成されると指定したサブネットに可能な限り均等に分散配置されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633103/de6778d9-b2bf-ba19-e0b8-6fecf3199721.png)

次にシェイプとイメージを指定します。OKEでサポートされているシェイプが表示されるので適当なシェイプを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633103/2f5405d3-b632-108a-5422-dcee9d21db15.png)

イメージにはプラットフォームイメージとOKEワーカー・ノードのイメージがあります。

+ プラットフォームイメージ
    Oracleで提供されているOracle Linux OSが選択できます。

+ OKEワーカー・ノードのイメージ
    プラットフォームイメージの上に作成された、OKEに必要な構成やソフトウェアと、ワーカー・ノードのベース・イメージとして機能するように最適化されたイメージです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633103/2be303fd-1dc1-2f74-9359-a4055e0cf2d9.png)



次にノード・プール・オプションにて、ノード・プール内のノード数を指定します。
続いて、ブートボリュームのオプションを指定します。ブートボリュームのサイズや暗号化オプションを指定したい場合はチェックを付けて変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633103/d5434087-a6ce-bdee-5b63-d3492fc3bd6a.png)

次に、ポッド通信の詳細を指定します。ポッド・サブネットでノード・プール内のポットが相互に通信する方法を指定します。
ポッドをホストするサブネットとアクセス制御を定義したネットワーク・セキュリティ・グループ(NSG)を指定します。
拡張オプションの表示をクリックして、ノード内のポッド数を選択できます。ポッドの最大数は110です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633103/2a725be6-4e84-636e-b74a-cba93784e6fc.png)


次に、拡張オプションの表示をクリックします。
「Cordonおよびdrain」の項目で、ノードの終了前にCordonとdrainするタイミングを設定できます。
削除猶予期間(分)で、ワーカー・ノードをCordon、drainできる期間を指定できます。
「猶予期間後に強制終了」を選択すると、猶予期間終了後にワーカー・ノードを終了するかどうかを指定できます。これを選択した場合、猶予期間終了後、正常にCordon、drainされていない場合も強制終了されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633103/cebbb3c3-510e-e75d-17ed-4054c1071870.png)


「初期化スクリプト」はノードをホストしているインスタンスを初めて起動した際に実行されるcloud-initスクリプトを指します。スクリプトのファイルを選択するか、cloud-initスクリプトを直接貼り付けることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633103/a01b318d-2b90-2d20-ab5d-c6c7fd712641.png)

また、ノードやノード・プールにタグを設定することも可能です。
ワーカー・ノードに対してSSHキーを追加して、SSH接続の設定を行うこともできます。

次の確認画面のページに遷移し、使用される既存リソースと作成されるリソースを確認します。
最後に、「Basicクラスタを作成」するかの確認をします。拡張クラスタの機能を使用する場合はチェックをはずし、Basicクラスタを作成する場合はチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633103/3852262f-45e2-aaf2-85a3-47091c85e4cd.png)

最後にクラスタの作成を押して、OKEのクラスタを作成開始します。
クラスタの作成が完了し、表示が緑色のアクティブになれば作成完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633103/35ca94b6-d77e-355a-981c-4087e47064e0.png)

正常にノードが立ち上がっていることも確認してください。
以上の手順でOKEのクラスタをカスタム作成できました。

## OKEへの疎通確認
OKEクラスタに対して、kubectlコマンドで接続できるかを確認します。
まず、kubeconfigを設定します。OKEの「クラスタ詳細」の画面、リソースのクイックスタートを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633103/a112f8a0-b201-b38f-d2d3-dec095f2fa29.png)

「クラスタへのアクセス」をクリックし、Cloud Shellを起動させてコマンドをコピーしてを実行します。

```
oci ce cluster create-kubeconfig --cluster-id <OKE-CLUSTER-OCID> --file $HOME/.kube/config \
--region <REGION-CODE> --token-version 2.0.0  --kube-endpoint PUBLIC_ENDPOINT
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633103/1c00e5ec-804b-8649-b95d-8ec34ded7201.png)

以下のコマンドでバージョンを確認します。
```
kubectl version --short
```

また、`kubectl get nodes`などでワーカー・ノードも確認してみてください。
```
NAME         STATUS     ROLES   AGE   VERSION
10.0.1.201   NotReady   node    8h    v1.27.2
10.0.1.237   NotReady   node    8h    v1.27.2
10.0.1.84    NotReady   node    8h    v1.27.2
```

以上が、カスタム作成でOKEクラスタを作成する手順になります。

# まとめ
今回はOCI上でOKEのカスタム作成を用いて、Kubernetesクラスタを作成しました。また作成したクラスタに接続できるようにネットワークを構築し、疎通確認も行いました。

# 参考
https://qiita.com/sugimount/items/ba6813aca89bec0c81f7

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

https://docs.oracle.com/ja-jp/iaas/Content/ContEng/Tasks/contengcreatingclusterusingoke_topic-Using_the_Console_to_create_a_Custom_Cluster_with_Explicitly_Defined_Settings.htm#create-custom-cluster