Flexisip + Flexisip Account Manager on K3s(Kubernetes)
本記事では、SIPサーバFlexisipとその管理コンポーネントであるアカウントマネージャを、軽量KubernetesディストリビューションK3s上で運用するための前準備について解説します。特に、Flexisipを稼働させるための仮想インフラの整備と、K3sクラスタの基本構成に焦点を当てています。
https://github.com/capitalfuse/k3s-flexisip
仮想マシン基本スペック
- 3 VMs (Node-VM:2, NFS-VM:1)created by QEMU/KVM
- 各VM : CPU 2 cores, Memory 2 GB, Storage 20 GB
- VMベースOS : Ubuntu Server 24.04
- 仮想ブリッジネットワークインターフェイス br0(各VMにはホスト側のDHCPからIPv4/IPv6アドレスが付与されます)
K3sシステム要件
- マルチノード : Master(Server)-Node 1, Worker(Agent)-Node 1 (各ノードの拡張可能)
- NFS (Persistent Volume and Persistent Volume Claim)
- K3sデフォルトのロードバランサーServiceLBの代替としてMetalLBを採用
- K3sデフォルトのCNIであるFlannelの代替としてCalico を採用
- IPv4/IPv6のデュアルスタック
- OS : Ubuntu Server 24.04
ホストマシンでのオペレーション
KVM/QEMUのインストール
以下の CLI版QEMU/KVMをインストールします。
$ sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients virtinst
システムデーモンlibvirtdの動作を確認。
$ sudo systemctl status libvirtd
● libvirtd.service - libvirt legacy monolithic daemon
.....
.....
ユーザを"libvirt" グループに追加(再ログインで有効)
$ sudo usermod -aG libvirt $USER
libvirtの主なコマンド : virsh, virt-install
$ virsh list --all
Id Name State
-----------------------------
5 ubuntu24.04 running
$ virsh domblklist ubuntu24.04
Target Source
-----------------------------------------------------
vda /var/lib/libvirt/images/ubuntu24.04.qcow2
sda -
$ virsh pool-list
Name State Autostart
-------------------------------
default active yes
注 : GUI版のVert-ManagerをインストールすることでリモートPCからの操作が可能です。
ブリッジネットワークインターフェイス br0
の作成
仮想ブリッジネットワークbr0
を作成することで、仮想マシンにもホストマシンと同一のDHCPからIPを付与することができます。
ホストマシンのNetplanの設定にbr0
を追加
/etc/netplan/netplan.yaml
network:
version: 2
ethernets:
enoXX:
dhcp4: no
dhcp6: no
bridges:
br0:
interfaces: [enoXX]
dhcp4: no
dhcp6: no
Netplanを再起動
$ sudo netplan apply
libguestfs-toolsのインストール
- 概要 : 仮想マシンイメージ(ディスクイメージ)を操作・編集するためのツール群。
- 用途 : 仮想マシンを起動せずに、イメージファイルの中身(ファイルシステム、設定ファイル、パーティションなど)を直接操作できる。
$ sudo apt install libguestfs-tools
SSH鍵の導入(後でクローン用に)
$ ssh-keygen -t ed25519
# → ~/.ssh/id_ed25519.pub
ベースVMの作成
ベースとなるVMには、Ubuntu24.04サーバ(openssh-server)をインストール、一度起動して必要なパッケージやシステムデーモンを有効(起動)にしておきます。
$ virt-install \
--name ubuntu2404 \
--ram 2048 \
--vcpus 2 \
--disk path=/var/lib/libvirt/images/ubuntu2404.qcow2,size=20,format=qcow2 \
--os-type linux \
--os-variant ubuntu24.04 \
--network bridge=br0 \
--graphics none \
--console pty,target_type=serial \
--cdrom /var/lib/libvirt/images/ubuntu-24.04-live-server-amd64.iso
Virt-Managerで作成する場合は、以下の画面で ブリッジデバイス “br0” を設定して下さい。
SSHサーバを起動、パッケージの更新
$ sudo systemctl start ssh
$ sudo apt update && sudo apt upgrade -y
Netplanの設定は残るのでこのままでいいが名称を変更
$ sudo mv /etc/netplan/50-cloud-init.yaml /etc/netplan/base-net.yaml
Netplanの設定
/etc/netplan/base-net.yaml
network:
version: 2
ethernets:
enpXXX: ## $ ip add
dhcp4: yes
dhcp6: yes
ホストネームの変更
$ sudo nano /etc/hostname ---> node001
$ sudo nano /etc/hosts ----> 127.0.1.1 node001
cloud-initによるVM起動時の設定を排除
$ sudo systemctl disable cloud-init
ベースVMを起動した状態でホストから公開鍵を登録(例)
$ ssh-copy-id -i ~/.ssh/id_ed25519.pub k8sadmin@BASE_VM_IP
Snapの削除
Ubuntuサーバインストール時にdockerのインストールを指定した場合、snap版がインストールされます。k3sのインストールスクリプトでは、コンテナランタイムcontainerdがaptコマンドでインストールされるため、snap及びdockerは不要。必要であれば別途aptコマンドでインストール。
# 1. snap版docker停止
$ sudo systemctl stop snap.docker.dockerd.service
$ sudo snap stop docker
# 2. snapパッケージ削除
$ sudo snap remove docker
$ sudo snap remove core22
$ sudo snap remove snapd
# 3. apt系snapd削除
$ sudo apt purge snapd
$ sudo apt autoremove --purge
# 4. 残存ディレクトリ削除
$ sudo rm -rf /snap /var/snap /var/lib/snapd /var/cache/snapd
# 5. 念のため再起動
$ sudo reboot
virt-sysprepの実行
ベースVMをシャットダウン後、virt-sysprepを実行
virt-sysprep
https://libguestfs.org/virt-sysprep.1.html
- 概要 : 仮想マシンのイメージを「クローン用に初期化」するツール(libguestfs-tools に含まれることが多い)。
- 用途 : 仮想マシンの複製を作る前に、ホスト固有情報を削除・初期化する。
- 初期化する内容の例 :
- ホスト名のリセット
- SSH ホスト鍵の削除
- ログの削除
- 一時ファイルの削除
- ユーザーパスワードのリセット など
VM確認
$ virsh list --all
Id Name State
-----------------------------
5 ubuntu24.04 running
VMで一意であるべき設定の初期化(ベースのVMのみ)
注 : machine-idが一意でないとクローンVMで同じIPが割当てられてしまいます。
$ sudo virt-sysprep -d ubuntu24-template --operations logfiles,machine-id,udev-persistent-net
注 : ベースのVMを起動して内容を変更した場合、シャットダウンしてホストで上記のコマンドを必ず実行して下さい。
ベースVMからクローンVMを作成
これをベースにVirt-Managerか以下のコマンドでVMを作成
クローンVMs
- Master(Server)-Node VM for K3s Server
- Worker(Agent)-Node VM for K3s Agent
- NFS VM for Local build docker images registry and K3s PV+PVC
$ virt-clone --original ubuntu24.04 --name master-node --auto-clone
$ virt-clone --original ubuntu24.04 --name worker-node001 --auto-clone
$ virt-clone --original ubuntu24.04 --name ubuntu-nfs --auto-clone
クローンVMでSSHサーバが起動していない場合 virt-managerのコンソールでステータスをチェック
$ sudo systemctl status ssh
enableにして起動
$ sudo systemctl enable ssh
$ sudo systemctl start ssh
各VMに一意のホストネームを付与
$ sudo nano /etc/hostname ---> nodeXXX
$ sudo nano /etc/hosts ----> 127.0.1.1 nodeXXX
NFS(Network File System) VMでのオペレーション
nfs-kernel-serverのインストール
インストールと共有ディレクトリの作成・権限設定
$ sudo apt install nfs-kernel-server
$ sudo mkdir -p /mnt/nfs
$ sudo chown nobody:nogroup /mnt/nfs
エクスポート設定を追加
$ sudo nano /etc/exports
/mnt/nfs 192.168.0.0/16(rw,sync,no_subtree_check,no_root_squash)
NFSエクスポートを再読込・再起動
$ sudo exportfs -a
$ sudo systemctl restart nfs-kernel-server
注 : オープンポート : 2049/TCP
Docker Registryのインストール
NFS仮想マシン上にDocker Registryコンテナをデプロイし、Dockerイメージをプライベートにホスティングおよび配布できるようにします。 Podmanでビルドしたカスタムイメージを、このプライベートレジストリにプッシュします。
https://github.com/distribution/distribution/
DockerHub
https://hub.docker.com/_/registry
ドキュメント
https://distribution.github.io/distribution/
Docker Registryコンテナの起動
$ docker run -d -p 5000:5000 --name registry registry:3
ホストマシンでビルドしたカスタムイメージをプッシュ
新規イメージタグを登録(タグのみ異なる同一イメージが登録されます)してDocker Registryへプッシュ
- php-fpm-8.2:20250514
- flexisip:20250514
$ podman tag localhost/php-fpm-8.2:20250514 192.168.100.30:5000/php-fpm-8.2:20250514
$ podman tag localhost/flexisip:20250514 192.168.100.30:5000/flexisip:20250514
$ podman push --tls-verify=false 192.168.100.30:5000/php-fpm-8.2:20250514
$ podman push --tls-verify=false 192.168.100.30:5000/flexisip:20250514
マスターノードVMとワーカノードVMでのオペレーション
NFSクライアントのインストール
$ sudo apt install nfs-common
NFSからマウントされるか確認
$ sudo mount -t nfs <NFS-VM-IP>:/mnt/nfs /mnt
マウント解除
$ sudo umount /mnt
NFSとの接続確認
$ mount | grep nfs
$ showmount -e <NFS-VM-IP>
K3sのインストール(マスターVM、ワーカVM)
マスターノードVMにK3sサーバをインストール
$ curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="\
--cluster-cidr=10.42.0.0/16,fd00:10:42::/48 \
--service-cidr=10.43.0.0/16,fd00:10:43::/112 \
--disable=traefik \
--flannel-backend=none \
--disable-network-policy" \
sh -
K3sエージェントに必要なトークンを取得
$ sudo cat /var/lib/rancher/k3s/server/node-token
K3S_TOKEN=<K3S_TOKEN>
K3sエージェントをワーカノードVMにインストール
$ curl -sfL https://get.k3s.io | K3S_URL=https://<MASTER-IP>:6443 \
K3S_TOKEN=<K3S_TOKEN> \
sh -
各ノードVMでローカルのDocker Registryを登録
https://docs.k3s.io/installation/private-registry
$ sudo mkdir -p /etc/rancher/k3s
/etc/rancher/k3s/registries.yaml
mirrors:
"192.168.100.30:5000":
endpoint:
- "http://192.168.100.30:5000"
K3sサーバであるマスターノードVMの再起動
$ sudo systemctl restart k3s
K3sエージェントであるワーカノードVMの再起動
$ sudo systemctl restart k3s-agent
各ノードVMでローカルのDocker Registryにプッシュされたカスタムイメージをプル
$ sudo k3s ctr image pull --plain-http 192.168.100.30:5000/php-fpm-8.2:20250514
$ sudo k3s ctr image pull --plain-http 192.168.100.30:5000/flexisip:20250514
イメージの確認
$ sudo k3s crictl images
IMAGE TAG IMAGE ID SIZE
192.168.1.119:5000/php-fpm-8.2 20250514 aadc0f74f501f 109MB
192.168.1.119:5000/ubuntu-flexisip 20250514 5ab7bfc30fb74 181MB
マスターノードVMでマニフェストの適用
Calicoのインストール
Download https://raw.githubusercontent.com/projectcalico/calico/v3.30.2/manifests/calico.yaml
ダウンロードしたファイルで以下の箇所を追加
"ipam": {
"type": "calico-ipam",
"assign_ipv4": "true",
"assign_ipv6": "true"
},
spec.template.spec.containers.envセクションに以下追加:
- name: IP6
value: autodetect
- name: CALICO_IPV6POOL_NAT_OUTGOING
value: "true"
- name: CALICO_IPV6POOL_CIDR
value: fd00:10:42::/48
追加内容を適用してインストール
$ sudo kubectl apply -f calico.yaml
MetalLBのインストール
$ sudo kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.15.2/config/manifests/metallb-native.yaml
$ sudo kubectl apply -f metallb-config.yaml
注 : metallb-config.yaml は、MetalLBがロードバランシングに使用する特定のIPアドレスを設定するための構成ファイルです。 このファイルでは、IPv4用とIPv6用の 2 つのIPアドレスプールが定義されており、それぞれに対してLayer 2 advertisementsが設定されています。 プール内で指定されたIPアドレスは、ネットワーク上で使用可能であり、他のデバイスと競合しないようにする必要があります。 この構成は、KubernetesクラスタにMetalLBを導入した後に適用してください。
Ingress-Nginxのインストール
$ sudo kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.12.3/deploy/static/provider/baremetal/deploy.yaml
$ sudo kubectl apply -f ingress-nginx-service.yaml
マニフェストの適用順序
cert-manager —> apache —> redis —> mariaDB —> phpmyadmin —> nginx —> php-fpm —> flexisip
[リファレンス]
本内容の修正やアップデートについては、下記のフォーラム記事を参照願います。
virt-manager (QEMU/KVM)の導入
https://forum.ficusonline.com/t/topic/532/7