
Kubernetesとは?基本概念をわかりやすく解説!使い方やメリットもご紹介
Kubernetesという言葉は最近よく聞くものの、その基本的な概念がよくわかっていない。または、もっと詳しく知ってシステム開発に活かしたいと感じる方は多いかもしれません。最近ではシステム開発においてKubernetesを使用する機会も増えているので、その概念は知っておいて損はないでしょう。ここでは、そんなKubernetesの基本概念について詳しく解説します。Kubernetesを使うメリットや具体的なコマンドにも触れ、その使い方についてもご紹介しますので、ぜひシステム開発に役立ててください。
Kubernetes とは?

Kubernetesについて説明する前に、まずは「コンテナ化」と呼ばれる技術についてご紹介します。Kubernetesを理解するためには、このコンテナ化について理解しておくことが重要なためです。
コンテナ化について
昨今のIT技術において、コンテナ化と呼ばれる仮想化技術がトレンドになっています。このコンテナ化によって、次のようなメリットがあります。
- 他のソフトウェアやプロセスに依存したり紐付けられたりせず、あらゆるプラットフォームやクラウドで一貫性のある均一な動作が可能となる
- 機能が軽量なため、サーバーの効率が向上しサーバーやライセンスのコストを削減できる
- 起動する ゲストOS がないため、起動時間が短縮される
- アプリケーションを分離し、他のアプリケーションから独立して動作させることができる(1つのコンテナに障害が発生しても、他のコンテナの動作に影響を与えない)
コンテナとはOS上に論理的な領域を作成し、アプリケーションを動作させるのに必要なライブラリやアプリケーションなどを1つに統合することで、一つのサーバーのように動作します。また、OSなどのリソースを論理的に分けることで、複数のコンテナでリソースを共有して使うことができるようになります。
アプリケーションやソフトウェアの動作環境が複数ある、1台のパソコン(OSは1つ)をイメージしてみるとわかりやすいでしょう。
Dockerについて
コンテナ技術について解説しましたが、コンテナの話題が出たときに欠かせないのがDockerです。Docker とは、Docker社が開発したコンテナ仮想化を用いてアプリケーションの開発や実行する環境を構築できるプラットフォームのこと。現在では、コンテナといえばDockerというのが主流になっています。
Dockerの詳細についてはこちらの記事もご参照ください。
Kubernetesについて
コンテナ技術を用いることによって、これまで以上に開発環境を効率的に利用できたり、リソースの節約ができたりするメリットがあります。しかし、コンテナ化によって管理すべきコンテナが増加してしまい、その管理や運用に手間がかかったり、煩雑になってしまったりするというデメリットが存在します。そこで、このデメリットを解消するために用いられるツールが、コンテナオーケストレーションです。コンテナオーケストレーションの利用によってコンテナ化されたアプリケーションのデプロイやスケーリング、管理などが自動的にできるため、コンテナの管理が容易になります。
そして、Kubernetesがこのオーケーストレーションツールの一つであり、コンテナの運用管理と自動化を実現するオープンソースソフトウェアです。Kubernetesは、Google社が社内で利用していたコンテナ管理ツールが汎用化され、オープンソースソフトウェアとなったもの。複数のコンテナを統合的に管理しつつ、スケールイン・アウトなども自動化することができます。そのため、大規模なシステムの運用管理の工数削減に役立つでしょう。そして今では、Kubernetesがコンテナオーケストレーションツールのデファクトスタンダードとなっています。
Kubernetesは「クバネティス」や「クバネテス」と読みます。また、Kubernetesのスペルを見ると最初の「K」と最後の「s」の間の文字数が8文字のため、「K8s」とも呼ばれています。Kubernetesはギリシャ語に由来し、操舵手やパイロットを意味する言葉です。Kubernetesは、以下のような機能を提供しています。
- サービスディスカバリーと負荷分散の機能
DNS名または独自のIPアドレスを使ってコンテナを公開可能です。コンテナへのトラフィックが多い場合、Kubernetesの負荷分散によってトラフィックを振り分けることができるため、デプロイが安定します。
- ストレージ オーケストレーションの機能
ローカルストレージやパブリッククラウドプロバイダーなど、選択したストレージシステムを自動でマウントすることができます。
- 自動化されたロールアウトとロールバック機能
デプロイしたコンテナをあるべき状態に保持することでき、障害発生時においてもあるべき状態に変更可能です。
- 自動ビンパッキング機能
コンテナ化されたタスクを実行するノードのクラスタをKubernetesへ提供します。また、各コンテナがどれくらいCPUやメモリー(RAM)を必要とするのかをKubernetesに通知。コンテナをノードにあわせて調整でき、リソースを最大限に活用してくれます。
- 自己修復機能
処理が失敗したコンテナを再起動してコンテナを入れ替え、定義したヘルスチェックに応答しないコンテナを強制終了します。
- セキュリティ機能
パスワードやOAuthトークン、SSHキーのような機密の情報を保持し、管理することができます。機密情報をデプロイし、コンテナイメージを再作成することなくアプリケーションの構成情報を更新することが可能です。
最近ではDX(デジタルトランスフォーメーション)を推進・促進するうえで、アプリケーションのモダナイゼーションが必要とされています。Kubernetesを利用すればモダンなアプリケーションの開発や実行、管理ができるのです。
また、マイクロサービスの普及によって、複数の独立したサービスを同時進行で開発する手法がとられおり、その環境もKubernetesによって実現することができます。これらの理由により、Kubernetesが注目されているのです。
Kubernetesを使うメリットについて

