Kubernetesはコンテナ仮想化ツールやアプリケーションのデプロイ、スケーリング、および管理を行うために開発されたオープンソースのコンテナオーケストレーションシステムです。Kubernetesの仕組みや特徴を学ぶことで便利かつ効率的にコンテナの運用や構成管理を行うことができるようになります。また、今までDockerで行ってきた管理において、Kubernetesを活用することで大規模でのDockerの管理や自動化を図ることが容易になり便利です。
1. Kubernetesとは
KubernetesとはDockerなどのコンテナ仮想化ツールの運用や構成管理・自動化を促すために開発されたオープンソースソフトウエア(OSS)で、コンテナ化されたワークロードやサービスを管理しポータブルで拡張性のあるオープンソースのプラットフォームです。また、Kubernetesは急速に成長するエコシステムを備え、サービスやサポート、ツールは幅広い形で利用されています。Kubernetesはマイクロサービスとの相性が良く、クバーネティス、またはクーベネティスと読みK8s(ケーエイツ)やkubeなどと略されることもあり、意味合いはギリシャ語で操縦士や船長、道しるべなど、舵を切るイメージです。
コンテナはアプリケーションやミドルウエア、複数のOSを実行できる独立した環境で、仮想化ソフトウエアと似ていますが大きな違いはコンテナレベルで空間を他のシステムから分離させられる点になります。なお、仮想化ソフトウエアとは1つのサーバー上に仮想化ソフトウエアとゲストOSを展開し、複数台の仮想マシンを運用できるシステムです。一方コンテナは、ゲストOSを展開せずに複数のアプリケーションの実行環境を構築できます。
図版①仮想化とコンテナの違い
コンテナには具体的に以下のようなメリットがあります。
- 必要最小限のリソース(CPUやメモリ)しか使用しないため、負荷が小さく高速な動作が可能。
- 複雑な処理が発生しないため、アプリケーションの起動が早くリソース効率が良い。コスト削減やパフォーマンスの向上が可能。
- コンテナ環境の構築は比較的容易でコピーも可能なため、開発工数を大幅に短縮できる。開発スピードの効率化を求めるアジャイル開発でよく採用される。
- OS環境を共有するため、従来の仮想マシンのような個別管理は不要。またアプリケーションの導入やパッチ適用・拡張などがスムーズに行えるため運用工数を削減できる。
- アプリケーションを分離し、他のアプリケーションから独立して動作させるため、1つのコンテナで障害が生じても他のコンテナには影響がない。また障害発生時の切り分けが容易にできる。
しかし、コンテナは管理や他のサーバーとの連携機能を持っておらず、「連携できない」という問題を解決してくれるのがKubernetesです。
Kubernetesはコンテナオーケストレーションツールの一つです。コンテナオーケストレーションとは複数のコンテナを管理する技術のことを言います。通常複数のコンテナを運用する場合はネットワークやストレージなどの連携管理を行う必要がありますが、コンテナオーケストレーションはこれらの管理を行いダウンしたときや高負荷がかかってしまった場合でもスムーズに運用できる機能です。
Kubernetesには複数のコンテナを管理するKubernetes Podが備わり、さらに複数のPodがNodeにまとめられています。Nodeの集まりを「クラスター」と呼び、クラスターはKubernetes全体構造の最上位階層に位置する部分です。Kubernetesがコンテナの配置や削除を行うときに直接指示を出すのがクラスターの役割です。このような構造がシステム効率を高めリソースを最大限活用し、機密情報の管理なども容易に行えます。
図版②クラスターの構造
2. KubernetesとDockerの関係とは
Dockerとはアプリケーションをコンテナの中で管理、実行するツール群を指します。Kubernetesとの違いは実行される場所です。Dockerはシングルノードで実行されますが、Kubernetesはクラスターでの実行になります。またDockerはアプリケーションを各コンテナに分離する目的で使用され、Kubernetesは各コンテナを管理するために使用されており、お互いに役割が異なる機能です。しかし、DockerとKubernetesは敵対関係ではなく、連携して利用され協力し合う関係性を持っています。Dockerも複数のDockerの管理や自動化をする機能は備わっていますが、コンテナ間の設定や管理が行えないことがあり、小規模程度の場合は別途作業を行うことは可能ですが、規模が大きくなる場合はKubernetesのような専用ツールを使ってDockerの管理や自動化を図ると効率的です。
3. Kubernetesの構造
Kubernetesクラスターは、さまざまなコンポーネントから構成されています。各コンポーネントの役割を知ることで、Kubernetesの構造を理解できるでしょう。
マスターノードとワーカーノード
Kubernetesクラスターは、Nodeが集合したものです。Nodeは用途によって2つの種類に分けられます。1つは複数のPodをまとめる「ワーカーノード」です。そしてワーカーノードは「マスターノード」によって管理されます。このようにマスターノードとワーカーノードがクラスターを構成することで、「高可用性」と「負荷分散」を実現します。
たとえばKubernetesクラスターでは、あるワーカーノード内のコンテナに障害が生じた場合、対象のコンテナを自動的に再起動させることが可能です。また、クラスター内の別のNodeで新たにコンテナを起動させ、問題が発生したコンテナで行っていた処理を引き継ぐこともできます。これによりアプリケーションを停止させずに、可用性を維持します。
また特定のワーカーノードへ負荷が集中しないよう、マスターノードが各ワーカーノードへ処理を分散するため、リソースを効率的に使用できます。
図版③高可用性と負荷分散
さらにKubernetesは、マスターノードが実行するコントロールプレーンを構成するコンポーネントと、すべてのワーカーノードによって実行されるノードコンポーネントが連携することによって動作します。
図版④Kubernetesアーキテクチャ
コントロールプレーンコンポーネント
コントロールプレーンコンポーネントは、クラスターに関する全体的な決定を行います。コントロールプレーンの各コンポーネントは別々のNodeでも稼働させられますが、1つの同じNodeですべて実行させることが推奨されています。なぜならコントロールプレーンコンポーネントは、それぞれが密接に連携してクラスターを管理しているため、別々のNodeに配置した場合、1つのNodeに障害が生じた際に連携が取れなくなり、クラスターの管理機能が停止する恐れがあるためです。
kube-apiserver
kube-apiserverは、Kubernetesコントロールプレーンのフロントエンドとなる役割です。外部にAPIを公開しており、APIを通じて管理者はKubernetesをコントロールできます。主にKubernetesのリソース情報の管理を担いますが、CRUD処理(データベースの処理)のみ行い、リソースに対する実際の処理は別のコンポーネントが行います。不特定多数がアクセスできる環境でのセキュリティを確保するため、認証・認可・リクエスト制御の機能も備えています。
etcd
etcdは、Kubernetesすべてのクラスター情報(構成・Pod・Node・アカウント・ロールなど)の保存場所として利用されるコンポーネントです。etcdに保存されたデータは、kube-apiserver を通して取得や格納が行われます。ほかのコンポーネントは直接etcdを参照せず、kube-apiserverを通してリソースにアクセスします。
kube-scheduler
kube-schedulerは、Podに最適なNodeを選択し配置を決定するコンポーネントです。新しく作成されたPodにNodeが割り当てられているかを監視し、割り当てられていない場合にそのPodを実行する最適なNodeを選択します。配置先は基本的に各Nodeで偏りがないように決定されますが、Podにリソース要件(CPUやメモリの指定)などが設定されている場合は、要件を満たすNodeが選択されます。
kube-controller-manager
kube-controller-managerは、さまざまな領域のコントローラーをまとめて実行するコンポーネントです。コントローラーとは各コンポーネントなどの状態を監視し、必要な対応を実行するプロセスを指します。kube-controller-managerには以下のコントローラーが含まれ、各領域を監視して必要な対応を行います。
- ノードコントローラー
- レプリケーションコントローラー
- エンドポイントコントローラー
- サービスアカウントとトークンコントローラー
各コントローラーは個別のプロセスですが、1つの実行ファイルにまとめられており、controller-managerとして単一のプロセスで実行されます。
cloud-controller-manager
cloud-controller-managerは、クラスターとクラウドプロバイダーAPIをリンクするコンポーネントです。パブリッククラウド環境で使用しているリソースをKubernetesでも使用したい場合、cloud-controller-managerが操作の指示を中継することにより、パブリッククラウド上のリソースとKubernetes上の情報を連携します。クラウドに対する窓口となる役割です。
ノードコンポーネント
ノードコンポーネントはすべてのワーカーノードで実行され、稼働中のPodの管理とKubernetesの実行環境を提供する役割があります。
kubelet
kube-proxyは、各Nodeで動作するネットワークプロキシの役割を担うコンポーネントです。内部的にはLinuxに搭載されているパケットフィルタであるiptablesが使用されており、kube-proxyはこれを利用してクラスター内外からのPodへのアクセスを制御します。
コンテナランタイム
コンテナランタイムはkubeletから呼び出され、コンテナを実行するソフトウエアです。KubernetesではDockerをはじめcontainerd、CRI-Oなど複数のコンテナランタイムをサポートしているため、環境に合ったソフトウエアを選択することが可能です。
4. Kubernetesを構成する技術やリソース
Kubernetesの仕組みの特徴はオープンソースソフトウエアのプラットフォームです。Kubernetesには複数のコンテナを運用、構成管理し自動化できる技術が備わり、コンテナオーケストレーションが便利に使える仕組みになっています。Kubernetesクラスターを管理するには、豊富に備わった技術やリソースの特徴を理解し、その用途を把握する必要があります。Kubernetesを構成する論理的な要素について解説します。
Kubernetes Cluster
クラスターとは「まとまり」の意味合いがあり、IT分野では複数台のコンピューターを結び付けまとめた仕組みを指します。Kubernetes Clusterは単一のユニットとして機能するように接続された、可用性の高いコンピューターのクラスターです。なお、可用性とはシステムを継続して稼働させる考え方で、例えると一つの機器が何かの原因で故障しても、他の正常な機器が自動的に切り替わり、利用者に影響が及ばないようにしてくれる仕組みになります。
namespace
namespaceはクラスターの分離機能のことを指し、同一の物理クラスター上で動作する複数のユーザーでクラスターリソースを分割する方法になります。namespaceは名前空間とも呼ばれ、比較的規模が大きい環境で導入が推奨されている機能です。namespaceを使用すればKubernetes内の環境に名前を付け利用することができるため、複数チームで利用が可能になります。また、他の環境と分離させて使用することができるのでセキュリティ向上を図り効率的に開発が進められて便利です。なお、namespaceの使い方としては使用者にどのような権限を与えるかを設定しKubernetes Clusterを分離させていきます。
Pod
Kubernetesが管理できる最小単位でDockerなどのコンテナが1つ以上を含み構成され、いくつかのデザインパターンがあります。また、Pod内に2つ以上のコンテナをまとめるケースがあり、メインコンテナでは利用する設定などを行い、サブコンテナが動的に書き換える構成となっています。Podは複数のコンテナを共存させることや共有ストレージ、ネットワーク、APIバージョンなどをファイルで設定することも可能です。ポイントはKubernetesがDockerなどのコンテナを直接管理するのではなくPod経由で管理していることで、PodにはIPアドレスが自動的に割り当てられ、コンテナ間で共有するストレージが含まれています。このように補助する機能を提供し、管理者は突発的な負荷の上昇に対してアプリケーションを支えるインフラのコンピューターの台数を増やし、システム全体の性能を挙げて容易にスケールアウトが可能です。
図版⑤Pod
Service
ServiceはPodとの通信を容易に行うためにエンドポイントの提供を行ってくれる機能です。また、ServiceはKubernetes Clusterで実行されるPod群へのロードバランシングやサービスディスカバリを行う機能でもあります。通常は通信をするために都度IPアドレスを指定しなければなりません。しかし、Service機能があれば、容易に通信するためのDNSラベルが発行されるためアプリケーションが他のPodと簡単に通信が可能です。なお、Service機能ではどのようなアプリケーションが稼働しているか、クラスターIPやポートも知ることができます。他にも高度なセキュリティやスケジューリングに関する様々な機能が用意されている機能です。4つの主なServiceとしてClusterIPやNodePort、LoadBalancer、ExternalNameが用意されています。
YAMLによる記述
KubernetesではPodやReplicaSetなどの設定は構造化データの表現方法であるYAMLで記述されています。これによりコードでインフラ構成を管理することが容易にできることがメリットです。また、担当者はKubernetesの知識を増やすことでシステム全体像を掴みやすくなります。なお、担当者が変更になった場合でも比較的容易にシステム全体像を理解しやすくなる記述です。
5. Kubernetesが提供する機能
さまざまなリソースやコンポーネントで構成されるKubernetesが提供する、具体的な機能について解説します。
自動化されたロールアウトとロールバック
Kubernetesでは、コンテナの構成管理にデプロイ後のあるべき状態を記述した設定ファイルを使用します。Kubernetesは現在のコンテナの状態を設定ファイルと同じ状態になるように監視しながら、段階的に変更を加えます。また更新に問題が起きた場合は、更新の設定ファイルを反映する前の状態を記述した設定ファイルを使用し、ロールバックを行います。新しいコンテナの作成や既存コンテナの削除、新しいコンテナにあらゆるリソースを適用する作業は、すべて自動化が可能です。
ローリングアップデート
Kubernetesは新しいコンテナをリリースする際やアプリケーションや設定への変更が必要な場合、段階的にアップデートを行うことが可能です。アプリケーションの状態を監視しながら、すべてのインスタンスが同時に停止しないようにします。この方法はローリングアップデートと呼ばれ、古いバージョンのコンテナと新しいバージョンのコンテナを混在させ、徐々に移行していくことで実現しています。
自動ビンパッキング
Kubernetesにはコンテナのリソース要件やその他の制約に基づいて、コンテナをどのように配置するかを決定する機能があります。可用性を損なうことなく、リソースの利用効率向上とパフォーマンスの最大化が可能です。
自己修復機能
Kubernetesはコンテナで障害が発生した場合にも、デプロイの際に使用する設定ファイルを参照し、障害が起こる前の状態を維持するよう自動的に動作します。たとえば処理が失敗したコンテナは再起動したり、別のコンテナへ処理を引き継いだり、ヘルスチェックに応答しないコンテナは強制終了したりなどの対応を自動で行います。
機密情報と構成管理
Kubernetesは、Secretというリソースを使用してパスワードやOAuthトークン、SSHキーのような機密情報を保持・管理できます。コンテナイメージから分離して管理しながらアプリケーションの構成情報を更新でき、個々で管理するよりも格段にセキュリティを強化できます。
ストレージオーケストレーション
以前はKubernetesでストレージを扱うことは難しいとよく言われていましたが、最近ではストレージに関する機能追加が活発に行われています。ローカルストレージやGCP、AWSなどのパブリッククラウドプロバイダー、ローカルとクラウドのハイブリッド、NFS・iSCSI・Gluster・Ceph・Cinder・Flockerのようなネットワークストレージシステムなどの中から、選択したストレージシステムを自動でマウントすることが可能です。
6. Kubernetesのメリット
では、Kubernetesを利用するとどのようなメリットがあるのでしょうか。
コスト削減・生産性の向上
Kubernetesは大量のコンテナを一括で管理・運用できます。そのため多くの工数がかかっていた管理業務が減り、運用コストの削減が見込めます。また開発・運用におけるさまざまな作業を自動化できるため、作業時間の短縮ができ、生産性の向上につながる点もメリットです。
アプリケーションの新機能を効率的にリリースできる
Kubernetesでは、アプリケーションのロールアウトやロールバック、不具合を修正したバージョンへの入れ替えなどの作業を自動化できます。そのため頻繁に新機能の追加や修正が行われた場合でも、効率的なリリースが可能です。
サービスディスカバリでアプリケーションの動作を把握できる
サービスディスカバリとは、サービスに接続するためのサーバー上のアプリケーションのポート番号やIPアドレスなどの情報を発見してくれる機能です。Kubernetesでは複数のアプリケーションが動作しますが、サービスディスカバリによって各アプリケーションの動作を把握できます。
複数の環境で利用できる
Kubernetesはオンプレミス環境とクラウド環境のどちらでも利用できます。特定の環境に依存しないため、開発における制約が少ないこともメリットです。
柔軟なスケーリングが可能
KubernetesはPodの水平スケーリングオートスケーリング機能によって柔軟なスケーリングが可能です。ビジネスの規模や状況に応じてリソースを最適化するため、無駄なコストを削減できます。
エコシステムとの連携や拡張が可能
ITにおけるエコシステムとは、さまざまな分野の企業が各々の知識・技術を提供しながら、収益を上げていく構造を指します。Kubernetesは外部のエコシステムとの連携も可能なプラットフォームであるため、多くのミドルウエアがKubernetesをサポートしています。さまざまな外部のサービスと連携し、拡張させることが可能です。
DevOpsとの親和性が高い
DevOpsとは、アプリケーションの開発担当と運用担当が連携して開発を進めることで、開発スピードの短縮と継続的なシステム価値の向上を目指す考え方です。DevOpsを実現するためには、開発業務の効率化や自動化を行うコンテナ技術とコンテナオーケストレーション技術が欠かせません。そのためKubernetesはDevOpsを実現するために広く採用されています。
7. 3大クラウドベンダーが提供するマネージドKubernetesサービス
大手クラウドベンダー3社も、それぞれマネージドKubernetesサービスを提供しています。マネージドKubernetesサービスは、自前で構築する環境とは違いKubernetesのコントロールプレーンを各クラウドベンダーが管理するため、煩雑なオペレーションを回避できます。サーバー構成も気にすることなくスムーズに導入できる点が魅力です。しかし、利用するうえでKubernetesの構造や仕組みをきちんと理解しておくことは重要です。以下では、各サービスの特徴について解説します。
Google Kubernetes Engine(GKE)
GKEはGoogleが提供するマネージドKubernetesサービスです。Googleはもともと自社で提供するサービスをコンテナで運用しており、Kubernetesを開発した実績があります。GKEはそのノウハウを盛り込んだサービスです。コンテナ作成の所要時間が他社は10分前後なのに対し、GKEは3〜5分です。大規模な開発環境なら、この差は大きいでしょう。
Amazon Elastic Container Service for Kubernetes(Amazon EKS)
EKSはAmazonが提供するマネージドKubernetesサービスです。IAM(Identity and Access Management)とKubernetesのユーザーを紐付けでき、IAMをベースとしてアクセス権限を管理できます。またPodのネットワークとAWS VPCを接続して、VMからコンテナに直接疎通することが可能です。
Azure Kubernetes Service(AKS)
AKSはMicrosoftが提供するマネージドKubernetesサービスです。ビルドツールやエディターツール、CI/CDパイプラインを作成するサービスなどとのシームレスな統合が可能で、開発者向けの機能に力を入れているのが特徴です。また周辺のエコシステムにも注力しています。
8. まとめ
Kubernetesはオープンソースのコンテナオーケストレーションシステムで大量のDockerなどのコンテナ仮想化ツールを容易に管理することができる機能です。KubernetesとDoctorの関係は敵対的ではなく、連携し協力し合って成り立っています。Kubernetesの仕組みを学び知識を増やすことで複数のコンテナの運用や管理を容易に行うことができるようになります。また、Kubernetesに備わっている主な4つの機能であるKubernetes Clusterやnamespace、Pod、Serviceを適切に使い分けることで、担当者が変わった場合でも比較的に容易にシステム全体像を把握することが可能です。
- カテゴリ:
- デジタルプラットフォーム