SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

開発現場からお届け! Wantedlyのプロダクトを育て、支える技術

オペレーションとルールを統一化し、Kubernetesを使った変化に強いインフラを構築

開発現場からお届け! Wantedlyのプロダクトを育て、支える技術 第2回

保守作業によるオペレーションを統一化

 アプリケーションにはさまざまな特徴があります。

  • バッチのような1回限りのもの
  • Cronで定期的に実行するもの
  • ジョブキューを常に実行するもの(sidekiq、delayed_job)
  • Webアプリケーション
  • 起動時にデータをすべてオンメモリーに乗せてから実行するもの

 Webアプリケーションに対しては、以下のようなオペレーションが必ずあると思います。

  • デプロイ
  • スケール
  • 定期バッチ処理
  • 不定期バッチ処理
  • スキーマ変更
  • コンソール
  • ログ確認

 このように、さまざまな特徴があるオペレーションを統一化するためKubernetesを使用します。

マニフェストファイルとkubectlを用いたオペレーション

 Kubernetes上でアプリケーションを実行する場合、KubernetesのAPIサーバーに指示を出すことで実行されます。

 指示を出すには、kubectlというコマンドラインツールを使います。kubectlのオプションとしてYAML(またはJSON)で記載したファイルを送ることができます。このファイルを、マニフェストファイルといいます。ここでは、手続き的な書き方ではなく、宣言的な書き方をします。

 マニフェストを書き終えたらコマンド、kubectl create -f ./your_manifest.yamlを実行します。すると、KubernetesのAPIサーバーに内容が送られ、クラスタに反映されます。Kubernetesにはいくつかのリソースがありますが、同様にマニフェストファイルを書いてkubectlコマンドを実行するだけで反映されます。マニフェストファイルの設定をうまく利用することで、ブルーグリーンデプロイメントやローリングデプロイメイントを行うことが可能です。

 また、kubectlには他にもサブコマンドが用意されており、例えばログをストリーミングで確認できるkubectl logs -f pod_idや、アプリケーションに入りたい場合に使用するkubectl exec -it pod_name bashがあります。

 この仕組みにより、アプリケーションの外側のオペレーションについては、すべて同じコマンドを利用するため、差異を吸収することができます。

統一化したオペレーションになった際のアプリケーションエンジニアのメリット

CoreOS Container Linux cluster architectures
CoreOS Container Linux cluster architectures

 Kubernetesはいくつかのサーバーを組み合わせて、1つのクラスタを構築します。そのため、アプリケーションを実行する際にサーバーを意識する必要はありません。Railsのデプロイツールとして、よく使われるCapistranoと比較して考えてみます。(Fabricなども同様です)

 Capistranoで新しくサービスを追加する場合、config/deploy/の下で定義されているステージを追加し、サーバー先を設定する必要があります。

 しかしKubernetesの場合、そもそもその作業は必要ありません。kubectlを実行するとKubernetesのAPIサーバーに指示が飛び、クラスタ内部で実行してくれるからです。

 新しくサービスを作りたい場合でも、インフラチームに頼んでサーバーを用意してもらったり、Capistranoにstageを追加したり、リリース方法を細かく指定するために既存のCapistranoのソースに手を入れたりする必要はありません。

 アプリケーションエンジニアは、主に以下の作業を行います。

  1. Dockerfileを書く。
  2. kubernetes/とscript/直下にファイルを書く。
  3. コマンドkubectl create -f ./your_manifest.yamlでアプリケーションをリリースする。

 主にこの3つだけを行うことで、作ったものを簡単にリリースすることができます。

[補足]Herokuでいいじゃん

 「Herokuでいいじゃん」と思った方に少し補足します。Herokuとの違いとして以下の利点があります。

  • 欲しいスペックを定義できる。
  • リリースしてからトラフィックを受け付けるタイミングを決められる。
  • postStartで事前準備ができる。
  • preStopで事後処理ができる。
  • Podはあくまでもデプロイする最小単位であり、「静的な部分をnginxコンテナで返し、動的な部分をアプリケーションコンテナで返す」という2つのコンテナをセットとして扱うことができる。(Kubernetesのコア開発者の方が書かれているこちらの資料がわかりやすいです)
  • Jobなどもマニフェストファイルに書くだけで、アドオンを追加することなく利用できる。
  • (社内でKubernetesを構築した場合は)社内の内部APIといったリソースが利用できる。
  • (クラスタの使い方次第で)モニタリングやロギングの設定を気にせず、同じDashboardに反映され、そのまま利用できる。

 ただ意外にも、社内でKubernetesを使ってみて最も反響が大きかったのはインフラチームにいちいち依頼せずに利用できることでした。

次のページ
アプリケーション固有の方言をなくす

この記事は参考になりましたか?

開発現場からお届け! Wantedlyのプロダクトを育て、支える技術連載記事一覧

もっと読む

この記事の著者

坂部 広大(Wantedly, inc.)(サカベ コウダイ)

 Wantedlyの基盤改善および保守運用をしているインフラエンジニア。ツールを作ったり、Web Applicationを作ったり、社内情報システムの整備をしたりしています。 WANTEDLY TECH BOOKを書いています。 Site Twitter Facebook Github Wantedly Engineers Blog

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/10428 2017/09/29 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー