ニュースのトップページに戻る

Incus 6.7 リリースのお知らせ

2024/11/15

はじめに

Incus チームは、Incus 6.7 のリリースのアナウンスができてうれしいです!

このリリースは、スタンドアロンユーザーから、小規模なホームラボを実行するユーザー、大規模のクラスターユーザーまで、すべてのユーザー向けの機能と改良を加えた、非常にバランスの取れたリリースです。

image|690x459

いつものように、オンラインでご自身で試せます: https://linuxcontainers.org/incus/try-it/

Enjoy!

新機能

Incus の Web インターフェースへの簡単なアクセス

ユーザーが Incus の Web UI にアクセスする方法についての不満が頻繁に発生していました。

これは、Incus が初期状態ではネットワークをまったくリッスンせず、ネットワークをリッスンするように設定したあとは、HTTPS 経由でのみリッスンし、中央の OpenID Connect 認証サーバーがある環境で実行していない限りは、TLS クライアントを通してのみ認証されるからです。

確かに動作させることはできますが、通常は次のような手順になります:

1) Incus がネットワークをリッスンするようにする
2) Web ブラウザーから Incus へアクセスする
3) 証明書の警告を無視する
4) ブラウザー内からクライアント証明書を生成する
5) Incus CLI を通して公開鍵を信頼する
6) 公開鍵+秘密鍵のペアをユーザー証明書としてブラウザーにインポートする
7) ブラウザーをリロードし、そのユーザー証明書で正しく認証されることを期待する

今では、同じセキュリティをほぼ確保しながら、これらすべてを大幅に簡素化した代替手段があります。それは、incus webui を実行するだけです。

このコマンドを実行すると、Incus クライアントツールは小さな HTTP ウェブサーバーを、ループバックデバイスのランダムなポートで実行します。このwebサーバーは、システム上の他のユーザーやソフトウェアが許可なく Incus とやりとりをするのを防ぐためのユニークなトークンにアクセスが制限されています。正しいトークンが提示されると、クライアントツールと同じ資格情報を使用して、Incus サーバーにプロキシーされます。

クラスターの自動リバランシング

Incus クラスターは VM のライブマイグレーションをサポートし、非常に柔軟なスケジューリング・配置ロジックと、サーバーがダウンしたときの自動修復を備えているため、次のロジックのピースは、クラスターの自動リバランシングの機能を追加することでした。

これが可能になりました。次のいくつかの構成キーで設定できます:

  • cluster.rebalance.batch controls は、1 ラウンドで再配置するインスタンス数
  • cluster.rebalance.cooldown は、インスタンスを再度移動できるようになるまでの待機時間を制御します
  • cluster.rebalance.interval は、インスタンスの再配置を検討する頻度を制御します
  • cluster.rebalance.threshold は、2 つのサーバー間のリバランスをトリガーするのに必要な負荷の見積もり量の差(パーセント単位)を制御します

Incus はクラスター内のそれぞれのサーバーのスコアを効果的に計算し、スコアがもっとも高いサーバーと低いサーバーを比較します。差がしきい値を超えると、2 つのサーバー間でインスタンス数を調整します。

スコアは現時点では、システム上の CPU 数に合わせて調整された 1 分間のロードアベレージと使用可能なメモリー量に基づいています。

ライブマイグレーションでは仮想マシンのみが移動され、プロジェクト内で適用される設定と制約の両方ですべてのマイグレーション要件を満たしているときだけ移動されます。

ドキュメント: https://linuxcontainers.org/incus/docs/main/howto/cluster_manage/#cluster-re-balancing

OCI コンテナの DHCP 更新

Incus で OCI コンテナを実行する場合のよくある問題は、ネットワーク構成に関係した問題です。OCI コンテナは一般的に、自身でネットワーク設定を行わず、起動時に完全に設定されたネットワークスタック(アドレス、ルート、DNS)を見つけることを期待します。

これを実現するために、Incus はインスタンスの初期化段階で、小さな DHCP クライアントを実行し、ネットワークを設定しています。しかし、これは 1 回限りのプロセスであり、DHCP リースが更新されないときに、DNS レコードが期限切れになるなどの問題が発生していました。

