お家で始める仮想化環境 Proxmox VE 環境構築編

Proxmox VE とは

Proxmox VE とは、仮想化環境を提供するプラットフォームの1つです。
VM(Virtual Machine)などのホストとして使用できます。
似た目的の製品として、VMWare ESXiなどがあります。
こちらを利用されている方も多いのではないでしょうか。

Proxmox - powerful open-source server solutions
https://proxmox.com/

ちなみに、Proxmox VE は Proxmox Virtual Environment の略です。

筆者は1年以上 Proxmox VE を使用していますが、いずれも安定して動作しています。

Proxmox VE の特徴

大きな特徴として、VMWare ESXiと比較し、ライセンスフリーでほぼすべての機能を利用できる点が挙げられます。
無償版でも、VMWare ESXiのようにVMあたりのコア数の制限はありません。
また、複数のホストをクラスタリングしたり、HA環境、ライブマイグレーションといった機能も無償で利用することができます。
さらに、VMWare ESXiと同様にWebインタフェースを持っていますので、Webブラウザ経由で簡単に管理することができます。
Debianベースで開発されていますので、ホストOS上にRAIDコントローラのドライバなども簡単に導入することができるのも、利点といえるでしょう。
さらに、VMWare ESXiでは早期にCPUサポートが打ち切られるケースがありますが、Proxmox VEでは基本的にLinux Kernelが動作可能なモノであれば動かすことができます。
自宅などで古いハードウェアを利用する際には、有力な選択肢となるでしょう。

VM(Virtual Machine)やLXC(Linux Container)に対応します。

インストール準備

公式サイトより、Proxmox VE のISOイメージをダウンロードしてください。
2020年8月12日時点では、Proxmox VE 6.2 が最新でした。

容量は863MBとなっています。丁度Debianのイメージと同じぐらいですね。

イメージのダウンロードが完了したら、balenaEtcherやddコマンドを利用して、適当なUSBメモリにダウンロードしたイメージを書き込んでください。
ここでは、書き込み手順については省略します。

イメージの書き込みが完了したら、準備は完了です。

インストール

仮想化環境の役割を与えるマシンを用意します。
今回は、以下のマシンを使用しています。
(AMD CPUを使用していますが、既存環境はIntel CPU上でProxmox VEを運用しており、手順に差が無いことを確認しています。)

パーツ 詳細
CPU AMD EPYC 7452 32Core Processor
M/B Supermicro H11SSL-i (Rev2.0)
Memory DDR4 ECC Registered 128GB

なお、利用するマシンのBIOSにて、CPU Virtualizationサポートを有効化しておきます。
Intel CPUの場合はVT-dなど、AMD CPUの場合はSVM Modeなどです。

これらの準備が完了すれば、先ほど作成したUSBメモリをマシンへ接続し、USBからブートします。
以下のような Welcome to Proxmox Virtual Environment と書かれた画面が表示されます

今回は普通にインストールしますので、「Install Proxmox VE」を選択します。
ブートログが流れたのち、以下のようなライセンス同意画面が表示されますので、ライセンスを読み問題が無ければ右下の「I agree」を押します。
なお、これらの操作はキーボードでもマウスでも操作可能です。

同意すると、インストールするターゲットディスクの選択画面が現れます。

今回は /dev/sda にデフォルトの ext4 でインストールします。
ソフトウェアRAIDを構成することも可能ですので、必要に応じてオプションを変更します。

続いて、国やタイムゾーン、キーボードレイアウトなどの設定です。
ここも各自必要に応じて設定します。

続いて、パスワードとE-Mailの設定です。
パスワードは、rootユーザーのパスワードになります。E-Mailも合わせて適時設定します。

続いて、ネットワーク周りの設定です。
ここでは、管理用ネットワークについて設定を行います。
管理用ネットワークとして利用するインタフェースとHostname・IPアドレス等を適切に設定します。

最後に、確認画面が表示されますので、設定に問題が無ければ「Install」を選択し、インストールを開始します。

インストール処理が行われますので、終了するまで待ちます。

インストールが完了すると、右下に「Reboot」と表示されますので、指示に従って再起動します。
なお、再起動中に、インストールに使用したUSBメモリは外しておきます。

再起動が完了すると、Proxmoxの起動メニューが表示されますが、選択しなければ通常起動されます。

起動が完了すると、Webインターフェースへアクセスするための情報(URL)が表示されますので、指示に従ってブラウザからアクセスします。
なお、今回は https://192.168.2.133:8006/ となっています。
(インストール時に設定した管理ネットワークのIPアドレスが使用されます)

