-
サーバ構築のデージーネットTOP
-
OSS情報
-
一押しOSS
-
Kubernetes〜コンテナ管理ツール〜
-
サーバ構築のデージーネットTOP
-
OSS情報
-
コンテナ型仮想化
-
Kubernetes〜コンテナ管理ツール〜
Kubernetes〜コンテナ管理ツール〜
- +
目次
Kubernetesとは
Kubernetesとは、コンテナの管理を自動化するためのソフトウェアで、コンテナ・オーケストレーション・ツールと呼ばれています。Kubernetesの名前は、ギリシャ語で「人生の道標」という意味があります。「クーベネテス」、「クーベルネイティス」などと呼ばれています。また、Kubernetesは、名前が長いことから短縮して「k8s」と表記されることもあります。
Kubernetesは、Googleが開発しました。Googleは、以前からインターネットサービスを提供するためにマイクロサービスの基盤を利用していました。Kubernetesは、このマイクロサービスの技術をオープンソースソフトウェアとしてまとめて公開したものです。現在はCNCF(Cloud Native Computing Foundation)が中心となりKubernetesとその周辺ツールの開発、管理を行っています。
Kubernetesは、ベースとなるコンテナの技術としてDockerを採用しています。Dockerコンテナは完全仮想環境化に比べ、ディスク、メモリ消費量を少量で利用できます。またサービスの起動が高速でバージョン管理を容易に行うことができます。Kubernetesを使用すると、コンテナの長所を最大限に活用することができます。
また、Kubernetesは、Google Cloud Platform上のGoogle Kubernetes Engine、AWS上のAmazon Kubernetes Service、AzureのAzure Kubernetes Serviceなど、クラウドベンダーのサービスでも採用されていて、コンテナ型仮想化のデファクトスタンダード的な位置づけになっています。

Kubernetesのアーキテクチャ
Kubernetesは、マスターサーバ(Master Server)とノードサーバ(Node Server)からなるクラスタとして動作します。これをKubernetesクラスタ(Kubernetes cluster)と呼びます。kube-apiserver、etcd、kube-scheduler、kube-controller-manager、clound-controller-managerなどのコンポーネントからできています。

ノードサーバは、実際にコンテナを動作させるコンポーネントです。kubeletがDockerコンテナの管理を行い、kube-proxyがDockerコンテナへの通信の中継を行います。
ユーザーはkubectlコマンドを使って、Masterコンポーネントに対してコンテナの制御の命令を送ります。マスターサーバは、ノードサーバ上で動作するコンテナを管理します。また、ノード上で動作するコンテナを監視し、必要に応じてレプリカセットやデプロイメントの制御を行います。
「Kubernetesのアーキテクチャ」へ
Dockerコンテナの課題
Dockerとは、docker社が開発しているコンテナ型仮想化の実装の1つです。オープンソースとして公開されていています。Dockerコンテナを利用することで様々なメリットがありますが以下のような課題もあげられます。
- 自ホスト上のDockerコンテナの管理しかできない
- ソフトウェア同士を連携させる場合、各Dockerコンテナ同士のネットワーク情報や、連携情報の管理に手間がかかる
- ホストに障害が発生した場合の冗長性確保が難しい
- 大量のDockerコンテナを全て監視しないといけない
以上のこのような問題はKubernetesを使用することで解決されます。
Kubernetesのメリット
Kubernetesには、次のようなメリットがあり、Dockerコンテナの課題を補うことができます。
Podによるコンテナの管理
Dockerでは、それぞれ1つのコンテナに1つのアプリケーションが動作するようにコンテナ化することが推奨されています。そのため、単一ではなくいくつものコンテナを組み合わせて1つの機能を提供するような構成になることがほとんどです。Kubernetesでは、このようなコンテナのセットをPodとして管理します。

Podは、Kubernetesでコンテナを管理するための最小単位で、コンテナの集合体です。コンテナをグループで管理することで使いにくさを解消します。
Pod機能は、Dockerコンテナをまとめてサービス単位で管理する機能です。あらかじめPodを定義しておくことで、サービスの起動や停止をまとめて行うことができます。動作しているPodの管理は、GUIとコマンドラインの両方で行うことが可能です。またKubernetesでは、kubectlコマンドを使って、コマンドラインからPodの制御や確認、削除を行うことができます。
「KubernetesのPod機能」へ
レプリカセット
レプリカセットとは、Kubernetesが複数のPodの複製を自動的にデプロイする機能です。例えば、レプリカ数に3を設定して起動すると、Kubernetesは同じ機能のPodを3つ自動的に配置します。この機能をうまく使うことで、万一コンテナに問題があり停止してしまった場合にも、Kubernetesが自動的にコンテナを起動します。
また、実際にレプリカセットを作成するには、デプロイメントという機能を利用します。デプロイメントは、名称の通りKubernetes上に必要な数のレプリカを配置することです。デプロイメントを行うためにマニュフェストファイルを準備します。
「Kubernetesのレプリカセットとデプロイメント」へ
ボリューム管理
Kubernetesでは、コンテナには一時的なストレージ領域を割り当てて提供します。このストレージ領域は、コンテナの起動中のみ有効で、コンテナを再起動すると再割り当てされます。Kubernetesは、この一時的なコンテナのストレージとは別に永続ストレージを管理します。永続ストレージは、コンテナにマウントして利用することができます。Kubernetesのストレージは、コンテナが動作するすべてのノードから共有できる必要があります。そのため、NFS、Ceph、DRBD-SDSなどのストレージが使われます。
同じDockerコンテナを別々のノードで動作させることができます。これにより冗長性が担保され、ホストが停止した場合の影響を最小限にすることができます。永続ストレージを利用する場合には、必ずデータの冗長化を考慮する必要があります。
「Kubernetesの永続ストレージ」へ
リソース管理
機械学習基盤向けにKubernetesを利用する場合には、貴重なGPUなどのリソースを細かく管理する必要があります。Kubernetesでは、コンテナに割り当てるCPUやメモリなどのリソース量を、取得し細かくコントロールすることができます。また、コンテナで利用しているリソースは、リソースモニターによって確認することができます。リソースモニターの機能はアドオンで実装されていて、Prometheusなどの拡張機能が公開されています。
ジョブ管理
Kubernetes上では、WEBサーバーやデータベースなどの常駐型のサービスだけでなく、一時的な処理や計算にも利用することもできます。このような処理を行なうコンテナのリソースは、Jobと呼ばれています。Jobによって動作したPodは、処理結果を取り出して分析することができるように、処理が終了した後も削除されずに保持されます。また、CronJobでは、定期的にジョブを実行することもできます。
ログ管理
Dockerでは、コンテナがイベントにより出力するログは、標準エラー出力に表示されます。そして、この情報はDocker側で管理します。Kubernetesでは、このログを安全に運用するため、独立したストレージで集中管理するようになっています。また、Kubernetesで用意されているDaemonSetというリソースを利用して、大量のログを管理する手法も使われます。DaemonSetを使うとKubernetesの各ノードに1つのコンテナを起動しておくことができます。それらの機能を使って、Fluentdでログを収集し、ElasticsearchやGraylogなどでデータを収集、解析、保存し、高速に検索するようなシステムを作ることができます。
「統合ログ管理・監視のOSS〜Graylog〜」へ
サービス管理
クラスタ内でコンテナが利用するIPアドレスやポートは、サービスとして定義します。ロードバランササービスと連携することでサービス用IPと内部IPを関連付け、外部からコンテナサービスにアクセスできるよう定義することができます。
ユーザ管理とマルチテナントでの利用
コンテナの仮想マシン空間を複数のセキュリティ的に独立したネームスペースに分離して管理することができます。この機能によって、コンテナ仮想基盤をマルチテナントで利用することができます。部署ごとに管理者を分けたり、ホスティングサーバのようにサブスクライビングすることも可能です。ネームスペース毎にリソース制限を設定することもできます。
また、ロールベースのアクセス制御(RBAC:Role Base Access Control)にも対応しています。そのため利用するユーザやネームスペースに割り当てる権限を調整することもできます。
ダッシュボード
Kubernetesには、管理用のダッシュボードが用意されています。ダッシュボードでは、Podの管理や、コンソールでの操作が可能になります。ダッシュボードから、次のような管理が可能です。
- Kubernetesで管理しているリソースの状況の確認
- Webフォームでのコンテナの設定
- 動作しているPodやコンテナの管理・操作
- ログの管理
「ダッシュボード」へ
Kubernetesの特徴
Kubernetesには管理する上で必須の機能が備わっており、次のような特徴があります。
YAML形式のファイルでリソースを管理
PodやレプリカセットなどのリソースはYAML形式のファイルで定義します。YAMLファイルの書式はKubernetesのAPIによって定義されています。ファイルでソフトウェアの相関を定義するため、このファイルがあればどのKubernetes上でも同じシステムを構築できます。
コンテナのスケジューリング
CPUやメモリの状態を見て、自動的に適切なホストを選択してコンテナを起動します。起動するコンテナの数も容易に指定できます。
アップデートのリスクを低減
コンテナを複製することで容易に検証環境を作成できます。つまり、本番と全く同じ環境での動作確認を行うことが可能です。また、デプロイメントはコンテナに行われた更新の履歴を管理しているため、簡単に元のバージョンに戻すことができます。
実際の運用では、単独のDockerコンテナだけで運用しているわけではないので、より複雑な手順が必要になります。複数のDockerコンテナがデプロイメントで動作している場合、Kubernetesはデプロイメント内のPod数を維持しようとします。通常は、Pod数は設定した上限数を超えることができません。そのため、入れ替え用の新しいPodを起動する場合は、別のデプロイメントを用意して、デプロイメント全体を入れ替える方法やデプロイメント内のPodの最大値を一時的に増やし、新しいPodを起動しながら順次入れ替えていく必要があります。
「コンテナアップデート」へ
ネットワークを仮想化しホスト間で通信
Dockerには、コンテナを自ホスト上でしか管理できないという課題があります。Kubernetesを活用することで、複数のノードで構成されている環境を1つの実行環境のように扱うことができます。そうすることで、別のホストにあるコンテナもまとめて管理できます。
セルフヒーリングによる高い耐障害性
Kubernetesは、常にコンテナの状態を監視しています。そして、万が一コンテナのプロセスが停止した場合、コンテナを起動し、自己修復します。そのため、ノード障害が起きたり、ノード退避などを行ったりしても、サービスを継続できます。

