とあるエンジニアの作業ブログ

Docker System Architecture コンテナ ビジネス書要約

Kubernetes入門 ~Kubernetes完全ガイドを読んで~

投稿日:2019年3月2日 更新日:

Kubernetesを学ばないとだんだん話についていけなくなってきたので止む無く勉強を始めた。
とりあえずKubernetes完全ガイドという、今のところ日本語だと一番良いと聞いたのでそいつで勉強。

ひとまずDockerの復習とKubernetesってなんぞやってとこまで。

動作環境

  • Ubuntu 18.04.1 LTS
  • docker version

Dockerのおさらい

Dockerコンテナの設計のポイント

  • 1コンテナにつき1プロセス
    ···仮想マシンのように1つのイメージの中に複数プロセスは非推奨。複数プロセス実行したいならイメージを分けるべし。
  • Immutable Infrastructureなイメージにする
    ···コンテナ起動後に外部から実行バイナリやパッケージを取得・インストールしたりすると外部要因によってそのコンテナイメージの実行結果が変わってしまいます。可能な限り実行バイナリやリソースを埋め込み、コンテナイメージは普遍的な状態にする。
  • 軽量なDockerイメージにする
    ···Dockerイメージは最初にリポジトリからpullする必要があるため、なるべく軽量な状態にすべき。方法としてyumやaptでパッケージインストールした後のキャッシュファイルの削除や、Alpineなどのベースイメージが軽量なものを利用するなどがある。
  • 実行ユーザーをroot以外にする
    ···コンテナ内でプロセスを起動する実行ユーザーの権限を最小化すること。rootなど使うと大きなセキュリティリスクにつながるので注意が必要。

Dockerfileの書き方

大雑把な使用コマンド説明

  • FROM
    ···ベースイメージを指定
  • EXPOSE
    ···コンテナがListenするポートを指定
  • COPY
    ···ビルドを行うマシン上のファイルをコンテナ(イメージ中)にコピーして配置
  • RUN
    ···ビルド時にコンテナ上でコマンドを実行。yumやaptでパッケージインストールなどが一般的な使い方(後述するハンズオンではgoをコンパイルして実行バイナリを作成している)
  • ENTRYPOINTとCMD
    ···コンテナ起動時に実行するデフォルトコマンドを指定するために用いる。非常に簡単に説明すると、「$ENTRYPOINT $CMD」が実行されるようなイメージ。
    ENTRYPOINTとCMDはコンテナ起動時に別途オプション指定することもできるので、実行の度に上書きすることもできる。一般的にはENTRYPOINTには基本的に書き換える必要のないコマンド、CMD部分にはデフォルト引数などを定義する。
    例)
    ENTRYPOINTに/bin/sleepを指定し、CMDにはsleep秒数を指定する

ハンズオン

docker buildでDockerfileから独自のイメージを作成。
docker buildにDockerfileのパスと-tオプションでイメージの名前とタグ(デフォルトはlatest)を指定できる。

docker runでコンテナを作成して実行。
docker ps -aは停止しているもの含めすべてのコンテナをリスト出力。(-aオプション無しだと起動中のコンテナのみ)

イメージの中に実行ソースを含める。
mian.goというソースをイメージの中にコピーしコンテナ化して実行。

マルチステージビルド

先ほどのハンズオンの方法だとdockerfile_golangのサイズは378MBにもなってしまった。これはイメージファイル中にGoのビルドツールなども含まれているため。
Dockerのマルチステージビルドを使えば、複数のコンテナイメージを使って処理を行い、成果物だけを実行用のイメージにコピーできる。
先ほどの例でいえば、Golangのイメージはビルドに必要なツール用途でしか使われていないので、ビルドで作成したbinaryを実行用イメージにコピーして最終的なコンテナイメージにする。

-fオプションで使用するDockerfileを指定することが可能。
dockerfile_multistageがdockerfile_golangよりもずいぶん小さくなったことがわかる。
※なぜかnone(dangling image)が出来上がってしまった。とりあえずdocker image pruneで削除したが、noneが出来上がって理由は後で調べる。

DockerレジストリへのPush

Dockerレジストリの有名どころ。

  • DockerHub
  • Google Container Registry(GCR)
  • Amazon Elastic Container Registry(Amazon ECR)
  • Azure Container Registry(ACR)

Dockerレジストリにプッシュするにはイメージ名を下記のフォーマットにする必要あり。

[Dockerレジストリのホスト名]/[ネームスペース]/[リポジトリ名称]:[タグ]

DockerHubの場合はホスト名は省略可能。ネームスペースはDockerHubのユーザー名。

docker.io/[DockerHubのユーザー名]/sample-image:0.1
または
[DockerHubのユーザー名]/sample-image:0.1

What is Kubernetes?と基本機能

Kubernetesとは