ブラウザからWebインタフェースへアクセスすると、SSLエラーが出ますが、自己証明書を使用している為に表示されているだけですので、そのままアクセスを続行します。
ログインを求められますので、インストール時に設定したパスワードなどを使用してログインします。
(ユーザー名のデフォルトは root です。)
言語なども必要に応じて変更します。

ログインすると、「No valid subscription」といったダイアログが表示されますが、そのまま「OK」を押して続行します。
無償版を使用していると表示されますが、無償版のデメリットはこのダイアログが表示されるぐらいなので、我慢しましょう。

以上で基本的な手順でのインストールは完了です。

無償版リポジトリを設定する

インストール直後の初期状態では、有償版のリポジトリが設定されているため、アップデートなどを行うことができません。
そこで、無償版のリポジトリを設定する必要があります。

Webインターフェースから Proxmox 自体のシェルへアクセス可能なので、そちらから設定を行います。
(もちろん、SSHでのアクセスも可能ですので、お好みの方法で設定を行ってください。)
左側のサイドバーからホストを選択します。今回は「test」となっています。
その後、右上のShellからお好きな方法で接続してください。
今回はコピー&ペーストが使用可能な「xterm.js」を使用します。

起動が完了したら、こちらを参考にリポジトリの設定を変更します。

/etc/apt/sources.list に無償版のリポジトリを追加

1
2
# PVE pve-no-subscription repository provided by proxmox.com, NOT recommended for production use
deb http://download.proxmox.com/debian stretch pve-no-subscription

/etc/apt/sources.list.d/pve-enterprise.list から有償版リポジトリを無効化
(ここではコメントアウトしています)

1
# deb https://enterprise.proxmox.com/debian stretch pve-enterprise

以上の変更操作が完了したら、アップデートを行います。
アップデートを行うには、2つの方法があります
1、このままシェルからアップデートを行う。
2、Webインタフェースから行う。

1、このままシェルからアップデートを行う。
Proxmox VE はDebianをベースにしていますので、パッケージマネージャとして apt が使用されています。

1
apt update && apt upgrade -y && apt dist-upgrade -y

2、Webインタフェースから行う。
Webインタフェースで、ホストを選択して「Updates」を開きます。
(画像の赤線部)

更新があるか確認する必要があるので、左上の「Refresh」を押し、パッケージの更新有無を確認します。
「No valid ・・・」ダイアログが出たのち、ログが出ますので、「Task OK」と表示されたら閉じます。
先ほどの画面に、更新のあるパッケージリストが表示されているはずです。

続いて、先ほどのボタンの右側「Upgrade」を押します。
シェルが開いて、Do you want to continue? [Y/n]と聞いてきますので、問題がなければyを入力して続行します。
こちらも、処理が完了したら閉じてOKです。

以上で、パッケージのアップデートが出来るようになりました。

Summary

ネットワークの設定は、ホストを選択した状態で、「Network」から行うことができます。
ストレージの設定は左側のツリートップの「Datacenter」を選択した状態で「Storage」から行うことができます。
ホストごとに設定すると思ってホストを選択した状態でストレージ設定を探してしまうので、注意が必要です。

ISOイメージをアップロードする

VMの作成などに使用するISOイメージのアップロードを行います。
Webインタフェース左側のツリーから「local」を選択します。(対象のストレージを選択しています。)
「Content」から「Upload」を押し、アップロードしたいイメージを選択して「Upload」を押します。

簡単にISOイメージなどをアップロードすることができます。

VMを作成してみる

試してにVM(Virtual Machine)を作成してみます。
Webインタフェース右上から「Create VM」を選択します。

VMを作成するホスト(Node)やID、名前を設定します。

続いて、インストールに使用するISOイメージや、GuestOSの選択を行います。
今回はUbuntu20.04.1を使用するので、以下のように設定しています。

「System」タブは、VMを作成してみるだけなら特に設定する必要はありません。

「Hard Disk」タブでは、ゲストOSが使用するストレージの設定を行います。
保存先やサイズなどを設定します。

「CPU」「Memory」では、ゲストOSに割くリソース量を設定することができます。
ホストOSの持つリソース量を超えないように設定します。

「Network」では、VMに割り当てるbridgeインタフェースの設定をします。初期設定のままだと「vmbr0」しか存在しないので、今回はそれを選択しておきます。
必要に応じて変更してください。

「Confirm」では確認画面が表示されますので、問題が無ければダイアログ右下の「Finish」を押します。

VMの作成が完了すると、Webインタフェース左側のツリーに作成したVMが表示されます。

作成したVMを選択し、右上の「Start」を押すとVMが立ち上がります。
「Console」を押すことでコンソールにアクセス可能です。

コンソールにアクセスすると、VMが立ち上がっているはずです。
(今回はVM上でのOSインストールは行いません)

