Aqutras Members' Blog

株式会社アキュトラスのメンバーが、技術情報などを楽しく書いています。

rancherでコンテナベースのサーバ運用を始めた話

こんにちは、いるかさんf:id:Dltn:20170419190159g:plainです。
前回の記事の最後に少し触れていましたが、社内にrancherを導入しました。 rancherとは、コンテナ管理のプラットフォームで、プロビジョニングやオーケストレーション、モニタリングなどのインターフェイスを提供します。 試したい場合は、dockerが入っていれば以下の1コマンドで試せますので、ぜひ。自分はこの1コマンドでrancherに一目惚れしました。

$ docker run -d --restart=always -p 8080:8080 rancher/server

単刀直入に、すこぶる使いやすいです。今までは、社内外で運用しているサービスは全部VPSやEC2等に乗せて運用していましたが、 社内で運用しているサービスの半分以上を一気にDockerで動かすように変更して、rancher上に乗せ換えてしまったぐらいに使いやすいです。 他のツール類を使ったことがない(本で読んだぐらい)なので、比較検証はできませんが、他にもClockerやTutumがO'ReillyのDockerでは紹介されています。

今回は、rancherを社内でどういう風に運用しているのか紹介しつつ、使っていて良いと感じた点、はまった点を紹介したいと思います。
※ アキュトラスではインフラエンジニアを募集しています!!

社内での運用形態

構成

f:id:Dltn:20170422184353p:plain
(※ 2017.04.22 18:45 図を少し修正しました。)

RancherはDigitalOceanに置いて、DockerのHostはAmazon EC2上においています。RancherをEC2ではなくDigitalOceanにおいてある理由は、もともとDockerのHostもDigitalOcean上に置こうと思っていたのですが、ちょうどその作業をしていた時にDigitalOceanがメンテで落ちてたので、EC2に作りました。

AWSのElasticIPは、5つしか取得できないみたいなので、1個だけGatewayを作って、ドメインのDNSはそのIPを設定しています。Gatewayにロードバランサのコンテナを設置するように設定し、そこから他サービスのコンテナへバランスしています。Gatewayをもう1台増やせば、冗長性をもたせられますが、まだやってません。Gatewayにアクセスが集中するので、コンテナはGateway以外に配置されやすいように設定しています。

CIやデプロイ

f:id:Dltn:20170422084558p:plain

GitHubでブランチが更新されると、CircleCIでテストが走ります。テストにパスすると、Dockerのイメージをビルドし、ECRにアップします。その後、RancherのAPIを利用して、コンテナをアップグレードしています。

良いと感じた点と、はまった点

長いので箇条書きで先にまとめます。詳しくは後述しています。

  • 良いと感じた点
    • 複数のホストを1台のように扱える
    • APIが豊富に用意されていて、しかもアクセスしやすい
    • docker-compose.ymlから構築できる
    • カタログが充実している
    • UI/UXが直感的でデザインも良い
    • 導入が楽
    • ホストの増減が楽
    • コンテナの増減が楽
    • ロードバランサ(haproxy)の設定が楽
    • ストレージの永続化が楽
    • 複数の運用環境を分離できる
    • 日本語対応
    • 開発が活発
  • はまった点
    • ネットワーク関係でのトラブル
    • ストレージの永続化
    • うまくコンテナが分散されない場合がある
    • スペックが低いと不安定

良いと感じた点

複数のホストを1台のように扱える

f:id:Dltn:20170422055921p:plain

  • rancher-agentを乗せてrancher管理下に置いてあれば、rancherがコンテナをホストに配置してくれます。
  • なので、スペック足りなければ適当にホストを追加すれば、そこにコンテナを配置して、既存のコンテナからリンク可能。
  • コンテナ間のネットワークまわりはrancherがよしなにしてくれます。(rancher ipsecで実現)
    • ネットワークをrancher managedに設定している場合(default)、 10.42.0.0/16 で管理してくれます。
    • ネットワークをbridgeに設定すれば、docker bridge ip 172.17.0.0/16 になります。
    • 基本的にmanagedで問題なさそうです。
  • rancher-agentはあくまでホストのdockerを操作しているだけでdocker in dockerではない。
  • rancherやrancher-agentも含めて基本的に全てdockerに乗って動いています。

APIが豊富に用意されていて、しかもアクセスしやすい

f:id:Dltn:20170422061916p:plain

  • 至る所のメニューに APIを見る という項目が用意されており、簡単にAPIを知ることができます。
  • この機能自体がAPIドキュメント的に機能している部分もあり、簡単にAPIを使えます。
    • curlでの実行例も表示してくれる親切設計。
  • さらに、APIの種類も多く、結構隅々までAPIで操作できるようになっています。
    • CIなどとの連携も簡単にできました。
  • レシーバーHookの利用でリソース不足ともサヨナラできそう。
    • ホストの増減、コンテナの増減用のHookURLを作れるので、リソース監視系と連携すれば、勝手に増減させて運用できそうです。

docker-compose.ymlから構築できる

  • docker-compose.ymlがあれば、それを使ってすぐに構築できます。
  • rancher上でポチポチして作った構成をdocker-compose.ymlに出力することも可能。
  • ただし、完全互換というわけではないので、その時々で修正が必要。

カタログが充実している

  • カタログとは、サービス単位で必要なイメージ群をとりまとめたもので、設定項目なども分かりやすくまとめられています。
    • 自分でカタログを作ることも可能。
  • コミュニティのカタログが結構充実しています。
    • WordPressやOwncloudなどもポチポチするだけで簡単に設置できました。
    • GitLabやRocketChatなど、開発系も多数揃っています。

Rancherに関連して便利なカタログを4つ紹介します。

Prometheus


↑ホストのmetrics画面の例 (少しdashboardを編集してます。) (クリックで拡大)

  • Rancher管理下のホストのリソースやDockerの状態をモニタリングできます。
  • 各ホストにnode-exporterとcadvisorが入って、prometheusでストア、grafanaで可視化します。
  • grafanaはv4系が入っているので、アラートも設定でき、大変素敵です。
  • デフォルトで多数のダッシュボードが登録されてるので、そのままでもいい感じに使えます。
  • ホストが増減しても勝手に追従するので、その辺も手軽です。

healthcheck

  • HTTP, TCPいずれかで接続確認して、条件を満たさなければコンテナの再作成を行う機能。
  • デフォルトで導入されるインフラカタログ。
  • 何らかの原因でコンテナ内のプロセスがサービスを提供できなくなっていても、勝手に復帰してくれる!

Rancher NFS

  • ストレージの永続化としてNFSを利用できるようにしてくれるインフラカタログ。
  • NFSを立てておけば、そこをvolumeで指定できます。
  • 特に不便は感じていませんが、他にも Rancher EBSRancher EFS などがあります。いずれも執筆時点でExperimentalです。
    • Rancher EBSは、AWSのEBSを利用するというもの。
    • 試してみたんですが、自分の環境ではうまく動きませんでした…. (設定不備?)
    • Rancher EFSは、AWSのNFS的なサービスを利用するというもの。
    • 東京リージョンは執筆時点でまだ未対応なので、海外リージョンを利用しないといけません。
    • これも試してみたんですが、自分の環境ではうまく動きませんでした…. (設定不備?)
    • いずれもExperimentalなので、今後に期待ですね!

ECR Credential Updater

  • RancherでAWS ECRを使う場合、トークン(credential)を登録しておく必要があります。
  • しかし、AWS ECRのトークンは有効期限が切れます。
  • それを自動で更新してくれるのが ECR Credential Updater で、AWS IAMのcredentialを入れておけば勝手に更新してくれます。
  • AWS ECRを使っているなら導入は必須だと思います。

UI/UXが直感的でデザインも良い

  • すでに何枚かスクリーンショットを貼っていますが、特段分かりにくいところもなく、扱いやすいです。(個人的には)
  • themeがlightとdarkの2種類用意されていて、どちらか選べます。
  • 時間によってthemeを勝手に切り替えてくれる機能もあります。
    • 自分は切り替えてくれる方を使っています。こういう細かい機能、大好き。

導入が楽

  • rancher自体がdocker上で運用できるので、手軽に試せるし使える!
  • メモリは最低1GB、推奨は8GBらしいけど今は4GBのホスト2台でHA構成で運用しています。
    • 1GBや2GBだとやや不安定な感じがしました….
    • 変に低スペックで頑張ろうとして不安定な挙動に振り回されるぐらいなら、ちょっとリソースを多めに見た方がよさそうでした。
  • Webインターフェイスでほとんどの操作ができるので、覚えることも少ないです。
    • 実際、O'ReillyのDocker本を10章まで読んですぐの状態でもすぐに使い始められた程度には楽。

