Dockerの本を読んでみた -5章編-

##前回までのおさらい
読んでいる本はこちら
[Docker/Kubernetes 実践コンテナ開発入門](https://www.techbookrank.com/books/5c043e93f53e80000483916e)
4章まで読み終わったので、（といっても4章はほぼ実践編だったので実装メイン）今回は5章編となる。
5章はとうとう、Kubernetesとは〜という話になってくる。

##章の流れ
大まかな流れは

>①localにKubernetes環境をつくってみよう
②Kubernetesの概念説明
③個々の用語と使い方の説明

という感じ。
上記と同じ流れでまとめてみる。

##Step1 ローカルにKubernetes環境をつくってみよう
これは本を読まなくてもその辺をぐぐれば出てくるので、ぐぐることをおすすめする。
※本内にもWindowsバージョンとMacバージョンとそれぞれ構築フローが写真と合わせて記載があるので、購入することが悪い訳ではない
よって、ローカルに構築する部分については割愛する。
ちなみに個人的にはローカルよりもAWS環境に構築してみる方が身になると考えたので、AWS環境にKubernetesを作ってみた。
（それについては後日別記事にて掲載予定）

##Step2 Kubernetesの概念説明
そもそもKubernetesって何？って話から入り、リソース名と用語が表形式で記載されている。
表でつらつらと書いても理解出来なかったので、図にして示すことにした。続きに記載

##Step3 個々の用語と使い方説明
ここでは、Step2で示した用語の詳細説明が主に記載されている。
それぞれ
###Kubernetesクラスタとは / Nodeとは
それぞれ本の内容を書いてみると、、

>Kubernetesクラスタとは、Kubernetesのいろーんなリソースを管理する集合体のこと
Nodeとは、Kubernetesのクラスタ管理下に置かれたDockerホストのこと。
そしてNodeには必ず1つMaster Nodeと呼ばれるNode全体を統括するNodeが存在する

上記のような説明があったが、結局どういうこと？？となってしまい、理解が進まなかったので以下のように図とした。
書き方についての注釈をいくつか入れると、以下のようになる。
※今回はAWS上にKubernetesを立てる想定で書いてみたということ。
※Kubernetes上では、「Podというコンテナの中にアプリやらストレージやらを載せていくイメージ」ってどこかに書いてあったので、上に積み上げるようなイメージで積み上げていること。
※矢印が下から上へ向かっていると思うが、これはクラウド上からKubernetes上へどのようにアクセスするのかの経路を示したかった為の矢印であること。
※また、個人的な理解として、「1つのNode＝AWSでいうところの1つのEC2」という認識であること。

![Kubernetes図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430110/6c31ccde-cc97-c9d0-47d8-cd18e0f47aa0.png)


###Namespaceとは
ネームスペースと読むのだが、これは、「クラスタ」の中にさらに入れ子状態でクラスタを作れる機能のこと。
なぜそんなややこしいことになるのか？クラスタ内にクラスタをつくって意味があるのか？
これには、意味がある。
著書には、例として権限制限が挙げられていた。
例えば、開発者はdevelopment teamと呼ばれるネームスペースに属していて、バックエンドはbackend teamと呼ばれるネームスペースに所属するとする。
そうすると、開発者とバックエンドと別の権限をもって作業に当たれるのだ。

###Podとは
コンテナの集合体のこと。
注意として、Pod内のコンテナは、一つのNodeに所属することがルールなので、2つのNodeにまたがるコンテナは作れない

####Podってどうやってつくるの？
作り方は簡単。ファイルをつくって、実行するだけ。
>①yamlファイルで作りたいPodを定義する
②コマンドを実行する

料理だって、レシピを元につくる。カレーだってレシピがなきゃどのくらいルーを入れていいのかわからないのだ。
同じように、定義ファイルをつくってこれを見てねとお願いしてから実行する。

定義ファイルについては割愛するが、実行コマンドは以下になる。
尚、作成した定義ファイル名は「simple-pod.yaml」とする。

```
# ----- Pod作成or更新時 ----- #
# kubectl apply -f simple-pod.yaml
```

####Podってどうやって操作する？
つくったPodの操作方法がわからないと、管理出来ない。
次にPodの操作コマンドが紹介されていた。

```
# ----- Podの状態取得 ----- #
# kubectl get pod
```

```
# ----- コンテナ内でコマンドを実行する ----- #
# 構文
# kubectl exec -i -t [Pod名] -c [コンテナ名] -- [コマンド]
# 例
# kubectl exec -it simple-echo sh -c nginx
```

```
# ----- コンテナを削除する ----- #
# 構文
# kubectl delete pod [Pod名]
# 例
# kubectl delete pod simple-echo
```

###ReplicaSetとは
Podの定義ファイルからはPodを1つしか作成出来ない。
よって、冗長構成を取るような可用性を担保したい時は「ReplicaSet」を用いて管理する。
「ReplicaSet」とは、同じ仕様のPodを複数生成・管理する為のリソースと記載がある。

####ReplicaSetはどうやってつくるのか？
先程設定したファイル（Podの仕様を定義したyamlファイル）に、設定を追記するだけでReplicaSetは構築できる。
※yamlファイルを新たに作成する必要はない。


###Deploymentとは
Deploymentとは、「ReplicaSetを管理するリソースとして存在するもの」とある
また、DeploymentがReplicaSetの世代管理も担うので、「Deployment1つに対してアプリケーション1つ」という単位で運用すると良いとあります。

```
# ----- ReplicaSet情報を取得----- #
# kubectl get rs
```

###Serviceとは
Podの集合体に対する経路やサービスディスカバリを提供するリソースのこと、とある。
そして、Serviceには3種類存在する。
>・Service - ClusterIP
・Service - NodePort
・Service - LoadBalancer

####Serviceのつくりかた
Serviceも同様にyamlファイルに定義を記載していくことで作成が可能となる。
また注意事項として、基本的にKubernetesクラスタの内部からしかServiceにはアクセス出来ない。

####Service - ClusterIP
ServiceのデフォルトはClusterIP機能
この機能は、クラスタ上の内部IPへIPを公開してくれる機能のこと。
よって、このServiceを作成することで、PodからPodへのアクセスが可能となる。

####Service - NodePort
クラスタ外からアクセスする為のもので、ServicePortへ接続する為にグローバルなポートを開けてくれる機能のこと

####Service - LoadBalancer
クラウド環境（Azure/AWS/GCPなど）内で提供されているLBと連携する為の機能のこと。
注意事項として、この機能はローカルのKubernetesでは利用出来ないことが挙げられる。


###Ingressとは
Kubernetesクラスタの外にServiceを後悔する為には、ServiceをNordPortで公開することが出来るAPIオブジェクトのこと。
Ingressは負荷分散機能も持っている、らしい。

##まとめ
Kubernetesの用語理解だけでいうと、自分なりに図にして落とし込むのが手っ取り早いなと思った。
(本を買って読むのも勿論大事だが、公式で記載されているドキュメントを読む方が早い、と思うのも一理あったりなかったり。。)

最後までお読みいただきありがとうございました！
認識相違などご指摘ありましたらコメントいただけると幸いです。


##参考文献・参考サイト
[GETTING STARTED](https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#exec)
[ReplicaSet](https://kubernetes.io/ja/docs/concepts/workloads/controllers/replicaset/)
[Service](https://kubernetes.io/ja/docs/concepts/services-networking/service/)
[Ingress](https://kubernetes.io/ja/docs/concepts/services-networking/ingress/)
[kubectlチートシート](https://kubernetes.io/ja/docs/reference/kubectl/cheatsheet/)