FICUSONLINE F9E
Flexisip System running on K3S (Kubernetes)
FlexisipとアカウントマネージャをK3S上で運用し、稼働までのステップをブログで紹介します。 Docker上で稼働させる場合と比べると、マニフェストの作成など運用開始までの準備に手間がかかりますが、より柔軟な条件設定が可能であることに加え、高い拡張性や安定性といった大きなメリットがあります。
Takanobu FuseAdministrator

1 hour ago

Linux

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

Flexisip Flexisip-Account-Manager on K3s


ホストマシンでのオペレーション

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のインストール

https://libguestfs.org/

  • 概要 : 仮想マシンイメージ(ディスクイメージ)を操作・編集するためのツール群。
  • 用途 : 仮想マシンを起動せずに、イメージファイルの中身(ファイルシステム、設定ファイル、パーティションなど)を直接操作できる。
$ 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” を設定して下さい。

Vert-Manager Select Bridge Network

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のインストール

metallb-config.yaml configures MetalLB to use specific IP addresses for load balancing. It defines two IP address pools, one for IPv4 and one for IPv6, and sets up Layer 2 advertisements for both pools. The IP addresses specified in the pools should be available in your network and not conflict with other devices. Make sure to apply this configuration after setting up MetalLB in your Kubernetes cluster.

$ 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

Install 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

Apply each manifest as the following order.

cert-manager —> apache —> redis —> mariaDB —> phpmyadmin —> nginx —> php-fpm —> flexisip



[References (only Japanese)]

Please see the following for the latest updates and fixes.

Install virt-manager (QEMU/KVM)

https://forum.ficusonline.com/t/topic/532/7

Kubernetes(K3s) + Flexisip + Flexisip Account Manager

https://forum.ficusonline.com/t/topic/529/6