ホストの増減が楽

  • ホストの追加も、Web上でポチポチすると簡単にできます。
  • 既存のホストを追加する場合だけ、ファイアウォールの設定と、コマンドを1つコピペで実行する必要があります。
    • でもそれだけ!
  • Amazon EC2、Azure、DigitalOcean等であれば、APIキーを入力してマシンのスペック等を選んでいくだけで、勝手にホストを作成してくれます。
  • rancher-agent等も勝手に入るので、作成が完了したら、即コンテナを置ける状態になります。
    • EC2についてはちょっとハマりどころがあるので後述します。
  • 上述していますが、HookURLでの増減も可能です。

コンテナの増減が楽

  • コンテナの増減は、プラスマイナスのボタンをポチポチ押すだけです。
  • 後はRancherが勝手に適当なホストにコンテナを置いて動かしたり削除したりしてくれます。
  • 楽ちんだなー( ;∀;)
  • 上述していますが、HookURLでの増減も可能です。

ロードバランサ(haproxy)の設定が楽

f:id:Dltn:20170422071654p:plain

  • 画像の通り、Web上でポチポチするだけでロードバランサができあがります。
  • SSL証明書もrancher上で管理でき、勝手に適切な証明書で処理してくれます。
  • haproxy.cfg を直接書くこともできるので、細かい制御はそこで対応できます。
  • プロトコルはTCPやTLSも対応しています。

ストレージの永続化が楽

  • 上述のRancher NFS等を使うことで、外部ストレージをvolumeに利用できます。
  • そのvolumeを利用することで、簡単に永続化できます。

複数の運用環境を分離できる

  • 環境という単位で、ホストやストレージ等を分離できます。
  • 更に、環境ごとにユーザのアクセス権限なども分離できるので、細かい運用制御ができます。

環境のテンプレートが充実

  • Cattleしか使ったことないですが、Kubernetes, Mesos, Swarmと、メジャーどころが一通り揃っています。
  • 違うテンプレートを選んでいても、カタログを使って追加できます。
  • 自前のテンプレートも管理可能。

日本語対応

  • 結構いろんな言語に対応していますが、日本語もバッチリ対応しています。
  • しかも翻訳漏れ的なところがほぼなく、自然な日本語なので、違和感もないです。
  • 英語アレルギーの人でもへっちゃら!(˘︶˘).。.:*♡

開発が活発

  • 開発が活発!何よりですね!
  • 使いはじめて数日後にRancherOSの正式版が出ましたが、それまでの間にもRancherOSのマイナーバージョンアップがありました。
  • Experimentalな機能も積極的に入ってますし、今後が楽しみです。

はまった点

ネットワーク関係でのトラブル

  • ホストのIPを変更すると、rancher-ipsec周りをうまく再起動しないといろいろこけました。
    • rancher-ipsecを再起動しないとずーーーーっとhealthcheckにこけてました。
    • Web上では、IPの表示が更新されるんですが、ネットワーク周りはうまく更新されないのかも….
  • rancher-ipsecの再起動ですぐ直ることもあれば、他のサービスも再起動しないとなおらないケースもありました。
  • ホストも、コンテナと同様、作ったり壊したりを前提で運用した方がよさそうです。

ストレージ関係

  • EFS、EBSは自分の環境ではうまく動きませんでした。Experimentalだからか、設定の不備だからかは分かりません。
    • NFSでも、まあ、問題はない。
  • docker-compose.ymlからrancher-nfsを利用する場合、先にストレージを作成しておかないといけない。
    • エラーで教えてくれるので問題はない。
    • Web上でコンテナを定義した場合は、ストレージがなければ、勝手にストレージを作成してくれました。
  • カタログにあるelasticsearchでrancher-nfsを利用しようとすると、うまくいきませんでした。
    • ストレージパスに謎のsuffixがついたりして、エラーを吐く。。
    • 結局解決せず。

うまくコンテナが分散されない場合がある

  • コンテナの配置は、Docker Swarmに近いらしく、ポートの競合がないかや、volume sharingなどを考慮して配置されます。
  • そのため、例えばメモリがほとんどないホストとたっぷり空いてるホストがあっても、ほとんどないホストに配置しようとする場合がありました。
  • その場合、 コンテナ起動→サービスを起動しようとしてメモリ不足でこける→再起動→ループ で延々とループするケースがありました。(自動リスタートがONの場合)
    • Docker Swarmのspreadやbinpackなら、CPUやメモリの量も見てくれるはずなので、上記ケースはレアケースだと思いますが、一度配置されると、そのコンテナを削除しないと他のところに作られないので、例えば同時に複数コンテナが作成されたりした場合は、リソースがたとえ空いていても、発生しうると思います。
  • ホストにラベルを設定できるので、その辺を使ってうまく分散されるように設定してあげるとよさそうです。
    • メモリを沢山食うコンテナはメモリがたくさん乗っているホストに優先して配置する、など。

スペックが低いと不安定

  • ホストを追加しながらいろいろ試していましたが、Amazon EC2の場合、t2.small はギリギリOKでした。
  • ただし、 t2.small では、コンテナが不意にstuckingすることがあるなど、結構、不安定でした。
  • t2.medium では安定して運用できています。
  • t2.micro, t2.nano では、SSHが立ち上がるまでにrancher側でタイムアウトが走ってしまって、うまくいきませんでした。

    • t2.micro は、稀に進むこともありましたが、それでもrancher-agent等のインストール中に死ぬことがありました….
  • Rancher自体を乗せるホストのスペックも、メモリが2GBはほしいなと思いました。

  • 1GBの場合、管理ページがなかなか開かないなど、ちょっとつらかったです。
    • 2GBでも、ホストやコンテナが増えてくるとちょっと辛いかな?という感じでした。
  • 今は、4GBで運用していますが、特に問題が起こることもなく安定しています。
    • 公式の推奨メモリは8GB〜16GBでした。

Rancher自体のHA構成の管理画面での確認

  • RancherをHA構成すると、管理画面の「高可用性」で状況を見られるっぽいのですが、、
  • 日本語だと、何故かページが真っ白になって表示されません。(v1.5.5で確認)
  • 通信状況を見ると、APIで情報はとれていて、clusteringもtrueになってるので、HA構成にはなってるっぽい。。
  • 翻訳周りのjavascriptのエラーでうまく表示されないようです。
  • 英語にするとちゃんと表示されました。
  • そして、何故かUUIDの値がIP:PORTになっています。

(2017.04.22 18:45 追記)

  • この件については、Rancher JPのFoxBoxsnetさまからコメントをいただきました!(当ページのコメント参照)
  • 現在、本家側でのマージ待ちの状態なようですので、次期バージョンでは修正されていそうですね。
  • 待てない!という人のために、コメントに暫定対応も合わせて掲載されております! FoxBoxsnetさま、ありがとうございます!!

おわりに

f:id:Dltn:20170422090821p:plain
↑はいるかさんが個人で作ったDockerフィギュア。

Rancher、良い感じに便利です。良くない点も挙げようと思ったんですが、思い浮かびませんでした。。今のところ、個人的な要求は全て満たしてくれています。今まで以上に、気軽に、試験的なサービスを置いて使ってみたり、テストしたりできるようになりました。Dockerについての理解が浅い人でも、手軽に触って試せると思います。運用していく上では、ある程度は熟知していないといけないのは言わずもがなですが、今後どうなっていくのか期待が高まります。

せんでん

スノーボードくま

Snowboard KUMA

先日、社内で開発していたゲーム「スノーボードくま」がリリースされました!タップ操作のみの手軽なミニゲームで、可愛らしいくまがスノーボードにのって滑っていきます。

自分は146.5秒までタイムを縮められましたが、多分、頑張れば145秒台まで出せるんじゃないかな?と思います。
PC環境では、SafariやFirefoxでは画面を縮めないと動作が重いので注意です。

パズルねこまんま

ねこまんま トートバッグ

先日、パズルねこまんまのグッズがBOOTHで販売開始されました!

めちゃ可愛らしいフード擬態ねこたちのグッズです。定番のアクリルキーホルダー以外にも、メガネクロス、トートバッグ、ペンケースなどが揃っています。
スノーボードくまのグッズも企画中なので、乞うご期待!