ZeroLoom

Kubernetes クラスターの構築手順

September 30, 2024
4 min read
Table of Contents

システム要件


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

参考資料