パソナについて
記事検索

Kubernetesとは?コンテナオーケストレーションの定番OSSをメリット含めて解説

コンテナオーケストレーションの定番OSSであるKubernetesについて、その特徴やメリットなどを解説してきます。

Kubernetesとは?コンテナオーケストレーションの定番OSSをメリット含めて解説

コンテナオーケストレーションの定番OSSであるKubernetesについて、その特徴やメリットなどを解説してきます。

スキルアップ

2021/01/28 UP

コンテナといえばDocker、そしてDockerを管理する場合Kubernetes(クーベネティス)、といえるほど、Kubernetesはメジャーになりつつあります。開発の中でコンテナを利用する機会は年々増えているため、Kubernetesについて理解しておく必要性を感じているエンジニアも多いかもしれません。

ここでは、コンテナオーケストレーションの定番OSSであるKubernetesについて、その特徴やメリットなどを解説してきます。

Kubernetesとは?

近年、仮想化技術を用いた開発手法はよりメジャーとなり、様々な仮想化技術が開発に用いられるようになりました。その中でも特にコンテナを利用した開発手法が注目を浴びています。そしてこのコンテナ技術と合わせて発達したのが、コンテナを管理するDocker Swarmや、Kubernetesなどのオーケーストレーションツールです。

Kubernetesは、このオーケーストレーションツールの一つで、コンテナの構成管理、デプロイ、スケーリングや監視などを自動化し、コンテナの管理に特化した、オープンソースソフトウェアです。2014年に、GoogleがKubernetesプロジェクトをオープンソース化し、さらにその大規模な知見を共有しました。

Kubernetesが台頭した背景

開発手法が多様化していく中で、devops(開発と運用をセットにした開発手法の一つ)、とりわけ、CI/CDの考え方が広く認知されるようになりました。CI/CDとは、Continuous Integration/Continuous Delivery (継続的インテグレーション/継続的デリバリ)と呼ばれ、アプリケーションのデプロイ・開発手法の名称です。

・CI/CD

Continuous Integrationは、ソースコードへの変更が自動的にテスト、ビルドされる環境を指します。Continuous Deliveryは、デリバリとデプロイにわけられます。デリバリは他リポジトリやコンテナレジストリへのデリバリ、デプロイメントは本番、検証環境へのリリースを指します。

Dockerは、このCI/CDと非常に相性が良く、ソースコードの変更から、テスト、ビルド、デプロイまでを一貫して行うことができるので、とても普及することとなりました。

・マイクロサービス

Dockerが普及した背景としてもう一つ、マイクロサービスアーキテクチャがあります。マイクロサービスとは、それぞれのコンテナが互いに独立しているサービスのことを指し、これらをまとめて一つのコンポーネントとして扱うのがマイクロサービスアーキテクチャという考え方です。

マイクロサービスとして構成するメリットとは、様々です。まずは、開発からデプロイまでの一貫したフローが確立されるため、アジャイルに開発を進めることができます。また、マイクロサービスなので、サービスそれぞれが独立しており、耐障害性に優れているというメリットもあります。特に、クラウドネイティブアプリケーションであれば、互いのアプリケーションが疎結合な構成を取ることが非常に容易なので、相性が良いとされています。

このような背景からシステムにDockerを採用する機会が増え、かつマイクロサービスアーキテクチャのため、複数のDockerコンテナを適切に管理する必要性がでてきました。そこで登場したのが、Kubernetesです。

Kubernetes の読み方

Kubernetesの読み方は、様々です。発音としては、koo-ber-nay'-taceとなります。カタカナで表現すると、クーベネティス、クーバネティスとなります。Kubernetesの発音については、日本人のみならず、海外の方の間でも議論の元となり、時にはGitHubのissueに登録されるほど、様々な発音が主張されています。

なお、Kubernetesという単語は長いので、k8s (k [ubernete] s) と、間の8文字を省略して表現することがあります。

Kubernetesでできること

Kubernetesでできること

Kubernetesには大きく6つの特徴的な機能があります。順番に見ていきましょう。

PodとNodeによる管理

KubernetesではPodとNodeという考え方があります。

PodはKubernetesアプリケーションの基本的な単位です。Kubernetesアプリケーションの単一インスタンスで、単一のコンテナまたは、複数のコンテナで構成されます。このPodを複数集めたものをServiceと呼びます。Serviceは、Podの集合として実行されているアプリケーションをひとまとまりに管理する方法です。

一方のNodeは、VMや物理マシンなどが抽象化されたものです。PodやServiceはNodeに割り当てられることで実行できるようになります。

