Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Application Design for Docker and Kubernetes

Maho Takara
October 03, 2018
710

Application Design for Docker and Kubernetes

Maho Takara

October 03, 2018
Tweet

Transcript

  1. Docker / Kuberentes を 活かすアプリ設計のポイント THE TWELEVE-FACTOR APP と Kubernetesの使い方

    with IBM 2018年10月3日 日本アイ・ビー・エム株式会社 クラウド事業本部 高良 真穂
  2. © IBM Corporation 13 12 Factor とは – Twelve-Factor Appは、次のようなSoftware

    as a Serviceを作り上げるための 方法論 https://12factor.net/ja/ – Herokuの創業メンバー Adam Wiggins によって書かれ、多くのSWエンジニア から支持されている。
  3. © IBM Corporation 14 12 Factor とは –I. コードベース •

    バージョン管理されている1つのコードベースと複数のデプロイ –II. 依存関係 • 依存関係を明示的に宣言し分離する –III. 設定 • 設定を環境変数に格納する –IV. バックエンドサービス • バックエンドサービスをアタッチされたリソースとして扱う –V. ビルド、リリース、実行 • ビルド、リリース、実行の3つのステージを厳密に分離する –VI. プロセス • アプリケーションを1つもしくは複数のステートレスなプロセスとして実行する
  4. © IBM Corporation 15 12 Factor とは –VII. ポートバインディング •

    ポートバインディングを通してサービスを公開する –VIII. 並行性 • プロセスモデルによってスケールアウトする –IX. 廃棄容易性 • 高速な起動とグレースフルシャットダウンで堅牢性を最大化する –X. 開発/本番一致 • 開発、ステージング、本番環境をできるだけ一致させた状態を保つ –XI. ログ • ログをイベントストリームとして扱う –XII. 管理プロセス • 管理タスクを1回限りのプロセスとして実行する
  5. © IBM Corporation 16 1. コードベース – 一つのコードベースから、複数のデプロイを作る • コードベースとは、GitやSubversionなどのコードのバージョン管理ツール

    • デプロイは、開発者のPCでの実行、テスト環境、本番環境などで実行されるアプリのインスタンス – K8sでは • レジストリに、アプリの実行形式とそれが依存するOSやライブラリを含んだコンテナを登録 • レジストリに登録されたコンテナから、各環境へデプロイする コードベース コンテナ・リポジトリ 開発者#1 開発者#2 テスト環境 本番環境 デプロイ 依存ソフトウェア OSS ライブラリ 依存 コード Linux配布 コンテナ アプリ
  6. © IBM Corporation 17 補足 レジストリとリポジトリの関係 – レジストリとリポジトリ コンテナ・レジストリ リポジトリ-A

    リポジトリ-B リポジトリ-C タグ-1 タグ-2 タグ-3 ・ ・ ・ ・ ・ ・ コンテナ#1 レジストリ名/リポジトリ名:タグ コンテナ#2 コンテナ#3 アプリ ver 1.0 アプリ ver 1.1 アプリ ver 1.2 アプリ名
  7. © IBM Corporation 18 2. 依存関係 – 依存関係を明示的に宣言し分離する • OSとそのパッケージを含めたすべての依存関係を

    依存関係宣言 マニフェストで完全かつ厳密に宣言 • 依存関係分離 ツール(vituralenv,pip,gemなど)を使って、暗黙の依存関係が“漏れ出ない”ことを保証 • この指定は、本番環境と開発環境の両方に対して同様に適用される。 – Dockerfileに依存関係分離ツールの実行を記述することで、アプリが依存する全てのパッケージ をコンテナへインストールする コードベース コンテナ・レジストリ 依存ソフトウェア、OS OSS ライブラリ 依存 コード Linux配布 コンテナ アプリ コンテナ Dockerfile アプリ
  8. © IBM Corporation 19 3. 設定 設定を環境変数に格納する – アプリ設定 は、デプロイ(ステージング、本番、開発環境など)の間で異なり得る唯一のモノとする。

    – 環境変数は、コードを変更することなくデプロイごとに簡単に変更できる。設定ファイルとは異なり、誤ってリポジトリにチェックインされる可能性はほとんどない。 – K8sは、次の環境への保存方法と、環境からの情報取得方法を提供する • ConfigMap 設定ファイルをk8sのネームスペースに保存する • Secret ユーザーID/パスワード、証明書など資格情報を、他者に見られない様にk8sのネームスペースに保存する • Service k8sサービスとしてデプロイすることで、それ以降のポッドの環境変数で、エンドポイントを環境変数で参照可能 • ポッド・テンプレート ConfigMapやSecretの情報を、コンテナの環境変数、または、ボリュームとしてマウントして参照可能 資格情報 設定 ファイル 資格情報 設定 ファイル 本番用 テスト用 本番用ネームスペース テスト用ネームスペース アプリ コンテナ アプリ コンテナ サービス サービス K8s クラスタ
  9. © IBM Corporation 20 他アプリ コンテナ 他アプリ コンテナ 4. バックエンドサービス

    バックエンドサービスをアタッチされたリソースとして扱う – バックエンドサービス はアプリが通常の動作の中でネットワーク越しに利用するすべてのサービスを言う。 – 例としては、データストア(例:MySQL や CouchDB)、メッセージキューイングシステム(例:RabbitMQ や Beanstalkd)、電子メールを送信するためのSMTPサービス(例:Postfix)、キャッシュシステム(例:Memcached) などがある。 • k8sサービスの機能は、サービスを抽象化することで、外部サービスと内部サービスを同等にアクセスできる。 – 内部サービスを作成する場合、サービスタイプをClusterIP 設定して、対応するポッドと一致するセレクタを設定 – 外部サービスを参照する場合、サービスタイプにExternalNameを設定して、外部サービスのIPやポートを設定 アプリ コンテナ サービス-A サービス-B 他アプリ コンテナ DBaaS 内部サービス 外部サービス サービスは抽象化され 内部外部を区別しない アプリ部品など マイクロサービス データーベース マネージドサービス
  10. © IBM Corporation 21 5. ビルド、リリース、実行 ビルド、リリース、実行の3つのステージを厳密に分離する – ビルド: アプリコードと依存をまとめて、コンテナをビルドする

    – リリース: 設定ファイル、資格情報を環境に登録、マニフェストをk8sクラスタへ適用 – 実行: ◯◯環境でアプリを実行 アプリ コンテナ ビルド リリース 資格情報 設定 ファイル ◯◯環境 ◯◯環境ネームスペース アプリ コンテナ サービス K8s クラスタ レジストリ 依存ソフトウェア OSS ライブラリ 依存 コード Linux配布 コンテナ コードベース アプリ 実行
  11. © IBM Corporation 22 6. プロセス アプリケーションを1つもしくは複数のステートレスなプロセスとして実行する • ステートレスとは、ウェブサーバーの様に、一回毎のリクエストとレスポンスだけで処理が継続する 事を意味しています。つまり、ロードバランサーのステイッキーセッションなどの機能を使って、

    セッションを確立したコンテナへ固定的に振り向ける事は、コンテナ上のアプリがセッションの状態 を持つことになり、12Factor に違反することになります。 • セッションの情報は、外にあるキャッシュ・サービスなどを利用して、アプリ・コンテナの突然の停 止に備える必要があります。 • リクエストを受けてから応答する間の一時的なメモリ上のデータは対象外です。 DBサービス 永続ボリューム キャッシュ・サービス アプリ コンテナ ・ ・ ・ アプリ コンテナ アプリ コンテナ どのアプリ・コンテナにリクエストが アサインされても、同じ応答ができる
  12. © IBM Corporation 23 7. ポートバインディング ポートバインディングを通してサービスを公開する • Webアプリとして、PHP、Python、Rubyなどプログラミング言語のフレームワーク等のサーバーポートをバ インドして、サービスを公開することを勧めており、公開のためにHTTPサーバーの利用を推奨していません。

    • K8sでは、アプリのポートを公開するために、Nginx等のHTTPサーバーのコンテナと組み合わせ事もでき、次 の機能によってコンテナのポート番号を公開用ポート番号に対応づける事ができる。 – NodePort ポートフォワーディングと負荷分散 – Ingress URL変換、TLS暗号化、負荷分散等 アプリ コンテナ ポッド アプリ コンテナ ポッド 内部(ポッド)ネットワーク Ingress or NodePort 外部ネットワーク クライアント 公開用 ポート コンテナ ポート コンテナ ポート
  13. © IBM Corporation 24 8. 並行性 プロセスモデルによってスケールアウトする • 個々のワークロードの種類を プロセスタイプ

    に割り当てることで、開発者はアプリケーションが多様なワーク ロードを扱えるように設計する • スケールアウトが必要になったときである。シェアードナッシングで水平分割可能なTwelve-Factor Appプロセ スの性質は、並行性を高める操作が単純かつ確実なものである フロントエンド ポッド バックエンド ポッド バッチ処理 ポッド フロントエンド ポッド フロントエンド ポッド バックエンド ポッド フロントエンド ポッド ワークロードの種類でプロセスを別ける (ワークロードの多様性) 処理能力の増減は、 並列数を増減させ る事で対応する ポッドレプリカ数 CPU、メモリ 資源量
  14. © IBM Corporation 25 9. 廃棄容易性 高速な起動とグレースフルシャットダウンで堅牢性を最大化する • コンテナの起動時間を最小化する努力は常に必要です。この素早い起動は、設定条件の変更、 ハード障害からの回復、ワークロードの急増に迅速に対応するためです。

    • 終了要求シグナル(SIGTERM)を受け取ると、速やかに終了処理を実行して、プロセスを終了 することを推奨しています。 ◯◯環境ネームスペース アプリ コンテナ K8s クラスタ レジストリ コンテナのサイズが大きいと レジストリからダウンロードが 長くなり、起動に時間がかかる SIGTERM 経過時間 SIGKILL 終了処理 SIGTERMの処理が 実装されたコンテナ SIGTERMの考慮 が無いコンテナ t1 t2 t1 < t2
  15. © IBM Corporation 26 10. 開発/本番一致 開発、ステージング、本番環境をできるだけ一致させた状態を保つ • 開発者が書いたコードは、出来るだけ早くデプロイする。 •

    コードを書いた開発者は、デプロイ作業に関わり、その後、モニタリングする。 • 開発環境と本番環境をできだけ一致した状態に保つ K8sクラスタをネームスペースで分割して、同じハードウェア環境上で、影響なく、開発〜本番環境を共存す る事ができる。 ネームスペースで実現できる分割 – CPUとメモリの利用上限、ネットワークのアクセス範囲 – kubectlコマンドの有効範囲 – RBACベースのサービスアカウントにより、開発者やSREのアクセス範囲を限定 本番用ネームスペース ST用ネームスペース アプリ コンテナ サービス アプリ コンテナ サービス IT用ネームスペース アプリ コンテナ サービス K8s クラスタ
  16. © IBM Corporation 27 K8s クラスタ 11. ログ ログをイベントストリームとして扱う –

    アプリケーションはログファイルに書き込んだり、ログをローテション管理しない。 – それぞれの実行中のコンテナは、イベントストリームを標準出力にバッファリングせずに書きだす – ローカルでの開発中、このストリームをターミナルで見ることで、アプリケーションのデバッグを実施 K8sではコンテナから標準出力に書き出されるイベントストレームは、Fluentd/Logstashで転送さ れElasticSearchに集約される。 Kibanaを利用して、ポッドやコンテナ横断的に、イベントの発生 状況を把握できる。 アプリ コンテナ アプリ コンテナ アプリ コンテナ アプリ コンテナ アプリ コンテナ Elastic Search Kibana コンテナのログは、STDOUTヘ出力 K8sクラスタのログ機能と してELKスタックが採用 Prometheus Grafana ログ分析 メトリックス 分析
  17. © IBM Corporation 28 12. 管理プロセス 管理タスクを1回限りのプロセスとして実行する • アプリケーションのメンテナンスのための一回限りの処理の管理用コードは、 –

    同じアプリケーションのコンテナ内で実行されるべき – 同じGitリポジトリ等に含まれるべき – アプリと同じコミットの世代が利用できる様に、同じコンテナに含まれるべき – kubectl exec ポッド名 コンテナ名、コンテナ内のファイル名を指定して実行する K8s クラスタ アプリ コンテナ アプリ コンテナ アプリ コンテナ アプリ コンテナ アプリ コンテナ kubectl exec pod名 -c コンテナ名 コマンド
  18. © IBM Corporation 30 IBM Cloud以外からも、Watson APIを呼び出せる インターネットでアクセス可能な場所から、IBM Cloudのサービスを利用できます。 使い慣れた他社クラウド環境からも利用できます。

    IBM Watson NoSQLデータベース マネージドサービス API サービス Web アプリケーション インターネット マイクロサービスとして Watson APIと KVSを利用 クラウドでも パソコンのISP 経由接続でもOK
  19. © IBM Corporation 31 IBM Cloud以外からも、Watson APIを呼び出せる インターネットでアクセス可能な場所から、IBM Cloudのサービスを利用できます。 使い慣れた他社クラウド環境からも利用できます。

    IBM Watson NoSQLデータベース マネージドサービス API サービス Web アプリケーション インターネット マイクロサービスとして Watson APIと KVSを利用 クラウドでも パソコンのISP 経由接続でもOK Web アプリケーション