Kubernetes〜コンテナ管理ツール〜Kubernetes〜コンテナ管理ツール〜+目次Kubernetes〜コンテナ管理ツール〜Kubernetesクラスタの構築KubernetesのPod機能KubernetesのレプリカセットとデプロイメントKubernetesのアーキテクチャKubernetesのコンテナアップデートKubernetesのローリングアップデートKubernetesのダッシュボードKubernetesの永続ストレージGitLab〜OSSコンテナレジストリ〜DRBD-SDSとKubernetesKubernetesとはKubernetesとは、コンテナの管理を自動化するためのソフトウェアで、コンテナ・オーケストレーション・ツールと呼ばれています。Kubernetesは、Googleが開発しました。Googleは、以前からインターネットサービスを提供するためにマイクロサービスの基盤を利用していました。Kubernetesは、このマイクロサービスの技術をオープンソースソフトウェアとしてまとめて公開したものです。Foundation)がKubernetesとその周辺ツールの開発、管理を行っています。Kubernetesは、ベースとなるコンテナの技術としてDockerを採用しています。Dockerコンテナは完全仮想環境化に比べ、ディスク、メモリ消費量を少量で利用できます。サービスの起動が高速でバージョン管理を容易に行うことができます。Kubernetesを使用すると、コンテナの長所を最大限に活用することができます。Serviceなど、クラウドベンダーのサービスでも採用されていて、コンテナ型仮想化のデファクトスタンダード的な位置づけになっています。KubernetesのアーキテクチャKubernetesは、マスターサーバとノードサーバからなるクラスタとして動作します。これをKubernetesクラスタと呼びます。ノードサーバは、実際にコンテナを動作させるコンポーネントです。ユーザはkubectlコマンドを使って、Masterコンポーネントに対してコンテナの制御の命令を送ります。マスターサーバは、ノードサーバ上で動作するコンテナを管理します。ノード上で動作するコンテナを監視し、必要に応じてレプリカセットやデプロイメントの制御を行います。KubernetesのアーキテクチャDockerコンテナの課題Dockerコンテナを利用することで様々なメリットがありますが次のような課題もあげられます。自ホスト上のDockerコンテナの管理しかできないソフトウェア同士を連携させる場合、各Dockerコンテナ同士のネットワーク情報や、連携情報の管理に手間がかかるホストに障害が発生した場合の冗長性確保が難しい大量のDockerコンテナを全て監視しないといけないこのような問題はKubernetesを使用することで解決されます。KubernetesのメリットKubernetesには、次のようなメリットがあり、Dockerコンテナの課題を補うことができます。Podによるコンテナの管理Dockerでは、1つのコンテナに1つのアプリケーションが動作するようにコンテナ化することが推奨されています。そのため、いくつものコンテナを組み合わせて1つの機能を提供するような構成になることがほとんどです。Kubernetesでは、このようなコンテナのセットをPodとして管理します。Podは、Kubernetesでコンテナを管理するための最小単位で、コンテナの集合体です。コンテナをグループで管理することで使いにくさを解消します。KubernetesのPod機能レプリカセットレプリカセットとは、Kubernetesが複数のPodの複製を自動的にデプロイする機能です。レプリカ数に3を設定して起動すると、Kubernetesは同じ機能のPodを3つ自動的にデプロイします。この機能をうまく使うことで、万一コンテナに問題があり停止してしまった場合にも、Kubernetesが自動的にコンテナを起動します。Kubernetesのレプリカセットとデプロイメントボリューム管理Kubernetesでは、コンテナには一時的なストレージ領域を割り当てて提供します。このストレージ領域は、コンテナの起動中のみ有効で、コンテナを再起動すると再割り当てされます。Kubernetesは、この一時的なコンテナのストレージとは別に永続ストレージを管理します。永続ストレージは、コンテナにマウントして利用することができます。Kubernetesのストレージは、コンテナが動作するすべてのノードから共有できる必要があります。そのため、NFS、Ceph、DRBD-SDSなどのストレージが使われます。けにKubernetesを利用する場合には、貴重なGPUなどのリソースを細かく管理する必要があります。Kubernetesでは、コンテナに割り当てるCPUやメモリなどのリソース量を、細かくコントロールすることができます。コンテナで利用しているリソースは、リソースモニターによって確認することができます。リソースモニターの機能はアドオンで実装されていて、Prometheusなどのアドオンが公開されています。ジョブ管理Kubernetes上では、WEBサーバやデータベースなどの常駐型のサービスだけでなく、一時的な処理や計算にも利用することもできます。このような処理を行なうコンテナのリソースは、Jobと呼ばれています。Jobによって動作したPodは、処理結果を取り出して分析することができるように、処理が終了した後も削除されずに保持されます。CronJobでは、定期的にジョブを実行することもできます。ログ管理Dockerでは、コンテナがイベントにより出力するログは、標準エラー出力に出力されます。この情報はDocker側で管理します。Kubernetesでは、このログを安全に運用するため、独立したストレージで集中管理するようになっています。Kubernetesで用意されているDaemonSetというリソースを利用して、大量のログを管理する手法も使われます。DaemonSetを使うとKubernetesの各ノードに1つのコンテナを起動しておくことができます。この機能を使って、Fluentdでログを収集し、ElasticsearchやGraylogなどでデータを収集、解析、保存し、高速に検索するようなシステムを作ることができます。統合ログ管理・監視のOSS〜Graylog〜ユーザ管理とマルチテナントでの利用Kubernetesは、コンテナの仮想マシン空間を複数のセキュリティ的に独立したネームスペースに分離して管理することができます。この機能によって、コンテナ仮想基盤をマルチテナントで利用することができます。部署ごとに管理者を分けたり、ホスティングサーバのようにサブスクライビングすることも可能です。ネームスペース毎にリソース制限を設定することもできます。Control)にも対応しています。そのため利用するユーザやネームスペースに割り当てる権限を調整することもできます。ダッシュボードKubernetesには、管理用のダッシュボードが用意されています。ダッシュボードでは、Podの管理や、コンソールでの操作が可能になります。Kubernetesダッシュボードから、次のような管理が可能です。Kubernetesで管理しているリソースの状況の確認Webフォームでのコンテナの設定Kubernetes上で動作しているPodやコンテナの管理・操作ログの管理KubernetesのダッシュボードKubernetesの特徴Kubernetesには管理する上で必須の機能が備わっており、次のような特徴があります。コンテナのスケジューリングKubernetesは、CPUやメモリの状態を見て、自動的に適切なホストを選択してコンテナを起動します。起動するコンテナの数も容易に指定できます。アップデートのリスクを低減Kubernetesでは、コンテナを複製することで容易に検証環境を作成できます。本番と全く同じ環境での動作確認を行うことが可能です。Kubernetesのデプロイメントはコンテナに行われた変更の履歴を管理しているため、簡単に元のバージョンに戻すことができます。Kubernetesのコンテナアップデートネットワークを仮想化しホスト間で通信Dockerには、コンテナを自ホスト上でしか管理できないという課題があります。Kubernetesを活用することで、複数のノードで構成されている環境を1つの実行環境のように扱うことができます。することで、別のホストにあるコンテナもまとめて管理できます。セルフヒーリングによる高い耐障害性Kubernetesは、常にコンテナの状態を監視しています。万が一コンテナのプロセスが停止した場合、コンテナを起動し、自己修復します。そのため、ノード障害が起きたり、ノード退避などを行ったりしても、サービスを継続できます。コンテナのオートスケールKubernetesは、HorizontalPodAutoscalerとVerticalPodAutoscalerの2つのオートスケールの仕組みを持っています。orizontalPodAutoscalerは、CPUやメモリの利用状況によって、Podのレプリカ数を自動的にスケーリングします。VerticalAutoscalerは、CPUやメモリの利用状況に合わせて、割り当てるリソースの量を自動的にスケーリングします。KubernetesのインストールKubernetesのインストール自体は、それほど難しくありません。マスタサーバもノードサーバも基本的なソフトウェアのインストール手順はほぼ同じです。initでマスタサーバの初期化処理を行います。この時、Kubernetesクラスタのトークンが作成されます。joinにこのトークンを指定して実行することで、Kubernetesクラスタに参加することができます。標準化とKubernetesのアーキテクチャKubernetesは、2014年にGoogleによって公開されました。2015年には、Docker、CoreOS、マイクロソフト、RedHat、VMWareなどが、オープンコンテナイニシアティブ(OCI)を発足し、標準化が始まりました。2017年に、OCIは次の2つの仕様を作成しました。Specification)その結果、これまでDockerが担ってきた役割が、次のようないくつかの要素に分割され、Kubernetesの動作環境は大きく変化しています。【分割されたDockerとKubernetesの関係】2018年には、高レベルのランタイム、低レベルのランタイムの実装が進み、2019年にはKubernetesも標準でこれらのランタイムを利用するようになっています。高レベルのランタイム高レベルのランタイムは、CRIに基づいてKubernetesからコンテナに関する処理を引き受けます。具体的には、次のような機能を持っています。コンテナの管理コンテナイメージの管理コンテナレジストリからのイメージのダウンロード高レベルのランタイムの実装としては、containerd、CRI-O、rktなどがあります。Specificationによって規定されたランタイムです。低レベルのランタイムは、カーネルの機能を使ってコンテナに必要な独立した環境を用意し、実際にコンテナを動作させる役割を担っています。Containerなどがあります。Kubernetesの限定環境Kubernetesは、比較的大規模なシステムになってしまうため、学習環境や開発環境を作成するのが難しいという問題を抱えていました。そのため、小規模なKubernetes環境がいくつか公開されています。MinikubeMinikubeは、小規模なKubernetes環境を作成するために作られました。1台のPC上に、仮想的にKubernetesの環境を構築することができます。Minikubeは、Windows上でもLinux上でもインストールできます。動作にはVirtualBoxやKVMなどのハイパーバイザーが必要です。現在、ハイパーバイザーを利用せずにMinikubeを動作させるための開発が行われていますが、まだ実験段階とされています。Minikubeでは、ランタイムを切り替えて使うことができます。Microk8sMicrok8sも、小規模なKubernetes環境を作成するために作られました。環境に依存しないパッケージを配布し、管理するための仕組みであるSnappyを使って配布されています。Minikubeとは違い、ハイパーバイザーは不要です。Kubernetesとともに利用することが多いレジストリやストレージなどのツールも内包されていて、簡単に有効化できるのが特徴です。Microk8sでは、containerd、runcをランタイムとして使っています。デージーネットの取り組みデージーネットでは、Kubernetesを活用したIot開発基盤を構築しています。Kubernetesを使用してオンプレミスでIot開発基盤を構築することで、一定のコストで継続的につかえるIot構築基盤を実現することができます。DockerやKubernetesの導入を考えているお客様へ構築のコンサルティングも行っています。Kubernetesを使用したコンテナシステム導入支援事例OSSのKubernetes「構築事例/情報の一覧」IoT開発基盤構築でのKubernetes活用構築事例IoT開発基盤構築にKubernetesを活用しました。これまで、プロジェクト単位でクラウドを契約していましたが、以前よりも多くの部門がIoTを扱うようになりました。IoT開発基盤では大量のデータを扱います。そのため、クラウドを利用するコストメリットが薄れてしまいました。そこで、オンプレミスで大容量のIoT開発基盤を構築し、一定のコストで継続的に使えるIoT開発基盤を実現しました。使用するアプリケーションを効率よく配信するシステムを検討されていました。アプリケーションをコンテナ化し、Kubernetesを利用してアプリケーション配信を行うことが決まっていましたが、実際にどのようにシステムを設計・構築してくかを支援してほしいというご要望をいただきました。サルでは、DockerやKubernetesの概要や利用することのメリット、Kubernetesを使用したコンテナシステムの構成のご説明、ハンズオンによる操作方法の説明等を行いました。Kubernetes調査報告書Kubernetesは、コンテナを管理するためのソフトウェアです。コンテナ間のネットワーク制御や、コンテナの監視、異常時のセルフヒーリング機能など、コンテナを管理する上で必須の機能が備わっています。本書では基本的なKubernetesの概念と使い方を紹介しています。デモのお申込みもっと使い方が知りたい方へKubernetesの操作方法や操作性をデモにてご確認いただけます。使い方のイメージを把握したい、使えるか判断したい場合にご活用下さい。デモをご希望の方は、下記よりお申込みいただけます。OSS情報「Kubernetes」Kubernetes〜コンテナ管理ツール〜ここでは、コンテナの管理を自動化するためのソフトウェア「Kubernetes」を紹介します。Kubernetesクラスタの構築ここでは、CentOS7に最小限のクラスタを構築する方法について説明いたします。KubernetesのPod機能ここではPod機能について説明いたします。Kubernetesのレプリカセットとデプロイメントここではデプロイメントという機能を利用してレプリカセットを作成する方法について説明いたします。Kubernetesのアーキテクチャここではアーキテクチャについて説明いたします。コンテナのアップデートここでは、コンテナをアップデートする場合の手法について説明いたします。ローリングアップデートここでは、ローリングアップデート機能について説明いたします。ダッシュボードここでは管理用のダッシュボードについて説明いたします。Kubernetesの永続ストレージここでは永続ストレージについて説明いたします。GitLab〜Dockerのプロジェクト管理とレジストリ〜GitLabは、GitHubと同様の機能を提供するプロジェクト管理ツールで、コンテナのコード管理とレポジトリマネージャの機能を提供します。ここではGitLabのコンテナレジストリについて説明いたします。DRBD-SDSここではDRBD-SDSを利用してコンテナサービスの冗長化を実現させる手法について説明いたします。