Kubernetes
![]() | |
作者 | |
---|---|
開発元 | Cloud Native Computing Foundation |
初版 | 2014年6月7日[1] |
最新版 |
1.13[2]
/ 2018年12月3日 |
リポジトリ | https://github.com/kubernetes/kubernetes |
プログラミング 言語 | Go |
使用エンジン | Docker |
サポート状況 | 開発中 |
種別 | クラスター管理ソフトウェア・コンテナオーケストレーション |
ライセンス | Apache License 2.0 |
公式サイト | kubernetes.io |
Kubernetes(クバネティス/クバネテス[3][4][5]、よくK8sと略記される)[6]は、コンテナ化したアプリケーションのデプロイ、スケーリング、および管理を行うための、オープンソースのコンテナオーケストレーションシステムである[7]。元々Googleが設計したシステムであるが、現在はCloud Native Computing Foundationがメンテナンスを行っている。Kubernetesの目的は、「ホストのクラスターを横断してアプリケーションコンテナを自動デプロイ、スケーリング、操作するためのプラットフォーム」を提供することとされている[6]。リリース時より、Dockerを含む多数のコンテナツールと連携して動作する[8]。多数のパブリッククラウドサービスプロバイダがKubernetesベースのPaaSやIaaSを提供しており、プラットフォーム提供サービスとしてKubernetesをデプロイすることができる。また、多くのソフトウェアベンダーも、ブランド化したKubernetesディストリビューションを提供している。
歴史
![](http://upload.wikimedia.org/wikipedia/commons/thumb/0/03/Kubernetes_talk_at_Google_Cloud_Summit.jpg/220px-Kubernetes_talk_at_Google_Cloud_Summit.jpg)
Kubernetes(κυβερνήτης、koo-ber-nay'-tace[9][10]、ギリシャ語で航海長またはパイロットを意味する[11])は、当初Joe Beda、Brendan Burns、Craig McLuckieの3人によって開発が始まり[12]、すぐにBrian GrantやTim Hockinなど、他のGoogleのエンジニアも参加するようになり、2014年中ごろにGoogleから初めて発表された[13]。Kubernetesの開発や設計はGoogleのBorgシステムから強い影響を受けており[14][15]、Borgのトップコントリビュータの多くが開発に参加している。Google内でのKubernetesのもともとのコードネームはProject Sevenであり、スター・トレックのキャラクターで、優しいBorgである、セブン・オブ・ナインの名前に由来する[16]。Kubernetesのロゴの輪にある7つのスポークは、このコードネームに由来している。
Kubernetes v1.0は2015年7月21日にリリースされた[17]。Kubernetes v1.0のリリースと同時に、GoogleはLinux Foundationと共同でCloud Native Computing Foundation(CNCF)を設立し、Kubernetesを種となる技術として提供した。2018年3月6日には、KubernetesプロジェクトはGitHubにおけるコミット数で第9位に到達し、コントリビューター数とissue数では、Linuxカーネルプロジェクトに次いで第2位となった[18]。
Kubernetesにおけるオブジェクト
Kubernetesは、いくつかのビルディングブロック("primitives")を定義している。このビルディングブロックのおかげで、アプリケーションのデプロイ、メンテナンス、スケールのメカニズムを、CPU、メモリ[19]、あるいはカスタムの指標[20]に基づいて正しく提供することが可能になっている。Kubernetesは、さまざまなワークロードに対応できるよう、疎結合かつ拡張可能なシステムとなっている。この拡張性の大部分は、Kubernete上で動作する拡張機能やコンテナだけでなく内部コンポーネントによっても使用されているKubernetes APIにより提供されている[21]。Kubernetesでは、コンピューティングとストレージのリソースを制御するため、リソースを以下のような「オブジェクト」として定義している。
ポッド(pod)
Kubernetesでは、スケジューリングの基本となる単位は、ポッドである[22]。コンテナ化されたコンポーネントをポッドとしてグループ化することで、1つ高いレベルの抽象化を与えている。1つのポッドは1つ以上のコンテナから構成され、同じポッドのコンテナは同じホストマシンにデプロイされるため、リソースの共有が保証される[21]。
Kubernetes内の各ポッドには、クラスタ内でユニークなPod IPアドレスが割り当てられる。これにより、アプリケーションはポートの衝突の危険を考える必要がない[23]。ポッド内では、すべてのコンテナがlocalhost上で互いに参照できる。しかし、あるポッド内のコンテナが、他のポッド内の他のコンテナを直接アドレスで参照する方法は存在せず、そのためには、必ずPod IPアドレスを利用しなければならない。しかし、アプリケーションの開発者はPod IP アドレスを決して使用するべきではない。なぜなら、他のポッドの機能にアクセスあるいは実行する時に利用するPod IPアドレスは一時的なものであり、参照しようとしている特定のポッドが再起動したりすると、そのPod IPアドレスは別のポッドに割り当てられてしまう可能性があるからである。その代りに、開発者は、特定のPod IPアドレスを持つ対象ポッドへのアクセスが可能な、サービスに対してアクセスしなければならない。
1つのポッドは、ローカルディスクのディレクトリあるいはネットワークディスクとして、1つのボリュームを定義し、ポッド内のコンテナに対して公開することができる[24]。ポッドの管理は、Kubernetes APIで手動で行ったり、コントローラに管理を委譲したりすることができる[21]。また、定義したボリュームは、ConfigMaps(設定の内容を、コンテナからファイルシステム上で参照可能にする機能)やSecrets(リモートのリソースに安全にアクセスするために必要な証明書を、認証されたコンテナのみでファイルシステム上で参照可能にする機能)など、Kubernetesのいくつかの機能の基礎となっている。
サービス(service)
![](http://upload.wikimedia.org/wikipedia/commons/thumb/6/63/Pod-networking.png/700px-Pod-networking.png)
Kubernetesサービスはいくつかのポッドの集まりであり、1ティアまたはマルチティアのアプリケーションと協調して動作する。サービスを構成する複数のポッドは、ラベルセレクターを用いて定義される[21]。Kubernetesはサービスディスカバリーの手段として、環境変数を用いるモードと、Kubernetes DNSを用いるモードの2種類の方法を提供している[25]。サービスディスカバリは、静的なIPアドレスとDNS名を各サービスに束縛させ、そのIPアドレスのネットワークコネクションに対して、セレクターにマッチしたポッド間でラウンドロビン方式でのロードバランシングを行う(セレクターを用いるのは、障害によりポッドがあるマシンから別のマシンに移動したとしても動作するようにするためである)[23]。デフォルトでは、サービスはクラスタの内部にのみ公開されている(たとえば、バックエンド用のポッドは、ロードバランシングされた複数のフロントエンド用ポッドからのリクエストに対して、1つのサービスとしてグループ化されているかもしれない)が、サービスはクラスターの外部に公開することもできる(たとえば、外部のクライアントがフロントエンド用ポッドにアクセスする場合など)[26]。
ボリューム(volume)
Kubernetesコンテナ内のファイルシステムは、デフォルトでは一時ストレージを提供する。つまり、コンテナを再起動すると内部のデータが削除されてしまうため、重要なアプリケーションで利用するには制限がある。Kebernetesボリュームは永続的なストレージを提供するため、コンテナが再起動しても、ポッドが生存している間はデータが削除されない。このストレージは、同じポッド内のコンテナ同士で共有ディスク空間としても利用可能である。ボリュームは、ポッドの設定ファイル上で定義したコンテナ内の特定のマウントポイントとしてマウントされ、それ以外のボリュームにマウントしたり、他のボリュームとリンクすることができないようになっている。ただし、同じボリュームでも、異なるコンテナであれば、ファイルシステムツリー上の別の場所にマウントすることは可能である。
ネームスペース(namespace)
Kubernetesは、リソースのパーティショニング機能を提供し、ネームスペース(名前空間)と呼ばれる重複のない部分に分割する。多数のチームやプロジェクトに渡る多数のユーザーの利用を想定している。これにより、開発、テスト、本番などの環境さえ完全に分離することができる。
Kubernetesのオブジェクトの管理
Kubernetesは、オブジェクトの管理、選択、操作を可能にするメカニズムを提供している。
ラベルとセレクター(label and selector)
Kubernetesは、ポッドやノードなどのシステム上のあらゆるAPIオブジェクトに対して、クライアント(ユーザーや内部のコンポーネント)が「ラベル」と呼ばれるキーバリューペアを付加できるようにしている。それに対応して、「ラベルセレクター」はラベルに対してクエリーを実行し、一致するオブジェクトに解決する[21]。あるサービスを定義すると、サービスルーターやロードバランサーがトラフィックをルーティングするポッドインスタンスを選択するために使用する、ラベルセレクターを定義できるようになる。したがって、単にポッドのラベルやサービスのラベルセレクターを変更するだけで、どのポッドにトラフィックを送るかを制御することが可能になる。この方法により、ブルーグリーンデプロイメントやABテストなど、さまざまなデプロイパタンを利用できる。このようなサービスが使用するリソースを動的にコントロールする機能のおかげで、インフラ内での疎結合が実現されている。
たとえば、あるアプリケーションのpodsがシステムtier
(たとえば、front-end
、back-end
などの値を持つ)とrelease_track
(canary
やproduction
など)というラベルを持つとき、back-end
かつcanary
であるノード全てを指定するには、以下のようなラベルセレクターが使える[27]。
tier=back-end AND release_track=canary
フィールドセレクター(field selector)
ラベルと同様に、フィールドセレクターもKubernetesの任意のリソースを選択可能にするものである。ラベルとは異なり、選択は、ユーザーが定義したカテゴリではなく、リソースに予め付与される属性の値に基づいて行われる。metadata.name
やmetadata.namespace
は、すべてのKubernetesオブジェクトに存在するフィールドセレクターである。使用される他のセレクターは、オブジェクトやリソースのタイプによって異なる。
アーキテクチャ
![](http://upload.wikimedia.org/wikipedia/commons/thumb/b/be/Kubernetes.png/660px-Kubernetes.png)
Kubernetesは、マスター・スレーブアーキテクチャで構成される。Kubernetesのコンポーネントは、各ノードを管理するノード(node)と、コントロールプレーンであるマスター(master)の2つに分けられる[28][29]。
マスターがクラスターの管理を行い、コンテナ(実際にはPodと呼ばれる単位で管理される)は各ノード上にデプロイされる。 マスターやノードを構成するコンポーネントは下記のようになっている[30]。
- Kubernetesコントロールプレーン(マスター)
Kubernetesのマスターは、クラスターのメインとなるコントロールユニットである。ワークロードとシステム全体に渡る直接的な通信を管理する。Kubernetesコントロールプレーンは複数のさまざまなコンポーネントから構成されている。各コンポーネントは独立したプロセスとして実行され、1つのマスターノードでも、高い可用性を持つクラスタをサポートするために複数のマスターノードで実行することも可能である。各種コンポーネントには、次のようなものがある。とおりである。
- kube-apiserver
- Kubernetes APIを外部に公開するためのコンポーネント。
- etcd
- Kubernetesクラスタの情報を保存する分散キーバリューストア。
- kube-scheduler
- Podをどのノードに対してデプロイするかを選択するコンポーネント。
- kube-controller-manager
- Kubernetesクラスタの各種コントローラを実行するコンポーネント。
- cloud-controller-manager
- Kubernetesとプラットフォームとなっているクラウドプロバイダとの相互作用を担うコンポーネント。各クラウドプロバイダに特化した機能を提供し、パフォーマンスを向上する。
- その他アドオン
- Kubernetesクラスタ内での名前解決を行うDNSサーバ、各種Web UIやクラスタ単位でロギングを行うコンポーネント(fluentd, etc.)など。
- Kubernetesノード(スレーブ)
-
- kubelet
- ノード上に常駐し、ノードの生存をクラスタに対して通知する。また自身に対するPodの割り当てが行われたかどうかを監視してボリュームのマウント、コンテナのダウンロード/デプロイ、Podの生存確認などを行い、クラスタに通知する機能も担う。
- kube-proxy
- 外部やapiserverからのアクセスをノード上の各Podに対して転送し、Podへのアクセスを抽象化するコンポーネント。
- Docker
- 実際にコンテナを動作させるバックエンドに利用される。2018年2月現在、実験的実装として rkt もコンテナバックエンドとして利用出来る。
- supervisord
- kubeletとdockerが正しく動作し続けるように監視及び管理するコンポーネント。
- fluentd
- クラスタレベルでのロギングを補助する。
マスターとノードのコンポーネントは同一のマシン上に存在してもよく、最小の構成では1台(マスターかつノード)からなるKubernetesクラスタが構築出来る。
普及の理由
2018年初頭の時点で、Kubernetesはコンテナオーケストレーションにおいてデファクトスタンダードと呼べる存在になっているが、短期間でこうなった理由には、以下の3点が挙げられる[31]。
- 定期的なメジャーアップデート
- 3ヵ月ごとにアップデートを繰り返し、エンタープライズからのフィードバックを反映しており、本番稼働に耐えうるソフトウェアとして信頼を勝ち得た。
- Kubernetesの普及とCNCFの活性化がリンクしている
- マイクロソフトがKubernetesのサポートを発表して以降、オラクルやVMwareといった企業もCNCFに参加を表明し、GoogleやMicrosoft Azureとは競合関係にあるAmazon Web Servicesも参加している。このため、「Kubernetesがデファクトスタンダード」という認識がより強まった。
- Docker社の凋落
- コンテナエンジンとしてのDockerを開発してきたDocker社であるが、その存在感が薄れてきている。
出典
- ^ “First GitHub commit for Kubernetes”. github.com (2014年6月7日). 2017年3月1日時点のオリジナルよりアーカイブ。2018年6月5日閲覧。
- ^ “GitHub Releases page”. github.com (2018年12月3日). 2019年1月2日閲覧。
- ^ “メモ:Google製DockerクラスタツールKubernetes”. qiita.com. 2018年5月26日閲覧。
- ^ Tenable (2017-07-20), How Do You Pronounce Kubernetes? And What Is It? 2018年5月26日閲覧。
- ^ 阿久津良和 (2017年10月25日). “MS、KubernetesをサポートするAzure Container Serviceの改善を発表”. マイナビニュース. 2018年1月24日閲覧。
- ^ a b “What is Kubernetes?”. Kubernetes. 2017年3月31日閲覧。
- ^ “kubernetes/kubernetes” (英語). GitHub. 2017年4月21日時点のオリジナルよりアーカイブ。2017年3月28日閲覧。
- ^ https://kubernetes.io/blog/2018/10/10/kubernetes-v1.12-introducing-runtimeclass/
- ^ “What is the correct pronunciation of Kubernetes in English?”. kubernetes/kubernetes:Issues. GitHub. 2018年2月5日閲覧。
- ^ “Kubernetes - New Testament Greek Lexicon - New American Standard”. New Testament Greek Lexicon. JupiterImages Co.. 2018年2月5日閲覧。
- ^ “What is Kubernetes?”. Kubernetes. 2017年3月31日閲覧。
- ^ “Google Made Its Secret Blueprint Public to Boost Its Cloud” (英語). 2016年7月1日時点のオリジナルよりアーカイブ。2016年6月27日閲覧。
- ^ “Google Open Sources Its Secret Weapon in Cloud Computing”. Wired. 10 September 2015時点のオリジナルよりアーカイブ。24 September 2015閲覧。
- ^ Abhishek Verma; Luis Pedrosa; Madhukar R. Korupolu; David Oppenheimer; Eric Tune; John Wilkes (April 21–24, 2015). “Large-scale cluster management at Google with Borg”. Proceedings of the European Conference on Computer Systems (EuroSys). オリジナルの2017-07-27時点におけるアーカイブ。 .
- ^ “Borg, Omega, and Kubernetes - ACM Queue”. queue.acm.org. 2016年7月9日時点のオリジナルよりアーカイブ。2016年6月27日閲覧。
- ^ “Early Stage Startup Heptio Aims to Make Kubernetes Friendly” 2016年12月6日閲覧。
- ^ “As Kubernetes Hits 1.0, Google Donates Technology To Newly Formed Cloud Native Computing Foundation”. TechCrunch. 23 September 2015時点のオリジナルよりアーカイブ。24 September 2015閲覧。
- ^ Conway, Sarah. “Kubernetes Is First CNCF Project To Graduate” (html) (英語). Cloud Native Computing Foundation. 29 October 2018時点のオリジナルよりアーカイブ。3 December 2018閲覧。 “Compared to the 1.5 million projects on GitHub, Kubernetes is No. 9 for commits and No. 2 for authors/issues, second only to Linux.”
- ^ “Autoscaling based on CPU/Memory in Kubernetes—Part II”. Powerupcloud Tech Blog. Medium (13 April 2017). 27 December 2018閲覧。
- ^ “Configure Kubernetes Autoscaling With Custom Metrics”. Bitnami. BitRock (15 November 2018). 27 December 2018閲覧。
- ^ a b c d e “An Introduction to Kubernetes”. DigitalOcean. 1 October 2015時点のオリジナルよりアーカイブ。24 September 2015閲覧。
- ^ https://kubernetes.io/docs/concepts/workloads/pods/pod/
- ^ a b Langemak, Jon (2015年2月11日). “Kubernetes 101 – Networking”. Das Blinken Lichten. 2015年10月25日時点のオリジナルよりアーカイブ。2015年11月2日閲覧。
- ^ Strachan, James (2015年5月21日). “Kubernetes for Developers”. Medium (publishing platform). 2015年9月7日時点のオリジナルよりアーカイブ。2015年11月2日閲覧。
- ^ https://kubernetes.io/docs/concepts/services-networking/service/#discovering-services
- ^ Langemak, Jon (2015年2月15日). “Kubernetes 101 – External Access Into The Cluster”. Das Blinken Lichten. 2015年10月26日時点のオリジナルよりアーカイブ。2015年11月2日閲覧。
- ^ “Intro: Docker and Kubernetes training - Day 2”. Red Hat (2015年10月20日). 2015年10月29日時点のオリジナルよりアーカイブ。2015年11月2日閲覧。
- ^ “An Introduction to Kubernetes”. DigitalOcean. 1 October 2015時点のオリジナルよりアーカイブ。24 September 2015閲覧。
- ^ “Kubernetes Infrastructure”. OpenShift Community Documentation. OpenShift. 6 July 2015時点のオリジナルよりアーカイブ。24 September 2015閲覧。
- ^ “Kubernetes Components”. Documentation - Concepts. kubernetes.io. 2018年2月5日閲覧。
- ^ 五味明子 (2018年1月5日). ““コンテナネイティブ”の時代が本格到来 ―2018年のクラウドはKubernetesとGoogleに注目”. 技術評論社. 2018年1月24日閲覧。