⚓
kubeadmを用いたk8sインストールメモ(containerd + calico)
この記事はなんですか
自宅クラウド(Proxmox)上にKubernetesクラスタを構築するためのメモです。
この作業のモチベーションはなんですか
kubernetesを学習し、普段SaaSに頼っていたものをOSSを用いて自宅でホスティングする足がかりとするための基盤構築を行います。kubernetesクラスタの構築はkubeadm、dockerコンテナのバックエンドとしてcontainerd、コンテナ間通信として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
- 今回はpod-network-cidrを10.244.0.0/20に変更しているためyamlを編集する必要がある
- 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