- Authors
- Name
Overview
Ubuntu 22.04にKubernetesをインストールする方法を解説します。 サーバーはmasterノード1台、workerノード2台で構成します。 Kubernetesのインストール手順は大きく以下の3つの作業に分けることができます。
- Container Runtimeのインストール
- cri-dockerdのインストール
- 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ファイルを以下の内容で作成します。
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%