Skip to content

Latest commit

 

History

1,642 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

GitHub release License: GPL v3 golangci-lint Go Reference GitHub stars

Marmot — 1台のサーバーから始められる、Kubernetes対応のシンプルなプライベートクラウド

Marmot(マーモット)は、シンプルなYAMLで仮想サーバー、ネットワーク、ストレージを管理できるプライベートクラウド基盤です。Kubernetesライクな宣言型APIを採用し、学習・検証環境から実運用まで、迅速かつ再現性の高いインフラ構築を実現します。

マーモットのイメージキャラ

コンセプト

利用者は、Kubernetesのマニフェストを書く感覚で仮想マシンを管理できます。しかし、Kubernetesのような複雑な概念や高い学習コストは、必要ありません。シンプルで理解しやすいYAMLを記述するだけで、仮想サーバー、ネットワーク、ストレージを宣言的に管理できます。Marmotマニフェスト集を参考にすれば、Linuxをインストールした1台のマシンから始めて、プライベートネットワークの構築、仮想ストレージの確保、仮想サーバーの展開までを数分で実現できます。複雑な設定作業に悩まされることなく、学習、検証、実験に集中できます。

apiVersion:
kind:
spec:

Marmotは、複雑化し続けるインフラ運用をシンプルにするためのプライベートクラウド基盤です。パブリッククラウドのコスト増大、高額なVMwareライセンス、GUI依存の運用、そしてOpenStackの重厚なアーキテクチャに代わり、シンプルなYAMLによるIaCを中心とした運用モデルを提供します。Ansibleによる自動構成管理やコンテナとの連携を標準化し、小規模なチームでも効率的にクラウド基盤を構築・運用できる世界を目指します。

Marmotは、プライベートクラウド運用をよりシンプルにし、Infrastructure as Codeを誰もが実践できる環境を目指しています。

技術的特徴

marmotに実装した魅力的な特徴を以下に列挙します。この複合的で統合された環境をmarmotをインストールすることで手に入れることができます。

  • YAML ベースの宣言的構成 — サーバー・ネットワーク・ボリュームをファイル一枚で定義
  • OpenAPI v3 REST APImarmotd サーバーを API で完全制御
  • リソースコントローラーによる自動化 — 利用者は「どうなっていてほしいか」をYAMLで記述するだけ。Marmotが仮想マシンやネットワークの作成・変更を自動的に実行します。
  • Cloud Image による仮想マシン — Ubuntuなどが提供するCloud Imageを利用して、OSインストールの手間なく仮想マシンを即座に作成できます。
  • iSCSI ネットワークブロックストレージ — LVM ボリュームを iSCSI ターゲットとして VM にアタッチ可能
  • ローカルブロックストレージ — LVM / QCOW2 を利用した高速にアクセスできるストレージをVM にアタッチ可能
  • Ceph RBD ブロックストレージ — Ceph プールをバックエンドにした Volume を作成し、VM にアタッチ可能
  • 仮想ネットワーク管理 — ホストブリッジ、OVN/OVS/Geneve オーバーレイ・ネットワークをサポート
  • マルチホーム対応 — 1 台の VM に複数の仮想ネットワークを割り当て可能
  • ノードセレクター — marmotクラスタ環境では、複数のMarmotノードから指定ノードへVMを 配置制御可能
  • etcd による状態管理 — Kubernetesで実績のあるetcdを利用し、クラスター全体の状態を安全かつ一貫性のある形で管理します。
  • 内部 DNS — VM に対する名前解決を自動提供
  • OpenVPN ゲートウェイ — VPN Gateway リソースで、PCとVM用プライベートネットワーク間を暗号化接続
  • Application Load Balancer — HAProxy ベースの L7 ロードバランサーを VM として自動デプロイ
  • Network Load Balancer — iptables ベースの L4 ロードバランサーで仮想ネットワーク内トラフィックを分散
  • OpenTelemetry メトリクス — Prometheus エクスポーターによる可観測性を標準提供, Loki へのログ転送も標準装備
  • RBAC によるアクセス制御 — Administrator / Compute-Operator / Viewer などのロールベースで API 操作を制限
  • MKE (Marmot Kubernetes Engine) — 抽象化されたYAMLからKubernetesクラスタを構築・運用できる専用コントローラー
  • ゲストOS Ubuntu Linux 22.04/24.04, Alpine Linux 3.23 サポート
  • ホストOS Ubuntu 24.04 サポート

