Oracle Cloud InfrastructureのFree Tier枠でKubernetesクラスターを構築してみた

※もし手順で抜けているところやわかりづらいところがありましたらコメントいただけるとありがたいです。

## OKEにたどり着いた背景
### Free Tier枠（ずっと無料）で使えるリソースが豊富
- 副業できそうなネタを思いついたのでWebサイトを開設したかったが、リソースの費用を抑えたかった
- サーバー代を安く抑えられるサービスやクラウドを探していると、OCI（Oracle Cloud Infrastructure）を発見
- OCI は、クラウド環境を構築するための強力なツールセットを提供している
- OCI の Free Tier では、無料で利用できる多くのサービスが存在し、なんとマネージドの kubernetes 環境である OKE（Oracle Kubernetes Engine）も Free Tier の対象となっているインスタンスタイプを選択すれば無料で利用可能とのこと。

### kubernetesで運用してみたかった
- 業務でkubernetesを使い始めたが、業務内ではkubernetes環境を触る機会がそこまで多くなかったため、kubernetes環境を使ってWebアプリを運用してみることで実績を積みたかった
- 単純にkubernetesを色々触ってみて楽しみたかった。

### terraformが使えた
- terraformも業務で使っていたため、一から構築してみて自分の知見を増やしたかった
- コードでインフラを管理（IaC）できるので、インフラの設計書を書く必要がなくなり手間が省ける
- 将来的に自動でインフラを追加、削除、更新する必要が出てきた際に、terraformで構築しておくと便利なため

## OKE（Oracle Kubernetes Engine）とは？
- Oracle が提供するマネージド Kubernetes 環境
- Kubernetes の複雑な構築や設定を OCI が代行し、コンテナオーケストレーションのみにフォーカスできるサービス