コンテナオーケストレーションエンジン。
Kubernetesはコンテナ化されたアプリケーションのデプロイ、スケーリングなどの管理を自動化するためのプラットフォーム。
Dockerは従来それ単体ではDockerがインストールされたホストを複数台協調して動作させたり、一元的に管理したりすることができなかったため、Docker単体では複数のホストで構成されるシステムを構築することは難しかった。

Kubernetes用語

  • Kubernetes Node ··· 実際にコンテナが起動するノード
  • Kubernetes Master ··· Nodeを管理するノード
  • Pod ··· (本には記載なし)Podは複数のコンテナの集合体です。Kubernetesでコンテナを管理するための最小単位。コンテナを単独で管理するのではなく、グループとして管理することで、コンテナの使いにくさを解消することが可能(例えばNginxとNodeJSのコンテナをWeb/APサーバーPodとして管理する)

Kubernetesを使うと何ができるのか

  • Infrastructure as Code
    ···YAML形式やJSON形式で記述したコード(マニフェスト)によりデプロイするコンテナや周辺リソースを管理可能
  • スケーリング/オートスケーリング
    ···コンテナクラスタ(Kubernetesクラスタ)を形成して複数のノードを管理する。Kubernetes上にコンテナをデプロイする際に、同じイメージを元にした複製コンテナ(レプリカ)をデプロイすることで負荷分散や耐障害性の確保が可能。負荷に応じたオートスケーリングも可能。
  • スケジューリング
    ···コンテナをどのノードにデプロイするか決める機能。ノードの性能差を意識してスケジューリングが可能(AffinityとAnti-Affinity)。例えば、「ディスクI/Oが多い」コンテナを「ディスクがSSD」のノードに配置といった感じ。また、クラウドのアベイラビリティゾーン(リージョン)を識別することもできるのでマルチリージョン化も可能になる。
  • リソース管理
    ···(特別な指定がない限り)ノードのリソース使用状況にしたがってコンテナをスケジューリングする。ユーザーがどのコンテナを配置するか管理する必要がなくなる
    ※リソース使用状況だけでコンテナをスケジューリングするとオートスケールの時とかに苦労しそうな気がするが、その辺はまだ勉強中
  • セルフヒーリング
    ···標準でコンテナのプロセス監視を行なっており、プロセス停止を検知すると自動的にコンテナ再デプロイする。更に、プロセス監視以外にもHTTP/TCPやシェルによるヘルスチェックの成否を条件に設定することもできる
  • サービスディスカバリとロードバランシング
    ···仮想マシンでロードバランサ経由でルーティングするように、Kubernetesもあらかじめ指定した条件に合致するコンテナ群に対してルーティングするロードバランシング機能(Service)を有している。スケール時のServiceへの自動追加/削除、コンテナ障害時のServiceからの切り離し、ローリングアップデート時の事前切り離しなどを自動的に行なってくれる
  • データの管理
    ···バックエンドのデータストアにetcdを採用しているため、コンテナやServiceに関するマニフェストも冗長化されて保存されている。また、コンテナが利用する設定ファイルや認証情報などのデータを保存する仕組みも用意されており、コンテナ共通設定やアプリケーションから利用されるPWなどの情報を安全かつ冗長化された状態で集中管理可能
    ※etcd···etcdはGo言語で記述された設定情報の共有とサービス検出のための分散KVS

 
 

-Docker, System Architecture, コンテナ, ビジネス書要約
-, ,

執筆者:


comment

メールアドレスが公開されることはありません。

関連記事

システムにおける適応度関数 〜進化的アーキテクチャを読んで〜

オライリーの進化的アーキテクチャを読んで、重要そうなポイント、特に適応度関数について自分用まとめ。 はじめに断っておくと、この本は「システムアーキテクチャを変更する際にこういう風にしておけば容易に変更 …

改めてリーンスタートアップの要点まとめ(1/3) 全体概要&第1部

ここ2、3年の仕事はプロジェクトをアジャイルで進めることが多く、かつ今度リーンスタートアップで提唱されているプロセスを採用するということで改めてリーンスタートアップを読んでみた。 以前読んだときは自分 …

改めてリーンスタートアップの要点まとめ(2/3) 第2部

リーンスタートアップの第2部のまとめ。 第1部のまとめはこちら。 目次 構築→計測→学びのサイクルと事業拡大/転換 :本書 5、6、7、8章に対応 構築・検証プロセスにおける特記 :本書 6章に対応 …

システムアーキテクチャ設計メソトロジー

システムアーキテクチャ設計のメソトロジー(方法論)をメモ。 目次 アプリケーションの原則とアーキテクチャパターン(Application Principle and Architecture Patt …

改めてリーンスタートアップの要点まとめ(3/3) 第3部

リーンスタートアップの第3部のまとめ。 第1部、第2部のまとめは以下から。 第1部 第2部 目次 リーン実践にあたっての案件サイズ(バッチサイズ) :本書 9、11章に対応 事業拡大において注力すべき …