クイックスタート

インストールして利用する前に、このパートで使用体験を感じてみてください。

ログイン

marmotd への接続は認証が必要です。初期管理者アカウント(admin)でログインします。 インストール直後のパスワードは、passw0rdですので、下記の手順で変更してください。

$ mactl login admin
Password: <パスワードを入力>
Successfully logged in as admin
⚠️  You must change your password before using other commands.
   Run: mactl passwd

初回ログイン時はパスワード変更を求められます。mactl passwd で変更してください。

$ mactl passwd
Current Password: <現在のパスワードを入力>
New Password:     <新しいパスワードを入力(英数字 8 文字以上)>

ログイン中のユーザー情報は mactl whoami で確認できます。

$ mactl whoami
User:  admin
Roles: [Administrator]

セッションを終了するときは mactl logout を実行します。

$ mactl logout
Successfully logged out

仮想サーバーの作成

sshの鍵ペアを準備して、公開鍵を表示します。

$ ssh-keygen -t ed25519 -f ./vmkey -C "For marmot VMs" -N ""
$ cat ./vmkey.pub 
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGAAL3eo+VgR6pj9eGuz62rBp/wbs4dSp3XljqBBymnW For marmot VMs

仮想サーバーを起動するため、上記で作成した公開鍵をspec.auth.publicKeyに貼り付けたマニフェストを準備します。

apiVersion: v1
kind: Server
metadata:
    name: server-20
    comment: marmotホストが繋がるネットワークに接続する仮想サーバー
spec:
    cpu: 1
    memory: 1024
    mmImage: ubuntu24.04
    auth:
        publicKey: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGAAL3eo+VgR6pj9eGuz62rBp/wbs4dSp3XljqBBymnW For marmot VMs"
        users:
         - ubuntu       
    networkInterface:
        - networkname: host-bridge  # marmot のサーバーが接続されるネットワーク

注) networkname=host-bridge の時に設定するデフォルト値は、/etc/marmot/marmotd.josn に設定しておく必要があります。

仮想サーバーの作成

次のKubernetesライクなコマンドで、仮想サーバーを起動できます。 環境により、しばらく時間が必要なことがあります。

# サーバーの作成
$ mactl create -f server-20.yaml 

# 起動の確認
$ mactl get server
NAME             NODE          STATUS        CPU  RAM(MB)  IP-ADDRESS       NETWORK          AGE
----             ----          ------        ---  -------  ----------       -------          ---
server-20        marmot3       RUNNING       1    1024     192.168.1.20     host-bridge      5s

# sshでのログイン
$ mactl ssh ubuntu@server-20 -- -i vmkey 
ubuntu@server-20:~$ # ログイン後に、コマンドを実行してみて、お楽しみください。
ubuntu@server-20:~$ exit

# サーバーの削除
$ mactl delete server server-20

# サーバー名をカンマ区切って複数の仮想サーバーの削除も可能です
$ mactl delete server server-20

mactl ssh を使うと、DNSを設定することなく、サーバー名で、sshログインできます。

mactl [mactlのフラグ] ssh [USER@]SERVER-NAME -- [SSH-ARGS...]

内部DNSは server-name.network-name 形式に加えて、marmotd ごとのサブドメイン付きFQDNにも対応しています。

  • 例1: server1.host-bridge
  • 例2: server1.host-bridge.marmot1.labo.local

Ceph ボリュームの作成(オプション)

