Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

Application Design for Docker and Kubernetes

Avatar for Maho Takara Maho Takara
October 03, 2018
920

Application Design for Docker and Kubernetes

Avatar for Maho Takara

Maho Takara

October 03, 2018
Tweet

More Decks by Maho Takara

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 アプリケヌション