検索
連載

5分で分かるKubernetes

コンテナ化されたアプリケーションの設定や管理を自動で行うOSS、Kubernetesの概要をおよそ5分でざっくり解説します。

Share
Tweet
LINE
Hatena

Kubernetesとは?

 「Kubernetes」は、コンテナ化されたサービスの設定や管理を自動で行うOSS(オープンソースソフトウェア)です。あるコンテナが動作を停止したときに別のコンテナを起動したり、サービスへの負荷の状況によってサーバのリソースを増減させたりと、多数のコンテナを運用管理する際に必要な機能を備えています。このようなソフトウェアを「コンテナオーケストレーションプラットフォーム」と呼びます。

 Kubernetes以外にも同様の機能を持つソフトウェアは存在しますが、2021年現在、Kubernetesが最もよく使われているといえるでしょう。

 Kubernetesは、当初はGoogleが開発していましたが、2015年にLinux Foundation傘下の組織Cloud Native Computing Foundation(CMCF)に寄贈されました。Amazon Web ServicesやMicrosoftなどの企業が参加するコミュニティーを中心として開発、アップデートが行われています。


仮想マシンとコンテナ(Kubernetes)の比較(参考:Kubernetesとは何か?

Kubernetesの特徴

サービスディスカバリと負荷分散

 Kubernetesは、サービスに接続するためのIPアドレスやポート番号などの情報を発見する「サービスディスカバリ」機能を提供します。Kubernetesのデプロイにおける最小単位「Pod」(後述)に独自のIPアドレスを割り振ったり、同じ設定で複製したオブジェクトに対して固有のDNS名を付与したり、複製したオブジェクトの負荷を分散させたりすることができます。

ストレージオーケストレーション

 Kubernetesには、クラウドサービスが提供するITインフラを抽象化するAPIが備わっています。パブリッククラウドプロバイダー、ローカルストレージ、両方のハイブリッド環境など、採用したいストレージシステムを自由に選択してサービスを構築できます。

ロールアウトの自動化とロールバック

 Kubernetesではサービスの構成管理に、デプロイした結果の状態を記述した設定ファイルを利用します。開発者は、デプロイした結果の状態を記述したファイルを作成し、Kubernetesに反映します。そうすることで、Kubernetesは現在のサービスの状態を設定ファイルと同じ状態になるように、段階的にサービスの状態を監視しながら変更を加えます。更新に問題が生じたとき、Kubernetesは変更をロールバックします。結果の設定ファイルを反映する前の状態を記述した、設定ファイルを反映するだけでロールバックができます。そのため、確実で頻繁なデプロイが容易になります。

ビンパッキングの自動化

 Kubernetesにはコンテナのリソース情報を設定した際、必要なオブジェクトをどのように配置するかを決定する機能があります。この機能により、コンテナに設定されるリソースの合計を調整し、用意したリソースの中でパフォーマンスを最大限に活用することができます。

自己修復機能

 Kubernetesは、障害によってサービスの状態に変化が生じた場合でも、障害が起こる前の状態を維持するよう動作します。デプロイの際に、Kubernetesはサービスの現在の状態を設定ファイルの記述通りに維持しますが、設定ファイルの参照は設定を変更するときだけではありません。処理に失敗したコンテナを検知し、設定に該当しないコンテナを強制終了する際にも設定ファイルを参照します。

機密情報と構成管理

 Kubernetesには、パスワードやSSHキーといった機密情報を保持、管理する機能があります。コンテナイメージから分離したオブジェクトで機密情報を管理し、アプリケーションの構成情報を更新します。

Kubernetesオブジェクトとは

 Kubernetesのアプリケーション構成は、Kubernetesオブジェクトを使って表現します。多様な性質を持つアプリケーションをデプロイするために、オブジェクトの種類も多数あります。ここでは代表的なKubernetesオブジェクトを紹介します。

Pod

 Podは、Kubernetesにおけるデプロイの最小単位です。ストレージ(ボリューム)とネットワークを共有するコンテナのグループのことをいいます。Pod内にコンテナは1以上あり、必ず同一のノード上に展開されます。ボリュームを共有しているので同じファイルを参照でき、ネットワークも共有しているためPod内にあるコンテナ同士はローカルネットワークで通信できます。

Service

 Serviceは、Podの集合と通信するためのポリシーを定義するオブジェクトです。PodのIPアドレスは基本的に固定のものではありません。PodのIPアドレスを意識することなく抽象化し、アクセス管理を容易にするのがServiceの役割です。

Namespace

 Namespaceは、クラスタを論理的に複数のクラスタに分割するオブジェクトです。テスト環境や本番環境、マルチテナント形式など、自由な単位で任意にクラスタ分割ができます。Kubernetesの多くのオブジェクトはNamespaceに属しています。例えば、先述したPodオブジェクトはNamespaceに属しています。

ReplicaSet

 ReplicaSetは、設定されたPodのレプリカを複製するオブジェクトです。設定されたPodレプリカを作成するだけでなく、設定された数のPodレプリカの実行数も一定に保つよう動きます。ノードの障害などで正常なPodの数が不足すると、自動的にPodがReplicaSetによって再作成されます。

Deployment

 Deploymentは、先述のReplicaSetをアップデートするオブジェクトです。ReplicaSetは、開発者が直接更新することはなく、このDeploymentオブジェクトを使って更新します。DeploymentはReplicaSetを更新し、ReplicaSetはPodを更新するという関係です。

ConfigMap

 ConfigMapは、アプリケーションの設定情報を扱うオブジェクトです。ConfigMapに設定情報を格納することで、コンテナは環境変数やコマンドライン引数として設定情報を扱うことができるようになり、アプリケーションと設定情報を分離できます。アプリケーションと設定情報を分離すると、開発環境や本番環境などの環境で同一のコンテナ化されたアプリケーションをデプロイできます。

Secret

 Secretは、パスワードやTLS証明書の秘密鍵など、アプリケーションの秘密情報を扱うオブジェクトです。ConfigMapと同様に格納した情報を環境変数として扱うことができます。

Kubernetesのアーキテクチャ

 Kubernetesを構成するコンポーネントのアーキテクチャを解説します。Kubernetesのコンポーネントは各クラスタを管理する「マスターコンポーネント」と、ノードを管理する「ノードコンポーネント」に大別されます。


Kubernetesアーキテクチャのイメージ(参考:KubernetesのコンポーネントKubernetes architecture
  • kubectl

 kubectlは、KubernetesのCLI(Command Line Interface)です。多くのコマンドが用意されており、このkubectl上でクラスタ情報を取得、変更するなどの操作ができます。

マスターコンポーネント

  • kube-apiserver

 kube-apiserverは、KubernetesのAPIを提供するコンポーネントです。他のコンポーネントへの操作もkube-apiserverを通じて実施されます。

  • etcd

 etcdは、Kubernetesが扱う情報を全て保存するコンポーネントで、Kubernetes唯一のデータストアです。他のコンポーネントはkube-apiserverを通じてetcdに保存されたAPIオブジェクトの変更を監視し、変更があると各コンポーネントに通知されます。通知を受け取ったコンポーネントはetcdの情報を参照して処理を実行します。

  • kube-scheduler

 kube-schedulerは、ノードの中で実行中のPodの数が偏らないようにスケジューリングをするコンポーネントです。

  • kube-controller-manager

 kube-controller-managerは、Kubernetesのオブジェクトの変更をトリガーとして望ましい状態に一致させるコンポーネントです。Deployment、Serviceなどのオブジェクトを処理するコントローラーを実行、管理しています。大半のKubernetesオブジェクトに対応したコントローラーが用意されています。各コントローラーは1つのプロセスですが、便宜上kube-controller-managerにまとめられています。

ノードコンポーネント

  • kubelet

 kubeletは、全てのノードに常駐し、Podの起動と管理を実行します。ノードにPodがスケジューリングされると、コンテナランタイムを操作してコンテナを作成します。Podが削除されるとコンテナを削除します。また、実行しているPodの監視もしています。

  • kube-proxy

 kube-proxyは全てのノードにインストールされている、クラスタ内の負荷分散を管理しているコンポーネントです。KubernetesのオブジェクトであるServiceを元にルーティングを実施します。

  • コンテナランタイム

 コンテナランタイムは、コンテナイメージを取得、実行します。kubeletから操作します。「Docker」「containerd」「CRI-O」などがあります。

  • クラスタDNS

 クラスタDNSは、Kubernetesのサービスディスカバリを利用するために必要なコンポーネントで、KubernetesのDNSレコードを提供します。アドオンという名称だと、必要に応じて利用するもののように思うかもしれませんが、公式ドキュメントで「クラスタDNS以外のアドオンは必須ではありませんが、全てのKubernetesクラスタはクラスタDNSを持つべきです」と言及されている通り、クラスタDNSはKubernetesを動作させる上で必須のコンポーネントといえます。

おわりに

 Kubernetesにはさまざまなメリットがありますが、導入、運用するにはさまざまなノウハウや少なくない学習コストが必要となります。

 この問題の解決策としては、Kubernetesの構築、運用を代行してもらう「マネージドKubernetesサービス」を利用する方法があります。

 その他にも「Kubernetesクラスタ構築ツール」を利用してクラウドやオンプレミスなど任意のリソースにKubernetesを構築する方法もあります。Kubernetesクラスタ構築ツールは、クラスタを構成するソフトウェアを設定するソフトウェアです。必要に応じて、導入を検討してみてはいかがでしょうか。

参考文献

Kubernetes実践入門 プロダクションレディなコンテナ&アプリケーションの作り方/技術評論社,2019,須田一輝(他)

参考サイト

Kubernetes公式

kubernetes-GitHub

Toku's Blog

Wild Data Chase -データを巡る冒険

あさのひとりごと

今さら人に聞けない Kubernetes とは?-Qiita

Wikipedia-Kubernetes

Kubernetesとは?仕組みと構造をわかりやすく解説します-カゴヤのサーバー研究室

Kubernetes とは-RedHat

Copyright © ITmedia, Inc. All Rights Reserved.

[an error occurred while processing this directive]
ページトップに戻る