事前の準備として、Cephの仮想サーバーを起動して、Cephのサーバーを準備しておきます。 Marmot は type: ceph の Volume をサポートしています。storageClasshdd / ssd / nvme)に応じて、marmotd が Ceph プールを選択します。

apiVersion: v1
kind: Volume
metadata:
    name: data-ceph-01
spec:
    kind: data
    type: ceph
    size: 20
    storageClass: ssd
# 作成
$ mactl create -f volume-ceph.yaml

# 確認
$ mactl get volume

# 削除
$ mactl delete volume data-ceph-01

注: type: ceph を利用する場合、marmotd 側で ceph_enabledceph_pool_by_class の設定が必要です(後述)。

Kubernetesクラスタの作成(MKE)

MKE (Marmot Kubernetes Engine) を使うと、Kubernetesの詳細な知識がなくても、シンプルなYAML一枚でKubernetesクラスタを構築できます。ノード数やCPU/メモリなどのリソース、CNIプラグイン(Cilium選択可)、外部接続用ネットワークを宣言するだけで、コントロールプレーンからワーカーノード、専用ロードバランサー、Cephストレージ連携まで、marmotd が自動的に構築します。

apiVersion: v1
kind: KubernetesEngine
metadata:
    name: mke0
    comment: 検証用K8sクラスタ
spec:
    version: "1.36"
    nodes: 3
    nodeSpec:
        cpu: 2
        memory: 4192
        auth:
            publicKey: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGAAL3eo+VgR6pj9eGuz62rBp/wbs4dSp3XljqBBymnW For marmot VMs"

以下は、デプロイから kubectl コマンドの実行までの操作例です。

# クラスタの作成
$ mactl create -f mke0.yaml

# 状態の確認
$ mactl get mke
NAME              VERSION   NODES   STATUS        AGE     
----              -------   -----   ------        ---     
mke0              1.36      3       RUNNING       3m   

# KUBECONFIGのダウンロード
$ mactl get mke mke0 --download
kubeconfig downloaded: /home/ubuntu/.kube/config

# kubectl コマンドの実行
$ kubectl get node
NAME              STATUS   ROLES    AGE     VERSION
mke-mke0-node-1   Ready    <none>   2m43s   v1.36.4
mke-mke0-node-2   Ready    <none>   113s    v1.36.4
mke-mke0-node-3   Ready    <none>   65s     v1.36.4

# クラスタの削除
$ mactl delete mke mke0

Ceph CSIによるストレージ連携やロードバランサー連携など、詳細な設計は docs/MEMO-marmot-kubernetes-engine.md を参照してください。

インストール