コンテナのオートスケール
サービスを分散する機能として、HorizontalPodAutoscalerとVerticalPodAutoscalerの2つのオートスケールの仕組みを持っています。orizontalPodAutoscalerは、CPUやメモリの利用状況によって、Podのレプリカ数を自動的にスケーリングします。VerticalAutoscalerは、CPUやメモリの利用状況に合わせて、割り当てるリソースの量を自動的にスケーリングします。
Kubernetesのインストール
インストール自体は、それほど難しくありません。マスタサーバもノードサーバも基本的なソフトウェアのインストール手順はほぼ同じです。
- Dockerをインストールする
- Kubernetesのパッケージレポジトリを登録する
- kubernetesのパッケージをインストールする
こうした準備を行った後、マスタサーバではkubeletサービスを起動した後、kubeadm initでマスタサーバの初期化処理を行います。この時、Kubernetesクラスタのトークンが作成されます。ノードサーバでは、kubeadm joinにこのトークンを指定して実行することで、Kubernetesクラスタに参加することができます。
「クラスタの構築」へ
標準化とKubernetesのアーキテクチャ
Kubernetesは、2014年にGoogleによって公開されました。また、2015年には、Docker、CoreOS、マイクロソフト、RedHat、VMWareなどが、オープンコンテナイニシアティブ(OCI)を発足し、標準化が始まりました。
2017年に、OCIは次の2つの仕様を作成しました。
- コンテナのランタイムに関する仕様(Open Container Initiative Runtime Specification)
- コンテナイメージフォーマットに関する仕様(Open Container Initiative Image Format Specification)
その結果、これまでDockerが担ってきた役割が、次のようないくつかの要素に分割され、Kubernetesの動作環境は大きく変化しています。

