fbpx

初めてのkubernetes #docker #mirantis #kubernetes #k8s

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

本ブログは Mirantis社のblog記事「Introduction to Kubernetes」の翻訳記事です。

Kubernetes の目的は、動作に必要となる個別アプリケーションをパッケージ化しているコンテナの、グループを管理する時の複雑さを抽象化することです。Kubernetes の REST API を経由してアプリケーションのあるべき状態を登録でき、Kubernetes( 別名 k8s ) は、インフラストラクチャを適合させるために必要なことは何でも行います。コンテナのグループをデプロイし、それらをレプリケートし、いくつかのコンテナが失敗した場合には再デプロイします。

また、オープンソースであるためどこでも実行でき、主要なパブリッククラウドプロバイダーもマネージドサービスを提供しています。もちろん OpenStack や Mesos をベースにしたプライベートクラウドでも k8s を実行でき、ベアメタルサーバをワーカーノードとして活用することも当然可能です。つまり、アプリケーションを k8s のビルディングブロックで記述すれば、パブリッククラウドやプライベートクラウド上の VM やベアメタルサーバ内にデプロイできるということです。

より深く活用するために基礎をしっかりと身につけましょう。
それでは見ていきましょう。

Kubernetes のアーキテクチャ

Kubernetesのアーキテクチャは比較的シンプルです。

アプリケーションをホストしているノードと直接やりとりしません。必ず API 経由で連携し Pods と名付けられたコンテナのグループをスケジューリングして複製する役割を担うコントロールプレーンとのみ通信します。
Kubectl は、API と対話して目的のアプリケーションの状態を共有したり、インフラストラクチャの現在の状態に関する詳細な情報を収集したりするために使用できるコマンドラインインタフェースです。

続いて、いろいろなピースを見てみましょう。

ノード

分散アプリケーションの一部をホストする各ノードは、Docker や CoreOS の Rocket のようなコンテナ技術を利用しています。

ノードはさらに2つのソフトウェアを実行します :

kube-proxy は実行中のアプリケーションへのアクセスを提供します。
kubelet は k8s のコントロールプレーンからコマンドを受信します。

ノードは、etcdをバックエンドとするネットワークファブリックである flannel をコンテナ用に実行することもできます。

Master

コントロールプレーン自体は、API サーバ ( kube-apiserver ) 、スケジューラ ( kube-scheduler ) 、コントローラマネージャ ( kube-controller-manager ) 、etcd ( 設定の共有と、Raft コンセンサスアルゴリズムを利用したサービスディスカバリのための高可用な key-value ストア ) を実行しています。

Terminology

Kubernetes には独自の用語があり、これに慣れてしまえばどのように構成されているかをある程度想定できます。これらの用語には次のようなものがあります。

Pods

Pods とは、1つ以上のコンテナのグループ、共有ストレージ、およびそれらを実行する方法に関するオプションのことです。各 Pod は独自の IP アドレスを取得します。

Labels

Labels とは、Pods や Replication Controllers 、Endpoints など、あらゆる Kubernetes オブジェクトの定義に利用される Key と value のペアのことです。

Annotations

Annotations は、問い合わせ不可能な任意のメタデータを格納するために使用される Key と Velue のペアです。

Services

Services は、Pods の論理セットとネットワーク上でそれらにアクセスするためのポリシーを定義したものです。

Replication Controller

Replication controllers は、特定の数の pod レプリカを一度に実行することを保証します。

Secrets

Secrets は、パスワード、TLS 証明書、OAuth トークン、および ssh 鍵などの機密情報を保持します。

ConfigMap

ConfigMaps は、コンテナをKubernetesに依存させずに、設定データをコンテナに注入するための仕組みです。

なぜKubernetesなのか?

Kubernetes がもたらす複雑さを正当化するためには相応の利点が必要です。
その核心は、k8s のようなクラスタマネージャが開発者にサービスを提供することで、運用チームを巻き込むことなく開発者自身がサービスを利用できる事にあります。

信頼性は Kubernetes の大きなメリットの1つです。Google は社内のコンテナオーケストレーションソリューションである Borg でのインフラ運用に関して10年以上の経験があり、その経験に基づいて Kubernetes を構築しています。Kubernetes を利用することで、アプリケーションの可用性やパフォーマンスに影響を与える障害を防ぐことができるのは大きなメリットです。

スケーラビリティは Kubernetes によってさまざまなレベルで処理されます。
ワーカーノードを増やすことでクラスタの容量を追加できますし、CPUとメモリをトリガーとするオートスケーリング機能を、多くのパブリッククラウドで自動化することも可能です。また、Kubernetes Scheduler にはアフィニティ機能が含まれており、ワークロードをインフラストラクチャ全体に均等に分散し可用性を最大化できます。
最後に、k8sは、カスタムトリガーで駆動できる Pod オートスケーラーを使用してアプリケーションをオートスケーリングできます。

新規CTA