必要最小条件

  • Ubuntu Linux 24.04 がインストールされていること。
  • ルート/ファイルシステムが、3G程度空いていること。 marmotが依存モジュール 1.2GBほどが、インストールされます。
  • /var/lib/marmot が、30GB程度の空きがあること。(OSイメージ取得で約2GB、1台の仮想マシン起動で16GBを消費します。
  • /etc/marmot/marmotd.json-sample, /etc/marmot/mke.json-sample を参考にして、設定を実施してください。

Ceph 連携を使う場合の追加要件(オプション)

  • marmotd を実行するホストに ceph-common がインストールされ、ceph / rbd コマンドが利用可能であること。
  • /etc/ceph/ceph.conf/etc/ceph/ceph.client.admin.keyring が配置済みで、marmotd 実行ユーザーから読み取り可能であること。
  • Ceph 側に利用する pool を事前作成しておくこと。

/etc/marmot/marmotd.json の設定例:

{
    "ceph_enabled": true,
    "ceph_pool_by_class": [
        { "storageClass": "hdd",  "pool": "marmot-hdd" },
        { "storageClass": "ssd",  "pool": "marmot-ssd" },
        { "storageClass": "nvme", "pool": "marmot-nvme" }
    ]
}

ceph_pool_by_class は配列形式で指定します。storageClass と pool の対応が未設定の場合、Ceph Volume 作成は失敗します。

deb パッケージのインストール

Releases から最新の .deb ファイルをダウンロードしてインストールします。

cd /tmp
apt-get update
VERSION=0.30.0
curl -OL https://github.com/takara9/marmot/releases/download/v${VERSION}/marmot_v${VERSION}_amd64.deb
sudo apt install -y ./marmot_v${VERSION}_amd64.deb

実行結果に、Serverのバージョンが表示されれば、サーバーと正しく通信できていることになります。

$ mactl vesion
Server version = 0.30.0
Client version = 0.30.0

詳しいインストール手順は、以下のドキュメントを参照してください。

チュートリアル

はじめて marmot を利用する方は、チュートリアルから始めるのがお勧めです。 基本操作を把握できる 30分コースと、じっくり楽しめる2時間コースを用意しています。

活用例

marmot の利用法を確認できるマニフェスト集もあります。このマニフェスト集から、順番を選んでチュートリアルを作成しました。

リファレンスマニュアル

コマンドとサブコマンド、オプションについての知りたい時は、リファレンスマニュアルをお勧めします。

コンポーネント

コンポーネント 説明
marmotd ハイパーバイザーノード上で動作するデーモン。LibVirt / LVM / OVN(OVS) を操作して VM を管理する
mactl CLI クライアント。YAML ファイルまたは URL を指定してサーバー・ネットワーク・ボリュームを操作する
maadm 管理者向け補助ツール(改修中のため使用は非推奨)

主な利用技術

marmotは、複数のOSS技術を利用して構成されています。現在、使用しているOSS技術を以下に列挙します。

  • KVM / QEMU — 仮想化
  • LibVirt — VM ライフサイクル管理
  • OVN / Open vSwitch — 仮想ネットワーク制御プレーン/データプレーン
  • etcd — 分散 KV ストア(クラスター状態管理)
  • LVM — 論理ボリューム管理
  • open-iscsi / targetcli — iSCSI ネットワークブロックストレージ
  • Ceph — RBD を利用した分散ブロックストレージ
  • OpenTelemetry — 可観測性のためのメトリックス公開、ログ送信のために使用
  • Geneve protocl — marmotdをクラスタ構成に使用するオーバーレイ・ネットワークに使用します。
  • OpenVPN — marmotd が管理するプライベートネットワークにセキュアに接続するために使用します。
  • Go言語marmotは、Go言語で書かれています。
  • Ansiblemactlコマンドは、Ansibleと連携して、起動した仮想サーバーをセットアップします。

ライセンス

GNU General Public License v3.0 — 詳細は LICENSE を参照してください。

貢献

貢献を歓迎します。ガイドラインは CONTRIBUTING.md を参照してください。

開発者の経歴について

Marmotは、30年以上にわたりエンタープライズシステム、仮想化基盤、クラウド技術に携わってきたインフラエンジニアによって開発されています。

長年にわたり、大規模システムの構築・運用を経験した後、クラウド基盤を利用した開発とテクニカルセールスに従事する中で、Kuberntesとコンテナは画期的な技術革新である反面、導入や運用が複雑化し、多くの利用者にとって扱いにくいものになっていると感じてきました。

Marmotは、その課題に対する一つの答えとして生まれました。

「プライベートクラウドをもっとシンプルに。」

この理念のもと、Kubernetesの宣言型運用の良さを取り入れながら、より少ない学習コストで利用できるクラウド基盤を目指しています。

Marmotは、複雑な仕組みを増やすのではなく、本当に必要な機能に集中し、学習・検証・実験から実運用まで幅広く活用できるプラットフォームとして進化を続けています。

連絡先

メンテナー: takara9
ご質問・議論は GitHub Discussions へ。

About

検証、実験、そして学習のための、簡便で高速な仮想サーバーの実行環境

Resources

Code of conduct

Contributing

Stars

5 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages