ubuntuでlxd/lxcの動作確認をしました

1.概要

microk8sをlxdで動作させる場合、lxd上のubuntuコンテナ上でpodを動作させます。pod自体がコンテナなので、コンテナの上でコンテナが動作するような形に見えます。最初、lxdのubuntu-VM上で動作させると思っていたのですが、構成が異なることに気が付きました。

kubernatesはmaster nodeとworker nodeに分かれています。しかし、microk8sは全てがmaster nodeであり、worker nodeでもあるようです。kubernatesのmaster nodeの弱点をカバーできそうな気がしました。master nodeが停止しても他のnodeがmaster nodeとして機能しそうな気がします

2.詳細

(a) lxd導入

lxdをubuntu-20.04 desktopに導入します

(b) プロファイル設定

$ lxc profile create microk8s
$ wget https://raw.githubusercontent.com/ubuntu/microk8s/master/tests/lxc/microk8s-zfs.profile -O microk8s.profile
$ cat microk8s.profile | lxc profile edit microk8s
$ rm microk8s.profile

(c) コンテナ作成と設定内容修正

k8s0の名称でubuntu20.04のコンテナを作成します。
$ lxc launch -p default -p microk8s ubuntu:20.04 k8s0

規定値の設定が大きいので修正をします。
$ lxc stop k8s0
$ lxc config set k8s0 limits.cpu=2
$ lxc config set k8s0 limits.memory=2GiB
$ lxc start k8s0

同様にk8s1も作成します。

(d) microk8s導入

k8s0にmicrok8sを導入します
$ lxc exec k8s0 -- sudo snap install microk8s --classic

次にk8s0上に/etc/rc.localを作成します
$ cat << EOF > rc.local
#!/bin/bash
apparmor_parser --replace /var/lib/snapd/apparmor/profiles/snap.microk8s.*
exit 0
EOF
$ lxc file push rc.local k8s0/etc/rc.local
$ lxc exec k8s0 -- sh -c 'chown root.root /etc/rc.local'
$ lxc exec k8s0 -- sh -c 'chmod +x /etc/rc.local'
$ lxc exec k8s0 -- sh -c 'reboot'
$ rm rc.local

同様にk8s1にもmicrok8sを導入します

(e) node追加

k8s0にk8s1を接続します
$ lxc exec k8s0 microk8s add-node | tail -n1 | xargs lxc exec k8s1

(f) 試験

試験できる環境ができたので、必要な試験をします。

3.所見

lxd/lxcは良くわかっていません。仮想マシンとコンテナを混在管理できるようです。そう言えば、VMwareも仮想マイン管理にコンテナ管理を追加する方向性を示していました。もしかすると、lxd/lxcを利用しているのかお知れません。

4.追加

この機会にlxd/lxc関連の検証の整理を行いました。おまけとして、内容を記述します。

(1) ubuntuのlxd/lxc環境でkubernatesは動作するか

lxdはubuntu20.04の仮想マシンを提供するのでkubernateを動かすこともできるのではないかと考えました。以前、master nodeだけのkubernates環境をubuntu desktopk上に構築したことがあり、同じことをlxd上のubuntu-20.04で実現できないかを試しました。しかし、kubernatesの導入ができない結果でした。lxdの仮想マシンは、オンプレPCとはちょっと違うようです。

(2) lxd/lxc

仮想環境は、PC自体をシミュレートする仮想マシンとアプリケーションの実行環境を提供するコンテナの2種類があると認識しています。ubuntuでは、前者はKVM環境、後者はdocker環境です。しかし、仮想マシンでもコンテナでもある環境としてlxdがあります。lxdではlxcコマンドを利用し、ちょっと不思議な感じです。

lxdは仮想マシンイメージとコンテナイメージが提供されます。例えば、ubuntu-20.04の仮想マシンとubuntu20.04のコンテナです。しかし、標準提供されるイメージはLinuxだけであり、lxdはLinuxに特化した環境と言うことができます。現状はKVMなどのようにisoファイルから仮想マシンを構築できないようです。

lxdのメリットは仮想マシンを構築した際のディスク使用量です。ubuntu-20.04の仮想マシンイメージファイルは300MB程度であり、Download後、展開しても1GB程度です。また、仮想マシンのようにisoファイルから導入する必要もなく利用できるので、短時間に必要な試験をするには適していると感じています。今回はlxdに関して記述します。

