LoginSignup
1
2

ArchLinux+kubeadm+cri-o+flannelでkubernetesクラスタ構築

Last updated at Posted at 2023-10-21

はじめに

本記事ではArchLinux上でkubernetesクラスタを構築していきます。基本的にはArchWikiに従いますが、ハマりどころが数ヶ所あったので、そのあたりを中心に書いていきます。

構成

NAME         STATUS   ROLES           AGE   VERSION   INTERNAL-IP      EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
takenoko-1   Ready    control-plane   90m   v1.28.2   192.168.220.21   <none>        Arch Linux           6.5.7-arch1-1       cri-o://1.28.1
takenoko-2   Ready    <none>          90m   v1.28.2   192.168.220.22   <none>        Arch Linux           6.5.7-arch1-1       cri-o://1.28.1
takenoko-3   Ready    <none>          80m   v1.28.2   192.168.220.23   <none>        Arch Linux           6.5.7-arch1-1       cri-o://1.28.1
takenoko-4   Ready    <none>          80m   v1.28.2   192.168.220.24   <none>        Arch Linux           6.5.7-arch1-1       cri-o://1.28.1

master1台、worker3台の計4台構成です。
コンテナランタイムはcri-o、CNIはflannelを使用しています。
ArchLinuxのインストールは完了し、ネットワークの設定が完了し名前解決可能であることを前提としています。

事前準備

対象マシン: 全マシン

まずスワップを無効にします

sudo swapoff -a

続いて/etc/fstabからスワップの設定を削除します

etc/fstab
# /dev/mapper/swap none swap defaults 0 0

kubeadmのインストール

対象マシン: 全マシン

必要なパッケージをインストールします

yay -S kubeadm kubelet kubectl docker cri-o cni-plugins open-iscsi

cri-oの設定

対象マシン: 全マシン

cri-oを起動します

sudo systemctl enable --now crio
sudo systemctl status crio

続いてcri-oの設定を行います

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

Arch は cniplugins によって提供されるプラグインを /usr/lib/cni/opt/cni/bin の両方にインストールしますが、他のほとんどのプラグイン(例えばクラスタ内デプロイメント、kubelet によって管理されるプラグインなど)はデフォルトでは2番目のディレクトリにしかインストールされません

CRI-O は最初のディレクトリにあるプラグインを探すようにしか設定されていないため、設定を変更しない限り、2 番目のディレクトリにあるプラグインは利用できません

この問題を解決するには、CRI-O の設定ファイルを編集して、プラグインのディレクトリを /opt/cni/bin に変更します

/etc/crio/crio.conf.d/00-plugin-dir.conf
[crio.network]
plugin_dirs = [
  "/opt/cni/bin/",
 ]

kubeletの設定

対象マシン: 全マシン

kubeletを有効化します

sudo systemctl enable --now kubelet

unqualified-search-domainsの追加

対象マシン: 全マシン

Archではunqualified-search-domainsが設定されていないので、imageの名前が咲楽された場合に名前解決できないエラーが発生することがあります

そのため、 /etc/NetworkManager/NetworkManager.conf にunqualified-search-domainsを追加します

/etc/NetworkManager/NetworkManager.conf
unqualified-search-registries = ["docker.io", "quay.io"]

kube initの実行

対象マシン: master1台

準備が整ったので、kubeadm initを実行します

sudo kubeadm init --apiserver-advertise-address=192.168.220.21 --pod-network-cidr=10.244.0.0/16 --cri-socket=unix:///var/run/crio/crio.sock

--apiserver-advertise-address=192.168.220.21 はmasterのIPアドレスを指定してください

Your Kubernetes control-plane has initialized successfully!

と表示されれば成功です

その下に表示されるコマンドを実行します

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

また、その下のworkerのjoinコマンドを控えておいてください

kubeadm join 192.168.220.25:6443 --token xxx \
        --discovery-token-ca-cert-hash sha256:yyy

クラスタへの参加

対象マシン: worker3台

kubeadm initを実行した際に表示されたコマンドを実行します

sudo kubeadm join 192.168.220.25:6443 --token xxx \
        --discovery-token-ca-cert-hash sha256:yyy

CNIの設定

対象マシン: master1台

CNIを設定します

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

ノードの確認

対象マシン: master1台

ノードが正常に追加されているか確認します

kubectl get nodes
NAME         STATUS   ROLES           AGE   VERSION   INTERNAL-IP      EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
takenoko-1   Ready    control-plane   90m   v1.28.2   192.168.220.21   <none>        Arch Linux           6.5.7-arch1-1       cri-o://1.28.1
takenoko-2   Ready    <none>          90m   v1.28.2   192.168.220.22   <none>        Arch Linux           6.5.7-arch1-1       cri-o://1.28.1
takenoko-3   Ready    <none>          80m   v1.28.2   192.168.220.23   <none>        Arch Linux           6.5.7-arch1-1       cri-o://1.28.1
takenoko-4   Ready    <none>          80m   v1.28.2   192.168.220.24   <none>        Arch Linux           6.5.7-arch1-1       cri-o://1.28.1

全てReadyになっていれば成功です

トラブルシューティング

  • nodeがNotReadyのままReadyにならない
    • まずは再起動してみてください
    • それでもダメな場合は、 crio.conf の設定が正しく行えているか確認してください

あとがき

私の場合はcrio.conf の設定を見落としており、nodeがNotReadyのままReadyにならないという状態になっていました。
クラスタを運用する上でArchLinux特有の問題はありますが、他のディストリビューションと比較しても手順が少ないことが気に入っています。
今後の運用していく中でより理解を深められたらと思います。

参考文献

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2