構成
ホスト、ゲスト全てArchLinuxです。
Host(MeYururi-Desktop)
| <- bridge でぶら下がっています。
+- Guest KVM( arch-mn01 )
+- Guest KVM( arch-wn01 )
hostname | IP Address |
---|---|
MeYururi-Desktop | 192.168.3.103 |
arch-mn01 | 192.168.3.181 |
arch-wn01 | 192.168.3.182 |
kizuka@MeYururi-Desktop ~ <- ホスト
❯ uname -a
Linux MeYururi-Desktop 5.10.13-arch1-2 #1 SMP PREEMPT Sat, 06 Feb 2021 11:07:29 +0000 x86_64 GNU/Linux
[root@arch-mn01]# uname -a <- ゲスト
Linux arch-mn01 5.10.14-arch1-1 #1 SMP PREEMPT Sun, 07 Feb 2021 22:42:17 +0000 x86_64 GNU/Linux
[root@arch-wn01]# uname -a <- ゲスト
Linux arch-wn01 5.10.14-arch1-1 #1 SMP PREEMPT Sun, 07 Feb 2021 22:42:17 +0000 x86_64 GNU/Linux
マスター1台、ワーカー1台の構成を目指します。
[root@arch-mn01 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
arch-mn01 Ready master 9h v1.19.4
arch-wn01 Ready <none> 9h v1.19.4
手順
OSのインストールはArchWikiを参照しながら実施。(インストールガイド)
本記事では、インストールガイドに書いてある内容は省きます。
ネットワーク
bridgeを作成します。
今回は、systemd-networkdを用いてインターフェイスの設定を行います。
詳細はArchWikiを参照。(systemd-networkd)
物理インターフェイスをbr0(ブリッジインターフェイス)に関連付け
[Match]
Name=enp0s31f6 # 手元の環境に合わせて読み替えてください
[Network]
Bridge=br0
ブリッジインターフェイスを作成
[NetDev]
Name=br0
Kind=bridge
ブリッジインターフェイスの設定
[Match]
Name=br0
[Network]
Address=192.168.3.103/24
Gateway=192.168.3.1
DNS=192.168.3.1
設定ファイルを作成後、systemd-networkdを再起動。
systemctl restart systemd-networkd
ゲストマシンの作成
ホスト側の用意が完了したので、ゲストマシンの作成を行います。
今回はlibvirtを使用し、KVMで2台仮想マシンを用意します。
こちらもArchWikiを参照。(libvirt)
QEMUイメージ作成
容量は割と雑に決めたので、後で痛い目を見る可能性あり。
qemu-img create -f qcow2 /var/lib/libvirt/images/arch-cn.qcow2 64G
qemu-img create -f qcow2 /var/lib/libvirt/images/arch-wn.qcow2 64G
VM作成
スペックは割と雑に決めたのd(ry
コンソール周りでつまずいたので、参考になるリンクを貼っておきます。(シリアルコンソールを使って Arch Linux をインストール)
❯ sudo virt-install \
--name arch-mn01 \
--memory 4096 \
--vcpus 2 \
--cpu host \
--os-variant archlinux \
--network bridge=br0 \
--graphics none \
--arch=x86_64 \
--disk /var/lib/libvirt/images/arch-mn.qcow2 \
--cdrom /var/lib/libvirt/iso/arch.iso \
--virt-type kvm
❯ sudo virt-install \
--name arch-wn01 \
--memory 4096 \
--vcpus 2 \
--cpu host \
--os-variant archlinux \
--network bridge=br0 \
--graphics none \
--arch=x86_64 \
--disk /var/lib/libvirt/images/arch-wn.qcow2 \
--cdrom /var/lib/libvirt/iso/arch.iso \
--virt-type kvm
つまずきのメモ
上にも書きましたがコンソールでつまずきました。
# virt-install実行後すぐTABキーを押し末尾にconsole=ttyS0をつけることで解消
>.linux /arch/boot/x86_64/vmlinuz-linux・archisobasedir=arch archisolabel=ARCH_202012 initrd=/arch/boot/intel-ucode.img,/arch/boot/amd-ucode.img,/arch/boot/x86_64/initramfs-linux.img console=ttyS0
また、再起動後も同様にコンソールが出てこず、virsh consoleの画面で入力ができませんでした。
対処として参考になったリンクを記載しておきます。
(起動時のデフォルトターゲットを変更する)
(gettyを起動したらどうか?)
:
GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3"
GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0"
:
# Uncomment to use basic console
GRUB_TERMINAL_INPUT="serial console"
# Uncomment to disable graphical terminal
GRUB_TERMINAL_OUTPUT="serial console"
[root@archiso /]# systemctl set-default multi-user.target
[root@archiso /]# systemctl enable getty@tty0
[root@archiso /]# systemctl enable getty@ttyS0
Kubernetesクラスタの構築
ここまででやっとVMが作成できたので、ここからKubernetesを導入します。
kubeadm, kubelet, kubectlの導入
# master, workerの両方で実施
[root@arch-mn01 ~]# pacman -S kubeadm kubelet kubectl
[root@arch-wn01 ~]# pacman -S kubeadm kubelet kubectl
dockerの開始
# master, workerの両方で実施
[root@arch-mn01 ~]# systemctl enable docker; systemctl start docker
[root@arch-wn01 ~]# systemctl enable docker; systemctl start docker
kubeadmの実行
Master側のNodeでkubeadm initを実行します。
今回はCNIにCalico使用するので以下のコマンドになります。
kubeadm init --apiserver-advertise-address=192.168.3.181 --pod-network-cidr=192.168.0.0/16
:
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
おそらくversion周りでWARNINGが出ています。が、今回は無視します。
Worker側のNodeでkubeadm joinします。(tokenや鍵はinitの出力を参考する)
kubeadm join 192.168.3.181:6443 --token xxxx.xxxxxxx --discovery-token-ca-cert-hash sha256:~~~
この時点でkubectl get nodesに2台表示されます。
ただ、ネットワークの設定をしていないため、STATUSはNotReadyになっています。
Calicoの導入
公式の手順を参考にします。(Quickstart for Calico on Kubernetes)
kubectl apply -f https://docs.projectcalico.org/manifests/tigera-operator.yaml
kubectl apply -f https://docs.projectcalico.org/manifests/custom-resources.yaml
calico-system上に色々立ち上がるので、podがRunningになるのを待ちます。
watch kubectl get pods -n calico-system
ここでつまずきました。
watchで見ていても、calico-kube-controllersがrunningになりませんでした。
以下、私の対処法になります。
journalctl -xeu kubelet
:
}: failed to find plugin "calico" in path [/etc/lib/cni]
:
どうやらそんなものないよと言われています。
確認すると/opt/bin/cni/の下にcalico, calico-ipamがありました。
これらをcpコマンドで/etc/lib/cni配下にコピーしたところ、事象が解消。
[root@arch-mn01 ~]# kubectl get pods -n calico-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-56689cf96-mmzb6 1/1 Running 0 10h
calico-node-bjv52 1/1 Running 0 10h
calico-node-f7w8m 1/1 Running 0 10h
calico-typha-76bb6bd8df-cs6l2 1/1 Running 0 10h
calico-typha-76bb6bd8df-kr4dn 1/1 Running 0 10h
[root@arch-mn01 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
arch-mn01 Ready master 11h v1.19.4
arch-wn01 Ready <none> 11h v1.19.4
これにてクラスタ構築完了です。
感想
virt-installでかなり時間を取られ、consoleの設定にたどり着くのに1日かかったのが一番疲れました。
以前、CentOSで構築したときとは違う気づきもあり楽しかったです。
記事内では省いた手順についても時間があれば追記したいなと考えています。
今後は実際に組んだクラスタ上で色々pod立ち上げたり遊び倒したいと思います。