ここでは、Kubernetesを利用するメリットについて解説します。Kubernetesを利用することでコンテナの運用管理が容易になりますが、具体的なメリットは次のようなものです。
コンテナを多数管理できる
Kubernetesでは、大量のコンテナを一括管理できることがメリットです。さらに、スケーリングも容易に行えます。また、設定ファイルを複数のコンテナ間で共有することによって、設定変更時も正確に大量に設定を反映させることが可能です。
起動が高速、軽量になる
Kubernetes は OS やミドルウェアなどを共有しているため、従来の仮想マシンと従来の仮想環境と比べて起動が高速かつ軽量となります。リソースの効率的な活用も可能となるため、アプリケーション開発も迅速に行うことができ、生産性の向上にも繫がるでしょう。
デプロイが自動でできる
Kubernetesを用いることで、アプリケーションのデプロイ時に新しいコンテナの作成や既存コンテナの削除、新しく作成したコンテナにリソースを適用する作業を自動化できます。
可用性を担保できる
Kubernetesでは、異なるノードの集まりであるクラスタを構成しています。あるクラスタ内にて障害が発生した場合、障害が起きたコンテナを自動で再起動させます。また、他のノードでコンテナを起動させ、処理を引き継がせるといったことで動作を継続。クラスタの存在によって、高い可用性を担保することができます。
複数の環境で利用できる
例えばKubernetesは、オンプレミス環境とクラウド環境など複数の環境で稼働させることができます。
特定の環境に依存しないため、システム開発において制約がありません。
DevOpsとの親和性が高い
DevOpsとは、アプリケーションの開発担当と運用担当が連携して協力し開発を進める手法です。Kubernetesにはアプリケーションの開発と運用に必要とされる機能が多数搭載されているため、DevOpsとの親和性が非常に高いという特徴があります。
以上のようにメリットが多いKubernetesですが、利用する際には注意すべきポイントも存在します。
初期投資が必要な場合がある
Kubernetesは、管理マシンおよび実行マシンとしての物理サーバーまたはクラウドサーバーが必要となります。そのため、現システムの構成や環境によっては新規でサーバーを用意しなくてはならず、初期投資のコストがかかる場合もあるでしょう。
継続的に学習し続ける必要がある
Kubernetesは定期的にアップデートされ、機能が追加されたり改善されたりと便利になる反面、学ぶべきことが多くなる傾向にもあります。そのため、学習コストが比較的高くなる点を意識しておくべきです。また、定期的なバージョンアップによって、既存のコードが使えなくなる可能性もある点に注意が必要となるでしょう。
事前に使い方を明確にしておく必要がある
Kubernetesは柔軟な設定が可能で、高い拡張性を持っています。しかし、その分だけ選択肢が多くなってしまい、どのような機能を実現したいのかが不明瞭だと十分に使いこなせないかもしれません。事前に「Kubernetesを使ってどのような運用管理を実現したいのか」を明確にしておきましょう。
Kubernetesの使い方について