Incus 6.7 以降は、DHCP クライアントがバックグラウンドでコンテナに参加し、これらの問題を防ぐために、リースの更新を行えるようになりました。

部分的なインスタンスとボリュームの更新

Incus インスタンスのバックアップでよく使われる機能は、copy --refresh を使うことです。これにより、Incus はソースとターゲットのインスタンスを効果的に比較し、現在の状態を同期する前に、欠けているスナップショットをターゲットに転送します。

これは非常にうまく機能しますが、バックアップサーバーでクリーンアップを実行してから、これらのスナップショットの一部を削除する方が適切な場合もあります。残念ながら次の更新で、保持する意味がない古いスナップショットであっても、削除したものが戻ってきてしまいます。

解決策の 1 つは、もちろんソースのスナップショットを削除することです。しかし、ソースがそれらのスナップショットを保持し、実質的にバックアップサーバーよりもたくさんの履歴を保持し続けている場合があります。

これに対応するため、新しい --refresh-exclude-older フラグが追加されました。このフラグを --refresh と一緒に与えると、最新の共有スナップショットが検索され、それ以降に作成されたスナップショットのみが転送され、実質的にターゲット上で欠落している古いスナップショットは無視されます。

カラムの設定とフォーマット、更新頻度が設定できるようになった incus top

incus top--format--columns をサポートするたくさんのコマンドの仲間に加わり、レンダリング方法とレンダリング対象をカスタマイズできるようになりました。

さらに、表示を更新する頻度を設定する --refresh も使えるようになりました。

OVN ネットワーク上での DHCP アドレスの範囲のサポート

ipv4.dhcp.ranges 設定オプションが OVN ネットワークにも適用されるようになりました。

これにより、ネットワークサブネットの一部のみを動的 IP 割当に使い、残りを固定 IP 割当や、他の用途に予約できるようになります。

物理ネットワークの親デバイスの変更

physical タイプの管理ネットワーク上の親プロパティの値を変更できるようになりました。これにより、物理ネットワークが再構成されたり、物理ネットワークインターフェースが交換されたりしたときに必要になる可能性がある、OVN アップリンクネットワークの別のデバイスへの移動ができるようになりました。

QEMU スクリプトレットの追加の QMP ヘルパー

QEMU スクリプトレットで、いくつかの追加関数が利用できるようになりました。

これには、run_qmp の便利なラッパーである新しい run_command が含まれており、簡単なコマンドを簡単に実行できます。

同様に、次のコマンドの簡単なラッパーがあります:

  • blockdev_add
  • blockdev_del
  • chardev_add
  • chardev_change
  • chardev_remove
  • device_add
  • device_del
  • netdev_add
  • netdev_del
  • object_add
  • object_del
  • qom_get
  • qom_list
  • qom_set

QEMU QMP コマンドの新しいログファイル

仮想マシン上で、新しいログファイルである qemu.qmp.log が利用できるようになりました。Incus と QEMU 間のほとんどのやりとりのログを保存します。

root@castiana:~# incus list v1
+------+---------+-----------------------+-------------------------------------------------+-----------------+-----------+
| NAME |  STATE  |         IPV4          |                      IPV6                       |      TYPE       | SNAPSHOTS |
+------+---------+-----------------------+-------------------------------------------------+-----------------+-----------+
| v1   | RUNNING | 10.178.240.4 (enp5s0) | fd42:8384:a6f8:63a0:216:3eff:fe4d:5cad (enp5s0) | VIRTUAL-MACHINE | 0         |
+------+---------+-----------------------+-------------------------------------------------+-----------------+-----------+
root@castiana:~# cat /var/log/incus/v1/qemu.qmp.log 
[2024-11-15T13:11:52-05:00] QUERY: {"execute":"query-cpus-fast"}
[2024-11-15T13:11:52-05:00] REPLY: {"return": [{"thread-id": 443303, "props": {"core-id": 0, "thread-id": 0, "node-id": 0, "socket-id": 0}, "qom-path": "/machine/unattached/device[0]", "cpu-index": 0, "target": "x86_64"}]}

