CNDO 2021、Kubernetesとコンテナの基本的構造をNTTの徳永航平氏が解説

2021年6月9日(水)
松下 康之 - Yasuyuki Matsushita
CNDO 2021から、コンテナの基礎とDocker、Kubernetesをランタイムを中心に速足で解説したセッションを紹介する。

CloudNative Days ONLINE 2021において、クラウドネイティブの基礎となるコンテナとKubernetesのランタイム関連の解説を日本電信電話株式会社の徳永航平氏が講演した。これは「DockerとKubernetesをかけめぐる」と題されたセッションで、コンテナの概要から始まり、Docker、Kubernetesの特徴とランタイムに関する解説を交えて行ったものだ。containerdのメインテナーでもあり、これまでもランタイム関連のセッションを行ってきた徳永氏らしい選択と言えるだろう。徳永氏は、ThinkITで実施したKubeCon 2019バルセロナの座談会にも参加している。

参考:KubeCon Europeに参加した日本人エンジニアとの座談会で見えてきたKubernetesの次の方向性とは

セッションを行った徳永氏

セッションを行った徳永氏

盛りだくさんの内容となったセッション

セッションはコンテナの技術的な解説、代表的な実装としてのDockerの解説、さらにコンテナオーケストレーションのデファクトスタンダードであるKubernetesの解説、そして最後にPodの仕組みとランタイムを解説するというものだ。この盛りだくさんの内容を20分で行うという文字通り「かけめぐる」感じのセッションとなった。

セッションのアジェンダ

セッションのアジェンダ

まずは、コンテナの特徴として仮想マシンと比較して「軽量な実行単位」という日本語で解説を開始する。ここではハードウェアの上にハイパーバイザーを載せて複数のOS、アプリケーションを実行する形態の仮想マシンとコンテナとを比較して、アプリケーションとその実行に必要なファイルをまとめることでシステムを実行するコンテナは、OS部分を含まないことで仮想マシンに比べて軽量であることを説明した。

仮想マシンとコンテナの比較をベースに解説

仮想マシンとコンテナの比較をベースに解説

次のスライドでは、コンテナは単に軽量であるだけではなく、Build-Ship-Runというサイクルを、コンテナをベースに実装できることで高いポータビリティ(相互運用性)を実現できることが重要だと解説した。これはデベロッパーのノートPCからオンプレミス、さらにパブリッククラウドまで運用が可能であることを意味しており、そのために業界標準の仕様が定まっていることがポイントであるとして、次のエコシステムのスライドにも繋がる解説を行った。

Docker

コンテナの標準であるDockerの解説

コンテナの標準であるDockerの解説

2013年にdotCloud(現Docker)社が発表したDockerについて解説を行った。技術としてはすでに存在していたLinuxコンテナを、開発者が使いやすいようにパッケージしたのがDockerだが、徳永氏はBuild-Ship-Runのワークフローを広めたことを評価しているのがポイントだろう。またコメントにはなかったが、Dockerが開発したSwarmというコンテナオーケストレーションツールも記載され、Kubernetesがデファクトスタンダードとなる前の、コンテナ黎明期の歴史を知るエンジニアとしての目配りが感じられた。

Build-Ship-Runの概要を解説。ここではRunの説明を実施

Build-Ship-Runの概要を解説。ここではRunの説明を実施

このスライドではDockerが実行される仕組みを解説している、プロセスだけではなくルートファイルシステムに注目しているのは、後段のPodが利用するストレージの話題への伏線と言ったところだろう。

Docker Buildの中のイメージレイヤーについて解説

Docker Buildの中のイメージレイヤーについて解説

ここではDockerfileによって階層的に生成されるコンテナイメージを解説している。イメージの作成手順書としてDockerfileを紹介し、下から重なるようにイメージが生成されるようすを説明した。

Kubernetes

次のトピックはKubernetesだ。徳永氏はKubernetesのクラスターの中にNodeが存在し、それに対してコントロールプレーンが制御のための仕組みとして稼働し、Podを実行し指令を与えるのはKubectlコマンドというかなり簡素化した図版を用いて解説を行った。ここではレジストリ(Docker Hub)がイメージの格納庫としてShipの役割を果たしていること、イメージをPullする場所として記述されている。CNCF配下のプロジェクトとしてGraduateしたHarborやRed HatがプッシュするQuayは割愛された形になった。

マニフェストを使った宣言的な構成情報を紹介

マニフェストを使った宣言的な構成情報を紹介

ここでは手続き的ではなく宣言的に構成を記述し、その記述と実際のノードの状況を比較しながらKubernetesが自律的に配置する仕組みを解説している。

Kubernetesの管理の最小単位はPod

Kubernetesの管理の最小単位はPod

徳永氏はKubernetesの管理の単位としてのPodを紹介し、複数のコンテナが一つのPodに格納されて実行されることで、仮想的なホストマシンとして実装されることを解説した。ここで仮想NICやIPアドレスなどにも言及し、仮想マシンとの比較を意識しながらの解説であることが感じられる。

Podのさまざまな種類を解説

Podのさまざまな種類を解説

