仕事中の問題と解決メモ。

最近はPythonとGoogle Cloud Platformがメイン。株式会社ビズオーシャンで企画と開発運用、データ活用とか。https://github.com/uyamazak/

社内向けDocker勉強会 発表用草案(作成中)

Docker+GCP Kubernetesを本番で使い始めてもうすぐ半年となり、いろいろとノウハウも溜まってきたので、社内向けに発表をしようと思う。11月中に予定。

まずテキストでまとめてみる。

もし興味がある方がいたらbizoceanの東銀座のオフィスで一般公開もできるのでコメントください。

第一部 Dockerとは

bizoceanでDockerを何につかっているのか

bizocean関係のデータ収集

https://docs.google.com/a/bizocean.co.jp/drawings/d/1qfip1ASimBJv1cnH4ZjpC4dcsimDQoGIhyBbA6xOVRU/pub?w=960&h=720


取っているデータ

  • アクセスログ
  • メール開封ログ
  • メールのリンククリックログ
  • サイト上のイベントログ(エラー、検索キーワード等)
  • アンケートフォームデータ

データサイズ

BigQuery上で200MB/日 約40万行


https://docs.google.com/a/bizocean.co.jp/drawings/d/1qfip1ASimBJv1cnH4ZjpC4dcsimDQoGIhyBbA6xOVRU/pub?w=960&h=720

なぜDockerを使うのか

本番サーバーの運用歴が長く、人の入れ替わりもあり、ブラックボックス化していた。変更履歴も残し方が人によって異なり把握は無理。

→しっかりドキュメント残せばいいじゃん(理想)
作成時点は問題ないが、3年後そのまま使えるのはまれ。使えたとしてもドキュメントが見つかることもまれ。サーバー上の設定ファイルとドキュメントを両方メンテすることとなり、コスト増。
bizoceanの歴史的に見てある程度の規模になるとほぼ不可能。

  • 開発サーバーの構築が大変。

手作業でさまざまな設定をすることになり、職人技となる。KVMVMware等の仮想化はホストの管理が大変。オーバーヘッドが大きいのでバンバン立てたりはできない。

  • 開発サーバーがゴミの山

開発時の様々な試行錯誤でゴミや不要なライブラリが残って、消し忘れたり、他の問題が起きたりする。

  • 本番と検証環境の差異

複雑化のため本番サーバーと開発サーバーを同じ状態にするのが難しくなり、様々な問題が噴出。

  • 言語のバージョン管理などからおさらばできる

virtualenv、rbenvなど、プログラムのバージョン、環境を切り替える機能をDockerコンテナに封じ込めることができるので、使う必要がなくなる

Dockerを使うとどうなったのか

Dockerfileにまとめることで、実行ファイル兼ドキュメントとなり、そのサーバーに何がどう入っているかがすべて明文化される。

Dockerfileをgitで管理することでバージョン管理もできる

開発サーバーは環境変数だけ変えてコマンド一発。人による差異も生まれにくい。

ライブラリなどもDockerコンテナごとに入れるので、ホストOSは汚れない。

仮想化技術と比べて一つ起動するためのリソースが少なく、1台で10以上でも可能(プロセスによる)。

ビルドと起動のたびに常に新規構築をするようなものなので、すべてが新品ですっきり気持ちいい。

参考:bizoceanのwebサーバーの現状

一つのWEBサーバーに複数のプロセスが動いている

コンテナとは何か。今までのOS仮想化との違い

Dokcerはコンテナの実装の一つ。

内部的にはLXC(Linux Containers)が使われている。
knowledge.sakura.ad.jp


f:id:uyamazak:20161017161619j:plain

画像引用元:注目を浴びる「Dockerコンテナ」、従来の仮想化と何が違うのか? | コラム | 東京エレクトロン デバイス株式会社

詳しくは上記記事参照。

これまでのVMwareKVMなどは、ハードウェアレベルで仮想化を行い、それぞれにOSが動いていた。

通常のアプリにおいて、その層はエラーの原因になるばかりで実際には必要なかった。

Dockerのようなコンテナ型では、OSはホストと共有するが、それぞれリソースを隔離する。CPU、メモリの制限・割当も可能。

単なるプロセスのため、起動、終了も早い。

マイクロサービス化に適している。


Dockerは新しい技術ではない

コンテナはUNIXのセキュリティ機能としてメインフレームの時代からあった。

Linux上でいろいろ使いやすいようにしたのがDocker。

GoogleFacebookもコンテナ

Borgすごい

www.infoq.com

後述するKubernetesはこのBorgの知識を活かしたもの。

後継にOmegaがある。

Borg, Omega, and Kubernetes - ACM Queue
Borg, Omega, and Kubernetes - ACM Queue


実行中でもプロセスをごそっとミリ秒単位で別サーバーに動かせるらしい。

例えばログをtail -fしてても、移動したのに気づかないぐらい。

Google App Engineも一つのコンテナ。

VMと比較したとき

ホストはLinuxのみ

外部IPも基本一つなので、複数のコンテナはポートで分けて使う


第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でデータセンターをまたいだ管理(GCPAWSとか)もできるようになった

Google上にイメージをアップする

GKEで使うためには、作ったイメージをGoogle側にアップする必要がある

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%以下のため今のところ必要なくて使ってない。