【ITニュース解説】100 Days of DevOps: Day 50
2025年09月22日に「Dev.to」が公開したITニュース「100 Days of DevOps: Day 50」について初心者にもわかりやすく解説しています。
ITニュース概要
KubernetesでPodを作成し、CPUやメモリのリソース(requestsとlimits)を制御する手順を紹介する。YAMLファイルで設定を定義し、kubectlコマンドで適用・状態を確認する一連の流れを解説する。
ITニュース解説
システムエンジニアを目指す皆さんにとって、現代のシステム開発において「クラウド」や「コンテナ」といった言葉は避けて通れないテーマになっている。その中でも特に重要な技術の一つが「Kubernetes(クバネティス)」だ。Kubernetesは、コンテナ化されたアプリケーションのデプロイ、スケーリング、管理を自動化するための強力なプラットフォームである。今回のテーマは、そのKubernetesにおける最も基本的な構成要素である「Pod(ポッド)」を「リソース制限」付きで作成する方法について解説する。リソース制限とは、アプリケーションが使えるCPUやメモリの量を適切に設定することで、システム全体の安定稼働や効率的な運用を実現するための重要な考え方だ。
まず、Podについて説明する。KubernetesにおいてPodは、一つまたは複数のコンテナが動作する最小のデプロイ可能単位である。通常、一つのPodには密接に関連する一つまたは複数のコンテナが一緒にデプロイされる。例えば、Webサーバーのコンテナと、そのログを監視するエージェントのコンテナが同じPod内で動作するといったケースがある。今回の例では、「httpd-pod」という名前のPod内に、Webサーバーとして広く使われている「httpd」のコンテナを一つだけ配置する。
このPodを作成するには、まずその設計図となる設定ファイルを作成する必要がある。Kubernetesでは、このような設定を「YAML(ヤムル)」という形式のテキストファイルで記述するのが一般的だ。YAMLは、人間が読みやすく、かつ機械も理解しやすいように設計されたデータ記述言語で、キーと値のペアやインデントを使ってデータの階層構造を表現する。この設計図ファイルには、「pod-resource-limits.yaml」という名前を付ける。
このYAMLファイルには、以下のような内容を記述する。
apiVersion: v1は、使用するKubernetes APIのバージョンを指定している。kind: Podは、作成したいKubernetesオブジェクトの種類がPodであることを示している。metadataブロックでは、Podに関するメタデータ、つまり付加情報が定義されており、name: httpd-podでPodの名前を指定する。specブロックは、Podの具体的な仕様を記述する部分であり、containersの配下でPod内に配置するコンテナの詳細を定義する。
containersブロックの中には、一つ目のコンテナとしてname: httpd-containerでコンテナ名を指定し、image: httpd:latestでこのコンテナがどのイメージから作成されるかを定義する。httpd:latestは、Apache HTTP Serverの最新版イメージをDocker Hubなどから取得して使用することを意味する。ここまでの設定で、httpdというWebサーバーが動作するコンテナを含むPodが作成されることになる。
特に注目すべきはresourcesブロックだ。ここが今回のテーマである「リソース制限」を定義する部分である。resourcesブロックには、requestsとlimitsという二つの設定項目がある。
requestsは、このコンテナが正常に動作するために「最低限必要とする」リソースの量をKubernetesに要求する設定だ。Kubernetesはこのrequestsの値を見て、どのノード(サーバー)にPodを配置するかを決定する。例えば、メモリが足りないノードには、このPodは配置されない。今回の例では、memory: "15Mi"(15メガバイト)とcpu: "100m"(100ミリコア、つまりCPUの0.1コア分)を要求している。CPUの単位である「m」はミリコアを意味し、1000mが1コアに相当する。
一方、limitsは、このコンテナが「最大で消費できる」リソースの量の上限を設定する。これは、万が一コンテナが暴走してリソースを大量に消費しようとした場合に、他のコンテナやシステム全体に影響が及ぶのを防ぐための非常に重要な設定だ。今回の例では、memory: "20Mi"(20メガバイト)とcpu: "100m"(100ミリコア)が上限として設定されている。
requestsとlimitsが設定されていることで、Kubernetesクラスタの安定性が向上する。メモリの場合、コンテナがlimitsで設定された上限を超えてメモリを消費しようとすると、Kubernetesは自動的にそのコンテナを強制終了させる。これを「OOMKilled(Out Of Memory Killed)」と呼ぶ。これにより、特定のコンテナがメモリをすべて使い果たしてしまい、ノード全体が不安定になるのを防ぐ。CPUの場合、コンテナがlimitsで設定された上限を超えてCPUを使おうとすると、そのコンテナのCPU使用が「スロットリング」される。つまり、処理速度が意図的に抑制され、上限を超えないように調整される。これにより、CPUを独占して他のプロセスやコンテナの動作を妨げることを防ぐことができる。このように、リソースのrequestsとlimitsを適切に設定することは、アプリケーションの安定稼働とクラスタの健全性を保つ上で不可欠なのだ。
設定ファイルが完成したら、次はその設定をKubernetesクラスタに「適用」する。Kubernetesクラスタを操作するための主要なコマンドラインツールが「kubectl(キューブコントロール)」だ。このkubectlコマンドを使って、先ほど作成したYAMLファイルをクラスタに送り込み、Podを作成する。具体的には、kubectl apply -f pod-resource-limits.yamlというコマンドを実行する。-fオプションは、ファイル(file)を指定することを意味する。このコマンドを実行すると、KubernetesはYAMLファイルの内容を読み込み、指定された設定に基づいてPodを作成し始める。コマンドの実行結果としてpod/httpd-pod createdと表示されれば、PodがKubernetesクラスタに正常に登録されたことを示している。これは、KubernetesがこのPodを作成するように指示を受け付けたことを意味する。
Podがクラスタに登録されたら、最後にそのPodが意図通りに動作しているかを確認する。これには、再びkubectlコマンドを使用する。kubectl get pods httpd-podというコマンドを実行することで、「httpd-pod」という名前のPodの現在の状態を取得できる。
このコマンドの出力には、Podの名前(NAME)、コンテナの準備状況(READY)、Podの現在の状態(STATUS)、再起動回数(RESTARTS)、そしてPodが作成されてからの経過時間(AGE)が表示される。今回の実行結果では、NAMEがhttpd-pod、READYが1/1、STATUSがRunning、RESTARTSが0、AGEが72sと表示されている。
READYが1/1であることは、Pod内の全コンテナ(この場合は1つ)が正常に起動し、準備が完了していることを意味する。STATUSがRunningであることは、Podが現在正常に動作中であることを示している。RESTARTSが0であることから、Podが途中で予期せぬ終了をして再起動したことがない、つまり安定して動作していることがわかる。これらの表示を確認することで、リソース制限付きのhttpd-podがKubernetesクラスタ上で正常に作成され、動作していることを最終的に確認できるのだ。
このように、Kubernetesを使ってアプリケーションをデプロイする際には、Podの作成方法だけでなく、リソースのrequestsとlimitsを適切に設定し、クラスタ全体のパフォーマンスと安定性を確保することが非常に重要になる。これは、システムの可用性を高め、予期せぬ障害からサービスを守るための基本的ながらも強力な手段となる。システムエンジニアを目指す上で、このようなKubernetesの基本的な概念と操作は、これからのキャリアにおいて非常に役立つ知識となるだろう。