徳永氏はこのセッションにおいて、なるべく平易な日本語での解説に挑戦していると思われるが、Podの解説において「デプロイ」というカタカナを使用しているのは興味深い。DeploymentがKubernetesでのコントローラーであり、Kubernetesにおいてはデプロイという単語が頻繁に出てくることから、敢えてそのままの単語を使っているのだろう。またStatefulsetもデータベースなどに使うデプロイ方式と敢えて簡易に説明し、Kubernetes自体がステートレスなアプリケーションの実装から始まっていることを説明せずに、今やデータベースの実装も可能になったことを解説した。

Deploymentでローリングアップデートを実装

Deploymentでローリングアップデートを実装

このスライドではコンテナオーケストレーションとしてのKubernetesの特徴の一つを解説した。ローリングアップデートはPodに新旧のバージョンが存在する時に、旧バージョンのPodの一つを停止させ、新バージョンを起動、旧バージョンを削除というプロセスを実行できることを解説した。これによって、複数のPodが徐々に新バージョンに置き換えられる仕組みを、デベロッパーや運用担当者が手動でやらなくてもKubernetesの設定で行えることを紹介し、自律的なシステムであることを説明した。

Serviceを使ってPodへのネットワークを抽象化

Serviceを使ってPodへのネットワークを抽象化

ここではサービスディスカバリーについて、Podに付加されたIPアドレスを用いて解説した。これまでのネットワークアプリケーションであれば、固定的にIPを割り振ることでシステムの管理単位としていたものが、Kubernetesにおいては自動的にIPが割り振られることでそれができなくなっている。そして、それを抽象的に行うために導入されたのがServiceというコンセプトであることを説明した。「サービスディスカバリーでPodを公開する」というタイトルは、このコンセプトを頭に入っていないと理解しづらいかもしれない。

Serviceにはさまざまな利用方法/設定方法があることを紹介

Serviceにはさまざまな利用方法/設定方法があることを紹介

このスライドでは、サービスにさまざまな使われ方があることを解説している。Ingressという単語も厳密にはKubernetesのAPIオブジェクトだが、サービスとして利用することもできるためロードバランサーなどと一緒に解説することで、Podへのアクセスの種類としての概念をまとめていると言える。

Kubernetesが持つさまざまな機能例を紹介

Kubernetesが持つさまざまな機能例を紹介

Kubernetesが持つ管理運用機能は多く存在する上に、日夜進化しているために全容を理解するのは困難だ。ここではConfigMapやPersistentVolume、Kubernetesを拡張するCRD(Custom Resource Definition)だけを挙げているが、20分ではこれで限界だろう。

Kubernetesにおけるランタイムの解説

Kubernetesにおけるランタイムの解説

ここからKubernetesにおけるPodの実行管理について解説を始めた徳永氏は、Kubeletが各ノードで実行されるPodを管理していることを解説した後で、このスライドからランタイムの解説を始めた。ここでは高レベルランタイムであるCRIを紹介している。また複数のランタイムを選択できるとして、containerd、CRI-Oを説明した。さらにKubernetes 1.20で非推奨となったKubeletからDockerを呼び出すDockersimについても記載されているのは、ランタイムに詳しいエンジニアとしての心遣いだろうか。

OCIランタイムを解説

OCIランタイムを解説

CRIランタイムから呼び出される低レベルランタイムであるCRIについても解説を行い、このレイヤーにおいても複数のランタイムを利用可能であるとして、runc、Kata Containers、gVisorなどを紹介した。

この後、OCIのリファレンス実装であるruncの解説、Linux由来の技術であるnamespace、cgroupなどについて解説を行った。

セッションのまとめ

セッションのまとめ

最後にコンテナ技術、Docker、Kubernetes、ランタイムの概要など今回の発表をまとめて紹介してセッションを終えた。シンプルな発想のコンテナ技術が、自律的、宣言的でクラウドネイティブなプラットフォームとして進化した形であるKubernetesに至った経路を、文字通り速足でかけめぐった感のある内容となった。コアのテクノロジーが綿々と引き継がれていることを知るには、必要充分だったのではないだろうか。

著者
松下 康之 - Yasuyuki Matsushita
フリーランスライター&マーケティングスペシャリスト。DEC、マイクロソフト、アドビ、レノボなどでのマーケティング、ビジネス誌の編集委員などを経てICT関連のトピックを追うライターに。オープンソースとセキュリティが最近の興味の中心。

連載バックナンバー

クラウドイベント
第15回

CNDO2021、CNCFの提供するクラウドネイティブランドスケープを解説するセッションを紹介

2021/8/5
クラウドネイティブランドスケープを中心にCNCFの活動を解説したセッションを紹介する。
設計/手法/テストイベント
第14回

CNDO 2021、技術的負債を現場のエンジニアが対処する方法を解説

2021/8/2
時間の経過とともに溜まってしまう技術的負債に、現場のエンジニアはどう対処するべきかをAWSのエバンジェリストが解説したセッションを紹介する。
クラウドイベント
第13回

CNDO2021、Kubernetesがない世界とある世界の違いをインフラエンジニアが解説

2021/7/29
Kubernetesがある世界とない世界を比較して、クラウドネイティブになるためのヒントを解説するセッションを紹介する。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています