Kubernetesとは
Kubernetesとは、Dockerなどのコンテナを管理するオープンソースソフトウェアである。ライセンスはApache License 2.0で公開されている。
Kubernetesは、複数のコンテナ化されたアプリケーションのデプロイ、スケール、管理を自動化する機能を提供している。このような機能は、コンテナオーケストレーションとも呼ばれ、Kubernetesはコンテナオーケストレーションのデファクトスタンダード的な位置づけとなっている。元々はGoogleがインターネットサービスを提供するために利用していたマイクロサービスの基盤を、オープンソースソフトウェアとしてまとめて公開したものが、現在のKubernetesである。Google Cloud Platform(GCP)のGoogle Kubernetes Engine(GKE)、AWSのAmazon Elastic Kubernetes Service(Amazon EKS)、AzureのAzure Kubernetes Service(AKS)といったクラウドベンダーのサービスでも採用されている。なお、コンテナ化やコンテナ管理の課題については、以下でより詳しく説明している。
「Kubernetes〜コンテナ管理の課題を解決するOSS〜」へ
Kubernetesの読み方
Kubernetesは、「クーベネテス」、「クーベルネイティス」、「クバネティス」などと発音される。この名前は、ギリシャ語の「人生の道標」や「操舵手・パイロット」という意味から由来している。また、綴りも長く覚えにくいことから短縮して「k8s」と表記されることもある。
KubernetesとDockerの関係
2013年、コンテナ型の仮想化を実装するソフトウェアとしてDockerが公開された。当初は安定性に問題があったものの、使いやすいGUIや集中管理機能、アプリケーションのデプロイの容易さ、コンテナのポータビリティなどにより、ソフトウェア開発者の間で注目されるようになった。2015年にはオープンコンテナイニシアティブ(OCI)が発足し、標準化も始まった。しかし一方で、自ホスト上のコンテナの管理しかできない、ソフトウェア連携時の管理が手間、大量のコンテナを全て監視しないといけないなどの課題も抱えていた。
こうした中、2014年に公開されたKubernetesは、Dockerの課題を解決するオープンソースソフトウェアとして注目を集めた。2015年にはバージョン1.0がリリースされ、その後も機能の拡充やスケーラビリティの向上が行われた。2017年には、Dockerが公式にKubernetesをサポートすることを発表している。
Kubernetesの特徴
Kubernetesでは、Podやレプリカセットといった新しい考え方で、コンテナを管理しやすくしている。本章では導入メリットについて解説する前に、まずはKubernetesの持つ特徴について紹介する。
Podによる管理
Podとは、複数のコンテナの集合体であり、Kubernetesでコンテナを管理するための最小単位である。Dockerコンテナでは1つのコンテナ上に1つのプロセスだけを起動することが推奨されており、WEB-DBサーバのように複数のサーバを組み合わせて実現するサービスの場合、いくつものコンテナを連携させて動作させる必要がある。そのため、各コンテナのネットワーク情報や連携情報の管理が煩雑になり、大規模なサービスを作ることが難しいといった課題があった。
Kubernetesでは、このようなサービスに必要なコンテナを統合し、図のイメージのようにPodとしてグループで管理することができる。Podとしてまとめることで、コンテナごとに個別でサービスの起動・停止を行ったり設定を変更したりする必要がなく、コンテナ管理の煩雑さや複雑さを隠蔽することができる。
レプリカセットとデプロイメント
レプリカセットとは、複数のPodのレプリカをセットで作成する機能のことである。例えば、レプリカ数に3を設定してPodを作成すると、Kubernetesは同じ機能のPodを3つ自動的に起動する。また、このレプリカ数はKubernetesのマスターノードによって保証されている。仮にノードの障害などで特定のPodが消失した場合でも、別のノードで自動的にPodが起動されて、レプリカ数を常に指定した数で維持してくれる。
また、実際にレプリカセットを作成する際は、デプロイメントという機能を利用する。デプロイメントとは、名称の通りKubernetes上に必要な数のレプリカを配置することを意味している。
アーキテクチャ
Kubernetesは、実際にコンテナが動作するノードサーバと、それを管理するマスターサーバの2種類からなるクラスタとして動作する。このクラスタをKubernetes clusterと呼ぶ。マスターサーバは、kube-api-server、etcd、kube-scheduler、kube-controller-manager、clound-controller-managerなどのコンポーネントから、ノードサーバはkubelet、kube-proxyのコンポーネントから構成される。
ストレージ
Kubernetes上のコンテナで使うデータを保存するストレージには、NFSやiSCSIなどのストレージデバイス、Cephなどの分散ストレージ、DRBD SDSなどがあり、用途に合わせて選択できる。コンテナは必要に応じて、ストレージをマウントして処理を行う。
Kubernetesのメリット
Kubernetesでは、Podやレプリカセットの利点を活用し、スケールアウト、オートスケーリング、ローリングアップデートなど、さまざまなポイントで高度なコンテナ管理機能を提供している。これらの機能によって、コンテナの長所を最大限に活用することができる。
柔軟なスケールアウト
通常、Dockerのコンテナは一台のホストに閉じている。同一ホスト内で動くコンテナ同士は通信が可能だが、ホスト外部との通信はNATを経由する必要がある。そのため、Dockerの実行環境ではホスト間の連携が煩雑で、コンテナ数が増えた場合に容易にスケールアウトすることができない。
Kubernetesを利用することで、複数のホストで構成されている環境を一台の実行環境のように扱うことができる。そのため、別のホストにあるコンテナもまとめて管理することができる。コンテナ数が増えてリソースが足りなくなった場合でも、ノードを追加するだけで拡張することが可能である。
不具合に自動的に対応 〜 セルフヒーリング
Kubernetesは、ホストに異常があった際、Kubernetes自身でヘルスチェックをして自動的に復旧を行うことができる。そのため、仮にKubernetesで運用中のコンテナに不具合があってサービスがダウンした場合でも、状態の変化を検知し、空きリソースを見ながらコンテナを自動的に再起動する。これにより、処理に失敗するなどして不具合が発生しても、自動で回復しサービスを継続することができるため、システムの安定性や可用性を高めることができる。
リソースの無駄を削減 〜 リソース管理
Kubernetesを利用すると、効率よくリソースを使うことができる。コンテナを何台起動するかという情報を記載するだけで、Kubernetesが最適な配置を決定してスケジューリングし、コンテナを起動する。HAクラスタのように待機系のサーバが必要なクラスタ構成に比べて、リソースを非常に効率的に使えるという点で大きなメリットがある。近年、クラウド上でサービスを提供するシステムが増加しているが、多くのクラウドサービスでは、使用するリソースによって料金が決まってくる。そのため、効率的なリソース管理は余計なコストの削減につながり、生産性の向上にも効果が期待できる。
システム全体の負荷に自動的に対応 〜 オートスケーリング
Kubernetesは、Podのリソースの利用状況を監視している。あらかじめ設定をしておくと、一定の条件になった場合には、Kubernetesが自動的に必要なレプリカ数を増やして確保したり、減少させたりする。例えば、短期的にアクセスが多くなるなど、負荷が高い時間帯だけPodを増やし、負荷が低くなればPodを自動的に減らすことができる。そのため、Kubernetesを使うことでアプリケーションを安定して稼働させることができる。
安全なソフトウェアアップデート 〜 ローリングアップデート
Kubernetesでは、従来のサーバでのアップデート作業に比べ、非常に安全かつ確実にアップデート作業を行うことができる。Kubernetes上に新旧両方のバージョンのPodを用意して検証が行えるうえに、旧バージョンから新バージョンへの切り替えも瞬時に行うことができる。万一問題が発生した時でも、デプロイメントがコンテナに行われた更新の履歴を管理しているため、簡単に旧バージョンに戻すことが可能である。
サービス管理
Kubernetesでは、デプロイメントでPodの複製を作成しただけでは、複数のPodを使いこなすことはできない。そのため、クラスター内でコンテナが利用するIPアドレスやポートは、サービスとして定義する。ロードバランササービスと連携することで、サービス用IPと内部IPを関連付け、外部からコンテナサービスにアクセスできるよう定義することができる。加えて、Kubernetesのサービス管理は、外部のロードバランサと連携するIngressという機能を持っている。このIngressの機能を利用することで、L7でのバランシングや、SSLオフロードなどを外部のロードバランサに任せることが可能である。
ユーザとテナント管理
Kubernetesは、マルチテナントに対応した信頼性の高いコンテナ環境を提供する。
Kubernetesは、コンテナの仮想マシン空間を、複数のセキュリティ的に独立したネームスペースに分離することができる。つまり、各テナントごとに、完全に独立した環境を提供することができる。そのため、Kubernetesを使うことで、コンテナ基盤を提供するマネージドサービスを実現したり、組織内の部署ごとにリソースを制限したりすることが可能である。
また、Kubernetesでは、ユーザーの役割も定義できる。そのため、サポート担当のエンジニアには、コンテナの状態を確認するだけの権限を与えたり、アプリケーション開発者にはコンテナを実行できる権限を与えるなど、Kubernetesにログインしたユーザによってそれぞれ個別に役割を定義することができる。なお、Kubernetesのユーザ認証では証明書認証も利用することができる。
Kubernetesの活用例
Kubernetesは、複数ノードで複数のコンテナを動作させることを前提としている。そのため、コンテナ間のネットワーク制御や、コンテナの監視、異常時に再度コンテナを起動して自己修復するなどの機能が備わっている。こうしたことから、例えば次のようにKubernetesを活用することができる。
- WEBアクセスの負荷に合わせてコンテナを自動で増やして処理させる
- コンテナやノードの故障が発生した際、コンテナを自動で再起動しサービスを継続させる
- ソフトウェアアップデートの影響を検証用のコンテナで確認する
また、Kubernetesは、IoT開発基盤や機械学習基盤にも利用することができる。IoT開発基盤や機械学習基盤では膨大なデータを扱うため、スケーラビリティや耐障害性が求められる。Kubernetesを利用することで、容易なスケールアウトや障害に強いシステムを実現できる。さらに、Kubernetesを使ってオンプレミス環境にシステムを構築することも可能である。クラウドベンダーが提供する開発基盤サービスだとコストがかかる、継続して使い続けることができるか心配、機密情報や重要情報を取り扱う関係でクラウドサービスを利用できない、といった不安がある場合などにおすすめである。
Kubernetesのインストール
Kubernetesのインストール自体はそれほど難しくなく、マスタサーバもノードサーバも基本的なソフトウェアのインストール手順はほぼ同じである。
- Dockerをインストールする
- Kubernetesのパッケージレポジトリを登録する
- kubernetesのパッケージをインストールする
以上の準備を行った後、マスタサーバでkubeletサービスを起動し、kubeadm initでマスタサーバの初期化処理を行う。この時、Kubernetesクラスタのトークンが作成される。ノードサーバでは、kubeadm joinにこのトークンを指定して実行することで、Kubernetesクラスタに参加することができる。
Kubernetesのダッシュボード
Kubernetesでは、視覚的にコンテナを管理できるように、Kubernetes専用のダッシュボードが用意されている。Kubernetesのダッシュボードからは、Podの状態の確認や、CPUの割り当て状況、メモリの使用量やログの確認など、Kubernetesが収集した各種リソースの状態をモニタリングすることができる。ただし、ダッシュボードでは、Kubernetesの操作をYamlフォーマットで行わなければならず、あまり直感的に管理をすることができない。そのため最近では、後述するRancharがより高機能なWeb管理画面として注目されている。
Kubernetes関連ツール
Kubernetesには、一緒に利用すると便利なコンテナツールがいくつか存在している。主に以下のようなものがある。
Minikube/Microk8s
Minikubeは、小規模なKubernetes環境を作成するためのパッケージである。1台のPC上に、仮想的に環境を構築することができるため、試験的にKubernetesを構築したい場合に利用できる。Minikubeは、Windows上でもLinux上でもインストールできるが、動作にはVirtualBoxやKVMなどのハイパーバイザーが必要である。
Microk8sも、小規模なKubernetes環境を作成するためのパッケージである。環境に依存せず、管理するための仕組みであるSnappyを使い配布されている。Minikubeと違い、Microk8sではハイパーバイザーは不要である。Kubernetesと併用することが多いレジストリやストレージなどのツールも内包されていて、簡単に有効化できる。Microk8sでは、containerd、runcをランタイムとして使っている。
GitLab
GitLabは、オープンソースのプロジェクト管理ツールである。コンテナレジストリとしても利用でき、複数のノードにコンテナイメージを配布する際に便利である。他にも、プロジェクト計画、ソースコード管理、CI/CD、監視、セキュリティ、ドキュメント管理等の機能がある。GitLabはオンプレミスに構築が可能なため、組織内にプライベートコンテナレジストリのサービスを提供することも可能である。機密情報を扱うコンテナでも、安心して運用することができる。
Ranchar
Rancherは、Kubernetesを管理を簡易化することを目的として開発されたオープンソースソフトウェアである。Rancherでは、コマンド操作などの専門的な知識を理解していなくても、Kubernetesの構築、操作、管理といった作業を行うことができる。そのため、コンテナ管理の利便性を向上させることができる。
PacemakerとPacemaker bundle
MySQLやPostgreSQLのようなコンテナを管理するためには、ノードサーバの状態をきちんと制御する必要がある。しかし、Kubernetes単独では、このような方法が用意されていない。Pacemakerを使うと、ノードサーバの状態を監視し、強制的にノードを停止することができる。また、コンテナにPacemaker bundleを用いて起動することで、コンテナ内部の状態まで監視することができる。
DRBD-SDS
DRBD SDSは、Software Defined Storageを実現するためのソフトウェアである。特にデータベースなどの、複数のコンテナで共有されてはいけないデータを安全に扱えるように設計されていて、動作が高速でパフォーマンスも高いことから、コンテナと組み合わせて利用される。
Portainer
Portainerとは、Web画面上でコンテナの起動や稼働中のコンテナの監視ができるオープンソースのGUIツールである。Docker、Kubernetes、Nomadをサポートしている。Portainerは、Kubernetesの管理用のダッシュボードと異なり、1台のサーバーしか利用しない小規模のシステムでもコンテナを管理できるという特徴がある。
セキュリティ関連のOSS
Falco
Falcoとは、Kubernetesなどのコンテナ環境を対象にランタイムセキュリティチェックを行う、オープンソースソフトウェアである。Falcoでは、システム上で通常行われないようなコンテナ内のイベントを検知して、条件によってアラートを送信することができる。連携できるシステムも多く、メールやチャットなど、さまざまな方式でアラートを送信することが可能である。しかし、Falcoはあくまで動作中のコンテナの侵入・改ざんを検知するツールであるため、ウイルスの検知、脆弱性診断などの機能はない。
Trivy
Trivyとは、オープンソースで公開されている、コンテナイメージの脆弱性診断ツールである。CIなどでも簡単に使えるシンプルな設計で、組織のソフトウェア開発パイプラインにも容易に統合することができる。Trivyは公式サイトでRedhat系、Debian系のOS用のパッケージが配布されているため、該当するパッケージをインストールするだけで動作可能である。
Vuls
Vulsとは、LinuxやFreeBSDを対象にした脆弱性診断ツールである。Vulsを使うことで、NVDやJVN、各ディストリビューションなどが提供する脆弱性情報を自動で取得し、リアルタイムな脆弱性診断が可能となる。そのため、システム管理者の負担軽減に繋がる。また、Dockerなどのコンテナの脆弱性診断にも対応しており、コンテナが動作中でも診断することができる。ただし、Vulsはコンテナイメージの脆弱性診断には対応していない。
デージーネットの取り組み
デージーネットでは、IoT開発基盤や機械学習基盤などの構築に、Kubernetesを活用したソリューションを提案している。実際に、「IoT開発では使用するデータ量が膨大なため、クラウドベンダーのサービスでは利用コストが増大する」「将来的にデータが増加する可能性が高いため、容易にスケールアウトしたい」といったお客様の課題に対し、Kubernetesを使ってオンプレミスでIoT開発基盤を構築した事例がある。
また、デージーネットでは、「Kubernetes調査報告書」を作成し、Kubernetesの基礎となる概念や基本の使い方、クラスタ構築の方法や管理方法についてまとめ、無料で公開している。本格的なKubernetesクラスタを構築する場合は、プロジェクトサイトからパッケージをダウンロードすることが可能である。また、Kubernetesを実際に操作したい場合は、チュートリアルも利用できる。
デージーネットでは、システム構築サービスを提供したお客様に、導入後支援サービスとして、Open Smart Assistanceを提供している。ソフトウェア単体のサポートではなく、Linuxなどを含むシステム全体に対するサポートとなっており、Q&A対応、セキュリティ情報提供、障害調査、障害回避、障害時オンサイト対応、障害時システム再構築などが含まれている。
手軽にKubernetesを導入できる「コンテナスターターサービス」
デージーネットでは、Kubernetesの導入を検討しているお客様向けに、導入を簡易化するためのサポートとして「コンテナスターターサービス」も提供している。
「コンテナスターターサービス」は、社内の規約や機密情報に関連してクラウドのコンテナサービスを利用できない方向けに、オンプレミスな場所にKubernetes環境を構築するサービスである。デージーネットが、oVirtなどの仮想化技術と組み合わせて、最小2台のハードウェア上にKubernetesクラスタを構築する。そして、Ranchar、Gitlab、ロードバランサのサービスなど、必要なコンポーネントを含んだ状態でお渡しするため、複雑なKubernetesクラスタの構築にかかる負担を軽減することができる。また、利用開始後のQ&A対応や障害対応、年に2回ソフトウェアアップデートなどの運用、保守サービスもセットで提供している。
【カテゴリ】:クラスタ  仮想化  仮想基盤  ビッグデータ  オープンソースソフトウェア  AI  
【Webセミナー】自社でOSSを採用しよう!今更聞けないOSSの基本セミナー
日程: | 11月22日(金)Webセミナー「BigBlueButton」を使用します。 |
内容: | OSSを導入したいけど、どこから手をつければいいかわからない方必見! |
ご興味のあるかたはぜひご参加ください。 |