servermemoのブログ

サーバー構築の手順をまとめる予定です。

UbuntuでkubeadmでKubernetesクラスターを構築

要件

このガイドは次のバージョンのUbuntu(の最新版)で動作確認をしています。

  • Ubuntu 18.04.6 LTS
  • Ubuntu 20.04.4 LTS
  • Ubuntu 22.04LTS (cgroup V1設定に変更が必要。詳細は後述)

現在の私の推奨はUbuntu 20.04.4 LTSです。

本ガイドでは Kubernetes 1.24.1をインストールする例を示しています。

SWAPのオフ

Swapパーティションコメントアウト、およびswapoffを実行します。

sudo vi /etc/fstab 
sudo swapoff -a

初期設定とランタイムのインストール

本例ではcontainerdをインストールします。UbuntuではUbuntu Archives版のcontaienrdパッケージとDockerリポジトリーに含まれるcontaienrd.ioパッケージのいずれかを使って、Ubuntuにcontainerdをインストールできます。Dockerリポジトリーに含まれる方が、新しいバージョンが使えるのでおすすめです。

まず、こちらに書かれている事前設定をそれぞれ行います。

sudo -i

cat > /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF

modprobe overlay
modprobe br_netfilter

cat > /etc/sysctl.d/99-kubernetes-cri.conf <<EOF
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

sysctl --system
exit

Ubuntu 22.04ではCgroup v2を無効化してください。設定変更後、再起動が必要です(Ubuntu 22.04以前のバージョンでは不要です)。

tech.virtualtech.jp

次に従って、リポジトリーの有効化を行います。

docs.docker.com

インストールは次のように行います。

sudo apt-get update 
sudo apt-get install -y containerd.io

その後、containerdの設定の作成と必要に応じて設定の変更、containerdサービスの再起動を行います。

sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml
sudo systemctl restart containerd

kubeadmツールなどのインストール

公式のInstalling kubeadmに従って、リポジトリーの有効化を行います。

手元の環境ではインストール済みでしたが、インストールされていない場合は導入します。

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl

Google Cloudの公開署名キーをダウンロードします。

sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg

Kubernetes aptリポジトリーの追加を行います。

echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

kubeadm,kubelet,kubectlのインストールとバージョンの固定を行います。

sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

Tips バージョンを指定する場合

アプリケーションの都合で特定のバージョンが必要な場合は次のように指定してインストールします。ただし、Kubernetesは最新版を使うのを最も推奨します。

sudo apt-get update
sudo apt-get install -y kubelet=1.24.1-00 kubeadm=1.24.1-00 kubectl=1.24.1-00
sudo apt-mark hold kubelet kubeadm kubectl

kubeadmツールでクラスターの作成

次のようなオプションを追加して、クラスターを作成します。

sudo kubeadm init --kubernetes-version 1.24.1 --pod-network-cidr=10.244.0.0/16 --control-plane-endpoint=<Public IP Address>

--kubernetes-version は、バージョンを指定します。指定できるバージョンにはある程度上限、下限があります。適切なkubeadmツールの導入が必要です。 --pod-network-cidr は、Podに割り当てるネットワークの範囲を定義するものです。ネットワークプラグイン(CNIとも呼ぶ)を追加する際に必要な範囲です。CNIをインストールするときにCNI側の設定を変更するか、クラスター作成時に後々インストールするCNIに合わせて設定をしておく必要があります。現在利用中のCIDRを指定しないように気をつけます。 --control-plane-endpoint は、Kubernetes APIなどが使うエンドポイントIPアドレスです。ホストのeth0とかのアドレスを設定すれば良いでしょう。決してグローバルIPアドレスを指定しないよう気をつけます。

上記を実行すると処理が始まります。最終的にクラスターが作成されるとYour Kubernetes control-plane has initialized successfully!と表示され、この後することが出力されます。

まず、kubectlコマンドを使えるようにするために、kubeconfigの設定を行います。

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

ノードを追加してマルチクラスター構成にする場合は、別のサーバーで出力されたkubectl join行のコマンドを実行します。 ちなみにここで示されたトークンキーには期限があり、数日経ってからノードを追加しようとしてもうまくいきません。

新しいトークンは kubeadm token create --print-join-commandで作成できます。これをkubectl joinの実行時に指定します。

1台目のマシンでPodをスケジューリングできるようにするには次のコマンドを実行します。

kubectl taint nodes --all node-role.kubernetes.io/control-plane- node-role.kubernetes.io/master-

クラスターネットワークの適用

Kubernetesクラスターにネットワークアドオンを追加します。 利用できるネットワークアドオンの代表的なものはアドオンのインストールにまとめられています。

Flannelの場合はGitHub flannelにあるように、次のように実行します。CIDRは10.244.0.0/16が要件です。どちらかを適切なものに合わせます。

kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

クラスターでPodを作ってみる

構築したクラスターでPodが作成できるか試してみます。

#Deploymentを作成
kubectl create deployment hello-node --image=k8s.gcr.io/echoserver:1.4

#Deploymentを確認
kubectl get deployment

#作成したDeploymentを削除
kubectl delete deployment hello-node

以上でUbuntuでkubeadmを使ったKubernetesクラスタの構築は完了です。