昔Hacker newsか何かでKickass home labという記事を見つけました。 だいぶ昔に記事を書いたのですがこの度やっと環境構築を行いましたので記録しておきます。
構成考え編
Kickass home labとは?
PDFのリンクが切れてしまったようですがyoutubeにプレゼン資料がありました。
概要(再掲)
kickassにはやっつける、最高などの意味をもつスラングで使われるようです。
オフリースのサーバは安いけどそれよりも静音サーバを作れたら最高じゃない?ってことらしいです。
サーバは自作で、内容はざっくりまとめると
とのことです。
サーバ買って、NW機器買って家でガンガン動かしたい、という思いもありますが置き場やコスト面を考えると仮想環境内で似たことができるなら越したことないですよね。
自宅用に構成をチューニング
自分で作るときはどうしようかなあとずっと考えていたのですが、以下の様にします。
ハードウェア
最近小型のゲーミングPCも出ているくらいだし小型の方がスペースも電気代もかからずいいのでは?と思いこの考えで移行と思いました。
そしてGW入る前に秋葉原のPCコンフルで購入してきました。
NECのMKM27/Cというモデルです。
写真撮ってませんが手のひら2個分くらいで本当に小さいです。
少し昔のモデルですが22000円だったので安い!と思って即購入。
(DPしか付いて無かったので変換ケーブルを買う羽目にはなりましたが)
Core i5-7500T、メモリ8GB、SSD256GBです。
サーバとして使うには貧弱かもしれませんが、運用してみてから考えましょう。
Hyper visor
買ったPCにはWindows10が入っていますのでわざわざ消さずVirtual boxをインストールすることにしました。
10ProなのでHyper-Vも使えますが、Turn key等(使うかわかりませんが)のovaが入るかわからなかったので避けました。
サーバ類
乗せるサーバですがいったんコンテナメインで作ります。
Guestをボンボンと立てるよりコンテナ集約の方がイマドキぽいじゃないですか。
コンテナ環境はいろいろなPCで散らばって触っていましたのでこの機に集約したいと思います。
システムっぽくクラスタも組んでみたかったのでdocker swarmを作ってみることにしました。
LXDはコンテナの管理がdockerほど簡単でないのと、Kubernetesはマシンリソースが足りなさそうなのと学習コストの面で止めました。
構成図
今の環境を流用しながらですが構成図はこんな感じ。
nwdiagで書いてます。それっぽいシステム構成になりましたね。
外からVPNで入れるようにpfSenseを咬ませてます。
NWエンジニアなのでアプライアンスも触っとかないとね。
構築編
pfSenseインストール
isoが提供されているのでこれもGuestでインストールします。
ウィザードに沿ってOKしていくだけなので割愛します。
wan側インターフェースは最初アクセスを受け付けないので仮解放します。 lan側にGUIアクセスできる端末があれば不要ですが、現時点では置かないからです。
0) Logout (SSH only) 9) pfTop 1) Assign Interfaces 10) Filter Logs 2) Set interface(s) IP address 11) Restart webConfigurator 3) Reset webConfigurator password 12) PHP shell + pfSense tools 4) Reset to factory defaults 13) Update from console 5) Reboot system 14) Disable Secure Shell (sshd) 6) Halt system 15) Restore recent configuration 7) Ping host 16) Restart PHP-FPM 8) Shell Enter an option: 12 Starting the pfSense developer shell.... Welcome to the pfSense developer shell Type "help" to show common usage scenarios. Available playback commands: changepassword disablecarp disablecarpmaint disabledhcpd disablereferercheck enableallowallwan enablecarp enablecarpmaint enablesshd externalconfiglocator gatewaystatus generateguicert gitsync installpkg listpkg pfanchordrill pftabledrill removepkgconfig removeshaper resetwebgui restartallwan restartdhcpd restartipsec svc uninstallpkg pfSense shell: playback enableallowallwan
この後11番でWebサーバを再起動すればOK。
アクセス画面。
ルールはこんな感じ。
外からは家のLANに入れないので今はルールガバにしてます。
dockerの構築
使い慣れているUbuntuで作ります。(22.04LTS)
OS、パッケージのインストール系は割愛。
複製して2号機まで作ったのち、docker swarmでクラスタ化します。
- 1号機側
クラスタ用のIPを指定するとtokenが払い出されます。
masashi@lab-docker1:~$ sudo docker swarm init --advertise-addr 10.254.0.1 Swarm initialized: current node (i06s83zzw3xyfjpvp8fj4jybk) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-3d7aoave0c97sr1izd9ewd0uzk9skb6sup4j6o8kd670lvy7vy-7txscqrdxgwwdzrdvwcsya8ho 10.254.0.1:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
- 2号機側
発行されたtokenを入れればクラスタ参加完了。
楽ですね~。マシンが増えても同じコマンドでどんどん参加できます。
masashi@lab-docker2:~$ sudo docker swarm join --token SWMTKN-1-3d7aoave0c97sr1izd9ewd0uzk9skb6sup4j6o8kd670lvy7vy-7txscqrdxgwwdzrdvwcsya8ho 10.254.0.1:2377 [sudo] password for masashi: This node joined a swarm as a worker.
- 再度1号機側
クラスタ組めました!
他の記事等見ると3~4台で組んでいるのが多いですが、ホストのリソースも少ないため2台で使ってみます。
masashi@lab-docker1:~$ sudo docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION i06s83zzw3xyfjpvp8fj4jybk * lab-docker1 Ready Active Leader 23.0.5 0crn1z5vpy219bkt513ccn5mh lab-docker2 Ready Active 23.0.5
docker単体のコマンドは各自打てますが、swarm系のコマンドはmanagerしか受け付けないので基本的に1号機側で操作することになります。
コンテナデプロイ
土台は組めましたがそれだけでは寂しいので管理ツールであるportainerをインストールします。
使ったことはあるのですがswarm上でデプロイするのは初めてです。
公式の手順通りにデプロイします。
masashi@lab-docker1:~$ curl -L https://downloads.portainer.io/ce2-18/portainer-agent-stack.yml -o portainer-agent-stack.yml masashi@lab-docker1:~$ sudo docker stack deploy -c portainer-agent-stack.yml portainer Creating network portainer_agent_network Creating service portainer_portainer Creating service portainer_agent masashi@lab-docker1:~$ masashi@lab-docker1:~$ sudo docker service ls ID NAME MODE REPLICAS IMAGE PORTS fyijaxnx2903 portainer_agent global 0/2 portainer/agent:2.18.2 ddrxmnjz9is4 portainer_portainer replicated 0/1 portainer/portainer-ce:2.18.2 *:8000->8000/tcp, *:9000->9000/tcp, *:9443->9443/tcp
サービスが上がりました。
masashi@lab-docker1:~$ ss -lnt State Recv-Q Send-Q Local Address:Port Peer Address:Port Process LISTEN 0 4096 127.0.0.53%lo:53 0.0.0.0:* LISTEN 0 128 0.0.0.0:22 0.0.0.0:* LISTEN 0 128 [::]:22 [::]:* LISTEN 0 4096 *:8000 *:* LISTEN 0 4096 *:9443 *:* LISTEN 0 4096 *:9000 *:* LISTEN 0 4096 *:2377 *:* LISTEN 0 4096 *:7946 *:*
ポート共有されてますね。OK。
アクセスします。
OKですね。
構成もちゃんと見えます。
まとめ
これでホームラボの土台がいったん作られました。
あとは外からアクセスできるようにVPN環境を作るのと、別マシンで動かしているFireflyやpi-holeを持ってくればOKです。
swarmは独自のコマンドですが、単体時のコマンドとそんなに違わなそうなのですぐに慣れると思います。(yamlも使えるし)
今後は試したいソフトがあればコンテナを立てればいいし、Turnkey Linuxでよさそうなマシンを立ち上げてもOKです。
バージョンアップ等のテスト用の環境も欲しいです。
コンテナ内のNWはdockerが自動で上手いことやってくれていそうですが、もう少し自分で制御して環境やマシンごとに分けられるようにしたいですね。