dockerさんのコンテナAPIとkubernetesの実装形式
はじめに
くーばねてすをやっつけるために新たなステージに上がるためについにdockerさんに会いに行くことにした。dockerさんと仲良くなることでコンテナシステムの仕組みの理解とくーばねてすを倒すための調査をする。
概要
■コンテナAPIとは
■コンテナAPIの種類
をまとめた(^^)
■コンテナAPIとは
dockerで作成するコンテナAPIとは、コンテナをブラックボックスとして扱えるようにインターフェイス化させることをいう。
ブラックボックス (Black box) とは、内部の動作原理や構造を理解していなくても、外部から見た機能や使い方のみを知っていれば十分に得られる結果を利用する事のできる装置や機構の概念。 転じて、内部機構を見ることができないよう密閉された機械装置を指してこう呼ぶ。
インターフェイスとは元々ハードウェア間を接続するための規格だが、ここでは異なるプログラム同士を連携させる方法の取り決めをインターフェイスと呼ぶ。
そしてAPIとはコンテナ内部の操作対象をブラックボックスとして扱い、APIのプログラムから利用できるようにするための仕組みになる。
コンテナ自体にAPIを実装することでコンテナ内部に組み込まなくても簡単に再利用することができる。
またdockerhubに登録されているイメージのほとんどがAPIを実装している。
kubernetesで求められるコンテナAPIについて勉強する。
■コンテナのAPIの種類
コンテナAPIにはいくつかの種類とそれぞれの目的、手段がある。
■コンテナの起動
コンテナの起動時に環境変数や引数を受け取りそれを実行できるようにする。
例えばデータベースサーバーのイメージとして環境変数でユーザーID、パスワード、データベース名、永続ボリュームのパス指定ができる。
■ヘルスチェック(kubernetesで)
ヘルスチェックAPIの中には
準備状態プローブ
活性プローブ
というインターフェイスがあり、
準備状態プローブはコンテナ内部のアプリケーションが外部からのリクエストを受け入可能となったか調べるインターフェイスで、
活性プローブはアプリケーションプログラムの稼働状態が正常か異常かを知らせてくれる。
■コンテナの終了
ここでは終了要求シグナル(SIGTERM)を受け取るとコンテナを停止するために終了処理を実行する。この処理にはデータを失わずに安全に停止するためのコードを記述する。
制限時間内に終了処理が実行されない場合、強制終了シグナル(SIGKILL)が発動されコンテナは強制終了される。
■サービス
サービスではアプリケーションが特定のポート番号でクライアントからの要求を受け取り、処理結果を返すことを意味する。
そのためにコンテナに付与されたIPアドレス上にポートを公開しリクエストを受け取ることになる。またコンテナホストとコンテナを紐付けることでコンテナを外部へ公開することもできる。
kubernetesではコンテナを内包するポッドのIPアドレス上にポートを公開し、リクエストを処理する。そしてサービスと連携してクライアントにアプリケーションを公開する。
■稼働ログ
アプリケーションのマイクロサービス化が進むとさまざまな種類のログがコンテナ数に応じて増加していく。
その際は標準出力と標準エラー出力がインターフェイスとなる。
このためコンテナは分散的にログをファイルに書き出すのではなく、一貫して標準出力と標準エラー出力にログを書き出すように実装される。
■フック(kubernetesで)
kubernetesのフックとはコンテナの起動時と終了時にコンテナ内で実行される処理でkubernetesではpodのマニュフェストに実行内容を記述する。そのためコンテナにはフックで使用されるコマンド、プログラムを実装する必要がある。
dockerfileではコマンドが順番に実行されるが、起動時のフックは非同期に実行され、順番は保証されない。
■永続ボリューム
コンテナAPIとしての永続ボリュームでは、「設定ファイル」と「永続性データ」がある。
設定ファイルの利用方法としては、コンテナの構築で必要となる設定ファイルはコンテナ外に配置していつでも再利用できるようにしておく。いちいちコンテナのイメージを設定するのは大変になるので、コンテナ起動時にオプションとして使用することで手間がはぶける。
永続性データの利用方法としてはサーバー証明書などの重要なファイルはイメージとしてリポジトリに登録するのはセキュリティ上よくないので外部から永続ボリュームとしてコンテナにマウントする。
kubernetesでは秘匿性が必要なデータを扱う「シークレット」と、設定ファイルを扱う「コンフィグマップ」の2つの機能がある。
■終了ステータス
dockerコンテナ上のプロセスでPID=1のExitコードがコンテナの終了コードとしてセットされる。
kubernetesではポッド内のコンテナが終了コード=0で終了すると正常終了、終了コードが0以外だと異常終了となる。
まとめ
kubernetesとdockerって動きがにてるな!(^^)
Discussion