Docker+GCP Kubernetesを本番で使い始めてもうすぐ半年となり、いろいろとノウハウも溜まってきたので、社内向けに発表をしようと思う。11月中に予定。
まずテキストでまとめてみる。
もし興味がある方がいたらbizoceanの東銀座のオフィスで一般公開もできるのでコメントください。
第一部 Dockerとは
bizoceanでDockerを何につかっているのか
bizocean関係のデータ収集
取っているデータ
- アクセスログ
- メール開封ログ
- メールのリンククリックログ
- サイト上のイベントログ(エラー、検索キーワード等)
- アンケートフォームデータ
データサイズ
BigQuery上で200MB/日 約40万行
なぜDockerを使うのか
- 既存サーバーのブラックボックス化
本番サーバーの運用歴が長く、人の入れ替わりもあり、ブラックボックス化していた。変更履歴も残し方が人によって異なり把握は無理。
→しっかりドキュメント残せばいいじゃん(理想)
作成時点は問題ないが、3年後そのまま使えるのはまれ。使えたとしてもドキュメントが見つかることもまれ。サーバー上の設定ファイルとドキュメントを両方メンテすることとなり、コスト増。
bizoceanの歴史的に見てある程度の規模になるとほぼ不可能。
- 開発サーバーの構築が大変。
手作業でさまざまな設定をすることになり、職人技となる。KVM、VMware等の仮想化はホストの管理が大変。オーバーヘッドが大きいのでバンバン立てたりはできない。
- 開発サーバーがゴミの山
開発時の様々な試行錯誤でゴミや不要なライブラリが残って、消し忘れたり、他の問題が起きたりする。
- 本番と検証環境の差異
複雑化のため本番サーバーと開発サーバーを同じ状態にするのが難しくなり、様々な問題が噴出。
- 言語のバージョン管理などからおさらばできる
virtualenv、rbenvなど、プログラムのバージョン、環境を切り替える機能をDockerコンテナに封じ込めることができるので、使う必要がなくなる
Dockerを使うとどうなったのか
Dockerfileにまとめることで、実行ファイル兼ドキュメントとなり、そのサーバーに何がどう入っているかがすべて明文化される。
Dockerfileをgitで管理することでバージョン管理もできる
開発サーバーは環境変数だけ変えてコマンド一発。人による差異も生まれにくい。
ライブラリなどもDockerコンテナごとに入れるので、ホストOSは汚れない。
仮想化技術と比べて一つ起動するためのリソースが少なく、1台で10以上でも可能(プロセスによる)。
ビルドと起動のたびに常に新規構築をするようなものなので、すべてが新品ですっきり気持ちいい。
コンテナとは何か。今までのOS仮想化との違い
Dokcerはコンテナの実装の一つ。
内部的にはLXC(Linux Containers)が使われている。
knowledge.sakura.ad.jp
画像引用元:注目を浴びる「Dockerコンテナ」、従来の仮想化と何が違うのか? | コラム | 東京エレクトロン デバイス株式会社
詳しくは上記記事参照。
これまでのVMware、KVMなどは、ハードウェアレベルで仮想化を行い、それぞれにOSが動いていた。
通常のアプリにおいて、その層はエラーの原因になるばかりで実際には必要なかった。
Dockerのようなコンテナ型では、OSはホストと共有するが、それぞれリソースを隔離する。CPU、メモリの制限・割当も可能。
単なるプロセスのため、起動、終了も早い。
マイクロサービス化に適している。
Google、Facebookもコンテナ
Borgすごい
後述するKubernetesはこのBorgの知識を活かしたもの。
後継にOmegaがある。
Borg, Omega, and Kubernetes - ACM Queue
Borg, Omega, and Kubernetes - ACM Queue
実行中でもプロセスをごそっとミリ秒単位で別サーバーに動かせるらしい。
例えばログをtail -fしてても、移動したのに気づかないぐらい。
Google App Engineも一つのコンテナ。
第2部 ローカルでDockerを使う
動かしてみる
公式レポジトリのものを走らせてみる
>||docker run -p 8088:80 nginx|
自分のDockerfileを作る
FROM
COPY
buildする
runする
docker psする
開発環境にDockerを使ってみる
変更、デプロイの手順と設定
第3部 GKE Kubernetes(クゥバネテス)を使ってみる
Kubernetesって
Dockerに限らずコンテナイメージを管理するサービス
Googleが主に作っているのでGCP上が一番いいけどオープンソースだからローカル、AWSなどでも動かせる
現在、絶賛開発中。
1.4でデータセンターをまたいだ管理(GCPとAWSとか)もできるようになった
deployment、serviceを立ち上げる
できたものをyaml形式で出力する
各用語の説明
- deployment
コンテナ実行グループ
どのコンテナをいくつ展開するのか等を管理する
イメージは基本1種類
以前は「Replication Controller」
- service
外部とのやりとりする部分
- pod
一つのコンテナ
各コマンドの説明
kubectl get
kubectl edit
バッチ処理にも使えるDocker
本番DBにつなげていろいろするバッチ用Dockerの紹介
アプリケーション配布パッケージとしてのDocker
Google Cloud Datalabを例として
今後どんどん増えそう
・軽い
・改造しやすい
Q&A
ユーザー管理は
全部rootだよ
ログどうやってとるの
開発時のリアルタイムは標準出力で。
GKEなら勝手に集めてくれる
一つのDockerで複数のアプリを動かせないの?
supervisord等でやろうと思えばできる
1コンテナ、1プロセスが原則。素直に分けろ
自作Dockerfileで起動してもすぐ落ちるんだけど
プロセスが終わったらDockerも終了する。
デーモンプロセスで起動しても終了してしまう
DBサーバーのIP、パスワード等、イメージ内部の設定、変数を変えたいときは?
環境変数で渡してプログラム側で読み取るようにする
オートスケールはできるの
できる
Kubernetes - Horizontal Pod Autoscaling
oceanusでは処理が早すぎて、スタンダード2台でCPU負荷10%以下のため今のところ必要なくて使ってない。