Rocky Linuxのシングルマスタークラスターへワーカーノードを追加してみた

概要

こんにちは。

前回、 Rocky Linux release 8.5 (Green Obsidian) に対してkubernetesをインストールし、シングルマスタークラスターを構築しました。

今回は、シングルマスタークラスターに対して、ワーカーノードを追加していきます。

すべてのコマンドは管理者権限で操作しております。

前回の記事は、こちら( Rocky Linuxにシングルマスタークラスターの構築をしてみた )になります。

Dockerインストール

Selinux無効化

getenforce コマンドで Disabled になっていない場合、Selinuを無効化します。

無効化後、サーバ再起動を実施し、再度、 getenforce コマンドで確認し、 Disabled になっていることを確認します。

reboot

→サーバ再起動

getenforce

リポジトリ追加

dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

Adding repo from: https://download.docker.com/linux/centos/docker-ce.repo

docker-ce-stableが追加されたことが確認出来ます。

dnf repolist

repo id                                                              repo の名前
appstream                                                            Rocky Linux 8 - AppStream
baseos                                                               Rocky Linux 8 - BaseOS
docker-ce-stable                                                     Docker CE Stable - x86_64
extras                                                               Rocky Linux 8 - Extras

インストール

mastr側のdockerとバージョンを合わせますので、事前に docker --version コマンドで確認しておきます。

筆者環境では、 Docker version 20.10.12, build e91ed57 でした。

利用可能なバージョン一覧を確認します。

dnf list docker-ce.x86_64 --showduplicates | sort -r

・
・[中略]
・
docker-ce.x86_64                3:20.10.12-3.el8                docker-ce-stable
・
・[中略]
・

dnf install docker-ce-<有効なバージョン文字列> でインストール可能なのでインストールします。

dnf install docker-ce-3:20.10.12-3.el8

・
・[中略]
・
インストール済み:
  container-selinux-2:2.167.0-1.module+el8.5.0+710+4c471e88.noarch            containerd.io-1.4.12-3.1.el8.x86_64
  docker-ce-3:20.10.12-3.el8.x86_64                                           docker-ce-cli-1:20.10.12-3.el8.x86_64
  docker-ce-rootless-extras-20.10.12-3.el8.x86_64                             docker-scan-plugin-0.12.0-3.el8.x86_64
  fuse-common-3.2.1-12.el8.x86_64                                             fuse-overlayfs-1.7.1-1.module+el8.5.0+710+4c471e88.x86_64
  fuse3-3.2.1-12.el8.x86_64                                                   fuse3-libs-3.2.1-12.el8.x86_64
  iptables-1.8.4-20.el8.x86_64                                                libcgroup-0.41-19.el8.x86_64
  libnetfilter_conntrack-1.0.6-5.el8.x86_64                                   libnfnetlink-1.0.1-13.el8.x86_64
  libnftnl-1.1.5-4.el8.x86_64                                                 libslirp-4.4.0-1.module+el8.5.0+710+4c471e88.x86_64
  slirp4netns-1.1.8-1.module+el8.5.0+710+4c471e88.x86_64

完了しました!

containerdはDocker社が開発している、コンテナーランタイムになりDockerのコンポーネントの一部として動作します。

それぞれ、インストールされたことを確認します。

rpm -qa | grep -E "docker-ce|docker-ce-cli|containerd.io"

docker-ce-cli-20.10.12-3.el8.x86_64
docker-ce-rootless-extras-20.10.12-3.el8.x86_64
containerd.io-1.4.12-3.1.el8.x86_64
docker-ce-20.10.12-3.el8.x86_64

一般ユーザでもdockerを使えるようにする

gpasswd -a rocky docker

ユーザ rocky をグループ docker に追加

追加されたことが分かりますね。

grep docker /etc/group

docker:x:987:rocky

自動起動有効化および起動

dockerサービスが起動状態でないかつ自動起動が無効になっているので起動および有効にします。

systemctl --now enable docker.service

Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.

systemctl is-active docker.service

active

systemctl is-enabled docker.service

enabled

Kubernetes構築事前準備

SWAP無効化

KubernetesではSWAP領域を無効化することが条件になっていますので確認します。

以下コマンドでSWAPが有効になっているか確認できます、筆者環境では元々、SWAP領域がなかったようです。

この場合、なんの問題もないのでスルーしましょう。

/sbin/swapon -s

cat /proc/swaps

Filename                                Type            Size    Used    Priority

ファイアウォールの確認

Kubernetesはnftables等に互換性がないので、nftablesやiptablesがインストールされており有効になっている場合には無効化します。

筆者、環境ではiptablesのみなのでこの場合、対応不要です。

rpm -qa | grep -E "firewalld|iptables|nftables"

iptables-1.8.4-20.el8.x86_64
iptables-libs-1.8.4-20.el8.x86_64

iptablesがブリッジを通過するトラフィックを処理できるようにする

cat << EOF | tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
cat << EOF | tee /etc/sysctl.d/99-kubernetes-cri.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

カーネルモジュールの読み込み

modprobe overlay
modprobe br_netfilter

sysctl --system

・
・[中略]
・
* Applying /etc/sysctl.d/99-kubernetes-cri.conf ..
・
・[中略]
・

必要なパッケージのインストール

dnf install iproute-tc chrony -y

・
・[中略]
・
Running transaction
  Preparing        :                                                                                                                                                    1/1
  Installing       : iproute-tc-5.12.0-4.el8.x86_64                                                                                                                     1/1
  Running scriptlet: iproute-tc-5.12.0-4.el8.x86_64                                                                                                                     1/1
  Verifying        : iproute-tc-5.12.0-4.el8.x86_64                                                                                                                     1/1

Installed:
  iproute-tc-5.12.0-4.el8.x86_64