ここでは、Kubernetesの使い方について解説します。どのようなことができるのか、そして具体的なコマンドもご紹介しますので、参考にしてください。
クラスタの作成について
Kubernetesでは可用性の高いクラスタを作成可能です。Kubernetesクラスタは以下の2種類のリソースで構成されます。
マスター:クラスタを管理する役割
ノード:アプリケーションを動かす役割
アプリケーションのデプロイについて
Kubernetesクラスタの作成後、その上にコンテナ化アプリケーションをデプロイすることができます。そして、Deployment の設定を実施します。Deploymentを作成することによって、Deployment内に含まれるアプリケーションインスタンスをクラスタ内の個々のノードで実行できるようになるのです。また、アプリケーションインスタンスの作成後は、Kubernetes Deploymentコントローラーがインスタンスを継続的に監視します。
Podについて
Pod はKubernetesアプリケーションの基本的な実行単位です。アプリケーションのコンテナ、ストレージリソース、ユニークなネットワークIP、およびコンテナの実行方法を管理するオプションをカプセル化します。Podによって、コンテナをまとめてサービス管理することが可能です。
ローリングアップデート
ローリングアップデートは、KubernetesでDockerコンテナを用いてサービスをアップデートする手法です。メリットとして、稼働中のアプリケーションを順番に新バージョンのものに切り替えることで、ダウンタイムを削減することができます。なお、ローリングアップデートによって以下が可能となります。
- コンテナイメージのアップデートを介した、ある環境から別の環境へのアプリケーションの昇格
- 以前のバージョンへのロールバック
- ダウンタイムなしでのアプリケーションのCI/CD
次に、Kubernetesで利用される各種コマンドとその意味についてご紹介しましょう。
リソースの表示
kubectl get services
:すべてのサービスのリストを表示します
kubectl get pods --all-namespaces
:すべてのPodのリストを表示します
kubectl get pods -o wide
:すべてのPodについてより詳細なリストを表示します
リソースのアップデート
kubectl set image deployment/frontend www=image:v2
:frontend Deploymentのwwwコンテナイメージをv2にローリングアップデートします
kubectl rollout history deployment/frontend
:frontend Deploymentの改訂履歴を確認します
リソースの編集
kubectl edit svc/docker-registry
:docker-registryという名前のサービスを編集します
リソースのスケーリング
kubectl scale --replicas=3 rs/foo
:「foo」という名前のレプリカセットを3にスケーリングします
kubectl scale --replicas=3 -f foo.yaml
:「foo.yaml」で指定されたリソースを3にスケーリングします
リソースの削除
kubectl delete -f ./pod.json
:pod.jsonで指定されたタイプと名前を使用してPodを削除します
kubectl delete pod,service baz foo
:「baz」と「foo」の名前を持つPodとServiceを削除します
実行中のポッドとの対話処理
kubectl logs my-pod
:Podのログをダンプします(標準出力)
kubectl logs -l name=myLabel
:name=myLabelラベルの持つPodのログをダンプします(標準出力)
まとめ

Kubernetesを導入することで、コンテナの管理が容易になります。利用するメリットは多く、使いこなすことができれば、より効率的にシステム開発を進めることができるでしょう。しかし、なぜKubernetesを導入するのかを明確にすべき点や継続的に学習しなくてはならない点に注意すべきです。なお、Kubernetesを実際に操作したい場合にはチュートリアルも利用できます。
https://Kubernetes.io/ja/docs/tutorials/
この記事をきっかけに、Kubernetesについての知見が広がれば幸いです。
▼参考
https://Kubernetes.io/ja/docs/concepts/overview/what-is-Kubernetes/
https://Kubernetes.io/ja/docs/tutorials/Kubernetes-basics/
https://Kubernetes.io/ja/docs/reference/kubectl/
[著者プロフィール]
中村陽平
8年間インフラエンジニアとして、システム開発から運用まで幅広く経験し、フリーランスとして独立する。IT技術に関する記事や転職、フリーランスに関する記事も多数執筆中。現在は官公庁系システムのネットワークの設計~構築・運用まで携わっている。得意分野はネットワークの設計、構築(Cisco機器)。