コンテナ

Kubernetes とは

Kubernetes または k8s(k + 8 文字 + s)、もしくは短縮形の「kube」とは、Linux コンテナの操作を自動化するオープンソース・プラットフォームのことです。コンテナ化されたアプリケーションのデプロイとスケーリングに伴う多くの手動プロセスをなくすことができます。つまり、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 はコンテナをそのノードにプルし、通常どおりこれらのコンテナを開始したり停止したりします。相違点は、管理者がこれらのことを手動ですべてのノードのすべてのコンテナに依頼する代わりに、自動化されたシステムが Docker に依頼するという点です。

コンテナのその他の多くの機能