EC2(Amazon Linux 2023)にkubeadmでkubernetesクラスターを構築してみる(node準備編)

ubuntu・CentOS・Amazon Linux2でkubernetesクラスターを構築した記事は多くありますが、Amazon Linux2023(FedoraベースOS)では少ない気がしたので、kubernetesクラスターの仕組み理解と共にnode準備編、mater-node編とworker-node編の全3回に分けて構築してみたいと思います。

## 構成図
![構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96623/611ce8e5-3e94-4ab4-7fef-adcc54803be5.png)

## 環境
- vpc CIDR: 10.0.0.0/21
- os: Amazon Linux2023
- インスタンスタイプ
    - master-node: t3.small
    - worker-node: t3.medium
- ECSボリューム(master node): 
    - master node: 10GB
    - worker node: 20GB
- kubernetes version: v1.27
- コンテナランタイム: containerd (v1.7.11)

※[インスタンスタイプを選定するのに参考にしたドキュメント](https://kubernetes.io/ja/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#%E5%A7%8B%E3%82%81%E3%82%8B%E5%89%8D%E3%81%AB)

## 作業内容
1. セキュリティグループを２つ作成する
    1. master-node用のセキュリティグループを作成する
    1. worker-node用のセキュリティグループを作成する
    1. master-node用のセキュリティグループにwoker-nodeのネットワークインターフェイスを追加する
1. master-nodeを作成する
1. worker-nodeを作成する
1. 各Nodeのhostを変更する(option)

## 1. セキュリティグループを２つ作成する
master-nodeとworker-nodeのセキュリティグループは使い回しでも検証なら問題ないのですが、今回はmaster-nodeとworker-nodeでそれぞれで解放すべきPortを理解する為に別々に作成します。
[公式ドキュメント](https://kubernetes.io/ja/docs/reference/networking/ports-and-protocols/)には以下のような表があります。

![Screen Shot 2023-12-18 at 9.45.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96623/e30b25e6-aea0-99fe-9d59-4308ae4c9f58.png)

今回は必要最低限なPortのみを解放する方針で以下のように設定します。

- master-node
    - 6443 (woker-nodeがkubernetes APIと通信する為に解放します)
    - 10250 (woker-nodeにmetrics-serverをdeployした場合などにkubelet APIと通信する為に解放します)
- worker-node
    - 10250 (master-nodeがwoker-nodeのkubelet APIと通信する為に解放します)
    - 30000-32767 (nodePortとして解放します、ターゲットグループのPortとかになります)

他の表に記載されているポートはmaster-node内での通信となるので特にPortは解放しませんが、インストールするPluginに合して適時解放して下さい。


### 1-1. master-node用のセキュリティグループを作成する
1. kubernetesクラスターを構築するのにSSHをしないといけないので22ポートを解放して下さい。ソースは`0.0.0.0`でもいいですし、接続元が自宅からのみなら自宅の**GIP**でも問題ないです。

![Screen Shot 2023-12-18 at 9.59.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96623/ce4b5f2f-78d2-7341-6040-75b2c022a275.png)

### 1-2. worker-node用のセキュリティグループを作成する
ここで作成したセキュリティグループはwoker-node共通で使う想定です。

1. 1-1で作成したセキュリティグループidをコピーする
1. 30000-32767ポートをソースをvpc CIDRにし解放する
1. 10250ポートをソースを**1-1で作成したセキュリティグループid**にし解放する
1. 22ポートをソースを**1-1で作成したセキュリティグループid**にし解放する

※ ソースをセキュリティグループidに設定しているのは**セキュリティグループに関連付けられたネットワークインターフェイス**単位でトラフィック許可を管理しworker-nodeが増えた場合にも増えたwoker-nodeのipを随時セキュリティグループに追加する手間を省く為になります。

![Screen Shot 2023-12-18 at 10.02.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96623/aa11b076-f9c0-45cc-c817-d7789e692df7.png)

### 1-3. master-node用のセキュリティグループにwoker-nodeのネットワークインターフェイスを追加する
1. 2-1で作成したセキュリティグループidをコピーする
1. 10250ポートをソースを**2-1で作成したセキュリティグループid**にし解放する
1. 6443ポートをソースを**2-1で作成したセキュリティグループid**にし解放する

![Screen Shot 2023-12-18 at 10.15.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96623/0fc5ada8-8b30-2f0f-53f8-dc945f9eafe4.png)

## 2. master-nodeを作成する

1. 名前とタグ: 任意の名前
1. Application and OS Images: Amazon Linux 2023 AMI
1. アーキテクチャ: 64ビット(x86)
1. インスタンスタイプ: t3.small
1. キーペア: 任意のキーペア
1. ネットワーク
    1. VPC: 任意のVPC
    1. サブネット: 任意のpublic subnet
    1. パブリック IP の自動割り当て: 有効化
    1. ファイアウォール (セキュリティグループ): ファイアウォール (セキュリティグループ)を選択し、1-1で作成したセキュリティグループを選択する
1. ストレージを設定: 10GB

## 3. worker-nodeを作成する
アプリケーションを稼働させる想定で、インスタンスタイプとストレージを設定をmaster-nodeより少し上げます。

1. 名前とタグ: 任意の名前
1. Application and OS Images: Amazon Linux 2023 AMI
1. アーキテクチャ: 64ビット(x86)
1. インスタンスタイプ: t3.medium
1. キーペア: 任意のキーペア
1. ネットワーク
    1. VPC: 任意のVPC
    1. サブネット: 任意のprivate subnet
    1. パブリック IP の自動割り当て: 無効化
    1. ファイアウォール (セキュリティグループ): ファイアウォール (セキュリティグループ)を選択し、2-1で作成したセキュリティグループを選択する
1. ストレージを設定: 20GB


## 4. 各Nodeのhostを変更する(option)
EC2の場合hostnameは`ip-xxx-xxx-xxx-xxx.ap-northeast-1.compute.internal`みたいになっており、kubernetesクラスター作成要件の**ユニークなhostname**は満たしていますが、変更したい方向けに変更方法も記載します。※ 変更しなくても問題はありません

- hostnameの変更
```bash
$ hostnamectl set-hostname master-node
```
- hostsへ自ホストを追加
```bash
$ vim /etc/hosts

#vim editerが開いたら
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost6 localhost6.localdomain6
#以下追加
<private_ip> master-node
```
- os再起動
※ コンソールからでも大丈夫です。
```
$ shutdown -r now
```
※ woker-nodeのhostnameを変更したら忘れずにmster-nodeの`/etc/hosts`に追加をして下さい。

```bash
$ vim /etc/hosts

#vim editerが開いたら
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost6 localhost6.localdomain6
#以下追加
<worker_node_private_ip> <worker_node_hostname>
```

## まとめ
今回はnode準備編として、master-nodeとworker-nodeのインスタンスを構築しました。
本番運用も想定しセキュリティー的に必要最低限のポートを判断する過程でコンポーネント間の通信理解が深まりました。
次回から今回構築したnodeにkubernetesクラスターを構築していきたいと思います。