Skip to content
Published on

Ubuntu 22.04 に Kubernetes をインストールする方法 (kubeadm)

Authors
  • Name
    Twitter

Overview

Ubuntu 22.04にKubernetesをインストールする方法を解説します。 サーバーはmasterノード1台、workerノード2台で構成します。 Kubernetesのインストール手順は大きく以下の3つの作業に分けることができます。

  1. Container Runtimeのインストール
  2. cri-dockerdのインストール
  3. kubeadmによるKubernetesのインストール

Container Runtimeとして以下の4つから選択できます。

コンテナランタイムの詳細を見る

Container Runtime (Docker) のインストール

KubernetesのウェブサイトでサポートされているContainer Runtimeの中からDocker Engineを選択しました。

インストール前に、ポートが開いているか確認します。

nc 127.0.0.1 6443

旧バージョンのアンインストール

以下のコマンドで、以前にインストールされている可能性のあるDocker関連ファイルを削除します。

sudo apt-get remove docker docker-engine docker.io containerd runc

リポジトリのセットアップ

sudo apt-get update
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Dockerのインストール

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

Dockerインストールの確認

sudo docker run hello-world

以下のようなメッセージが表示されれば、正常にインストールされています。

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

cri-dockerdのインストール

KubernetesのエンジンとしてDockerを使用するには、cri-dockerdアダプターを必ずインストールする必要があります。cri-dockerdのドキュメントを参照してください。

su -を入力して、以下のコマンドをroot権限で実行します。

git clone https://github.com/Mirantis/cri-dockerd.git
# Run these commands as root
###Install GO###
wget https://storage.googleapis.com/golang/getgo/installer_linux
chmod +x ./installer_linux
./installer_linux
source ~/.bash_profile

cd cri-dockerd
mkdir bin
go build -o bin/cri-dockerd
mkdir -p /usr/local/bin
install -o root -g root -m 0755 bin/cri-dockerd /usr/local/bin/cri-dockerd
cp -a packaging/systemd/* /etc/systemd/system
sed -i -e 's,/usr/bin/cri-dockerd,/usr/local/bin/cri-dockerd,' /etc/systemd/system/cri-docker.service
systemctl daemon-reload
systemctl enable cri-docker.service
systemctl enable --now cri-docker.socket

以下のようなメッセージが表示されれば、正常にインストールされています。

Created symlink /etc/systemd/system/multi-user.target.wants/cri-docker.service/etc/systemd/system/cri-docker.service.
Created symlink /etc/systemd/system/sockets.target.wants/cri-docker.socket/etc/systemd/system/cri-docker.socket.

以下のコマンドでkubeadmをインストールします。

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

su -でroot権限を取得した後、masterノードで以下のコマンドを実行します。

kubeadm init --cri-socket unix:///var/run/cri-dockerd.sock --pod-network-cidr=10.244.0.0/16

init実行中に以下のようなメッセージが表示された場合、このブログを参照してDockerを再起動し、kubeadm reset --cri-socket unix:///var/run/cri-dockerd.sockコマンドで初期化してから、再度kubeadm init --cri-socket unix:///var/run/cri-dockerd.sockを実行します。

he HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error

kubeletはswapがオンになっていると起動できません。そのため、masterとworkerノードでsudo swapoff -aコマンドでswapをオフにします。 再起動時にもこの設定を反映するため、sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstabコマンドで/etc/fstabファイルのswap部分をコメントアウトします。

sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

kubeadm init実行時に以下のような文言が表示されれば、正常にインストールされています。

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

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

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.219.110:6443 --token 0yrk20.i10d95793j5d9z9a \
	--discovery-token-ca-cert-hash sha256:b1ff8a6681b2fa13029892xxxxxxxxxxxxxxxxx

以下のコマンドでネットワークアドオンのインストールを行います。様々なアドオンの中でflannelが最も多く使われているようなので、このアドオンを選択しました。

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

workerノードでjoinを実行します。

kubeadm join 192.168.219.110:6443 --token 0yrk20.i10d95793j5d9z9a \
    --discovery-token-ca-cert-hash sha256:b1ff8a6681b2fa13029892xxxxxxxxxxxxxxxxx \
    --cri-socket unix:///var/run/cri-dockerd.sock

masterノードでkubectl get nodesを入力すると、以下のようにworkerノードのステータスがReadyであることが確認できます。

$kubectl get nodes
NAME                              STATUS   ROLES           AGE   VERSION
master          Ready    control-plane   15m   v1.26.0
node1           Ready    <none>          32s   v1.26.0
node2           Ready    <none>          32s   v1.26.0

kubernetes open /run/flannel/subnet.env: no such file or directoryというメッセージとともにPodが作成されずハングする現象がありました。解決方法を参照して解決しました。 すべてのworkerノードに/run/flannel/subnet.envファイルを以下の内容で作成します。

/run/flannel/subnet.env
FLANNEL_NETWORK=10.244.0.0/16
FLANNEL_SUBNET=10.244.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true

以上で、kubeadmを利用したUbuntuへのKubernetesインストール方法についての記事を終わります。ありがとうございました。

kube-flannel PodがCrashLoopBackOff状態の場合、solutionを参照してkubectl patch node ノード名 -p '{"spec":{"podCIDR":"10.244.0.0/16"}}'を実行します。

kube-flannel   kube-flannel-ds-fg8lc             0/1     CrashLoopBackOff

その後に発生した問題は https://potato-yong.tistory.com/150 を参照して解決しました。

metrics-server deploymentに--kubelet-insecure-tlsの追加およびspec.template.specにhostNetwork: trueの追加で解決しました。

root@cubi01:~# kubectl top node cubi01
NAME     CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
cubi01   234m         5%     8696Mi          55%
root@cubi01:~# kubectl top node cubi02
NAME     CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
cubi02   46m          1%     6730Mi          42%

reference