Kubernetes 参考資料 入門編

##概要

Kubernetesの概要について書いてくださっているサイトが多くありますので、
それを見ながら、学習を進めていく上で、内容の理解度を深めるために
アウトプット用に書いておこうと思います。

今回は以下のサイトを参考にさせていただいております。

[Kubernetesの概要](https://www.itbook.info/network/kubernetes01.html)

##Kubernetes概要について

>今回からコンテナオーケストレーションツールであるKubernetesを紹介していきます。
まず、オーケストレーションツールとはなんでしょう。。
→「コンテナ」を管理する技術のことを言います。

>Kubernetesは「クーバーネイティス」とか「クバネティス」とか「クーべネティス」とか人によって読み方が多少異なったりします。また、Kubernetesは長いのでK8sと略されることが多いです。

ふむふむ。

>Kubernetes（k8s）は、Googleが開発したコンテナオーケストレーションツールで、複数のマシンからなるコンテナを統一的に管理することができるツール

Googleさんありがとうございます。

>元々はGoogleが自社で利用していた「Borg」と呼ばれるツールを広く一般的に公開したツールのため、Googleの大規模サービスの運用ノウハウが盛り込まれています。

Googleのノウハウぜひ活用させていただきます。

>Kubernetesの主な機能は次の通りです。
>・複数サーバーでのコンテナ管理
>・自動でコンテナを分散配置
>・コンテナがダウンしたら自動回復
>・ローリングアップデートが可能
>・コンテナのロードバランシング
>・コンテナの監視
>・コンテナ間のネットワーク管理
>・オートスケーリングが可能
>・ログの集中管理

なるほど。
自動回復機能、ローリングアップデート可能、監視、ロードバランシングと
多種多様でありがたいです。

>また、機能以外にもKubernetesには、特徴的な2つの思想があります。1
>宣言的な構成管理
>巨大なエコシステムと拡張性の高さ

####エコシステムとは？
業界やプロダクト、サービスなどがお互いと連携することで巨大な収益構造を持つ様をビジネスのこと

##宣言的な構成管理とは？

>k8sは宣言的な構成管理という思想を取り入れています。
ユーザーが期待する状態をManifestファイルに宣言する。そしてそれを適用すれば、以前の状態がどうであれ、宣言した状態になる、という考え方です。
アプリケーションをk8sにデプロイする時に、「こうあるべき」という状態を宣言すれば、宣言通りの状態をk8sが作業してくれます。
Manifestファイルの宣言の仕方が気になりますが、
便利ですね。

>宣言的な構成管理の場合、「こうあるべき」という状態を実現するために細かい手順に気を使わなくて良いというメリットがあります。この宣言的な構成管理を採用することで、k8sはコンテナをシンプルに管理することができます。
Manifestファイルの書き方がより気になりますね。

※以下、マニフェストファイルひな形の参考資料です。

[Kubernetes Tips: kubectl でマニフェストの雛形を作る](https://qiita.com/tkusumi/items/4f63cea4c4d910b368c4)

別途確認しようと思います。

##巨大なエコシステムと拡張性の高さ

>k8sは拡張性の高さも大きな特徴で、当初からAPIを公開しており、このAPIを活用した様々なコンポーネントやツールが有志から公開されています。
もちろん、Kubernetesは複数の異なるクラウドに対応しますし、オンプレミス環境でも利用が可能です。また、このような拡張性の高さを活かして、プラグインによってさまざまなネットワークベンダやストレージベンダを対応させることができます。

助かりますね。
本当に便利です。

>k8sはCNCF（Cloud Native Computing Foundation）と呼ばれるオープンなファウンデーションで中心的なプロジェクトとなっていて、OSSとしてコミュニティベースとして開発が進められています。周辺のプロジェクトも多岐に渡っていて、活発に活動されていることもいます。

ふむふむ。


>さらに、これらのOSSプロジェクトに加えて、クラウドベンダもk8sをマネージドサービスとして提供しているなど、k8sを中心に巨大なエコシステムが構築されています。
k8sを知らないとインフラエンジニアとして致命的という未来はすでにきているかもしれませんね。

[クラウドベンダ情報はこちら](https://landscape.cncf.io/)


##Kubernetesのアーキテクチャ

>クラスタ
>k8sが管理するマシンの集合で、少なくとも1つのマスターとノードと呼ばれるコンテナの展開されるマシンで構成されます。クラスタ内でどのノード上でも動作可能。

つまり、

 - k8sが管理するマシン（ノード）の集合体。
 - 少なくとも1つのマスターとノードと呼ばれるコンテナが展開されるマシンが必要
 - クラスタ内でどのノード上でも動作可能

>マスタ
>クラスタ全体の管理を行うプロセスが動作するマシンで、APIサーバー、スケジューラ、コントロールマネージャなどのプロセスが動作します。ユーザーや各コンポーネントはマスタが持つAPIサーバーが公開しているAPIを叩くことで、クラスタを操作します。
>k8sではAPI操作をkubectlコマンドでコマンド化しています。

つまり、
クラスタ全体の管理を行うプロセスが動作するマシン。
主に以下プロセスが動作する

 - APIサーバ
 - スケジューラ
 - コントロールマネージャ
 
など

また、API操作をkubectlコマンドでコマンド化している。

>ノード
>コンテナを展開するマシン。クラスタには通常1つ以上のノードが存在します。各ノードの管理はマスターが行います。

ふむふむ。

>ポッド
>コンテナを管理するための最小単位で、複数のDockerコンテナの集合体です。

ふむふむ。

>マニフェスト
>YAMLやJSON形式で、リソースの構成をテキストファイルで記述して、それをAPI経由でクラスタに宣言することで、クラスタを操作することができます。

なるほど。
マニフェストはしっかり理解しなくてはいけませんね。

##Kubernetes マスタとノードのコンポーネント

※以下URLより抜粋しております。
https://www.itbook.info/network/kubernetes01.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114409/88fef98c-04ea-c85c-773c-5af0debe8f11.png)

 - クライアントコンポーネント（ノード）

※クライアントは厳密にはコンポーネントではありません。

>kubectl
>kubectlはapi-serverに対してリクエストを送信し、リソースの作成や変更、削除などを行います。kubectlはコマンド形式ですが、裏ではAPIのやり取りを行っています。

kubectlコマンドはしっかりと押さえておかないといけませんね。

 - Kubernetesマスタコンポーネント

マスタには、次のようなコンポーネントが動作しています。

>APIサーバー（kube-apiserver）
>ユーザーや各コンポーネントから管理情報にアクセスするためのAPIを提供しています。認証や認可の処理なども行っています。全ての操作はこの kube-apiserver を通して行われます。

なるほど。
それぞれのAPIを実行するkubectlコマンドは押さえておかないといけませんね。

[kubernetes : kubectlコマンド一覧](https://qiita.com/suzukihi724/items/241f7241d297a2d4a55c)

>スケジューラ（kube-shcduler）
>コンテナをどのノードで実行するかのスケジューリングを実施します。

なるほど。

>コントロールマネージャ（kube-controller-manager）
>クラスタ上のノードやコンテナなどに関するクラスタの状態をAPIサーバー経由で監視するコンポーネントです。

監視も必要ですね。
こちらもしっかり押さえておかないとですね。

>クラウドコントロールマネージャ（cloud-controller-manager）
>ノードやルーティング、ロードバランサ、ストレージなどのクラウドプロバイダに依存するオブジェクトを管理

以下より抜粋
https://kubernetes.io/ja/docs/tasks/administer-cluster/running-cloud-controller/

→cloud-controller-managerは、クラウド固有の制御ループを組み込むデーモン

>etcd
>etcdはKubernetesのデータストアとして利用されています。クラスタ全体の管理に関わる情報が格納されています。データは kube-apiserver を通して取得や格納が行わます。

なるほど。

 - Kubernetesノードコンポーネント

>ノードには、コンテナを実行するためのコンテナエンジン（Docker）が動作しています。このDockerを操作するためのコンポーネントのkubeletと、コンテナ間通信を行うためのコンポーネントのkube-proxyが動作しています。

なるほど。

>kubelet
>コンテナを起動したり管理するためのコンポーネントです。kube-schedulerでスケジュールされたタスクを認識し、ノードの起動や監視を行います。

kubeletの動き方もしっかり押さえておかないとですね。

>kube-proxy
>コンテナ間通信を行うためのルーティングを行います。実際はiptablesのルールを使ってパケットの制御を行っています。

コンテナ間通信は、ロードバランシングなどで使用する際に必要になってくると思うので、ここもしっかり押さえていきたいですね。

##まとめ

概要について理解してきましたので、
Kubernetesのチュートリアルを行い、実際に手を動かしてみようと思います。

[Kubernetesチュートリアル](https://kubernetes.io/ja/docs/tutorials/)

[チュートリアルを実際に進めてみた備忘録](https://qiita.com/tomotomo3/items/bb1788d5ef22c3ec97d9)