コンテナ

Kubernetes とは

Kubernetes または k8s (k + 8 文字 + s)、もしくは短縮形の「kube」とは、Linux コンテナの操作を自動化するオープンソース・プラットフォームです。Kubernetes を使用すると、コンテナ化されたアプリケーションのデプロイとスケーリングに伴う多くの手動プロセスをなくすことができます。つまり、Linux コンテナを実行しているホストをまとめてクラスタ化できるということです。Kubernetes はこれらのクラスタを容易に、そして効率的に管理するために役立ちます。クラスタには、パブリックプライベートハイブリッドクラウドにまたがるホストが含まれます。

Kubernetes は元々、Google のエンジニアによって開発および設計されました。Google は Linux コンテナテクノロジーに当初から貢献してきておりGoogle のすべての業務がコンテナで実行されていると公言しています。(このテクノロジーが、Google のクラウドサービスを支えています。) Google では毎週 20 億以上のコンテナをデプロイしており、これらすべては内部プラットフォームである Borg から行われています。Borg は Kubernetes の前身であり、何年にもわたって Borg を使用して得られた教訓が、Kubernetes テクノロジーの背後にある主要な原動力となっています。

なお、Kubernetes の車輪のロゴから伸びる 7 本のスポークは、プロジェクトの最初の名前「Project Seven of Nine」を表しています。

Red Hat は Kubernetes に関して Google と最初に連携した会社の 1 つです。Kubernetes 発表前から関わってきた Red Hat は、Kubernetes アップストリーム・プロジェクトにおける 第 2 位のコントリビューターになっています。2015 年に Google は、新しく設立された Cloud Native Computing Foundation に Kubernetes プロジェクトを寄贈しました。


Kubernetes が必要な理由

実際の実稼働アプリは、複数のコンテナにまたがります。これらのコンテナは複数のサーバーホストにデプロイされる必要があります。Kubernetes を活用すれば、これらのワークロード用にコンテナを大規模にデプロイするうえで必要なオーケストレーションと管理機能を手に入れることができます。Kubernetes オーケストレーションによって、複数のコンテナにまたがるアプリケーションサービスを構築し、それらのコンテナをクラスタにスケジュールして、コンテナのスケーリングを行い、コンテナの正常性を継続的に管理できるようになります。

Kubernetes で総合的なコンテナ・インフラストラクチャを提供するには、ネットワーク、ストレージ、セキュリティ、テレメトリーなど他のサービスと統合する必要もあります。

Kubernetes explained - diagram

もちろん、これは実際の環境でどのようにコンテナを使用するかによって異なります。基本的なアプリケーションでは、Linux コンテナは効率的で高速な仮想マシンのように扱われます。これが実働環境の複数のアプリケーションに拡張されていくと、個々のサービスを提供するために連携して動作する複数の共同コンテナが必要であることが明確になります。そのため環境内のコンテナの数がかなり増加し、コンテナが蓄積されるにつれて、複雑さも増していきます。

Kubernetes はいくつかのコンテナを「Pod」(小群) にまとめることで、コンテナの急激な増加に伴って発生する問題の多くを解決します。Pod はグループ化されたコンテナに抽象的なレイヤーを追加します。これはワークロードをスケジューリングしたり、必要なサービス (ネットワークやストレージ) をそれらのコンテナに提供したりする際に役立ちます。さらに Kubernetes は、これらの Pod 間でロードバランスを保ち、ワークロードを処理するのに適切な数のコンテナを確実に維持するようサポートします。

Kubernetes を正しく実装し、他のオープンソース・プロジェクト (Atomic RegistryOpen vSwitchheapsterOAuth、および SELinux など) を活用することで、コンテナ・インフラストラクチャのすべての部分をオーケストレーションすることができます。

コンテナが企業のためにできること


Kubernetes の機能

Kubernetes を使用することの主な利点は、物理または仮想マシンからなるクラスタ上でコンテナをスケジューリングして実行するためのプラットフォームが得られることです。さらに、信頼性の高いコンテナベースのインフラストラクチャを本番環境に完全に実装することができます。Kubernetes は運用タスクを自動化します。他のアプリケーション・プラットフォームや管理システムで行える多くの操作を、Kubernetes ではコンテナに対して行うことができます。

Kubernetes には次のような機能があります。

  • 複数のホストにわたるコンテナのオーケストレーション
  • エンタープライズ・アプリケーションの実行に必要なリソースを最大限活用できるようにハードウェアを効率よく使用する
  • アプリケーションのデプロイとアップデートを制御し自動化する
  • ステートフルなアプリケーションを実行するためのストレージのマウントおよび追加
  • コンテナ化されたアプリケーションとそのリソースの迅速なスケーリング
  • サービスを宣言的に管理する (これにより、デプロイ済みアプリケーションが常にデプロイ方法に従って実行されます)
  • 自動置換、自動再起動、自動複製、自動スケーリングにより、アプリケーションのヘルスチェックと自己修復を行う