Kubernetesでは、複数のコンテナをPodで管理し、そのPodをServiceで管理、インフラもNodeとして管理することで、コンテナと実行マシンを紐づけることなく、抽象化して管理することができるようになっています。

コンテナのデプロイ

Kubernetesクラスタを利用して、コンテナアプリケーションをデプロイすることができます。

Kubernetesのコマンドラインインターフェースである、kubectl を利用して、デプロイを実施することができます。kubectl は例として以下のようなコマンドが実行できます。

//リソースの一覧を表示
kubectl get

//リソースの詳細情報を表示
kubectl describe

// Pod上のコンテナログを表示
kubectl logs

// Pod上のコンテナ内でコマンドを実行
kubectl exec

コンテナの負荷分散(スケーリング)

Deploymentを利用することで、KubernetesのPodをスケーリングすることができます。

例えば、スケールアウトすることで、自動で新しいPodが作成され、利用可能なNodeにスケジュールされます。また、スケーリングを0に設定することで、全てのPodを削除することも可能です。

コンテナの監視

Kubernetesは、様々な監視機能を備えています。

例えばDeploymentは、Podを監視しています。設定したPod以下になると、自動的にPodを起動し、設定したPod数となるまで起動します。また、Podは、コンテナの状態を監視し、随時ステータスを取得し保持しています。

その他Kubernetesは、様々な拡張コンポーネントを追加して、リソース状況やステータスなどを監視、表示することが可能です。代表的なものとしては、Kubernetes Dashboardがあります。

コンテナのアップデート

Kubernetesには、ローリングアップデートという機能があります。ローリングアップデートは、Podインスタンスを新しいPodへ段階的にアップデートすることで、ゼロダウンタイムでPodの更新が行える機能です。

また、新しいPodは、利用可能なNodeに再度スケジュールされます。アップデート中は、Serviceは利用可能なPodのみにリクエストを負荷分散するため、ダウンタイムが発生しないという仕組みになっています。

コンテナの自動復旧

Kubernetesでは、事前にスケールしておくことで、耐障害性を持たせることができます。さらに、Nodeに障害があった場合、Kubernetesは自動復旧を行います。また、Pod内のコンテナに障害があった場合でも、自動復旧するよう設定を行うことができます。

これらの機能とServiceを利用することで、正常なPodにのみリクエストを振り分けることができるため、より強固なアプリケーションを構築することが可能です。

Kubernetesのメリット

Kubernetesには大きく3つのメリットがあります。大量のコンテナの管理、デプロイの高速化、高可用性です。順番に見ていきましょう。

大量のコンテナの管理

Kubernetesは、設定一つでスケーリングが簡単に行えるので、大量のコンテナ管理に向いています。設定ファイルにあるべき姿を抽象化して共有できるので、大量のコンテナがあった場合にも、正しく保守することが可能です。またローリングアップデートにも対応しているので、手動でデプロイ作業を行う必要がありません。

コンテナだけでなく、物理マシン、仮想マシンの切り替えも容易に行うことができるので、様々な面で管理のメリットがあります。

デプロイの高速化

コンテナを元にデプロイを自動で行ってくれるので、手動でデプロイ作業を行う必要がありません。またアプリケーション自体の動作についてはローカルで担保されるため、開発、検証、本番のインフラストラクチャについての検証を行う必要がなく、高速にデプロイを行うことができます。

場合によっては、より多くのコンテナを稼働させたいというシーンがあります。Kubernetesであれば、定義ファイルの修正と反映のみで増減が可能であるため、容易にデプロイの調整を行うことができます。

高可用性

KubernetesはPodという最小単位で構成されているため、Podを増やしたり減らしたりすることで、可用性を高めることができます。また、定義ファイルによってレプリケーションなども自動で行うことができるので、可用性が高い状態の構成をすぐに取ることができます。設計次第で、コストパフォーマンスを高く保ちつつ、可用性を担保することが可能です。

次世代のIT基盤ともいわれるKubernetesを使ってみよう!

次世代のIT基盤ともいわれるKubernetesを使ってみよう!

Kubernetesは、PodとNodeにより抽象化することでデプロイやスケーリング、保守にいたるまでメリットが多くあり、次世代のIT基盤ともいわれています。その半面、技術的な学習コストは高いので、しっかり理解して導入する必要があります。

コンテナを用いた開発の機会が増える中で、インフラエンジニアでなくともKubernetesについてはある程度理解しておく必要性は増えています。ぜひこれを機会に、Kubernetesを触ってみて、実際にPodやNodeを稼働させてみてはいかがでしょうか。