## Free Tier での OKE クラスターの利用
[OCI Free Tier](https://www.oracle.com/jp/cloud/free/#always-free) では、以下のサービスを無料で利用可能（ここではOKE構築に必要なリソースのみ記載）

- 仮想マシン（VM）：1VMまたは最大4VMとして使用できるArmベースのAmpere A1コアと24GBのメモリを1か月あたり3,000 OCPU時間と18,000GB時間で使用可能
- ブロックボリューム：2つのBlock Volumesストレージ、合計200 GB
- ロードバランサー：フレキシブルロードバランサー 1インスタンス 10Mbps

この Free Tier 枠で OKE クラスターを構築することが可能で、個人レベルのWebサイトであれば十分運用可能なリソースを半永久的に無料で利用することができる。
※ 最近OCPU時間とメモリ時間の上限が設定されたが、私の環境では上限を超えていないため常にCPU100%とかでなければ超えないのかもしれない

## OKE クラスター構築の手順
### OCI アカウントの作成
- クレジットカード情報を入力する必要があるが、Free Tierの利用範囲内であれば課金されることはない
- アカウントを作成後、OCI コンソールにログインし、クラウド環境を管理できるようになる
- 【重要】Free Tierの恩恵を受けるためにはOKEのノードとなるインタスタンスのタイプに「Ampere A1コア」を選択する必要があるが、日本のRegionである東京・大阪ではリソースが枯渇しているため、Montrealを選択
※2024/9/28 時点でリソースが確保できるかは不明
- 具体的な手順の詳細は[こちら](https://docs.oracle.com/ja-jp/iaas/content-management/doc/create-and-activate-oracle-cloud-account.html)。

### ローカル環境の構築
#### 構築時のローカル環境情報
- マシン：Mac mini M2チップ
- macOS：Sonoma系

#### OCIコマンド（CLI）のインストール
- 自分の場合はMacだったので`brew`でインストール
- 具体的な手順の参考ページは[こちら](https://docs.oracle.com/ja-jp/iaas/Content/API/SDKDocs/cliinstall.htm#InstallingCLI__macos_homebrew)。

#### CLIの設定
- セットアップ用のコマンドを打ち込み、作成したOCIアカウントの情報を入力していく
- 具体的な手順の参考ページは[こちら](https://blog.1q77.com/2020/12/setup-oci-command/)
- 設定時に作成した API key と fingerprint は後続作業で使うので保管しておく

#### terraformのインストール
- `brew`で`tfenv`（`terraform`のバージョン管理ツール）をインストール
- `tfenv`で欲しい`terraform`のバージョンをインストール。自分の場合は特に条件やこだわりがなかったため、最新バージョンをインストールした。
- 具体的な手順の参考ページは[こちら](https://qiita.com/reoring/items/dc42f7b60f0d0ce3a97f)

#### kubectlのインストール
- ローカルからOKE環境を操作するために、ローカルに`kubectl`をインストール
- 自分の場合は簡単のために`brew`でインストールした
- 具体的な手順の参考ページは[こちら](https://kubernetes.io/ja/docs/tasks/tools/install-kubectl-macos/#install-kubectl-on-macos)

### OKEクラスタ用のterraformコードの作成
[githubのリポジトリ](https://github.com/yamamuratkr/terraform_oke_Ampere_A1)に自分が構築した際の`terraform`のコードを用意したため、`git clone`してterraformコードを入手

### terraformの実行（OKEクラスターの構築）
- terraformのコマンドを実行してOKE環境を構築する。`terraform apply`が完了するまでは5分ほどかかる。
- 使い方の詳細は[githubのリポジトリREADME](https://github.com/yamamuratkr/terraform_oke_Ampere_A1)の「使い方」を参照

### kubectl のセットアップ
- ローカルマシンから OKE クラスターにアクセスするために`kubectl`を設定する
- OCI CLI を利用して`kubeconfig`ファイルを取得し、ローカル環境に配置することで、`kubectl`コマンドを使ってクラスターに接続可能
- ターミナルで以下のコマンドを実行し、`kubectl`の設定と動作確認
```
# kubectlの設定
oci ce cluster create-kubeconfig --cluster-id <CLUSTER_OCID> --file $HOME/.kube/config  --region ca-montreal-1 --token-version 2.0.0  --kube-endpoint PUBLIC_ENDPOINT

# 動作確認
kubectl get nodes
# 以下のようにノードの情報が取得できれば設定完了
NAME         STATUS   ROLES   AGE    VERSION
10.0.1.117   Ready    node    457d   v1.26.2
10.0.1.178   Ready    node    457d   v1.26.2
10.0.1.5     Ready    node    457d   v1.26.2
10.0.1.99    Ready    node    457d   v1.26.2
```

## アプリケーションのデプロイ
- クラスターが動作していることを確認したら、サンプルアプリケーションをデプロイして実際の動きを確認する
- ここでは例として、公式の Nginx イメージを使ってデプロイしてみる
```
# NginxのPODを起動
kubectl create deployment nginx --image=nginx

# NginxにHTTP接続するためのロードバランサー構築
kubectl expose deployment nginx --port=80 --type=LoadBalancer
※このコマンドだとLBのスペックを指定していないため、有料版が作成されてしまう可能性あり
```
- これでインターネットからアクセス可能な Nginx PODとロードバランサーが OKE クラスター上にデプロイされる
- OCIコンソールにログインし、ロードバランサーの IP アドレスを取得して、ブラウザで接続するとNginxのランディングページが表示される

## セキュリティの観点で追加した方がいい設定
### ingress security rule の接続元IPの限定
- 用意した`terraform`コードでも`ingress security rules`は設定しているが、全IPに対して解放している
- 接続元IPが確定している場合は、そのIPだけ許可するよう設定をするとより強固になる

### Identity Policies と User Groupの設定
- いわゆるUserとRoleの設定
- OCI アカウント開設時のユーザは全てを更新できてしまうため、通常の運用では使わない
- 目的に合ったユーザとグループを作成し、グループに適切な権限を設定することで、必要最小限の権限の設定が可能となる
- Identity Policies と User Group も`terraform`を使えるので、設計書の整備を省きたい場合はterraformでの管理だと管理対象が減るため楽

## まとめ
- OCI の Free Tier枠 を利用して OKE クラスターを構築する方法
- Kubernetes の学習や、小規模なビジネスの利用には十分なリソースを無料で提供してくれる
- さらに多機能な他のクラウド機能（Logging、DB、オブジェクトストレージ、etc）と組み合わせることで、無料で更に幅が広がる点も魅力的
- とりあえず動かせる環境を構築することを目的としたため、セキュリティ周りは改善点が残っている。なので、ビジネス目的の本番環境として利用する場合は、追加の設定が必要になる。