Kubernetesとは?
「Kubernetes」は、コンテナ化されたサービスの設定や管理を自動で行うOSS(オープンソースソフトウェア)です。あるコンテナが動作を停止したときに別のコンテナを起動したり、サービスへの負荷の状況によってサーバのリソースを増減させたりと、多数のコンテナを運用管理する際に必要な機能を備えています。このようなソフトウェアを「コンテナオーケストレーションプラットフォーム」と呼びます。
Kubernetes以外にも同様の機能を持つソフトウェアは存在しますが、2021年現在、Kubernetesが最もよく使われているといえるでしょう。
Kubernetesは、当初はGoogleが開発していましたが、2015年にLinux Foundation傘下の組織Cloud Native Computing Foundation(CMCF)に寄贈されました。Amazon Web ServicesやMicrosoftなどの企業が参加するコミュニティーを中心として開発、アップデートが行われています。
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のコンポーネントは各クラスタを管理する「マスターコンポーネント」と、ノードを管理する「ノードコンポーネント」に大別されます。
- 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 とは?-Qiita
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- クラウドでKubernetesを学ぶ――マネージドサービスで始めるKubernetes入門
人気過去連載を電子書籍化して無料ダウンロード提供する@IT eBookシリーズ。第72弾はKubernetesによるWebアプリケーションの構築、公開はどのような姿になるのか、マネージドKubernetesサービスについて知りたい人のための連載『マネージドサービスで始めるKubernetes入門』5回分をPDFとしてまとめました。 - 1000倍返しの勢いで混沌化するKubernetes/クラウドネイティブ周辺ツールは何から学べばよいのか
Kubernetesやクラウドネイティブをより便利に利用する技術やツールについて概要や使い方を凝縮して紹介していく連載。初回は、Kubernetesの現状や、多種多様なKubernetes/クラウドネイティブ周辺ツールについて。 - 安定志向のNRIが変化の激しいKubernetesを推進する理由
さまざまな顧客のシステム開発や運用に関わる中で、NRIはコンテナ技術やKubernetesに積極的に取り組んでいる。本連載の初回はNRIが抱える組織や文化の課題を整理し、Kubernetesに期待していることを紹介する。