初心者のためのDocker/Kubernetes開発用語集

## はじめに

DockerとKubernetesの勉強を最近始めたのですが知らない単語が結構ある上に、知らない単語を調べ上げるとまた知らない単語が出てくるというループに陥ったので、ここで備忘録として記録しておきます。

# 単語帳

## 基本用語

**Dockerイメージ**
アプリケーションの実行に必要なインフラ設定とビルド済みの実行モジュールが一つにまとまったインストールイメージ

----

**Dockerfile**
アプリケーションの実行モジュールと実行に必要なインフラの構成情報を記述したファイル

→ これをもとにDockerイメージが作成される
→ Dockerイメージは異なる環境でも問題なく動く
→ テスト済みの安全なイメージを使ってアップデートするので安心
→ Dockerfileさえあれば基本的にはいつでも同じイメージを生成可能
→ 実行環境のインフラを直接変更するのではなく、大元のDockerfileを修正して新たにビルドしたDockerイメージで実行環境を入れ替えることが可能（Immutable Infrastructure）

----

**コンテナ**
ホストOS上に論理的な区画（コンテナ）を作り、アプリケーションを動作させるのに必要なライブラリやアプリケーションなどを1つにまとめ、あたかも個別のサーバーのように使うことができるようにしたもの

----

**コンテナオーケストレーションツール**
コンテナを統合管理できるツール

マルチホストで構成された本番環境をクラスタ構成で稼働させる場合、以下が必要：

- コンテナの起動/停止
- ホスト間のネットワーク接続
- ストレージの管理
- コンテナをどのホストで稼働させるかなどのスケジューリング機能

コンテナオーケストレーションツールはこれらの機能を備えている！

Docker Engine, Apache Mesos, Kubernetesなど

----

**クラスタリング**
複数のサーバを束ねて、利用者や外部のシステムに対して全体で一台のコンピュータであるかのようにみせる技術

----

**ローリングアップデート**
ソフトウェアの更新、入れ替えの方法の一つで、システムを完全には停止させずに更新を行うこと

----

**オーバーヘッド**
ある処理を行うために間接的にかかってしまうコスト

----

**可搬性（ポータビリティ）** 
一度作ってしまえばどこででも動くソフトウェアの特性

----

**Immutable Infrastructure(イミュータブル・インフラストラクチャ)**
実行環境のインフラを直接変更するのではなく、大元のDockerfileを修正して新たにビルドしたDockerイメージで実行環境を入れ替えるインフラ管理方法

----

**プロビジョニングツール**
インストールや環境設定をコードで定義して自動化するためのツール
例：

- OSの起動を自動化するツール（Kickstart, Vagrant）
→ 英名：Bootstrapping

- OSやミドルウェアの設定を自動化するツール（Chef, Ansible）
→ 英名：Configuration

- 複数サーバの管理を自動化するツール（Serf, Capistrano, Kubernetes）
→ 英名：Orchestration

----

**ヘルスチェック**
現用機で障害が発生したことを検知する仕組み
例：

- ICMP監視（pingなどの応答を確認）
- ポート監視（Webサービスであれば、80番ポートからの応答を確認）
- サービス監視（HTTP通信を確認する場合、特定のページが正しく表示されるかを確認）

----

## ツール名

**Jenkins**
単体テストを自動化するためのインテグレーションツール

----

**Docker Hub**
公式のDockerレジストリ

Ubuntu, CentOSなどのLinuxディストリビューションの基本機能を提供するベースイメージが配布されている

----

**Docker Machine**
Dockerの実行環境を自動構築するサービス

----

**Docker Swarm**
複数のコンテナを統合管理するサービス

----

**Docker Engine**
コンテナオーケストレーションツールのひとつ
SwarmモードをDockerで使うと、複数のコンテナをマルチホスト環境で動作させ、それらのコンテナをまとめて一つのコマンドで操作できる

----

**Apache Mesos**
コンテナオーケストレーションツールのひとつ
長時間にわたって動作し続けるアプリケーションの起動やモニタリングが可能

----

**Kubernetes**
コンテナオーケストレーションツールのひとつ
Google Kubernetes Engine（以前はGoogle Container Engine）で使える

----

**Google Container Registry**
DockerイメージをGCPのプロジェクト内で管理できるプライベートなレジストリサービス

----

**Google Cloud Datasore**
複数のサーバにデータを分散して保持することで、大量データの保存に対応したNoSQLデータベースサービス
→ NoSQL:Not only SQL、非RDBMSの総称
→ RDBMS:簡単に言うと、「表」で表すことができるデータベース

RDBMSとNoSQLについては下のリンクがわかりやすいかも。
> https://qiita.com/t_nakayama0714/items/0ff7644666f0122cfba1

----

**Flannel**
ノード間の内部ネットワークを簡単に構成してくれるツール

----


## Google Kubernetes Engineの特長についての用語


**フルマネージド**
Kubernetesの環境を自動で構築/管理する機能を提供
Dockerコンテナに対する高い可用性を確保して安全に管理することができる
→ 可用性：システムが継続して稼働できる能力のこと

----

**プライベートなContainer Registryの提供**
インターネットに公開できない実行ファイルもプライベートな環境に保存することが可能

----

**スケーラブル**
アプリケーションの要求の変化に応じて、コンテナに割り当てられるクラスターソースやコンテナクラスタのサイズを調整することが可能

----

## Kubernetesに関する用語集

**マスターサーバ（Kubernetes Master）**
Kubernetesクラスタ内のコンテナを操作するためのサーバ

- kubectlコマンドを使ってクラスタを構成したりリソースを操作したりするとき、マスターサーバがコマンドからのリクエストを受け取って処理を行う


----

**ノード(Node)**
実際にDockerコンテナを動作させるサーバ

- ノードの管理はマスターサーバが行う
- ノードを複数用意して、クラスタを構成

----

**バックエンドデータベース(etcd)**
etcd（/etc distributed の略）と呼ばれるKey-Value Store(KVS)を使って、クラスタの構成情報をまとめて管理する

Key-Value Store: 

> データ管理システムの種類の一つで、保存したいデータ（value：値）に対し、対応する一意の標識（key：キー）を設定し、これらをペアで格納する方式

----

**レジストリサーバ**
クラスタ内で起動するDockerコンテナのもとになるDockerイメージを管理するためのサーバ

----

**Pod（ポッド）**
仮想NIC（プライベートIP）を共有するコンテナ群をまとめたものをPodと呼ぶ

→ Pod内のコンテナは同一のノード上に配備される

NIC: Network Interface Card

----

**Replication Controller（レプリケーションコントローラ）**
同一構成のPodが指定の数だけ起動している状態を作り出すコントローラ
→ Podの起動するノードはスケジューラが自動で決定

----

**Service（サービス）**
起動中のPodに対してServiceを定義することによって外部からアクセス可能なIPアドレスが用意される

→ Serviceに対するIPアドレス+ポート番号にアクセスすると、複数のPodに対する負荷分散が行われる

----


## 最後に

実際に使ってみないと理解は深まらないと思うので、k8s（Kubernetes）関連の仕事をいただけるようにアピールします。

参考：

> プログラマのためのGoogle Cloud Platform入門
> https://www.amazon.co.jp/dp/B0721JNVGT/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1