はじめに
Rancherを使っていくにあたってリソース(特にホスト)をどうするかという課題は常に考えないといけません。
クラウドに好きなだけリソース(例えばAWSであればEC2)を追加できる環境下であれば良いのですが、皆が皆そうとは限りません。
場合によっては自社内のベアメタルと、クラウドの両方を使いたい、つまりはオンプレとクラウドのハイブリッド環境を実現したいとも考えるかもしれません。
そこで今回は、Rancherで構築するオンプレとクラウドのハイブリッド環境を実践してみたいと思います。
ポイントは「オンプレなのか」、「クラウドなのか」ということは意識せず、それぞれのホストがあくまで「リソース」としてシームレスに使われているという点です。
構成と概要
構成図としては上記のようになります。
2台のホスト(EC2)をAWSのパブリックサブネットに配置し、2台のホストを社内LANに配置します。
それぞれのホストにはRancherOSをインストール済みです。
上の構成図でちょっと見慣れないと思われる点は、AWSと社内ネットワークでVPNを構築していることです。
Rancherのホスト間通信を実現する為には、Rancher UI上で表示されているIP(下図)で相互に通信ができる必要があり、かつそのIPは一意である必要があります(Cross-host intercontainer communication trouble にてvincent氏が語っています)。
この条件を満たすためにVPNを構築しているというわけです。
VPNサーバーにはOpenVPNを使い、(カタログからポチッと作成)VPNクライアントは専用のコンテナをRancherOS上で稼働させます。
VPNが構築できたところでロードバランサの後ろにWordpressをそれぞれのホストにデプロイし、シームレスにロードバランスされているのが確認できたら「オンプレとクラウドのハイブリッド環境」が構築できたことになります。
今回のWordpressに関しての実用性はともかく、オンプレとクラウドを意識することなく、ホストが「リソース」として使えていることに着目していただきたいと思います。それでは順を追って実際に構築していきましょう!
実践
前提
以下は既に準備ができているものとして話を進めていきますのでご了承ください。
- Rancherサーバーはパブリックネットワークにデプロイ済み(今回はAWSにデプロイ済みでElastic IPも付与済み)
- 社内のベアメタル環境にはRancherOSをインストール済み
AWSにホストを1台追加
まずはAWSにホスト(EC2)を追加しましょう。
Rancher UIから「インフラストラクチャ」を選択し、「ホストを追加」を選択します。
次にホスト(EC2)をデプロイしたいリージョンを選択し、EC2作成権限のあるアクセスキーとシークレットキーを入力し、諸々必要な情報を入力して「作成」を選択します。
これだけでRancherOSの入ったEC2がAWS上にデプロイされ、ホストとして追加されます。
もちろん、AWS上でもこのEC2は確認できます(下図参照)
全てがうまくいけば、以下のようにホストが追加されたのが確認できるかと思います。
VPNサーバーをカタログから構築
パブリックなホスト(EC2)が1台準備できたところで、カタログからOpenVPNのサーバーを立ち上げます。
Rancher UIの「カタログ」でフィルタに「vpn」と入力することでVPNに関連するカタログに絞り込むことができます。
今回はRancherのローカル認証を使おうかと思います。
「詳細を見る」を選択するとフォームが表示されるので、この中に以下のように必要事項を入力します。
ポイントとしては
- RancherサーバーのURL
- OpenVPNサーバーのIPアドレス(EC2のパブリックIP)
- OpenVPNのカスタム設定
- VPNの証明書を複数のホストで共有するので
duplicate-cn
を追加します(グッドプラクティスとは言えませんが便宜上)
- VPNの証明書を複数のホストで共有するので
そして「起動」します。これで先程のホスト(EC2)にOpenVPNサーバーのコンテナが立ち上がります。
正常に立ち上がれば以下のようになります。
ここで忘れてはいけないのが、ホスト(EC2)のセキュリティグループにてOpenVPNが使うポート1194を許可しておくことです。
これをやっておかないとOpenVPNサーバーにクライアントから接続できません。(下図参考)
VPNクライアント用のConfig作成
VPNサーバーが立ち上がったので、次にVPNクライアントが接続するための設定ファイルを作ります。
設定ファイルの元となるデータはOpenVPNサーバーのログ内にあるので、コンテナのログを「ログを見る」で参照します。
そのログの中で下図のような場所があるので、中身をコピーしています。(下図参照。 </ca>
の場所までコピーが必要です。)
この中身を適当に vpn-client-config.ovpn
とでも名前をつけて保存しておきましょう。
中身は以下のようになっているはずです。
VPNサーバーと疎通確認
では、OpenVPNサーバーが正常に動作しているか疎通確認をしましょう。
ローカルのmacからVPNクライアントを立ち上げて、接続ができるか試してみます。
やり方の詳細はこの記事では紹介しませんが、Tunnelblickなどのソフトと、先程作った設定ファイルを使ってVPNサーバーに接続してみます。
うまくいけば 10.43系
のIPが付与されるはずです。
この状態でVPNサーバーのコンテナを Ping
するとちゃんと通るのが確認できます。
これでVPNサーバーがパブリックネットワークに正常にデプロイされているのが確認できました。
VPNクライアントコンテナをRancherOSで起動
VPNサーバーが完成したところで次はVPNクライアントを用意します。
方法は色々とあるかと思いますが今回はRancherOS上にOpenVPNのDockerコンテナを起動する方法にしたいと思います。
Dockerイメージに関してはあらかじめDockerHubに openvpn
だけ alpine
上に入れたものを準備しています。
以下のとおり極々シンプルなDockerfileになっています。
FROM alpine:latest
RUN apk --no-cache add
openvpn
WORKDIR /etc/openvpn
ENTRYPOINT ["openvpn"]
それではまず、ホスト(EC2)に上で作っておいたVPNクライアント用のConfig(vpn-client-config.ovpn)ファイルを転送するか、コピペで作成するかして格納しましょう。
ホストへは rancher cli
を使って接続しています。
そしてConfigとopenvpnのクライアントコンテナを組み合わせてVPNクライアントを立ち上げます。(これはRancher UI上からもできますが、Configを準備したついでにそのままホスト内から起動しています)
VPNクライアントを立ち上げる場合に docker
は通常の権限では不十分になることと、 --device
オプションがついていることに注意してください。
sudo docker run -it --privileged --net=host \
--cap-add=NET_ADMIN --device /dev/net/tun \
--name vpn-client -v $(pwd):/etc/openvpn \
supersoftware/openvpn vpn-client-config.ovpn
-it
オプションをつけているのはVPNの認証を対話型で行う為です。
実運用でこの方法は非現実的ですが、とりあえず今回は便宜上このまま実行します。
ユーザーにはRancherサーバーで認証の通るユーザーとパスワードを指定してください。認証が完了するとVPNの構築ができたはずです。
以下はホストでOpenVPNクライアントのコンテナが動いている様子です。( docker ps
)
そしてコンテナ内からVPNサーバー( 10.42.17.234
)がPingできていることも確認できます(下図)
最後に、自分に 10.43系
のIPアドレスが付与されていることも確認できます。
これでコンテナによるVPN環境が1セット構築できました。
後編ではホストの量産を行っていき、Webアプリをデプロイしていきます!