システム要件

SWVersion
Ubuntu Server22.04
kubectl1.27.3
kubeadm1.27.3
containerd(CRI)1.6.8
Calico(CNI)3.25.1
HWSpecCount
CPU16 core2
RAM32 GB1
Storage128 GB1

事前準備

  1. apt パッケージリストを更新
bash
sudo apt update
  1. swap を無効化
bash
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

処理されていない場合は以下の該当行をコメントアウト

bash
sudo vi /etc/fstab
/etc/fstab
# /swap.img	none	swap	sw	0	0
  1. containerd 用のカーネルモジュールをシステムに反映
bash
sudo tee /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF
bash
sudo modprobe overlay
sudo modprobe br_netfilter
  1. Kubernetes 用のカーネルパラメータを設定
bash
sudo tee /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
  1. カーネルパラメータの設定を反映
bash
sudo sysctl --system

containerd(Container Runtime Interface)をインストール

  1. apt パッケージをインストール & リポジトリを追加
bash
sudo apt install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/docker.gpg
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt update
sudo apt install -y containerd.io

バージョンを指定してインストールする場合

bash
sudo apt install -y containerd.io=1.6.8-1
  1. containerd 用の設定を作成
bash
containerd config default | sudo tee /etc/containerd/config.toml >/dev/null 2>&1
  1. cgroup の管理を systemd に委譲する設定を追加
bash
sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
  1. containerd サービスの自動起動を有効化
bash
sudo systemctl restart containerd
sudo systemctl enable containerd
sudo systemctl status containerd.service

Kubernetes をインストール

  1. apt パッケージをインストール & リポジトリを追加
bash
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/kubernetes-xenial.gpg
sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
bash
sudo apt-get update && sudo apt-get install -y apt-transport-https gnupg2
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubectl

2023年09月からリポジトリが変更されているため以下を確認

  • /etc/apt/sources.list に以下のリポジトリが定義されている
/etc/apt/sources.list
deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main

リポジトリ変更後にインストールする場合

bash
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.32/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.32/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
  1. /etc/apt/sources.list.d 配下に xx_kubernetes_io_-jammy.list のようなファイルが存在し、以下のリポジトリが定義されている
/etc/apt/sources.list.d
deb http://apt.kubernetes.io/ kubernetes-xenial main

pkgs.k8s.io に変更する必要がある可能性有り

Kubernetes.io - Kubernetes Legacy Package Repositories Will Be Frozen On September 13, 2023

Kubernetes クラスターを構築

  1. クラスターを初期化
bash
sudo kubeadm init --control-plane-endpoint=<192.168.xx.xx>:6443 --pod-network-cidr=10.0.0.0/16 --upload-certs
  1. Kubeadm/Kubectl コマンドの設定を有効化
bash
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
  1. コマンドを確認
bash
kubectl get pod,svc -A -o wide
kubectl cluster-info
kubectl get nodes
  1. クラスターネットワークの設定
bash
curl -O https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/calico.yaml
sudo vi calico.yaml
calico.yaml
  - name: IP
    value: "autodetect"
+ - name: IP_AUTODETECTION_METHOD
+ value: "cidr=192.168.xx.0/24"
calico.yaml
- # - name: CALICO_IPV4POOL_CIDR
- #   value: "192.168.0.0/16"
+ - name: CALICO_IPV4POOL_CIDR
+   value: "10.0.0.0/16"
  1. ネットワーク設定をクラスターに適用
bash
kubectl apply -f calico.yaml
  1. クラスターの状態を確認
bash
kubectl get pod,svc -A -o wide
kubectl get pods -n kube-system
  1. ワーカーノードを追加(ワーカーノードで実行
bash
sudo kubeadm join 192.168.xx.xx:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>
  1. crictl のエンドポイントを containerd に変更
bash
sudo vi /etc/crictl.yaml
/etc/crictl.yaml
runtime-endpoint: unix:///var/run/containerd/containerd.sock
  1. crictl コマンドが実行できることを確認
bash
sudo crictl images

動作確認

  1. Nginx 用の Pod / Container を作成
bash
kubectl create deployment nginx-app --image=nginx --replicas=2
kubectl get pod,svc -A -o wide
kubectl expose deployment nginx-app --type=NodePort --port=80
kubectl get svc nginx-app
kubectl describe svc nginx-app
curl http://192.168.xx.xx:32631

その他

--control-plane と --certificate-key オプションの使い方について
まず、--control-plane オプションは、追加するノードをコントロールプレーンノード(マスターノード)としてクラスターに参加させる場合に使用します。
通常、kubeadm join コマンドを使用してノードを追加する場合、そのノードはワーカーノード(コントロールプレーンコンポーネントを持たないノード)として追加されます。
 
しかし、--control-plane オプションを指定することで、そのノードはコントロールプレーンノード
(APIサーバー、コントローラーマネージャー、スケジューラーなどのコントロールプレーンコンポーネントを持つノード)としてクラスターに参加します。
 
一方、--certificate-key オプションは、kubeadm init または kubeadm init phase upload-certs --upload-certs コマンドの実行結果として表示される秘密鍵を指定します。
このキーは、追加のコントロールプレーンノードがクラスターに参加する際に、既存のコントロールプレーンノードから必要な証明書を安全にコピーするために使用されます。
 
したがって、--control-plane --certificate-key を付与して kubeadm join コマンドを実行する場合、
そのノードはコントロールプレーンノードとしてクラスターに追加され、--certificate-key で指定した秘密鍵を使用して、既存のコントロールプレーンノードから必要な証明書をコピーします。
 
これに対して、これらのオプションを付与せずに kubeadm join コマンドを実行する場合、そのノードはワーカーノードとしてクラスターに追加されます。
  • シングルノード運用を行う場合はコントロールプレーンノードの taint を無効化

    bash
    kubectl taint nodes <node_name> node-role.kubernetes.io/control-plane:NoSchedule-
  • コントロールプレーンノードの kubelet によって使用される cgroup ドライバーの設定

    bash
    sudo vi /etc/default/kubelet
    /etc/default/kubelet
    KUBELET_EXTRA_ARGS=--cgroup-driver=<value>
    bash
    systemctl daemon-reload
    systemctl restart kubelet

参考資料