ご注意いただきたいこと
個人で行っている趣味レベルサービスで運用している構成となります。業務で運用している構成などではないので、ご了承ください。
構成についてお話していますが、実際に構築する手順は書いていません。 需要ありそうなら書いていこうかと思います。
カッコいい自動デプロイとかオートスケーリングとかの話はありません。。。
VPSでLXD使うと、便利だよ!というお話です
個人でサービス立ち上げるとき、、、
・AWSで立てるほどでもない……
・だけどRedisとかいろいろミドルウェアがほしい……
なんてことがあるかと思います。(私だけ?)
そんなとき、VPSを借りていると自分でなんでも入れられるので便利なのですが
「1サービスに1VPS使っていると、お金が……」ということになってしまいます。
そもそもとりあえず作ってみたサービス毎にVPS借りるなんてできません。
そこで登場するのがLXDです。
そもそもLXDって?
LXD(https://linuxcontainers.org/ja/lxd/introduction/)
LXD は次世代のシステムコンテナマネージャです。 仮想マシンと同じようなユーザ体験を提供しますが、仮想マシンではなく Linux コンテナを使います。
LXDを使うことで1ホスト内にサービスを集約でき、「CPUやメモリといったリソースを無駄なく利用することができる」というメリットが得られます。
(同時にホストが落ちたとき、サービスがまるっと落ちるというデメリットもありますが)
コンテナならDockerもありますが、Dockerの「アプリケーションコンテナ(1コンテナ1プロセス)」に対して、LXDは「システムコンテナ」です。
1コンテナに1プロセスでも良し、1コンテナにNGINX+PHP-FPM+MYSQL+REDISとまとめても良しと自由にできます。
(Dockerでもまとめることができますが、Dockerの思想から外れてしまいます)
DockerとLXDの違いについて、まとめてくださっている方がいらっしゃいました。
(https://qiita.com/takaaki_kurihara/items/41bfc2b3253eb8b6a98e)
構成図
LBホスト(nginx)
スペック:さくらVPS メモリ512MB SSD 20 GB 1仮想コア
OS:CentOS7
ロードバランサと書いていますが、実際のところ各LXDサーバ内のコンテナ(サービス)に振り分けるだけのリバースプロキシです。
コンテナサーバを外部にそのまま公開しちゃうのは不安……と思い利用しています。
SSL証明書もこのLBホストに集約されています。
(LXDホストを2台用意して、それぞれに同じコンテナ立ち上げて負荷分散みたいなこともできます)
LXDサーバ内にnginxサーバ立ち上げて利用、でも問題ないと思います。
なお、振り分けはサブドメインを利用して行っています。
LXDホスト
スペック:さくらVPS メモリ 2GB HDD 200 GB 仮想3コア
OS:Ubuntu16.04
今回の本題、LXDが稼働するサーバです。
ここにいろんなサービスを載せます。
サービス立ち上げまでのざっくりした流れ
- アプリケーションコード書く
- LXDコンテナを立ち上げる
lxc launch ubuntu:16.04 new_service
- 作成したコンテナの中に入って環境構築(内容はシステムに応じて。 PHPならPHPインストールなど)
lxc launch new_service bash → 指定したコンテナにbashでログインします
- WEBサーバから作成したコンテナへのプロキシ設定を行う(→これで外部にシステムが公開される)
実際にどう使っている?
先程の構成で以下のサイトを運営しています。(航空系趣味のサイトです)
※その他にも(非公開ですが)ZabbixやJenkins、身内だけで運営しているMastodonなど。。。
まとめ
メリット
- サーバの高集積化。余ってしまうリソースを有効活用することができる
- サービスが大きくなってきたら新しいホストを借りて、コンテナを移行と柔軟な対応もできる
- 不要になったサービスのコンテナはすぐに消してリソース開放することができる(しかもホストは汚さない)
デメリット
- 1ホストに複数サービスが集まるので、特定のサービスにアクセスが集中してしまうと他のサービスにも影響が出る
- ホストが止まるとすべてのサービスが停止してしまう
- 完全な仮想化ではないため、LXD特有の不具合が発生してしまう可能性もある
最後に
初めてまともに自分のやっていることをアウトプットしているので、うまく伝わる記事になっているかは不安ですが。。。
LXDも便利だよ!というのが伝えられるよう今後も記事を増やしていきたいと思います。