containerdとkubeadmを使用してkubernetesを構築①

## 環境
- ubuntu：22.0.4.1 LTS
- kubernetes：1.28.2


## 要件確認
公式ドキュメントより確認

https://kubernetes.io/ja/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

以下、抜粋。ここでは、Swapのオフについてのみ記載します。
（Swapについては、v1.22以降では有効でも使用できるらしいです（後述）。）

> - 1台あたり2GB以上のメモリ(2GBの場合、アプリ用のスペースはほとんどありません)
> - 2コア以上のCPU
> - クラスター内のすべてのマシン間で通信可能なネットワーク(パブリックネットワークでもプライベートネットワークでも構いません)
> - ユニークなhostname、MACアドレス、とproduct_uuidが各ノードに必要です。詳細はここを参照してください。
> - マシン内の特定のポートが開いていること。詳細はここを参照してください。
> - Swapがオフであること。kubeletが正常に動作するためにはswapは必ずオフでなければなりません。

※Swapを使用する場合はKubeletConfigurationで修正できるようです。
（動作確認はできていないです。）

https://kubernetes.io/ja/docs/concepts/architecture/nodes/#swap-memory

## swapのオフ
### /etc/fstabの修正
以下をコメントアウトする
```diff:/etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/ubuntu-vg/ubuntu-lv during curtin installation
/dev/disk/by-id/dm-uuid-LVM-TyqXbx0yg0a711NQgPrCGSXBSnt6VFU4b995cVb1DSgP2k6GwyyHlQFPDxhfMKrU / ext4 defaults 0 1
# /boot was on /dev/sda2 during curtin installation
/dev/disk/by-uuid/c2cc52fd-0ac5-41c9-91d2-e17ec2687ec9 /boot ext4 defaults 0 1
- /swap.img      none    swap    sw      0       0
+ #/swap.img      none    swap    sw      0       0
```
### 再起動
再起動を実行
```cmd
sudo reboot
```
### 確認
swap領域を確認する
```cmd
free -h
```

<details>
<summary>出力例</summary>
<div>

```cmd
               total        used        free      shared  buff/cache   available
Mem:           3.8Gi       305Mi       2.3Gi       1.0Mi       1.2Gi       3.3Gi
Swap:             0B          0B          0B
```
</div>

</details>


## コンテナランタイム用の設定
 ```cmd
 cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# カーネルパラメーターの設定
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

# カーネルパラメーターを適用
sudo sysctl --system
```

### 確認 - モジュール
以下のコマンドで、モジュールが読み込まれていることを確認する。

```cmd
lsmod | grep br_netfilter
```
<details>
<summary>出力例</summary>
<div>

```cmd
br_netfilter           32768  0
bridge                307200  1 br_netfilter
```
</div>

</details>


```cmd
lsmod | grep overlay
```

<details>
<summary>出力例</summary>
<div>

```cmd
overlay               151552  0
```
</div>

</details>


### 確認 - カーネルパラメータ
以下のコマンドで、カーネルパラメータが反映されていることを確認します。

```cmd
sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables 
```

<details>
<summary>出力例</summary>
<div>

```cmd
net.ipv4.ip_forward
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
```
</div>

</details>


## containerdのインストール
コンテナランタイムには、containerdを使用します。
インストール方法はいくつかありますが、ここではDockerより配布されているcontainerd.ioをインストールします。その他の方法についても*getting-started.md*に記載があります。

https://github.com/containerd/containerd/blob/main/docs/getting-started.md

### aptレポジトリの追加
以下の一連のコマンドでレポジトリを追加します。
```cmd
# GPG鍵を追加
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# レポジトリを追加
echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
```
### container.ioのインストール
```cmd
sudo apt-get install containerd.io
```

### configの作成、修正
公式ドキュメントを確認すると、kubelet用のcgroupドライバーにsystemdに設定する際は、コンテナランタイムのcgroupドライバーもsystemdに変更する必要があります。
>kubelet用のcgroupドライバーとしてsystemdを設定する場合、コンテナランタイムのcgroupドライバーにもsystemdを設定する必要があります。 具体的な手順については、以下のリンクなどの、お使いのコンテナランタイムのドキュメントを参照してください。

はじめに以下のコマンドで、デフォルトのコンフィグを作成できます。
```cmd
containerd config default > /etc/containerd/config.toml
```

上記で作成したファイルを以下のように修正します。
後にkubenetesを起動する際は、kubeletのcgroupドライバーの設定をする。
加えて、デフォルトのままだと、以下のエラーが出るので、sandboxのバージョンを変更する。
```cmd
W1110 12:27:27.248837 1905882 checks.go:835] detected that the sandbox image "registry.k8s.io/pause:3.6" of the container runtime is inconsistent with that used by kubeadm. It is recommended that using "registry.k8s.io/pause:3.9" as the CRI sandbox image.
```

```diff:/etc/containerd/config.toml
  [plugins."io.containerd.grpc.v1.cri"]
-   sandbox_image = "registry.k8s.io/pause:3.6"
+   sandbox_image = "registry.k8s.io/pause:3.9"
...
           [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.opti    ons]
-            SystemdCgroup = false
+            SystemdCgroup = true
```

containerdの再起動
```cmd
sudo systemctl restart containerd
```

## cniプラグインのインストール
以下のアーカイブをダウンロードする
- cni-plugins-linux-amd64-v1.3.0.tgz

```cmd
wget https://github.com/containernetworking/plugins/releases/download/v1.3.0/cni-plugins-linux-amd64-v1.3.0.tgz
```
インストール
```cmd
sudo mkdir -p /opt/cni/bin
sudo tar Cxzvf /opt/cni/bin cni-plugins-linux-amd64-v1.3.0.tgz
```

## kubeadm, kubelet, kubectlのインストール

### aptレポジトリの追加
```cmd
# 必要なパッケージをインストール
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
# Google Cloudの公開鍵をダウンロード
curl -fsSL https://dl.k8s.io/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg
# レポジトリを追加
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
```

### kubernetesに必要なソフトウェアをインストール
kubectlは必要に応じてインストールする。

```cmd
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
```

以上で準備は完了です。
次回は、kubeadmを使用してkubernetesを構築していきます。

https://qiita.com/ktog/items/997c4c7da54385a21c31