業務で携わったことは無いですが個人的にコンテナ技術に興味があり、Kubernetesについて学習したので、本記事にまとめてみました。記載内容は概要的なものです。(Kubernetesのアーキテクチャやリソースについては別記事に記載予定です。)
①Kubernetesの概要 ←本記事記載
②Kubernetesで出来ること ←本記事記載
③Kubernetesの基本知識を知る ←本記事記載
④Kubernetesのリソースを知る ←別記事記載予定
⑤Kubernetesアーキテクチャを知る ←別記事記載予定
⑥Kubernetesのまとめ ←別記事記載予定
#①Kubernetesの概要
###Kubernetesとは
Kubernetesはコンテナのデプロイやスケーリングなどの管理を自動化するためのコンテナオーケストレーションツールです。コンテナオーケストレーションツールはKubernetesの他にOpenShift、DockerSwam、Mesos、Rancher、Amazon ECS等色々とあります。この中でも最も使用されておりデファクトスタンダートになっているのがKubernetesです。(sysdig-2019-container-usage-report) Kubernetesを使用することで、コンテナの手動での管理から解放されます。
###Kubernetesの歴史
Linux Foundationのプロジェクトの1つで、コンテナ技術の推進と、その進化を取り巻くテクノロジー業界の足並みを揃えるために創設された財団のCNCF(Cloud Native Computing Foundatioin)がホストして、コミュニティーが主体となって開発が進められています。2015年7月以前はGoogleがホストしていましたがKubernetesバージョン1.0となったタイミングでCNCFに移管されました。Googleの社内で利用されていたコンテナクラスタマネージャの「Borg」をアイデアの元にして作られたのがKubernetesです。
#②Kubernetesで出来ること
###スケーリング/オートスケーリング
同じコンテナイメージを元に複数のKubernetesノードにデプロイすることで、負荷分散を実現することや耐障害性を向上することが出来ます。また、負荷に応じて自動的にコンテナ数を増減することが出来ます。
###ロードバランシング
特定のコンテナに負荷が集中しないように、負荷を分散することが出来ます。
###スケジューリング
コンテナをどのKubernetesノードにデプロイするのか管理する機能です。Affinity/Anti Affinityの機能を使用することで、コンテナ内のアプリケーションの特徴やKubernetesノードの性能を意識して、コンテナをKubernetesノードにデプロイすることが出来ます。例えば、ディスクのI/Oが多いコンテナを、ディスクがSSDのKubernetesノードにデプロイする、といった制御が可能になります。
###セルフヒーリング
Kubernetesでは標準でコンテナのプロセス監視を行っており、例えば、Kubernetesノードがダウンした場合、コンテナのプロセスダウンを検知して別のKubernetesノードにコンテナを復旧させる、といった動作が実現できます。このセルフヒーリング機能で耐障害性を高めることが出来ます。
###リソース管理
KubernetesノードのCPUやメモリのリソースに応じて、ユーザが意識する必要無く、コンテナのデプロイ先を自動的に調整します。また、Kubernetesノードのリソースの消費量に従い、Kubernetesクラスタのオートスケール機能でKubernetesノードを自動的に増減することも可能です。
###ローリングアップデート
コンテナ内のアプリケーションをアップデートする際に、新しいコンテナを追加してから古いコンテナを削除する手順を繰り返し行うことで、ダウンタイム無しでのアップデートを実現することが出来ます。
###サービスディスカバリ
前述のオートスケーリングやスケジューリング、セルフヒーリングなどKubernetesはダイナミックにコンテナを稼働させます。そのため、どこにどのコンテナが存在しているのか把握することが難しくなります。Kubernetesはコンテナがどこにいるのか、アドレスは何かなど把握して、ダイナミックに変化するシステムにおいてもコンテナが相互の相互アクセスを実現します。
###設定・機密情報の管理
環境変数やコマンドライン引数、パスワードやTLS証明書などの情報をKubernetesで一元的に管理することが出来ます。環境変数やコマンドライン引数はConfigMapで管理して、パスワードやTLS証明書等の機密情報はSecretsで管理します。
#③Kubernetesの基本知識
Kubernetesを知るためには、基本知識を押さえる必要があります。
##基本知識
###マニフェスト
Kubernetesでは、YAML形式やJSON形式で記述したデプロイするコンテナや周辺のリソースを管理するための宣言的なコードをマニフェストと呼びます。コードで環境を管理することが出来るので、KubernetesはIaC(Infrastructure as Code)を実現することが可能です。
###kubectl
kubectlと呼ばれるCLIツールを使用して、後述するKubernetes Masterに命令を送ります。ユーザはkubectlコマンドで様々な操作をすることができるようになります。kubectlコマンドで前述のマニフェストファイルを指定して使用することも出来ます。
###Kubernetes Node
KubernetesにはKubernetes MasterとKubernetes Node(以降、Node)の2つのノードがあります。NodeはDockerホストのような役割で、コンテナを実際に動作させる場所です。
###Kubernetes Master
Kubernetes Master(以降、Master)はマニフェストに記載されている内容を元にkubectlを通じて、指令を受け付けること、そして自分の管理下にあるNode上に受け付けた指令を実現させます。例えば、受け付けたマニフェストファイルが各Node上のコンテナ数を増加させる内容だった場合、実際に各Node上のコンテナ数を増加させる役割をMasterは担います。
この記事は以下の情報を参考にして執筆しました。
Kubernetes公式ドキュメント
Kubernetes完全ガイド 第2版