まとめ

今回は、Proxmox VEの初期セットアップ方法について書いて見ました。
多くの人がVMWare ESXiを使用する中で、Proxmox VEは無償版での機能制限がほぼないのが魅力です。
さらに、VMWare ESXiは早期にCPUサポートをやめますが、Proxmox VEでは基本的にLinux Kernelが動作するCPUであれば利用できます。
自宅などで古いハードウェア上で利用したい場合には大きなメリットとなるでしょう。

今回は初期セットアップ方法のみの解説でした。
ストレージやネットワーク周りの設定、クラスタリングなどについても、需要がありそうであれば書いてみたいと思います。

自宅インフラ紹介2020年6月 論理構成編

さて、自宅インフラの論理構成がおおよそ固まってきたので、少し紹介したいと思います。
(物理と合わせて書くとグチャグチャになるので今回はあんまり触れません。)

1年ほど前の構成はこちら
最近書いた物理構成はこちら

指針

これまでの自宅環境では、Hypervisor である Proxmox を利用した仮想化環境を主として構成していました。
しかしながら、複数のWebサイトをホストしたりする都合上、仮想マシン(VM)ではスケールに手間がかかります。
そこで、学習・検証を兼ねて、kubernetes を用いたコンテナ環境を採用することにしました。
また、都合上、仮想マシンも同時に扱える必要がありますので、ハイパーバイザー上の仮想マシンでコンテナ環境を実現するという少し変な構成になっています。
(電気代を気にしないならばマシンごとに分ければよいのですが、そうもいかないので)

Server Hardware

本構成では、物理サーバを3台使用しています。
うち2台はHPE製の2Uサーバ、DL380 Gen10を使用し、ストレージには Western Digital 製の Ultrastar DC SS200 (SAS 12Gbps) を使用しています。

Hypervisor for Virtualization

Hypervisor には引き続き proxmox を利用します。
VMWare ESXi を用いない理由としては、無償版においてCPU数の制限があること(8C)、ネットワークインタフェースでのLAG等が出来ないことが挙げられます。

Infrastructure with kubernetes

物理サーバを2台使用し、それぞれの VM 上にワーカーを乗せています。
また、図にはありませんが、コントロールプレーンは物理サーバごとに1つ以上配置しています。
これらの物理サーバは 10GbE 2本で接続されています。
さらに、 Horizontal Pod Autoscaler による水平方向のオートスケーリングを設定しています。
HTTPトラフィックは、 Ingress によるL7ロードバランサーを利用し各Podへの分散を行っています。

Registry for Container

Docker Container 用のレジストリには SUSE がオープンソースで公開している Portus を用いています。
また、これらのレジストリは kubernetes が動くマシンとは独立し、ストレージサーバ上の仮想マシンで動作させています。
kubernetes クラスタ内に配置しなかったのはストレージサーバ上で動作させるほうがストレージ的に都合が良かったためです。
適当なマシンが手に入れば引っ越し予定ですので、それと同時に kubernetes クラスタ内に配置するかもしれません。
このあたりはまだ詰めきれていない状態です。

HTTP and HTTPS Traffic

外部からのHTTP(HTTPS)トラフィックは、Nginx Reverse Proxy を使用して Ingress Load Balancer へ流しています。
ルータからのフォワーディングは 1IP に向けることしか出来なかったので、間に Nginx を挟み Ingress が動く複数のワーカーへ通信を分散しています。
手元の機材では、これ以外の方法が思いつきませんでした

Redundancy and Scalability

構成上、 Nginx や Registry が単一障害点となっていますが、 kubernetes クラスタについては物理・論理の両方での冗長性を確保しています。
例えば、物理的にサーバをメンテナンスする際にも、もう一方のサーバでサービスは動き続けます。
また、ワーカーの動く仮想マシンの1つをシャットダウンしたとしても、サービスは動き続けることが出来ます。
さらに、水平方向へのスケーリングも容易に行うことができ、これらは Horizontal Pod Autoscaler によってオートスケーリングされます。
個人レベルでは全く意味がないですが、ある程度の冗長性とスケーラビリティを実現しました。
これで気軽にサーバの電源を落とせます

まとめ

今回、自宅ラックで構成した環境は、kubernetes をメインとしました。
それに付随して、スケーラビリティを確保することができ、ラックのメンテナンスが容易になりました。
kubernetes の検証も兼ねて構成したものですので、構成した本番環境以外で別途クラスタを構築し、今後の学習に利用する予定です。
眠くなってきたので、今回はこのあたりで終わっておきます。

Docker Private Registryを構築しDashboardを利用する

Docker Registryをプライベートで利用したい

