【コンテナ技術】開発が激変！？DXで超注目されているKubernetes　

前回ざっくりKubernetesについて書いたのですが、
肝心の中身がすっかすかだったので、補足しますmm

参考までにこちらの記事をお読み下さい。
■[Kubenetesって流行ってるけど何？](https://qiita.com/DogFall253/items/0b3e6c67f98156f9a988)
■[【マツコの知らないインフラの世界】 OpenStackって知ってる？　～パブリックorプライベートなクラウドについて～](https://qiita.com/DogFall253/items/38c5ae25b3d7b64b6b8c)



#DXとは
<b>ITによってビジネスそのもを変革させる
デジタルトランスフォーメーション(DX)</b>は最近ブームになっています。
１度はどこかで見たり聞いたりしたことがないでしょうか？

>その背景で、開発したアプリケーションはなるべく小さな単位で、かつ短いサイクルでデプロイしたいという開発者のニーズは、日に日に大きくなっています。

しかしながら少人数の管理者で、
大規模な分散環境を安定して運用管理するには、
多くの克服すべき課題がたくさんあります。

そこで大きく注目されているのが
<b>コンテナ技術とコンテナオーケストレーションツール</b>です。

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

ホストOSのリソースを論理的に分離し、複数のコンテナで共有して使います。
コンテナはサーバー仮想化に比べオーバーヘッドが少ないため、
<b>軽量で高速に動作するのが特徴</b>です。

本来であれば複数のアプリケーションで使用しているミドルウェアやライブラリのバージョンが異なる場合などは、<b>お互いのアプリケーションが影響を受けないよう注意が必要</b>です。
<br>
　これに対しコンテナ技術を使用すると、OSやディレクトリ、IPアドレスなどのシステムリソースを、個々のアプリケーションが占有しているように扱うことができます。

![11336_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684145/c5fea0af-1277-766b-23bc-8052e7efe665.jpeg)



　コンテナ技術はいくつかありますが、現在KubernetesのデフォルトになっているのがDocker（ドッカー）です。Dockerは、アプリケーションの実行に必要な環境を1つのイメージにまとめ、そのイメージを使って、さまざまな環境でアプリケーション実行環境を構築／運用するためのオープンソースソフトウェアです。


[◆Docker［公式サイト］](https://www.docker.com/)

#コンテナアプリ開発のフロー
一般的なWebシステムの開発において、
アプリケーションを稼働させるためには次のものが必要です。


| 必要な数 |必須なもの |
|:-:|:-:|
| 1 | アプリケーションの実行モジュール |
| 2 | ミドルウェアやライブラリ群 |
| 3 | OS/ネットワークなどのインフラ環境設定  |

従来はこんな感じで進みますが、
環境によっては動かない😢ってことがあります。
![11336_02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684145/e0eeb5cc-3aae-11ae-7d60-4c3184acab14.jpeg)


ですが、コンテナを使うと、アプリケーションの実行に必要なすべてのファイル／ディレクトリ群を、まるごとコンテナイメージとしてまとめることができ楽ちんなのです。
![11336_03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684145/3f4330f1-342e-1a4e-6d46-3b04728eef0b.jpeg)

このイメージは、OSカーネルに互換性があり、<b>コンテナが動く環境であればどこでも動作する<b>ので（ただし、開発環境で必要なライブラリが実行環境には不要な場合もあります）、<b>「開発／テスト環境では動くけど、本番環境では動かない」リスクを減らす</b>ことができます。



<br>
さらにさらに、アプリケーションの開発からテスト～本番環境へのデプロイが、<b>すべてアプリケーションエンジニアの手で行うことが可能になり、デプロイのスピードを上げることができます</b>。

| 番号 | 手順 |
|:-:|:-:|
|  1 |  コンテナアプリケーションのビルド（Build）|
|  2 |  コンテナイメージの共有（Ship） |
|  3 |  コンテナアプリケーションの実行（Run） |

#Dockerにも触れてみる
###ビルド（Build）
Dockerは、アプリケーションの実行に必要になるプログラム本体／ライブラリ／ミドルウェアや、OSやネットワークの設定などを1つにまとめてDockerイメージを作ります。
![11336_04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684145/d3a6c33b-9480-5c61-2492-542052579bf5.jpeg)


Dockerでは1つのイメージには、1つのアプリケーションのみを入れておき、複数のコンテナを組み合わせてサービスを構築するのが推奨されています。

このDockerイメージの正体は、
アプリケーションの実行に必要なファイル群が格納されたディレクトリです。

###共有（Ship）
コンテナイメージはレジストリで共有できます。
![11336_05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684145/358a38cd-d83e-4c0c-efb8-504803b949c2.jpeg)


たとえば、公式のDockerレジストリであるDocker HubではUbuntuやCentOSなどのLinuxディストリビューションの基本機能を提供するベースイメージが配布されています。これらのベースイメージにミドルウェアやライブラリ、デプロイするアプリケーションなどを入れたイメージを積み重ねて独自のコンテナイメージを作っていきます。

なお、よりセキュアな環境が必要であれば、プライベートなレジストリを使うこともできます。パブリッククラウドの多くは、コンテナイメージを共有するプライベートなレジストリサービスを提供しているので、これを利用するのがよいでしょう。

###実行（Run）
Dockerは、Linux上で、コンテナ単位でサーバー機能を動かします。
![11336_06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684145/b8cb0848-69c7-a293-9d1f-d771db9903c1.jpeg)


このコンテナのもとになるのが、Dockerイメージです。<b>Dockerイメージさえあれば、Dockerがインストールされた環境であればどこでもコンテナを動かすことができます</b>。

　また、Dockerイメージから複数のコンテナを起動することもできます。


コンテナの起動／停止／破棄は、Dockerのコマンドを使います。他の仮想化技術でサーバー機能を起動するためにはOSを起動させるところから始まるため時間がかかりますが、Dockerの場合は、すでに動いているOS上でプロセスを実行するのとほぼ同じ速さで高速に起動します。

#分散環境におけるコンテナの運用管理
コンテナを動かすときは、システムのトラフィックの増減や可用性要件を考慮したうえで、複数のホストマシンからなる分散環境を構築することになります。

コンテナは、開発環境などのように1台のマシンで稼働させるときは手軽に導入できます。

しかし、マルチホストで構成されたクラスター構成で稼働させるには、コンテナの起動／停止などの操作だけでなく、ホスト間のネットワーク接続やストレージの管理、コンテナをどのホストで稼働させるかなどのスケジューリング機能が必要になります。
![11336_07.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684145/834360fb-4802-5f2f-36c1-cc7f095e59fa.jpeg)



さらに、コンテナが正常動作しているかどうかを確認するしくみも重要です。


これらの機能を備え、コンテナを統合管理できるツールのことをコンテナーオーケストレーションツールと呼びます。


#Kubernetesの特徴
Kubernetes は、大規模な分散環境において少人数のエンジニアでコンテナアプリケーションを管理することを目指したオーケストレーションツールです。


Kubernetesは、ハードウェアインフラストラクチャーを抽象化し、データセンター全体を単一の膨大な計算リソースとしてみなします。何言ってんだと思いますがザックリいえば、<b>開発者は実際のサーバーを意識することなく、コンテナアプリケーションをデプロイして実行できます</b>。また、複数のハードウェアのコンピューティングリソースを有効に活用できます。

Kubernetesの主な機能は次のとおりです。

>複数サーバーでのコンテナ管理
コンテナのデプロイ
コンテナ間のネットワーク管理
コンテナの負荷分散
コンテナの監視
コンテナのアップデート
障害発生時の自動復旧




#まとめ
<b>Kubernetesは、コンテナの実行環境のデファクトスタンダードと言っても過言ではない</b>です。

しかしながら、決して魔法の箱というわけではありません。
<b>Kubernetesの利用者は、そのコンセプトやしくみを学ぶことが重要</b>です。ただし、インフラストラクチャーに関する前提知識や抽象的な概念も多く、初学者にはやや敷居の高いソフトウェアであることは否めません。