kubeadmを用いたk8sインストールメモ(containerd + calico)

に公開

この記事はなんですか

自宅クラウド(Proxmox)上にKubernetesクラスタを構築するためのメモです。

この作業のモチベーションはなんですか

kubernetesを学習し、普段SaaSに頼っていたものをOSSを用いて自宅でホスティングする足がかりとするための基盤構築を行います。kubernetesクラスタの構築はkubeadm、dockerコンテナのバックエンドとしてcontainerd、コンテナ間通信としてCalicoを利用します。

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

https://jaco.udcp.info/entry/2020/12/03/172843

https://containerd.io/

https://www.tigera.io/project-calico/

事前準備

IPアドレスが固定された適当なlinuxサーバを3台。今回は以下の構成で行いますが、オンプレでもクラウドでも構わないです。この記事ではubuntuを利用しているためdebian系以外の場合はapt等読み替えが発生する場合があります。

ノード一覧

ホスト名 役割 IPアドレス OS スペック
epi1-k8s-m1 管理ノード(master) 192.168.xxx.aaa Ubuntu 24.04.1 LTS Server 4コア,8GB,128GB
epi1-k8s-w1 ワーカーノード(worker-1) 192.168.xxx.bbb 同上 同上
epi1-k8s-w2 ワーカーノード(worker-2) 192.168.xxx.ccc 同上 同上

作業イメージ

proxmox上のサーバに対してSSHでログインして作業します。全サーバで行うものとワーカーノードのみで行う作業に別れます。

全ノードで実行

OS 設定

  • hostsファイル編集
sudo vi /etc/hosts
  • 以下を追記
# Kubernetes Clusters
192.168.xxx.aaa    epi1-k8s-m1
192.168.xxx.bbb    epi1-k8s-w1
192.168.xxx.ccc    epi1-k8s-w2
  • スワップを無効化
sudo sudo swapoff -a
  • スワップを恒久的に無効化
sudo vi /etc/fstab
  • 以下をコメントアウト
/swap.img      none    swap    sw      0       0
  • カーネルモジュールの設定ファイル作成
sudo vi /etc/modules-load.d/containerd.conf
# cat /etc/modules-load.d/containerd.conf
overlay
br_netfilter
  • カーネルモジュールの有効化
sudo modprobe overlay
sudo modprobe br_netfilter
  • kubernetesのconfigにカーネルパラメータ設定
sudo vi /etc/sysctl.d/k8s.conf
# cat /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
  • カーネルパラメータ反映
sudo sysctl --system
  • カーネルパラメータ反映確認
    • 全コマンドの出力結果末端行を確認する
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1

Kubernetes関連コンポーネントの設定

  • Dockerアンインストール

    • デフォルトではインストールされてなかったのでスキップ
  • 必要なコマンドのインストール

sudo apt install -y gnupg2 software-properties-common apt-transport-https ca-certificates
  • containerdパッケージ取得のためのgpgキーの取得
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/docker.gpg
  • containerdパッケージ取得のためのリポジトリ設定
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

Press [ENTER] to continue or Ctrl-c to cancel.--> [Enter]キーを押下

  • aptのリポジトリ有効化
sudo apt update
  • containerdインストール
sudo apt install -y containerd.io
  • containerd用Config生成
sudo containerd config default | sudo tee /etc/containerd/config.toml >/dev/null 2>&1
  • 一部書き換え
sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
  • conrainerd再起動
sudo systemctl restart containerd
  • containerd自動起動設定(いらないかも)
sudo systemctl enable containerd
  • kubernetes関連パッケージ取得用gpgキー設定
sudo curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
  • kubernetes関連パッケージ取得用gpgキーをaptに設定する
sudo 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
  • aptのリポジトリ有効化
sudo apt-get update
  • kubelet kubeadm kubectlのインストール
sudo apt-get -y install kubelet kubeadm kubectl
  • kubelet kubeadm kubectlのバージョン固定
sudo apt-mark hold kubelet kubeadm kubectl
  • kubelet自動起動設定(いらないかも)