Complete!

コンテナーランタイム設定書き換え

Dockerとcontainerdの両方が同時に検出された場合、Dockerが優先されます。

cp -p /etc/containerd/config.toml /etc/containerd/config.toml_$(date +%Y%m%d)

containerd config default | tee /etc/containerd/config.toml

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options] 箇所に SystemdCgroup = true を追加します。

vi /etc/containerd/config.toml

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
  SystemdCgroup = true

systemctl restart containerd.service

systemctl restart docker.service

Kubernetessリポジトリ追加

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

Kubernetesレポジトリが追加されたことが確認出来ます。

dnf repolist

repo id                                                              repo の名前
appstream                                                            Rocky Linux 8 - AppStream
baseos                                                               Rocky Linux 8 - BaseOS
docker-ce-stable                                                     Docker CE Stable - x86_64
extras                                                               Rocky Linux 8 - Extras
kubernetes                                                           Kubernetes

Kubernetessインストール

以下、ツールのインストールをおこないます。

kubeadm :クラスターを起動するコマンドです。
kubelet :クラスターの各ノードでPodを管理するコンポーネントです。
kubectl :クラスターにアクセスするためのコマンドラインツールです。

master側のバージョンと合わせるため、事前に、使用しているバージョンを、 rpm -qa | grep -E "kubeadm|kubelet|kubectl" コマンドで確認しておきます。

バージョンリストを確認するため、キーのインポートをおこないます。

rpm --import https://packages.cloud.google.com/apt/doc/rpm-package-key.gpg

rpmkeys --import https://packages.cloud.google.com/apt/doc/rpm-package-key.gpg

rpm --import https://packages.cloud.google.com/apt/doc/yum-key.gpg

rpmkeys --import https://packages.cloud.google.com/apt/doc/yum-key.gpg

各種ツールの利用可能なバージョン一覧を確認します。

master側で1.23.1を使用していますので同じバージョンをインストールします。

dnf list kubelet kubeadm kubectl --showduplicates | sort -r | grep "1.23.1"

kubelet.x86_64                       1.23.1-0                         kubernetes
kubectl.x86_64                       1.23.1-0                         kubernetes
kubeadm.x86_64                       1.23.1-0                         kubernetes

dnf -y install kubelet-1.23.1-0 kubeadm-1.23.1-0 kubectl-1.23.1-0

・
・[中略]
・
インストール済み:
  conntrack-tools-1.4.4-10.el8.x86_64          cri-tools-1.19.0-0.x86_64                        iptables-ebtables-1.8.4-20.el8.x86_64
  kubeadm-1.23.1-0.x86_64                      kubectl-1.23.1-0.x86_64                          kubelet-1.23.1-0.x86_64
  kubernetes-cni-0.8.7-0.x86_64                libnetfilter_cthelper-1.0.0-15.el8.x86_64        libnetfilter_cttimeout-1.0.0-11.el8.x86_64
  libnetfilter_queue-1.0.4-3.el8.x86_64        socat-1.7.4.1-1.el8.x86_64

完了しました!

指定したバージョンがインストールできたことを確認します。

rpm -qa | grep -E "kubeadm|kubelet|kubectl"

kubectl-1.23.1-0.x86_64
kubeadm-1.23.1-0.x86_64
kubelet-1.23.1-0.x86_64

CRI(コンテナランタイム)変更

コンテナランタイムでDockerを使用したい場合の変更方法を記載します。

dockerのcgroupドライバーがcgroupfsになっていますので、systemdに変更します。

docker info | grep -i cgroup

 Cgroup Driver: cgroupfs
 Cgroup Version: 1

dockerデーモン設定にsystemdを使用するように設定します。

cat <<EOF > /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

systemctl daemon-reload && systemctl restart docker

→設定を適用します。

適用後、systemdに変更されました。

docker info | grep -i cgroup

 Cgroup Driver: systemd
 Cgroup Version: 1

Kubernetessシングルマスターへワーカーノードを追加する

トークンの再発行をします。

そのまま、 ワーカーノード側 で実行します。

マスター とは違うマシンです。

kubeadm token create --print-join-command

kubeadm join ***.***.***.***:6443 --token va8tfa.27asuj2u8ks8p432 --discovery-token-ca-cert-hash sha256:f3ca47ea96312fe1e336556979a300bd8119bd3be87f4e891aca53390b10e033

ワーカーノード側 実行以下コマンドを実行します。

kubeadm join ***.***.***.***:6443 --token va8tfa.27asuj2u8ks8p432 --discovery-token-ca-cert-hash sha256:f3ca47ea96312fe1e336556979a300bd8119bd3be87f4e891aca53390b10e033

[preflight] Running pre-flight checks
        [WARNING Hostname]: hostname "k8s-node-a" could not be reached
        [WARNING Hostname]: hostname "k8s-node-a": lookup k8s-node-a on ***.***.***.***:53: no such host
        [WARNING Service-Kubelet]: kubelet service is not enabled, please run &#039;systemctl enable kubelet.service&#039;
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with &#039;kubectl -n kube-system get cm kubeadm-config -o yaml&#039;
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run &#039;kubectl get nodes&#039; on the control-plane to see this node join the cluster.

control-planeで確認しろ言われるのでマスター側で確認します。

NotReady になっている場合、すこしまてば Ready 状態へ変わります。

kubectl get nodes

NAME               STATUS     ROLES                  AGE     VERSION
i-15100000247731   Ready      control-plane,master   16h     v1.23.1
k8s-node-a         Ready      <none>                 8m21s   v1.23.1

まとめ

シングルマスタークラスターを構築した時と手順は似通ってきますね。

ワーカーノードは、joinコマンドで追加できるので少し楽でした。