Rocky Linuxのシングルマスタークラスターへワーカーノードを追加してみた
Contents
概要
こんにちは。
前回、 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 'systemctl enable kubelet.service'
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[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 'kubectl get nodes' 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コマンドで追加できるので少し楽でした。
ディスカッション
コメント一覧
まだ、コメントがありません