【従来の関係】
|

【分割された関係】
|
2018年には、高レベルのランタイム、低レベルのランタイムの実装が進み、2019年には標準でこれらのランタイムを利用するようになっています。
高レベルのランタイム
高レベルのランタイムは、CRIに基づいてKubernetesからコンテナに関する処理を引き受けます。具体的には、次のような機能を持っています。
- コンテナの管理
- コンテナイメージの管理
- コンテナレジストリからのイメージのダウンロード
高レベルのランタイムの実装としては、containerd、CRI-O、rktなどがあります。
低レベルのランタイム
OCI Runtime Specificationによって規定されたランタイムです。低レベルのランタイムは、カーネルの機能を使ってコンテナに必要な独立した環境を用意し、実際にコンテナを動作させる役割を担っています。
低レベルのランタイムの実装としては、runc、gVisor、Kata Containerなどがあります。
Kubernetesの限定環境
Kubernetesは、比較的大規模なシステムになってしまうため、学習環境や開発環境を作成するのが複雑で難しいという問題を抱えていました。そのため、小規模なKubernetes環境がいくつか公開されています。
Minikube
Minikubeは、小規模なKubernetes環境を作成するために作られました。1台のPC上に、仮想的に環境を構築することができます。Minikubeは、Windows上でもLinux上でもインストールできます。ただし、動作にはVirtualBoxやKVMなどのハイパーバイザーが必要です。
現在、ハイパーバイザーを利用せずにMinikubeを動作させるための開発が行われていますが、まだ実験段階とされています。Minikubeでは、ランタイムを切り替えて使うことができます。
Microk8s
Microk8sも、小規模なKubernetes環境を作成するために作られました。環境に依存しないパッケージを配布し、管理するための仕組みであるSnappyを使って配布されています。Minikubeとは違い、ハイパーバイザーは不要です。Kubernetesとともに利用することが多いレジストリやストレージなどのツールも内包されていて、簡単に有効化できるのが特徴です。Microk8sでは、containerd、runcをランタイムとして使っています。
Kubernetesの管理ソフトウェア
コンテナのオーケストレーションツールとして、デファクトスタンダードの地位を確立していますが、理解することや使いこなすには専門的な知識が必要となります。それを解決するKubernetesの管理ソフトウェアが公開されています。
Rancher
Rancherとは、コンテナ管理の利便性を向上させることができるプラットフォームのオープンソースソフトウェアです。Rancherは、Kubernetesクラスタの構築・アップデートやPod等のKubernetesリソースの管理を行います。そしてこのような機能をWEB UIから操作することが可能になります。
「Rancher〜Kubernetesの管理ソフトウェア〜」へ
コンテナのプロジェクト管理
コンテナを使用したシステムを開始する時、コンテナのイメージをどこに管理するかを決める必要があります。1つのイメージを使って複数のサーバでコンテナを起動したり、新しいイメージを作成したりする場合に、イメージをどのように管理するのかがコンテナ運用の重要な鍵となります。
GitLab
GitLabは、レジストリと呼ばれるコンテナのイメージを管理するオープンソースソフトウェアです。組織内にプライベートコンテナレジストリを構築することができます。コンテナレジストリ機能や、プロジェクト計画、ソースコード管理、CI/CD、監視、セキュリティ、ドキュメント管理等の機能があります。
「GitLab〜Dockerのプロジェクト管理とレジストリ〜」へ
コンテナのセキュリティ
コンテナ型仮想化は、サーバ仮想化と比べると非常に効率よく運用することが可能です。しかし、コンテナイメージ内には不正なプログラムや脆弱性が含まれる場合があります。そこでセキュリティを高めるために侵入・改ざん検知や脆弱性を見つけ、対策する必要があります。
Falco
Falcoは、コンテナの侵入・改ざん検知を行うオープンソースソフトウェアです。動作中のコンテナ内のイベントを検知して、アラートを送信することができます。Falcoは、ホストOSまたはKubernetes環境にデプロイすることで利用できるため、導入が比較的簡単におこなえます。また診断対象のコンテナに手を入れる必要もありません。
「Falco〜コンテナの侵入・改ざん検知ツール〜」へ
Trivy
Trivyとは、コンテナイメージの脆弱性診断ツールです。TrivyはCIなどでも簡単に組み込んで使用できるようにシンプルに作られています。また、他のスキャナーとは異なり、OSパッケージと言語固有の依存関係の両方をカバーし、組織のソフトウェア開発パイプラインに容易に統合することが可能です。
「Trivy〜コンテナイメージの脆弱性診断ツール〜」へ
Vuls
Vulsもオープンソースソフトウェアの脆弱性診断ツールです。さまざまなソフトウェアの脆弱性診断を行うことができますが、コンテナの脆弱性診断にも対応しています。対象のサーバにエージェントをインストールする必要はなく、SSHで接続して脆弱性診断をおこないます。Vulsは、LinuxのOSパッケージに存在する脆弱性やOSパッケージ対象外のミドルウェアを確認することができます。
「Vuls〜OSSの脆弱性検知ツール〜」へ
デージーネットの取り組み
デージーネットでは、Kubernetesを活用したIot開発基盤を構築しています。オンプレミスでIot開発基盤を構築することで、一定のコストで継続的につかえるIot構築基盤を実現することができます。また、導入を考えているお客様へ構築のコンサルティングも行っています。Kubernetes調査報告書にはログインや詳細情報など記載しています。
デージーネットでは、システム構築サービスを提供したお客様には、導入後支援サービスとして、Open Smart Assistanceを提供しています。Q&A対応、セキュリティ情報提供、障害調査、障害回避、障害時オンサイト対応、障害時システム再構築などがあります。これは、ソフトウェア単体のサポートではなく、Linuxなどを含むシステム全体に対するサポートです。
「Kubernetesを使用したコンテナシステム導入支援事例」へ
OSSのKubernetes「構築事例/情報の一覧」
IoT開発基盤構築にKubernetesを活用しました。これまで、プロジェクト単位でクラウドを契約していましたが、以前よりも多くの部門がIoTを扱うようになりました。IoT開発基盤では大量のデータを扱います。そのため、クラウドを利用するコストメリットが薄れてしまいました。そこで、オンプレミスで大容量のIoT開発基盤を構築し、一定のコストで継続的に使えるIoT開発基盤を実現しました。
各拠点で使用するアプリケーションを効率よく配信するシステムを検討されていました。アプリケーションをコンテナ化し、Kubernetesを利用してアプリケーション配信を行うことが決まっていましたが、実際にどのようにシステムを設計・構築してくかを支援してほしいというご要望をいただきました。コンサルでは、DockerやKubernetesの概要や利用することのメリット、コンテナシステムの構成のご説明、ハンズオンによる操作方法の説明等を行いました。
Kubernetesは、コンテナを管理するためのソフトウェアです。コンテナ間のネットワーク制御や、コンテナの監視、異常時のセルフヒーリング機能など、コンテナを管理する上で必須の機能が備わっています。本書では基本的な概念と使い方を紹介しています。
デモのお申込み
もっと使い方が知りたい方へ
Kubernetesの操作方法や操作性をデモにてご確認いただけます。使い方のイメージを把握したい、使えるか判断したい場合にご活用下さい。デモをご希望の方は、下記よりお申込みいただけます。
OSS情報
- クラスタの構築
- ここでは、CentOS7に最小限のクラスタを構築する方法について説明いたします。
- Pod機能
- ここではPod機能について説明いたします。
- ダッシュボード
- ここでは管理用のダッシュボードについて説明いたします。
- DRBD-SDS
- ここではDRBD-SDSを利用してコンテナサービスの冗長化を実現させる手法について説明いたします。