sudo systemctl enable --now kubelet

マスターノードで実行

  • マスタノード初期構築(作成)
    • この構成ではPod間通信で10.244.0.0/20を利用します。
sudo kubeadm init --pod-network-cidr=10.244.0.0/20
  • ※以下のコマンドの出力結果はワーカーノード追加時に必要になるためメモしておくこと
sudo kubeadm join 192.168.xxx.aaa:6443 --token xxx.xxx \
        --discovery-token-ca-cert-hash sha256:xxxxxxxxx
  • kubectl用設定ファイル格納ディレクトリの作成
sudo mkdir -p $HOME/.kube
  • admin.confをコピーしてconfigを作成
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  • 設定ファイルの所有者を変更
sudo chown $(id -u):$(id -g) $HOME/.kube/config
  • 動作確認(一般作業ユーザーでkubectlが使用できればOK)
kubectl get node
NAME         STATUS     ROLES           AGE   VERSION
epi-k8s-m1   NotReady   control-plane   52s   v1.30.10
kubectl get pod -A
NAMESPACE     NAME                                 READY   STATUS    RESTARTS   AGE
kube-system   coredns-55cb58b774-8df2z             0/1     Pending   0          88s
kube-system   coredns-55cb58b774-zb296             0/1     Pending   0          88s
kube-system   etcd-epi-k8s-m1                      1/1     Running   0          103s
kube-system   kube-apiserver-epi-k8s-m1            1/1     Running   0          104s
kube-system   kube-controller-manager-epi-k8s-m1   1/1     Running   0          103s
kube-system   kube-proxy-bdkzc                     1/1     Running   0          88s
kube-system   kube-scheduler-epi-k8s-m1            1/1     Running   0          103s

ワーカーノードで実行

クラスタへjoinさせる (sudoを付けること)

sudo kubeadm join 192.168.xxx.aaa:6443 --token xxx.xxx \
        --discovery-token-ca-cert-hash sha256:xxxxxxxxx

マスターノードで実行

動作確認(ワーカーノードが追加されたことを確認する。この時点ではコンテナ間通信ができていないのでSTATUSはNotReadyである。)

kubectl get node
NAME         STATUS     ROLES           AGE     VERSION
epi-k8s-m1   NotReady   control-plane   4m23s   v1.30.10
epi-k8s-w1   NotReady   <none>          72s     v1.30.10
epi-k8s-w2   NotReady   <none>          14s     v1.30.10

コンテナ間通信の有効化(calicoを利用)

  • 作業時の最新バージョンは3.29.2でした。適宜読み替えてください。
  • calico quick start

https://docs.tigera.io/calico/latest/getting-started/kubernetes/quickstart

  • 今回はpod-network-cidrを10.244.0.0/20に変更しているためyamlを編集する必要がある

https://docs.tigera.io/calico/latest/reference/installation/api

  • Tigera Operatorの適用
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.29.2/manifests/tigera-operator.yaml
kubectl get pods -n tigera-operator
NAME                               READY   STATUS    RESTARTS   AGE
tigera-operator-6479d6dc54-xnxwk   1/1     Running   0          9s
  • calicoのマニフェストをダウンロードする
wget https://raw.githubusercontent.com/projectcalico/calico/v3.29.2/manifests/custom-resources.yaml
  • 編集する
vi custom-resources.yaml
  • cidrのIPアドレス指定を以下の内容に修正
spec:
  calicoNetwork:
    ipPools:
    - cidr: 10.244.0.0/20
  • 適用する
kubectl apply -f custom-resources.yaml
  • STATUSがReadyになりコンテナ間通信が有効になったことを確認する。
kubectl get node
NAME         STATUS   ROLES           AGE     VERSION
epi-k8s-m1   Ready    control-plane   9m2s    v1.30.10
epi-k8s-w1   Ready    <none>          5m51s   v1.30.10
epi-k8s-w2   Ready    <none>          4m53s   v1.30.10

以上。

Discussion