aptで導入します。
$ sudo apt install lxd

4.0を選択するとsnap経由の導入になります。
次に、初期設定をします。
$ sudo lxd init

ubuntu仮想マシン作成
$ lxc launch images:ubuntu/focal/amd64 ubuntu20 --vm

仮想マシンへのlogin
$ lxc exec ubuntu20 bash

(3) ubuntuのKVM環境でkubernatesは動作するか

lxd環境のkubernates導入が失敗したので、KVM環境にkubernatesを導入して、nodesやpodsの動作確認をしました。kubernates環境を十分に試験するには複数ノードが必要なので、master/worker nodeを揃えた必要最低限の試験環境の構築に関して記述をします。

環境は非uefiのBIOS-PCでAMD(2core)、Memory(8GB)、Disk(500GB)でubnutu-20.04.4 Desktop環境です。kubernatesのnodes用の仮想マシンはubuntu-20.04.4 serverを利用して3台構築(2 core, 2GB Memory, 20GB Disk)しました。1台がMaster node、2台がworker nodeです。ベースのPC環境の制限で試験できる限界構成に近いと思っています。

作業手順は多く、下記項目の通りです。
参考利用に沿って作業しますが、Porxyサーバを必要としないので省略箇所があります。

(a) KVM環境構築

sudo apt install virt-manager qemu-system

本ブログのWindows95/98のPCゲーム(2022/04/16)を参照願います。

(b) ubuntu-20.04.4 serverの導入

・download

下記urlからubuntu-20.04.4-live-server-amd64.isoをdownloadします。

http://cdimage.ubuntu.com/releases/20.04/release/

・仮想マシン導入

KVM仮想マシンを作成します。kubernates環境は2core必須のようです。

host namae: ubuntu201
CPU: 2 core
Memory: 2048 MB
Disk: 20 GB
残りは既定値です

ubuntu-20.04 serverの導入手順は参考資料を参照願います。
disk 20GBはGPT設定で、1MBのBIOS grup領域と残りは/に設定しました。
openSSH serverは作業上便利なので導入します

・ip変更

インストール完了後、仮想マシンのip-addressを変更します。
標準のDHCP経由での取得のままですが、macアドレスとipを関連付けします。
参考資料を参照願います。

まず、仮想マシンの現在の状況を確認します。
仮想マシンのterminalでip aにて確認します
仮想マシンを停止して作業を実施します。

次に、ubuntu-20.04のdesktopから設定を変更します。

sudo virsh net-edit default

参考資料に記載されていますが、私は以下の記述を追加しました。

<host mac='52:54:00:xx:xx:xx' ip='192.168.122.10'/>

xx:xx:xxは仮想マシンのmac-address、192.168.122.0/24からipを選定します

設定完了後、ubuntu-20.04 desktopを再起動します。

・update

ubuntu-20.04 desktop起動後、再度、仮想マシンを起動して更新処理をします

desktop PCから仮想マシンにssh loginします

ssh username@192.168.122.10
sudo apt update
sudo apt upgrade

(c) master node, worker nodeの共通機能の導入

・kubernates共通機能導入

sudo apt -y install apt-transport-https
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
sudo apt update
sudo apt -y install kubelet kubeadm kubectl
kubelet --version

・swapの削除

sudo swapoff -a
cp /etc/fstab  fstab
sed -i -e '10 s/^/#/' fstab
sudo mv fstab /etc/fstab
sudo rm /swap.img

・仮想マシンのshutdown

sudo shutdown -h 0

(d) 仮想マシンのクローン

作成した仮想マシンをworker node用にcloneします

desktopのterminalから作業します

・クローン
ubuntu201からubuntu202とubuntu203をcloneします。

virt-clone --original ubuntu201 --name ubuntu202 --file /var/lib/libvirt/images/ubuntu202.qcow2
virt-clone --original ubuntu201 --name ubuntu203 --file /var/lib/libvirt/images/ubuntu203.qcow2

・ip変更
前回作業と同様に、ubuntu202とubuntu203のipを変更します

