【入門】kubernetes勉強メモ①：Dockerから学ぶ

# はじめに：くーべねてぃす？
なんとなく今まで聞いたことあったけど触れたくなかった、、、Dockerでよくないか？
とかとか、思っていた今日この頃。

しかし、モダンな技術だし（モダン？）
クラウド上でシステム構築するときになんか良いらしいし、最近使うことになったので勉強していきます。
 ~~（必要を迫られないと勉強しない、エンジニアの風上にも置けない人間）~~

ということで、Kubernetesの理解のために何を勉強したのかメモ代わりに残しておきます。
今回は以下の内容を取り扱います。　
　・Dockerの基礎
　・Kubernetesの基礎
　　・Kubernetesの利点
　　・Kubernetesの用語と仕組み
　・両者の関係性

自分も初学者なので、誤りなどがあった場合にはコメントいただけると幸いです。

# 本記事の対象
1. KubernetesどころかDockerも怪しいよの人
1. Kubernetesは聞いたことはあるけれど…の人

以上の、駆け出しエンジニア用です。
一緒に勉強していければ幸いです。

# Dockerの基礎
Kubernetesの入門記事を読んでいると、「コンテナを～」や「Dockerが～」とよく出てくるのでまずはDockerから。
先人の入門記事が素晴らしいのでぜひこちらを見てください。

 **【docker入門】**

https://qiita.com/HyunwookPark/items/43164de18a256182bf85

 **【Docker超入門　合併版】**

https://www.youtube.com/watch?v=lZD1MIHwMBY&t=3073s

ちなみにDockerを全く知らないよ、使ったことないよという方は、１～２時間かかっても実際に手を動かしてみましょう。
読むだけ、見るだけで出来るようになるならば、この世の全員が大谷翔平になれます！！！

### 個人メモ
+ 「いちいち各PC上で開発環境整えるの面倒だから仮想環境上で動くもの作ろうよ」ができるよ。
+ 仮想環境の作り方はいろいろあるけど、OS上に直接作るんじゃなくてDocker Engine用意してその上に作ろうよ（コンテナ仮想化）。
+ 「コンテナ」が実行環境。「イメージ」が実行環境（コンテナ）のひな型。「イメージ」から「コンテナ」ができるよ。
+ 「Dockerfile」はイメージ作成の指示書。「Dockerfile」から「イメージ」が作れるよ。

# Kubernetesの基礎
いざ、Kubernetesの勉強です。

 **【Kubernetesとは何か？】**

https://kubernetes.io/ja/docs/concepts/overview/what-is-kubernetes/

↑は公式ドキュメントですが、よく読めばなんとなくわかるのですが元が英語なので直訳的かつ、専門用語が多数、、、
でもなんとなく、 **「コンテナ（実行環境）をいい感じに管理してくれるプラットフォームなんだな～」** ということがわかります。

## Kubernetesの利点
まずは、なぜKubernetesを使うのかです。
上でも書きましたが、結局のところは「いい感じにコンテナ管理してくれる」に尽きると思います。
今までは、コンテナのデプロイやスケーリングなどの管理を手動や半自動でやっていましたがこれを **自動** でやってくれます。
この特徴が **コンテナオーケストレーションと呼ばれ、 「コンテナ化されたアプリを自動的にデプロイ、スケーリングおよび管理してくれる」** とのこと。
もう少し詳細を見てみると、以下の特徴がよく挙げられています。
<dl>
 <dt>・コンテナの自己復旧</dt>
   <dd>処理失敗状態のコンテナを自動的に再起動したり、入れ替えたりしてくれる。</dd>
 <dt>・自動スケーリング</dt>
   <dd>コンテナ数を自動的にスケールアップorダウンしてくれる。</dd>
 <dt>・リソースの最適活用</dt>
   <dd>コンテナの必要とするCPUやメモリを宣言するとリソースを最大限に活用してくれる。</dd>
 <dt>・ストレージの管理</dt>
   <dd>ローカルやクラウドのストレージを選ぶと自動でマウントしてくれる。</dd>
 <dt>・ネットワークトラフィックの管理</dt>
   <dd>コンテナへのトラフィックが多い時に、負荷分散してくれる。</dd>
 <dt>・ロールアウト・ロールバックの管理</dt>
   <dd>アプリケーションのバージョンに合わせ、自動的にコンテナの作成・削除、それらへのリソースの適用をしてくれる。</dd>
 <dt>・セキュリティ情報や構成情報の管理</dt>
   <dd>パスワードやトークン、キーなどを保持可能。（著者はよく理解できてない）</dd>
</dl>

ひとまず、こんな感じがKubernetesを使うメリットでしょうか。
正直、使ってみないと分からないし、大規模なサービスにならないとあまり実感できないのでは？という気もしています。
ところで、コンテナオーケストレーション的なソフトウェアは他にもあるのですが、なぜKubernetesなのかという点については、やはりAWSやGCP、Azureがサポートしていることが大きいのではないでしょうか。

## Kubernetesの用語と仕組み
なんとなくメリットが分かったところで、まずは最低でも知っておくべき用語をまとめてみました。
<dl>
 <dt>・Kubernetesクラスタ</dt>
   <dd>マスターとノードを含むマシン群。 </dd>
 <dt>・Kubernetesマスター（コントロール・プレーン）</dt>
   <dd>Kubernetesノードを制御するマシン。Kubernetes APIサーバ、etcd、Kubernetesスケジューラ、Kubernetesコントローラ、クラウド・コントローラ・マネージャが含まれる。</dd>
 <dt>・Kubernetesノード</dt>
   <dd>マスターに制御されるマシン。割り当てられたタスクを実行。Kubelet、Kubernetesネットワーク、Docker、コンテナなどが含まれる。</dd>
 <dt>・Pod</dt>
   <dd>各ノードにデプロイされた、一つ以上のコンテナからなるグループ。ストレージやネットワークなどをファイルで設定できるらしい。</dd>
 <dt>・Service</dt>
   <dd>Podと外部の通信を取り持つための仕組み。アクセスをPodに自動的に分配してくれる。</dd>
 <dt>・マニフェストファイル</dt>
   <dd>マスターで処理されるシステム全体の仕様書。yamlで書かれ、これにどんなコンテナをデプロイするかとかが書かれてる？（まだ詳細を理解してない）</dd>
 <dt>・kubelet</dt>
   <dd>各ノードで実行されるエージェント。Podの起動や管理を担当。</dd>
 <dt>・kubectl</dt>
   <dd>KubernetesのCLI的なもの。これでマニフェストファイルをマスターに処理させたりいろいろするらしい。</dd>
</dl>

この辺の用語をふんわり理解したところで、仕組みについてですが以下の記事を読んでみてください。

 **【Kubernetesとは】（コンポーネントのあたり）**

https://www.oracle.com/jp/cloud-native/container-engine-kubernetes/what-is-kubernetes/

**【[挫折したエンジニア向け] Kubernetesの仕組みをちゃんと理解する (入門/基本編)】(めちゃわかりやすいのでおすすめ)**

https://www.youtube.com/watch?v=r0NpHb-6IvY&t=59s

と、こんな感じですがKubernetes全体のイメージは掴めたでしょうか？
ちなみに、著者は６割ぐらいの理解で、以下のような感想です。
 **「じゃあ実際にKubernetesはどう使えばいいんだ～～！！」**
 **「そもそもKubernetes使う場面がわからん～～！！」**
実際の使い方や使用場面については第２回以降で取り扱いたいと思います。

# KubernetesとDockerの関係
最後にKubernetesとDockerの両者の関係についてです。
著者は以前、両者は対等な関係であり、どちらかを選べばどちらかを選べないものと考えていました。
しかし、Kubernetesはコンテナを管理するプラットフォームであり、Dockerはコンテナを作成・実行できる技術（ソフトウェア）です。
つまり、両者は同時に活用することが望まれ、 **全体をマネージメントしているのがKubernetes、各ノード上でコンテナを実際に動かしているのがDocker** というイメージでしょうか。
よくKubernetesはコンテナのためのOSと言われていますが、その意味も今は理解できました。

ところで、Dockerを少しかじったことがある方は、「DockerComposeがあるからKubernetesいらなくない？」と思うでしょう。
たしかに、シンプルで拡張する予定のないアプリケーションならばDockerComposeでよいかもしれません。
しかし、複数のサーバで複数のコンテナを実行している場合、それらの管理や監視は非常に面倒です。

この辺りは以下の記事がわかりやすかったです。
 **【数時間で完全理解！わりとゴツいKubernetesハンズオン！！】（Kubernetesの何がうれしいの？あたりから）**

https://qiita.com/Kta-M/items/ce475c0063d3d3f36d5d

というように、現代のコンテナを多用するサービス開発において、それらを統合的に管理可能なKubernetesはかなり重要な技術なのです！！ ~~（無理やりな幕引き）~~

# 終わりに
Kubernetesについて、なんとなく理解できたでしょうか？
参考になる記事はたくさんあると思いますが、言葉の統一性が無かったり、注目するポイントがバラバラだったりで、お目当ての情報にたどり着くのが難しかったなという印象です。
それから、実際に手を動かしてみないと分からないところが多い技術だなと感じました。
というのも、抽象的な表現や、そもそも抽象化した概念の言葉も多かったからです。

次回は、簡単なハンズオンができたらいいな～～（願望）

# 参考にさせていただいた記事など
記事内で紹介したもの
**【docker入門】**
https://qiita.com/HyunwookPark/items/43164de18a256182bf85
**【Docker超入門　合併版】**
https://www.youtube.com/watch?v=lZD1MIHwMBY&t=3073s
**【Kubernetesとは何か？】**
https://kubernetes.io/ja/docs/concepts/overview/what-is-kubernetes/
 **【Kubernetesとは（Oracle）】（コンポーネントのあたり）**
https://www.oracle.com/jp/cloud-native/container-engine-kubernetes/what-is-kubernetes/
**【[挫折したエンジニア向け] Kubernetesの仕組みをちゃんと理解する (入門/基本編)】**
https://www.youtube.com/watch?v=r0NpHb-6IvY&t=59s

記事外で参考にしたもの
**【【図解】Dockerの全体像を理解する -前編-】**（後編まで含む）
https://qiita.com/etaroid/items/b1024c7d200a75b992fc
**【kubernetes初心者のための入門ハンズオン】**
https://qiita.com/mihirat/items/ebb0833d50c882398b0f
**【Kubernetes とは（VMwere）】**
https://www.vmware.com/jp/topics/glossary/content/kubernetes.html
**【Kubernetes とは（Red Hat）】**
https://www.redhat.com/ja/topics/containers/what-is-kubernetes
**【Kubernetesとは何かを図でわかりやすく解説！Pod、Namespaceも】**
https://udemy.benesse.co.jp/development/system/kubernetes.html
 **【Kubernetesのアーキテクチャ】** 
https://www.designet.co.jp/ossinfo/kubernetes/architecture/