Kubernetes とは
Kubernetes (k8s または「kube」とも呼ばれる) はオープンソースのコンテナ・オーケストレーション・プラットフォームで、コンテナ化されたアプリケーションのデプロイ、管理、スケーリングに伴う多くの手動プロセスを自動化します。
Kubernetes はアプリケーションの構成を自動化し、リソースの割り当てを管理および追跡します。Cloud Native Computing Foundation (CNCF) のプロジェクトである Kubernetes は 2014 年に登場し、分散型のアプリケーションやサービスを大規模に実行するためのプラットフォームとして広く採用されるようになりました。
Kubernetes の基本的な概念
Kubernetes はコンテナを管理するためのプラットフォームです。コンテナにはアプリケーションのコード、構成、依存関係がバンドルされており、アプリケーションを独自のリソースを持つ個別のプロセスとして実行できます。各アプリケーションは独自のコンテナまたは複数のコンテナを取得し、それらは Kubernetes Pod としてグループ化されます。
Kubernetes は、ベアメタルサーバー、仮想マシン、パブリッククラウドプロバイダー、プライベートクラウド、ハイブリッドクラウド環境で実行できます。Kubernetes の主な利点の 1 つは、さまざまな種類のインフラストラクチャで動作することです。
Kubernetes は、Kubernetes 実装の詳細で説明されているように、ユーザーが 3 つの主要な設計原則に従うことができるように構築されています。Kubernetes のデプロイメントは次のようなものであるべきです。
- 安全であること。セキュリティに関する最新のベストプラクティスに従う必要があります。
- 使いやすいこと。わずかな数の簡単なコマンドで操作できる必要があります。
- 拡張可能であること。特定のプロバイダーを優先することはしません。また、設定ファイルからカスタマイズできる必要があります。
Red Hat のリソース
Kubernetes のメリットとは
Kubernetes は、アプリケーションのデプロイおよびスケーリングにおける面倒な作業の多くを自動化し、時間を節約して新しいソフトウェアをより早く市場に投入できるクラウドネイティブ開発手法への道を開きます。主なメリットには次のようなものがあります。
大規模で複雑な環境のサポート:複数のアプリケーションを実行する本番環境では、多数のホストにデプロイされた多数のコンテナがすべて連携して動作する必要があります。Kubernetes は、大規模なワークロードに必要なスケールでコンテナをデプロイするために必要なオーケストレーションと管理機能を提供します。
スケーラビリティ:Kubernetes はニーズに応じて自動的にスケーリングし、リソースとコストを節約しながらアプリケーションに必要な容量を提供します。
可搬性:Kubernetes は、自社データセンター、パブリッククラウド、パブリックインスタンスとプライベートインスタンスのハイブリッド構成のいずれでも実行できます。つまり、Kubernetes を用いれば、同じコマンドをどこでも使用することができます。
一貫したデプロイメント:Kubernetes のデプロイメントはインフラストラクチャ全体で一貫しています。コンテナは不変のインフラストラクチャの概念を具体化しており、アプリケーションの実行に必要なすべての依存関係とセットアップ手順がコンテナにバンドルされています。
運用と開発の分離および自動化:コンテナは開発者の時間を節約し、迅速な反復サイクルを可能にします。同時に、運用チームは Kubernetes によってシステムの安定性に自信を持つことができます。
ハイブリッドクラウド戦略のサポート:多くの組織では、オンサイトデータセンターとパブリッククラウド・ソリューションまたはプライベートクラウド・ソリューションを併用しており、価格設定やサービスレベルの変更に対応するために複数のクラウドプロバイダーにワークロードをうまく分散させています。Kubernetes の一貫性と可搬性は、こうしたハイブリッド戦略をサポートできます。
従来のアプリケーションに対する継続的なサポート:Kubernetes は、コンテナ化されたレガシー・アプリケーションやクラウドネイティブ・アプリケーション、およびマイクロサービスにリファクタリングされたアプリケーションの提供と管理を支援します。
複雑な環境の管理:コンテナ内のマイクロサービスにより、ストレージ、ネットワーキング、セキュリティなどのサービスのオーケストレーションが容易になりますが、環境内のコンテナの数も大幅に増加し、複雑さが増します。Kubernetes はコンテナを Pod にグループ化します。これはワークロードをスケジューリングしたり、必要なサービス (ネットワーキングやストレージ) をそれらのコンテナに提供したりする際に役立ちます。
セキュリティの向上:Kubernetes のセキュリティプラクティスにより、IT セキュリティの向上に向けて効果的な措置を講じることができます。管理者は、セキュリティとガバナンスのポリシーを適用し、Pod または Pod のグループごとにポリシーをセグメント化できます。開発チームは、本番環境でアップデートやパッチ適用を行うのではなく、ランタイムにコンテナのセキュリティ問題を特定し、ビルドの段階で修正することができます。ロールベースのアクセス制御 (RBAC) によって、ユーザーやサービスアカウントに特定の権限を割り当てることができます。Kubernetes シークレットは、暗号化キーのような機密データを安全に保護することができます。
DevOps の実現:コンテナに一貫したインフラストラクチャ基盤を提供することで、Kubernetes は DevOps アプローチをサポートし、開発チームと運用チームの効率的な連携を促進します。CI/CD (継続的インテグレーションおよび継続的デリバリー/デプロイメント) を採用すると、ソフトウェア開発ライフサイクルを最適化し、加速することができます。また、DevOps の進化形である DevSecOps により、セキュリティ制御と脆弱性管理がソフトウェア開発ライフサイクルの初期段階に移行します。
Kubernetes クラスタとは
動作している Kubernetes のデプロイメントはクラスタと呼ばれます。クラスタは、実行中のコンテナのグループです。
管理者は Kubernetes クラスタの望ましい状態を設定し、どのアプリケーションまたは他のどのワークロードを実行する必要があるか、どのイメージを使用するか、どのリソースを利用できるようにするべきかといった構成の詳細を記述します。
Kubernetes クラスタは、コントロールプレーンと一連のコンピュートノード (通常はサーバーまたは仮想サーバー) という 2 つのパーツとして視覚化できます。
コントロールプレーンの役割は、どのアプリケーションが実行されているか、どのコンテナイメージが使用されているかといった、クラスタの望ましい状態を維持することです。
一方、ノードはコントロールプレーンからの指示に従い、アプリケーションとワークロードを実行するという実際の作業を行います。各ノードは独立した Linux® 環境であり、物理マシンでも仮想マシンでもかまいません。Kubernetes クラスタは少なくとも 1 つのコンピュートノードを必要としますが、通常は多数を有しています。
Kubernetes ノードは Pod で構成され、各 Pod はアプリケーションの単一のインスタンスを表します。Pod は、1 つのコンテナまたは密結合された複数のコンテナと、コンテナの実行方法を制御するオプションで構成されます。
多数の Kubernetes サービスが連携して各タスクに最適なノードを自動的に識別し、リソースを割り当て、そのノードに Pod を割り当てて、要求された作業を実行します。Kubernetes は適切な Pod に自動的にリクエストを送信します。Pod がクラスタ内のどこにあろうと、たとえ置き換えられていても問題ありません。
Kubernetes はすべてを制御し、クラスタを管理、作成、構成するための統合 API (アプリケーション・プログラミング・インタフェース) を提供します。
Kubernetes アーキテクチャを理解する
Kubernetes クラスタ内で何が起こっているのかをさらに詳しく見ていきましょう。
コントロールプレーンは中枢であり、クラスタを制御するコンポーネントと、クラスタの状態と構成に関するデータが配置されています。これらの Kubernetes のコアコンポーネントは、十分な数のコンテナが必要なリソースで実行されていることを確認するという作業を担います。
Kubernetes API (kube-apiserver) は、Kubernetes コントロールプレーンのフロントエンドであり、内部からの要求と外部からの要求を処理します。API サーバーは要求が有効かどうかを判断し、有効な場合は処理します。API へは、REST 呼び出し、kubectl コマンドライン・インタフェース、または kubeadm などの他のコマンドラインツールを使用してアクセスできます。
Kubernetes スケジューラー (kube-scheduler) は、クラスタの健全性とともに、Pod のリソースニーズ (CPU やメモリーなど) を考慮します。そして、Pod を適切なコンピュートノードにスケジュールします。
コントローラー (kube-controller-manager) は実際のクラスタの実行を処理します。Kubernetes コントローラー・マネージャー 1 つで、いくつかのコントローラー機能を実行します。あるコントローラーはスケジューラーに問い合わせて、正しい数の Pod が稼働していることを確認します。Pod がダウンした場合、別のコントローラーが検知して応答します。
構成データとクラスタの状態に関する情報は、key-value ストアデータベースである etcd 内にあります。etcd は、フォールトトレラントで分散されており、クラスタに関する信頼できる基本的な情報源となるように設計されています。
コンテナを実行するために、各ノードにコンテナ・ランタイム・エンジンがあります。Docker は 1 つの例ですが、Kubernetes は rkt や CRI-O などの他の Open Container Initiative 準拠のランタイムもサポートしています。
各ノードには、コントロールプレーンと通信する小さなアプリケーションである kubelet が含まれています。kubelet は、コンテナが Pod で実行されていることを確認します。コントロールプレーンが、ノードでの何らかの処理を必要とする場合、kubelet がアクションを実行します。
各ノードには、Kubernetes ネットワークサービスを容易にするためのネットワークプロキシである kube-proxy も含まれています。kube-proxy は、オペレーティングシステムのパケットフィルタリング・レイヤーまたはトラフィック自体の転送に依存して、クラスタ内外のネットワーク通信を処理します。
Kubernetes は、アプリケーションを実行するコンテナを管理するだけでなく、クラスタに付帯するアプリケーションデータも管理できます。Kubernetes を使用すると、基盤となるストレージ・インフラストラクチャの詳細を知らなくても、ストレージリソースをリクエストできます。永続ボリュームは、Pod ではなくクラスタに固有のものなので、Pod が終了しても存続できます。
Kubernetes が依存するコンテナイメージは、コンテナレジストリに格納されます。これは、構成したレジストリまたはサードパーティのレジストリにすることができます。
Knative とサーバーレス Kubernetes
サーバーレスは、開発者がサーバーを管理する必要なくアプリケーションを構築および実行できるようにするクラウドネイティブ開発モデルです。サーバーレスにもサーバーはありますが抽象化されており、アプリケーション開発から切り離されています。開発者は、コードをコンテナにパッケージ化するだけでデプロイできます。
デプロイされると、サーバーレス・アプリケーションは需要に対応し、必要に応じて自動的にスケールアップやスケールダウンを行います。パブリッククラウドプロバイダーのサーバーレスサービスは、通常、イベント駆動型実行モデルを通じてオンデマンドで測定されます。そのため、サーバーレス機能がアイドル状態である間は、費用がかかりません。
Kubernetes は、サーバーレス環境を実行するための選択肢として人気があります。しかし、Kubernetes だけでは、サーバーレス・アプリケーションを実行できません。Knative は、サーバーレス・アプリケーションを Kubernetes でデプロイ、実行、管理するためのコンポーネントを追加するオープンソース・コミュニティ・プロジェクトです。
Knative では、コードをコンテナイメージとしてパッケージ化し、それをシステムに引き渡すことでサービスを作成します。コードは必要な場合にのみ実行され、インスタンスは Knative によって自動的に開始および停止されます。
Kubernetes Operator とは
Kubernetes Operator は、Kubernetes API の機能を拡張したアプリケーション固有のコントローラーで、Kubernetes ユーザーに代わって複雑なアプリケーションのインスタンスを作成、設定、管理し、その他のアプリケーション機能を追加します。Kubernetes のリソースとコントローラーの基本コンセプトをベースに構築されていますが、ドメインまたはアプリケーション固有の知識を含み、管理対象のソフトウェアのライフサイクル全体を自動化します。
Kubernetes Operator は、複雑なアプリケーションのスケーリング、アプリケーションのバージョンのアップグレード、さらには特殊なハードウェアによるコンピュートクラスタ内のノードのカーネルモジュールの管理まで、ほぼあらゆる Kubernetes アクションを実行するように構築できます。Kubernetes Operator としてデプロイされるソフトウェアやツールの例としては、監視用の Prometheus Operator や、検索を自動化するための Elastic Kubernetes Operator などがあります。
Kubernetes と Red Hat OpenShift の違い
Kubernetes そのものは、コンテナのデプロイ、管理、スケーリングのためのオープンソースソフトウェアです。それを実際に活用するには、多大な労力がかかります。ほとんどの組織は、自動化、監視、ログ分析、サービスメッシュ、サーバーレス、開発者生産性ツールなどの機能を統合したいと考えます。ネットワーキング、Ingress、負荷分散、ストレージ、監視、ロギング、マルチクラスタ管理、継続的インテグレーションおよび継続的デリバリー (CI/CD) を支援するツールも追加したいかもしれません。簡単に言えば、ほとんどのユースケースについて、Kubernetes だけでは不十分です。
多くのソフトウェアベンダーは、セルフマネージド型のディストリビューション、ホスト型のサービス、インストーラー、PaaS (Platform-as-a-Service) 製品など、独自のバージョンの Kubernetes を提供しています。CNCF は、数十の認定 Kubernetes 製品のリストを管理しています。
Red Hat® OpenShift® は CNCF が認定した Kubernetes 製品ですが、他にも多くの機能が含まれています。Red Hat OpenShift は、ハイブリッドクラウド環境全体で一貫した方法でクラウドネイティブ・アプリケーションを提供するための完全なプラットフォームの基盤として Kubernetes を使用しています。
Kubernetes をコンテナ・オーケストレーション・エンジンとする Red Hat OpenShift には、CNCF オープンソース・エコシステムの多くの機能が組み込まれており、そのすべてが Red Hat によってテスト、パッケージ化、およびサポートされています。Red Hat OpenShift は、AWS、Microsoft Azure、Google、IBM のような主要なクラウドプロバイダーのパブリッククラウドサービスとして、またはデータセンター、パブリッククラウド、エッジにまたがる広範囲のベアメタルや仮想インフラストラクチャ上のセルフマネージド型ソフトウェアとして利用できます。
OKD とは
OKD は Kubernetes の実行に必要なソフトウェア・コンポーネントをパッケージ化したコミュニティ・プロジェクトです。OKD は、Kubernetes に加えて開発者向けツールおよび運用に特化したツールを提供するので、アプリケーション開発のスピードアップ、効率的なデプロイと拡張、長期的なライフサイクルの維持に役立ちます。OKD は開発者がクラウド上でアプリケーションを作成、テスト、デプロイできるようにし、Go、Node.js、Ruby、Python、PHP、Perl、Java などのプログラミング言語もサポートします。
OKD は、継続的なアプリケーション開発とデプロイのために最適化された、Red Hat OpenShift のアップストリーム・プロジェクトです。OKD は、一般的に OpenShift よりも機能面で数リリース先行しています。コミュニティ・アップデートが最初に行われ、エンタープライズでの使用に向けて試験的に実装される場所が OKD です。
OKD と OpenShift の主な違いは、Red Hat OpenShift の場合、Red Hat が検証とテストを実施しており、エンタープライズ運用に必要な要件を満たすサブスクリプションのメリットを享受できることです。Red Hat OpenShift サブスクリプションには、テクニカルサポート、セキュリティ対応チーム、長期サポートオプション、検証済みのサードパーティ運用者、認定データベースやミドルウェアなどが含まれています。
Red Hat 公式ブログ
Red Hat のお客様、パートナー、およびコミュニティのエコシステムに関する最新の情報を入手しましょう。