sudo virsh net-edit default
<host mac='52:54:00:xx:xx:xx' ip='192.168.122.10'/>     # ubuntu201
<host mac='52:54:00:xx:xx:xx' ip='192.168.122.20'/>     # ubuntu202
<host mac='52:54:00:xx:xx:xx' ip='192.168.122.30'/>     # ubuntu203

desktop PCをrebootします

・hostname変更
ubuntu202,ubuntu203のhostnameを変更します

ssh username@192.168.122.20
sudo hostnamectl set-hostname ubuntu202
exit

ssh username@192.168.122.30
sudo hostnamectl set-hostname ubuntu203
exit

(e) master nodeの構築

ssh username@192.168.122.10でloginします

・初期設定(処理に時間が必要)

sudo kubeadm init --node-name master --pod-network-cidr=10.244.0.0/16

下記メッセージが表示されると完了です。
config用のdircotryを作成、worker node接続情報が表示されます。
kubeadm joinはworker nodeからmaster nodeへ接続するときに必要です。

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.122.20:6443 --token fhgs8c.kp2yt9heu22qzfe4 \
    --discovery-token-ca-cert-hash sha256:ca90b71260e12f14c78e56683079b9095f872c4f6d127fafe4780ed1322c5b09
    
・config用のdircotryを作成   

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

(f) worker nodeの接続

ssh username@192.168.122.20でloginします

sudo kubeadm join 192.168.122.10:6443 \
   --node-name node1 \
   --token fhgs8c.kp2yt9heu22qzfe4 \
   --discovery-token-ca-cert-hash sha256:ca90b71260e12f14c78e56683079b9095f872c4f6d127fafe4780ed1322c5b09

exit

ssh username@192.168.122.30でloginします

sudo kubeadm join 192.168.122.10:6443 \
   --node-name node1 \
   --token fhgs8c.kp2yt9heu22qzfe4 \
   --discovery-token-ca-cert-hash sha256:ca90b71260e12f14c78e56683079b9095f872c4f6d127fafe4780ed1322c5b09

exit

(g) master nodeの追加設定

ssh username@192.168.122.10でloginします

sudo sysctl net.bridge.bridge-nf-call-iptables=1
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

nodeとpodの状態を確認します

kubectl get nodes
kubectl get pods

(h) node podの試験

参考資料にnginxをpodで動作させる試験があります。試してください。

(4) UbuntuのKVMでk3s動作試験をしました

ネットでもう一つの軽量化kubernatesを見つけました。k3sです。簡単に導入できるようなのでmaster nodeだけを構築しました。worker nodeは少しだけ試して、動作しませんでした。同じエラーで動作しないとの内容がネット上にありました。k3sはubuntu以外のcentosなどで利用されているようです。

microk8s, k3s共に、kubernatesがベースとなっているようで、kubectlコマンドは同じです。kubectlコマンドを実行するために、microk8s kubectlやk3s kubectlのように、モジュール名の引数として実行します。kubernatesが存在するのに、micork8sやk3sが開発されている理由は、私にはよく理解できません。

(a) kvm環境構築

sudo apt install virt-manager qemu-system
ubuntu-20.04 server仮想マシン作成します

(b) k3s導入

curl -sfL https://get.k3s.io | sh -

(c) 試験

下記コマンドなどの試験を実行できます。

sudo k3s kubectl get node

(5) KVMは新しいubuntuをisoから正しく認識しない

KVM環境でUbuntuのISOファイルから仮想マシンを作成するときに、いつも思うことがあります。それは、ISOファイルからOSのIDを認識する部分です。ubuntu-20.04は正しく認識をするのですが、ubuntu-22.04やubuntu-24.04は認識されずGeneral Linuxを利用します。Windows10は正しく認識されるのですが、何故だろうと思っています。個人的な意見を記述します。

ubuntu-20.04.6は安定版でバグ修正のみが実施されています。ubuntu-22.04.5やubuntu-24.04.1は、マイナーバージョンが更新される余地が十分あり、安定版と見ていない気がします。KVM環境ではOSのversionとして認識されるのものは安定版に限られているのかもしれません。

不便な点はKVMへインストールするときのOSのID認識部分だけですが、いつも気になっていたので記述してみました。

参考資料

コメント