Docker Hub には、Docker イメージをアップロード出来る機能がありますが、アップロードしたイメージは有料会員で無い限りすべてパブリックに公開されます。
つまり、Docker Hub 上においてプライベートなレジストリを利用するには、有料会員となる必要があるわけです。
しかしながら、個人利用においては自身で作成したイメージをパブリックに公開したくないことも多々あります。
そこで、レジストリを自身でホスティングする方法で、自分だけの Docker Registry を構築してみます。

本記事は、自宅オンプレ環境にイメージを展開するためのレジストリを構築するという目的で、TLS等での通信に必要な証明書については触れません。

Docker Private Registry をDocker上で実行する

Docker Private Registry 自体のイメージは、Docker Hub 上で発見することができます。
また、以下のようにコマンドを利用しても検索を行うことができます。

1
2
3
$ docker search registry
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
registry The Docker Registry 2.0 implementation for s… 2984 [OK]

事前にイメージを手元にダウンロードしておきたい場合は、pull オプションを利用してください。

1
$ docker pull registry

また、これらの手順を行わなくとも以下のコマンドを実行することで、手元にイメージがない場合は自動的にダウンロードされます。
なお、本記事では、registry:latest を使用し、レジストリ用のポートとしてホストのポート5000番をbindしています。

1
$ docker run -d -p 5000:5000 --restart always --name registry -v /mnt/docker/registry:/var/lib/registry registry

ここでは、Dockerを実行しているホストOS上の /mnt/docker/registry ディレクトリを、コンテナ上の /var/lib/registry にマウントしています。
これは、コンテナを再起動したりした場合でも レジストリにアップロードしたイメージを保持するために必要です。
必要に応じてホストOS側のディレクトリの作成を行ってください。
docker psコマンドを用いて実行状態を確認することができます。

1
2
3
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
26d11328cef9 registry "/entrypoint.sh /etc…" 16 seconds ago Up 14 seconds 0.0.0.0:5000->5000/tcp registry

なお、必要に応じてDockerを実行しているホストOS側のFirewallを適切に設定してください。
本記事ではufw等の設定は省略します。

Docker Image を利用する側の設定

Docker Image をアップロードする際、デフォルトではTLS等の暗号化通信において、適切に暗号化されたホストとのみ通信を行うような設定になっています。
しかしながら、今回はTLS等の暗号化通信を使用しませんので、レジストリのホストが信頼できるホストであるとして、設定を行う必要があります。

Docker Image をアップロードするマシンにおいて、以下のファイルを編集します。
(必要に応じて管理者権限で実行してください)

1
$ nano /etc/docker/daemon.json

このファイルに、以下の記述を追加します。
この例では、レジストリを構築したホストのIPアドレスを 192.168.1.10 と仮定しています。

1
2
3
{
"insecure-registries" : ["192.168.1.10:5000"]
}

Docker Image をアップロードしてみる

ここでは、Docker Hub 上の例を引用し、Ubuntuのイメージを構築したレジストリにアップロードしてみます。
(適時、IPアドレス・ポート番号は変更してください)

1
2
3
$ docker pull ubuntu
$ docker tag ubuntu 192.168.1.10:5000/ubuntu
$ docker push 192.168.1.10:5000/ubuntu

簡易的なWeb Dashboard

docker-registry-frontendは、どのようなイメージがレジストリ上に存在するか確認することが出来るWebインタフェースです。

利用するには、以下のようにコマンドを実行します。
(適時、IPアドレス・ポート番号は読み替えてください)

1
$ docker run -d -e ENV_DOCKER_REGISTRY_HOST=192.168.1.10 -e ENV_DOCKER_REGISTRY_PORT=5000 -p 8080:80 konradkleine/docker-registry-frontend:v2

なお、レジストリのホストIPアドレスとして、localhost を用いることはできませんのでご注意ください。

docker ps コマンドを利用して、コンテナが実行されているか確認することができます。
(ここでは、レジストリとWebインタフェースを同じホストで実行しています)

1
2
3
4
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
313bf15a690e konradkleine/docker-registry-frontend:v2 "/bin/sh -c $START_S…" 5 seconds ago Up 2 seconds 443/tcp, 0.0.0.0:8080->80/tcp wonderful_williams
26d11328cef9 registry "/entrypoint.sh /etc…" 21 minutes ago Up 21 minutes 0.0.0.0:5000->5000/tcp registry

コンテナが実行されていれば、ブラウザ上から http://192.168.1.10:8080/ とすることでWebインタフェースにアクセスできるはずです。

今回は、プライベートな Docker Registry を構築し、簡易的なWebインタフェースを試しました。

本記事を執筆中に、別途レジストリに使えそうなものを発見したので、余裕があればそちらも試してみようと思います。