Kubernetesとは？

# はじめに

AWSの業務でKubernetesを扱っているため、色々と調べたり、学んだことを記事に残したいとい思います。概念的な話になりますが、Kubernetesを理解する上で何かのお役に立てればと思います。

# その前にDockerとは・・・
Kubernetesを知る上で、Dockerの理解は必要不可欠なのでそのあたりについて触れたいと思います。
Dockerは、Docker社が開発している、コンテナ型の仮想環境を作成、配布、実行するためのプラットフォームです。

Dockerは、Linuxのコンテナ技術を使ったもので、ホストマシンのカーネルを利用し、プロセスやユーザなどを隔離することで、あたかも別のマシンが動いているかのように動かすことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816973/193cf780-6565-c116-a425-bdcb9b021e8f.png)

# Dockerの特徴は？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816973/26afaf21-130d-5452-aa8c-11a2f25a0d04.png)


# Dockerの考慮事項は？
こんな、便利な特徴のDockerですが、Dockerイメージのビルドや各コンテナの起動・停止などをより簡単に行えるようにするツール「Docker Compose」を利用しても考慮しなくてはいけない点が以下の吹き出しの数だけあります。
これはなかなか大変！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816973/b858a325-817f-2ba4-1dec-e4bac684d30e.png)

# そこでようやくKubernetesの登場です！

コンテナ化されたアプリケーションのデプロイ、スケーリングなどの管理を自動化するもの
＝コンテナオーケストレーションツール

Docker自体はコンテナの“作成・廃棄”の機能は持っていますが、
コンテナを効率よく配置したり、管理したりといった機能は備えていません。

Kubernetes と Docker の根本的な違いは、Kubernetes がクラスター間での実行を目的としているのに対し、Docker はシングル ノードで実行されます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816973/5fc43e12-1c7f-f921-e0af-949bb0ca9f7b.png)


# Kubernetesの構成は？

・マスター
ここには、クラスタを制御する Kubernetes コンポーネントと、クラスタの状態と構成に関するデータがあります。これらは、Kubernetes のコアコンポーネントが、十分な数のコンテナが必要なリソースで実行されていることを確認するという重要な作業を担います。


・ノード
Kubernetes クラスタは少なくとも 1 つのコンピュートノードを必要としますが、通常は多数を有しています。クラスタの容量をスケールアップする必要がある場合は、ノードを追加します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816973/936f84ae-75dc-b677-877d-e747f1573f0a.png)


# マニフェストファイルとは？
・マニフェストファイル
リソースをどのように構成してKubernetesクラスタとしてのアプリケーションをデプロイしていくのかを定義したものがマニフェストファイルです。つまり、リソースの構成をテキストファイル(yaml、json)で記述したのがマニフェストファイルです。

・kubectl
Kubernetes クラスタを構築する前に、kubectlと呼ばれるツールが必要になります。一般に「Kube Control」として知られるこのツールは、Kubernetes クラスタをターミナルから簡単に管理できるコマンドラインインターフェイスです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816973/d5ef238f-03ad-9636-d29c-82d36e60a943.png)



# Kubernetesって何ができるの？？

・コンテナのスケジューリング

マスターが各ノードのリソース状況を確認し、ノードに適切にコンテナを配置してくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816973/760dfe7f-4bcc-22e3-34cc-201da41750f3.png)

そのため、ユーザはどのノードにコンテナを配置するか管理する必要がありません。
下の図ではリソースが100％を越えるノードに対して、コンテナの配置は行われません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816973/77aa9956-8c43-9cb5-bd84-a90518e85d5c.png)

・セルフヒーリング（コンテナの停止）
　コンテナが停止した場合は自動的にコンテナを再デプロイしてくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816973/af9e629e-4cfc-c403-6cf5-85238ccd01be.png)

・セルフヒーリング（ノードの停止）
　ノードが停止した場合は自動的に他のノードで再デプロイします。
　他のノードのリソースが不足している場合は新規にノードを作成することも可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816973/e30678a9-7489-2461-ea93-744090ceed2e.png)



# Pod起動の仕組み

もう少し踏み込んで、詳細な仕組みについて触れたいと思います。
コンテナの最小実行単位であるPodと言われるものが存在します。
Podを起動するまでの仕組みが以下の図になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816973/b19c1544-1d43-7f12-bd88-2f4401cfa2c1.png)

マスターに存在する「etcd」内に定義された状態を維持するために各コンポ―ネントがポーリングして②~⑤の動作を実行することでコンテナのスケジュールやセルフヒーリングを可能にしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816973/c3d8a7f5-6d1b-cc30-0c43-75968d5882b0.png)

# マスターとノード間の通信

以下の図はマスターとノード間でどういった通信をおこなっているかまとめものになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816973/3a054586-f262-833a-d336-b3eff5ea4b4e.png)

・API Server
　UserがKubectlを実行した際の受け取る窓口的な役割となります。
　API Serverを介して、各ノードに命令を出します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816973/8d345d71-5698-df98-0603-0262b599e760.png)

・etcd
　Kubernetesのあらゆる設定情報を格納するキーバリューストアになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816973/f6798ea2-799e-19a6-e72a-e2d104e0d399.png)

・Scheduler
　コンテナの配置を管理するものとなります。
　新しいコンテナが作成された際に、どのノードに配置するか決めたりする役割となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816973/a6d30957-df8f-bbdc-0616-03b06a36acaf.png)

・Controller Manager
　Kubernetesに関する様々な状態を監視します。
　(1)ノードコントローラー
　　ノードがダウンした場合の通知と対応を担当します。
　
　(2)レプリケーションコントローラー
　　システム内のPodの数を正しく保つ役割を持ちます。
　
　(3)エンドポイントコントローラー
　　エンドポイントオブジェクトを注入します(つまり、ServiceとPodを紐付けます)。

　(4)サービスアカウントとトークンコントローラー
　　新規の名前空間に対して、デフォルトアカウントとAPIアクセストークンを作成します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816973/09ad41e8-fac3-6cc1-1d94-2cf33fedc5c4.png)


・Container Runtime
　Container image名やContainer実行に関する各種設定情報を受け取ってContainerを作成・実行・停止・削除する
　ソフトウェアです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816973/656e49bd-935c-659d-fd37-5820e4be70ea.png)

・Kubelet
　各ノードに配置するKubernetesエージェントです。Container Runtimeと連携して、コンテナの起動停止を実施し、
　コンテナの監視も行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816973/f0176896-d4c5-33a2-b85f-1131caa83e1d.png)


# おわりに
Kubernetesの構成やコンテナ起動までの仕組みについて記載させて頂きました。
実際に動かしてのノウハウは今後、別記事で投稿していけたらと思います。
本記事が何かのお役に立てれば幸いです。
ありがとうございました。

参考記事）
Docker入門
https://knowledge.sakura.ad.jp/13265/
Kubernetes入門
https://kaitoy.github.io/hello-k8s/#/