ただし、このようにオーケストレーションされたサービスをすべて提供するには、Kubernetes は他のプロジェクトに依存します。他のオープンソースプロジェクトを加えることで、Kubernetes の能力が十分に発揮されます。必要なものには、以下が含まれます。

  • レジストリ:Atomic Registry や Docker レジストリなどのプロジェクトを利用
  • ネットワーク化:OpenvSwitch などのプロジェクトやインテリジェントなエッジ・ルーティングを利用
  • テレメトリー:heapster、kibana、hawkular、および elastic などのプロジェクトを利用
  • セキュリティ:マルチテナンシー・レイヤーのある OAUTH、LDAP、SELinux、RBAC などのプロジェクトを利用
  • 自動化:インストールとクラスタのライフサイクル管理のための Ansible Playbooks を利用
  • サービス:一般的なアプリケーション・パターンのコンテンツを豊富に含むカタログを利用

Kubernetes を活用するには

テクノロジー特有の専門用語は、初心者へのハードルとなる場合があります。ここでは Kubernetes を理解するために役立つ、いくつかの一般的な用語をご紹介します。

マスター:Kubernetes ノードを制御するマシン。すべてのタスクの割り当て元となります。

ノード:リクエストされ、割り当てられたタスクを実行するマシン。Kubernetes マスターはこれらのノードを制御します。

Pod:1 つのノードにデプロイされた、1 つ以上のコンテナからなるグループ。Pod に入っているすべてのコンテナは、同じ IP アドレス、IPC、ホスト名、その他のリソースを共有します。Pod はネットワークとストレージを、基盤となるコンテナから抽象化します。そのため、コンテナをより簡単にクラスタ内で移動できるようになります。

レプリケーション・コントローラー: クラスタ上で、同一の Pod コピーをいくつ実行するかを制御します。

サービス:Pod から作業の定義を分離します。Kubernetes サービスプロキシは適切な Pod に自動的にサービスリクエストを提供します。クラスタ内のどこにあろうと、たとえ置き換えられていても問題ありません。

Kubelet:ノード上で実行されるサービス。コンテナマニフェストを読み取り、定義されたコンテナが確実に開始し実行されるようにします。

kubectl:Kubernetes のコマンドライン設定ツールです。


本番環境で Kubernetes を使用する

Kubernetes はオープンソースです。このため、確立された公式サポート体制があるわけではありません。実働環境で Kubernetes の実装に問題が発生した場合、困ることでしょう。お客様の満足度も下がる危険があります。

そこで活躍するのが Red Hat OpenShift です。OpenShift は企業向けの Kubernetes であるだけでなく、さらに機能が豊富です。OpenShift は、Kubernetes を企業向けに強化するためのさまざまなテクノロジーを提供します。これには、レジストリ、ネットワーキング、テレメトリー、セキュリティ、自動化、サービスが含まれます。OpenShift を活用することで、開発者はコンテナ化された新しいアプリを作り、ホストし、クラウドでデプロイできるようになります。さらに、スケーラビリティ、制御性、オーケストレーションを提供することで、優れたアイデアを迅速かつ簡単にビジネスへつなげるための助けとなります。

そして何よりも、OpenShift はオープンソース分野におけるリーダーである Red Hat がサポートし、開発しています。


インフラストラクチャ内における Kubernetes の位置付け

Kubernetes diagram

Kubernetes は Red Hat Enterprise Linux Atomic Host などのオペレーティング・システム上で稼働し、ノード上で実行されるコンテナの Pod とやり取りします。Kubernetes マスターは、管理者 (または DevOps チーム) からコマンドを受けると、従属するノードにそれを伝えます。このハンドオフは多くのサービスと連動して行われ、そのタスクに最も適切なノードを自動的に決定します。その後、リソースを割り振り、Pod をそのノードに割り当てて、リクエストされた作業を実行します。

インフラストラクチャの観点からは、これまでのコンテナの管理方法と大きな違いはありません。コンテナの制御をより高いレベルから行えるため、個別のコンテナやノードのミクロな管理を行う必要なく、より優れた制御性が実現します。いくらかの手作業も必要ですが、そのほとんどは Kubernetes マスターの割り当て、ノードの定義、Pod の定義に関連しています。

Docker の役割

Docker テクノロジーは、その本来の目的を引き続き果たしています。Kubernetes が Pod をノードに割り当てると、そのノードの kubelet は指定されたコンテナを起動するように Docker に指示を出します。次に kubelet が Docker からそれらのコンテナのステータスを継続的に収集し、その情報をまとめてマスターに伝えます。Docker はコンテナをそのノードに pull し、通常どおりこれらのコンテナの開始や停止を行います。異なる点は、管理者がこれらのことを手動ですべてのノードのすべてのコンテナに行う代わりに、自動化されたシステムが Docker に依頼するという点です。

コンテナについてさらに詳しく知る