KubernetesをUbuntu22.04に構築

### Kubernetesとは？その意義と重要性

現代のソフトウェア開発において、システムのスケーラビリティや可用性、迅速なデプロイが求められる中で、コンテナ技術は急速に普及してきました。その中核となるツールが **Kubernetes** です。Kubernetes（クバネティス、略してK8s）は、Googleが開発を始めたオープンソースのコンテナオーケストレーションツールで、現在ではクラウドネイティブなアプリケーションの運用には欠かせない存在となっています。

#### Kubernetesを使う意義

1. **アプリケーションのスケーラビリティ**
   Kubernetesはアプリケーションの負荷に応じて自動的にリソースを調整し、スケールアップ・スケールダウンを実現します。これにより、トラフィックの急増や減少に柔軟に対応できます。

2. **可用性の向上**
   Kubernetesはアプリケーションの状態を常に監視し、障害が発生した場合には自動的に復旧を試みます。ノードやコンテナの障害時にも高い可用性を維持できるため、運用負荷が大幅に軽減されます。

3. **効率的なリソース利用**
   コンテナを効率的にスケジューリングすることで、サーバーリソースを最大限活用できます。これにより、インフラコストを削減しながら高パフォーマンスを維持することが可能です。

4. **一貫した環境の提供**
   開発、テスト、本番環境で同じ設定と動作を維持できるため、デプロイに伴う問題を大幅に削減します。また、複数のクラウドプロバイダーやオンプレミス環境にまたがるハイブリッド環境の運用も簡単になります。

5. **クラウドネイティブの実現**
   マイクロサービスアーキテクチャやDevOpsの実践を支援する基盤として、Kubernetesは非常に強力です。自動化と標準化を通じて、開発スピードの向上と運用の効率化を同時に実現します。

#### Ubuntu 22.04にKubernetesを構築する理由

UbuntuはLinuxディストリビューションの中でも信頼性が高く、コミュニティやドキュメントが豊富です。特にUbuntu 22.04 LTSは最新の技術と長期サポート（LTS）の両立が可能で、Kubernetesの運用基盤として最適です。

このような背景から、本記事ではUbuntu 22.04にKubernetesを構築する手順を詳しく解説します。初めてKubernetesを触れる方から、運用を始めたい方まで、幅広い読者にとって参考になる内容を目指しています。

次に進む準備はできましたか？構築の詳細に入っていきましょう！

# 手順
### Swap
```bash
sudo sed -i '/swap/d' /etc/fstab
sudo swapoff -a
```
### Kernel
```bash
# 起動時に読み込むカーネルモジュールの設定
cat <<EOF | sudo tee /etc/modules-load.d/containerd.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.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
vm.overcommit_memory                = 1
vm.panic_on_oom                     = 0
kernel.panic                        = 10
kernel.panic_on_oops                = 1
kernel.keys.root_maxkeys            = 1000000
kernel.keys.root_maxbytes           = 25000000
EOF
# カーネルパラメーターの設定を適用
sudo sysctl --system
```
### Containerd
```bash
# Dockerからcontainerdをインストール
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release
sudo mkdir -m 0755 -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list
sudo apt-get update
sudo apt-get install -y containerd.io
# containerdの設定
sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml
if grep -q "SystemdCgroup = true" "/etc/containerd/config.toml"; then
  echo "Config found, skip rewriting..."
else
  sudo sed -i -e "s/SystemdCgroup \= false/SystemdCgroup \= true/g" /etc/containerd/config.toml
fi
# 設定の適用
sudo systemctl restart containerd
```
### Kubernetes
```bash
# kubeadmなどをインストール
sudo apt-get install -y apt-transport-https
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
# 構成のconfigを作成
mkdir -p $HOME/.kube
cat <<EOF | tee $HOME/.kube/init_config.yaml
apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
bootstrapTokens:
- token: "$(openssl rand -hex 3).$(openssl rand -hex 8)"
  description: "kubeadm bootstrap token"
  ttl: "24h"
nodeRegistration:
  criSocket: "unix:///var/run/containerd/containerd.sock"
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
controllerManager:
  extraArgs:
    bind-address: "0.0.0.0" # Used by Prometheus Operator
scheduler:
  extraArgs:
    bind-address: "0.0.0.0" # Used by Prometheus Operator
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: "systemd"
protectKernelDefaults: true
EOF
# kubernetesを構築
sudo kubeadm init --config ~/.kube/init_config.yaml
# kubectlを使えるように設定
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
# helmをインストール
curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
# helmでcilium(cni)をインストール
helm repo add cilium https://helm.cilium.io/
helm install cilium cilium/cilium --namespace kube-system
```
### 最終確認
nodeの確認
```bash
kubectl get node
```
下のように表示されればOK！
```txt
NAME        STATUS   ROLES           AGE   VERSION
master-01   Ready    control-plane   1m   v1.30.2
```
podの確認
```bash
kubectl get pods -A
```
下のように表示されればOK！
シングルノードの時はciliumが１つPendingになっているのは正常です
```txt
NAMESPACE     NAME                                READY   STATUS    RESTARTS   AGE
kube-system   cilium-bgtn7                        1/1     Running   0          6m7s
kube-system   cilium-operator-65496b9554-fgcnz    1/1     Running   0          6m7s
kube-system   cilium-operator-65496b9554-s9x5t    0/1     Pending   0          6m7s
kube-system   coredns-7db6d8ff4d-7cx7n            1/1     Running   0          11m
kube-system   coredns-7db6d8ff4d-d56zn            1/1     Running   0          11m
kube-system   etcd-ap-hsg-01                      1/1     Running   0          11m
kube-system   kube-apiserver-ap-hsg-01            1/1     Running   0          11m
kube-system   kube-controller-manager-ap-hsg-01   1/1     Running   0          11m
kube-system   kube-proxy-mb4d9                    1/1     Running   0          11m
kube-system   kube-scheduler-ap-hsg-01            1/1     Running   0          11m
```

### 適宜設定
シングルノードだとmasterしかいないため、通常のdeploymentはスケジュールできないです。その制限を下のコマンドで外せます。
```bash
kubectl get node -o json \
  | jq '.items[].metadata.name' \
  | awk 'system("kubectl taint node "$1" node-role.kubernetes.io/control-plane:NoSchedule-")'
```

### まとめ
以上の手順で、Ubuntu 22.04にKubernetesを構築することができます。Kubernetesを利用することで、スケーラブルで安定したアプリケーション環境を構築でき、現代のクラウドネイティブな運用に対応する基盤を手に入れることが可能です。

今回紹介した内容をベースに、実際の運用シナリオに応じてさらなるカスタマイズやチューニングを行うことで、自社のニーズに最適化したKubernetesクラスタを構築してください。Kubernetesを活用し、より効率的で柔軟なインフラ運用を目指しましょう。