[2024-11-15T13:11:52-05:00] QUERY: {"execute":"netdev_add","arguments":{"fds":"/dev/net/tun.0:/dev/net/tun.1","id":"incus_eth0","type":"tap","vhost":true,"vhostfds":"/dev/vhost-net.0:/dev/vhost-net.1"}}
[2024-11-15T13:11:52-05:00] REPLY: {"return": {}}

[2024-11-15T13:11:52-05:00] QUERY: {"execute":"device_add","arguments":{"addr":"00.0","bootindex":"1","bus":"qemu_pcie4","driver":"virtio-net-pci","id":"dev-incus_eth0","mac":"00:16:3e:4d:5c:ad","mq":"on","netdev":"incus_eth0","vectors":"6"}}
[2024-11-15T13:11:52-05:00] REPLY: {"return": {}}

[2024-11-15T13:11:52-05:00] QUERY: {"execute":"blockdev-add","arguments":{"aio":"native","cache":{"direct":true,"no-flush":false},"discard":"unmap","driver":"host_device","filename":"/dev/fdset/0","locking":"off","node-name":"incus_root","read-only":false}}
[2024-11-15T13:11:52-05:00] REPLY: {"return": {}}

[2024-11-15T13:11:52-05:00] QUERY: {"execute":"device_add","arguments":{"bootindex":"0","bus":"qemu_scsi.0","channel":"0","drive":"incus_root","driver":"scsi-hd","id":"dev-incus_root","lun":"1","serial":"incus_root"}}
[2024-11-15T13:11:52-05:00] REPLY: {"return": {}}

[2024-11-15T13:11:52-05:00] QUERY: {"execute":"system_reset"}
[2024-11-15T13:11:52-05:00] REPLY: {"return": {}}

[2024-11-15T13:11:52-05:00] QUERY: {"execute":"set-action","arguments":{"panic":"pause","reboot":"shutdown","shutdown":"poweroff"}}
[2024-11-15T13:11:52-05:00] REPLY: {"return": {}}

[2024-11-15T13:11:52-05:00] QUERY: {"execute":"cont"}
[2024-11-15T13:11:52-05:00] REPLY: {"return": {}}

[2024-11-15T13:11:52-05:00] QUERY: {"execute":"query-status"}
[2024-11-15T13:11:52-05:00] REPLY: {"return": {"status": "running", "running": true}}

配置スクリプトレットの get_instances_count コマンド

配置スクリプトレットに、新たに get_instances_count 関数を追加しました。

これを使用して、プロジェクト・ロケーションの組み合わせ内でのインスタンスの合計数や、トータルのインスタンスの合計数を簡単にカウントできます。また、完全に作成が完了しているインスタンスだけでなく、現在作成中のインスタンスを含めることもできます。

この追加の一部として、スクリプトレットに対して提供される候補リストにも小さな変更が加えられました。候補リストは、保持しているインスタンスの合計数に基づいて(もっとも使用頻度が低いものから高いものまで)ソートされるようになりました。

incus admin sql 内で --format オプションのサポート

incus admin sql コマンドで、通常使える --format オプションがサポートされるようになりました。

これで、単一の SQL カラムをクエリしたとき、--format=csv を使うと、スクリプトで使える形式で生の値を取得できるので特に便利です。

すべての変更点

このリリースのすべての変更のリストは次の通りです(翻訳なし):

すべてのChangeLogを見る
  • doc: Correct name of macvlan modes
  • incusd/device/nic: Correct name of macvlan modes
  • fix: fix slice init length
  • internal/instance: fix live update VM's limits.memory configuration when use a percentage value
  • incusd/instance/lxc: Remove restrictions on /run
  • Translated using Weblate (German)
  • Translated using Weblate (German)
  • Translated using Weblate (Dutch)
  • incus-simplestreams list -f json: output field names. fixes lxc#1308
  • incus-agent: Add timeout for DNS query
  • incusd/db/profiles: Support config caching
  • incusd: Update calls to profile ToAPI
  • incusd/cluster/profiles: Fix import shadowing
  • incusd/instance/qemu: Don't fail on console retrival issue
  • incusd/network: Make IsUsed configurable
  • incusd/network: Update for IsUsed argument
  • incusd/network/physical: Fix typo
  • incusd/network/physical: Handle changes in parent value
  • incus: Fix display of current project in projects list
  • incus/admin/sql: Add support for --format
  • i18n: Update translation templates
  • incusd/instance/common: Cleanup volatile on device add failure
  • incusd/internal/server/instance/drivers: Add support for Chimera Linux edk2 pkg file names
  • shared: Move internal "revert" library into shared
  • incusd/network/bgp: Only advertise networks with BGP configuration
  • incusd/cluster: Fix resource data caching
  • incusd/cluster: Actually use YAML for resources cache
  • shared: Update import path for "revert" library
  • incusd/instance/lxc: Simplify idmapSize
  • incusd/instance/lxc: Simplify findIdmap
  • incusd/isntance/lxc: Respect restrict.idmap.size on un-isolated containers
  • incusd/instance/lxc: Refactor findIdmap
  • incusd/instance/lxc: Fix off by one idmap check
  • shared: Move internal "ask" library into shared
  • shared: Update import path for "ask" library
  • shared: Add godoc comment for NewAsker
  • doc/network/resolved: Add disabling DNSSEC and DNSOverTLS
  • incusd/device/nic/bridged: Handle invalid configuration
  • doc/explenation/instances: Update for application containers
  • doc/howto/instances_create: Add an example of application container
  • doc: Add Kubernetes to wordlist
  • incusd/storage_volumes_snapshots: Respect pattern on manual creation
  • tests: Add test for custom storage volume snapshots pattern
  • incusd/main_forknet: Port DHCP client to nclient4
  • incusd/main_forknet: Attach to the container PID namespace
  • incusd/main_forknet: Handle background renewals
  • shared/cgo: Add setproctitle
  • incusd/main_forknet: Set process title
  • doc/installing: Update for Chimera Linux
  • shared/cgo: Don't use strlcpy
  • incus/top: Fix usage
  • shared/util: Add OpenBrowser
  • incus/remote/proxy: Add token authentication
  • incusd/api: Only expose UI if index.html exists
  • incus: Add webui command
  • i18n: Update translation templates
  • incusd/scriptlet: Make set_target fail with invalid members
  • tests: Update for scriptlet placement error handling
  • incusd/instance/qmp: Make Run public
  • incusd/scriptlet: Add useful QMP functions
  • doc/ref/instance_options: Mention QEMU raw QMP commands
  • incusd/network/ovn: Add support to ipv4.dhcp.ranges
  • api: instances_scriptlet_get_instances_count
  • incusd/scriptlet/instances: Fix error messages
  • incusd/db/instances: Add GetInstancesCount
  • incusd/scriptlet/instances: Add get_instances_count
  • doc/cluster/placement: Add get_instances_count
  • incusd/db/node: Sort members in GetCandidateMembers
  • incusd/instances: Rely on candidateMembers being sorted
  • incusd/db/node: Remove unused GetNodeWithLeastInstances
  • incusd/db/node: Update tests to use GetCandidateMembers
  • internal/server: Log QMP interaction to a file
  • incusd/instance/qemu: Log QEMU command line
  • tests: Update instance placement tests for new ordering
  • incusd/instance_logs: Update log file list
  • incusd/network/ovn/sb: Only monitor required tables
  • incusd/network/ovn: Implement OVN SB event handlers
  • incusd/instance/qmp: Handle disabling log file
  • incusd/instance/qemu: Don't use QMP log for feature checks
  • incusd/instance/lxc: Fix LXCFS per-instance path
  • doc/idmap: Clarify subuid/subgid configuration
  • incusd/instance/qmp: Fix logging with no log file
  • client: Add a GetOIDCTokens() method
  • cmd/project: Add get-current to show current project
  • tests: Add get-current to show current project
  • i18n: Update translation templates
  • incus/file/create: Use SFTP client instead of file API
  • internal/instance: Allow 0 as value to limits.cpu.nodes
  • Translated using Weblate (Indonesian)
  • Translated using Weblate (Indonesian)
  • Translated using Weblate (French)
  • internal/linux: Add NetlinkInterfaces
  • incus-agent: Use NetlinkInterfaces
  • incus/top: Add additional flags
  • i18n: Update translation templates
  • gomod: Update dependencies
  • incus/monitor: Include location in cluster logging
  • incusd/instance: Add ResourceUsage
  • incusd/scriptlet/instance: Use ResourceUsage
  • api: cluster_rebalance
  • incusd/cluster/config: Add cluster re-balance configuration keys
  • incusd/instance/config: Add volatile re-balance configuration key
  • doc: Update configs
  • incusd: Add cluster rebalance task
  • incusd/internal: Add rebalance endpoint
  • doc/cluster: Add mention of re-balancing
  • api: custom_volume_refresh_exclude_older_snapshots
  • shared/api: Add RefreshExcludeOlder to InstanceSource and StorageVolumeSource
  • client: Add RefreshExcludeOlder flag to StoragePoolVolumeCopyArgs and InstanceCopyArgs
  • incus: Adding refresh-exclude-older flag to 'copy' and 'storage volume copy'
  • incusd/migration: Add refresh-exclude-older flag
  • internal: Adding refresh-exclude-older flag implementation
  • i18n: Update translation templates
  • doc/rest-api: Refresh swagger YAML
  • incus/top: Fix gofmt
  • incusd/instance/drivers: Make Export return a pointer to metadata
  • incusd/images: Update for changes to Export
  • incusd/instances/publish: Fix base metadata
  • incusd/bgp: Don't add duplicates
  • incusd/network/bgp: Only skip BGP if unconfigured and not on OVN
  • incusd/network: Move loadBalancerBGPSetupPrefixes to OVN driver
  • incusd/network/ovn/sb: Add CheckLoadBalancerOnline
  • incusd/network/ovn/nb: Add GetLoadBalancer and GetLoadBalancersByStatusUpdate
  • incusd/network/ovn: Add load-balancer health event handler
  • incusd/network/ovn: Don't advertise offline load-balancers on startup
  • shared/subprocess: Allow overriding Cwd
  • incusd/device/tpm: Fix handling of long instance names
  • incusd/instance/qemu: Don't take over operations on console retrieval
  • incusd/instance_post: Provide target project to relocation scriptlet
  • incusd/cluster/request: Add new internal user-agent
  • incusd/instances_post: Don't re-run placement on internal requests
  • incusd/api: Handle new user agent
  • incusd/instance_post: Pass in internal user agent during relocation
  • incusd/instance/qemu: Don't overtake operations on console retrieval

ドキュメント

Incus のドキュメントはこちらです:
https://incus-ja.readthedocs.io/ja/latest/ (日本語訳)
https://linuxcontainers.org/incus/docs/main/ (原文)

パッケージ

Incus の開発元は、通常リリースの tarball のみをリリースするため、公式の Incus パッケージはありません。Incus を実行するために使えるオプションを以下にいくつか示します。

Linux 上に Incus サーバーをインストールする

Incus はほとんどの一般的な Linux ディストリビューションで利用できます。インストール手順の詳細は、Incus のドキュメントを参照してください。

https://incus-ja.readthedocs.io/ja/latest/installing/ (日本語訳)
https://linuxcontainers.org/incus/docs/main/installing/ (原文)

Incus クライアントの Homebrew パッケージ

HomeBrew 経由で、Linux と macOS 向けにクライアントツールが利用できます。

https://formulae.brew.sh/formula/incus

Incus クライアントの Chocolatey パッケージ

Chocolatey 経由で、Windows ユーザー向けにクライアントツールが利用できます。

https://community.chocolatey.org/packages/incus/6.7.0

Incus クライアントの Winget パッケージ

Winget 経由で、Windows ユーザー向けにクライアントツールが利用できます。

https://winstall.app/apps/LinuxContainers.Incus

サポート

月次のフィーチャーリリースは、次のリリースがリリースされるまでのみサポートされます。より長いサポート期間と少ない変更頻度が必要な場合、代わりに Incus 6.0 LTS の使用を検討すべきです。

コミュニティサポートはこちらから : https://discuss.linuxcontainers.org
商用サポートはこちらから : https://zabbly.com/incus
バグはこちらから報告できます : https://github.com/lxc/incus/issues