はじめに

Kubernetes クラスターは、大きなアパートのようなものです。

全員がロビーで暮らしていたら、混乱してしまいます。どの家具が誰のものか分からず、大きな音を立てる住人が全員の生活を妨げるかもしれません。

Namespace はクラスターを論理的に分割し、異なるチーム、環境、アプリケーションがリソースを分けて整理できるようにします。

ResourceQuota は、Namespace が使用できる特定のリソース量を制限します。これにより、1 つのチームやワークロードが共有クラスターの容量を使い果たすことを防げます。

この実験では、次の操作を行います。

  • dev という新しい「アパート」(Namespace)を作成します。
  • そのアパートに厳しい「電力制限」(ResourceQuota)を設定します。
  • 家具(Pod)をアパートに運び入れ、収まるかどうかを確認します。

Namespace を作成する

このステップでは、開発チームのリソースを分離するために、新しい Namespace を作成します。

Namespace は 1 つのクラスター内にある論理的な境界であり、別のクラスターではありません。チームは同じコントロールプレーンと基盤ノードを共有しますが、名前、ポリシー、多くのリソース表示を分離できるため、作業を整理して管理できます。

デフォルトでは、すべてのリソースが default Namespace(ロビー)に入ります。現在存在する Namespace を確認しましょう。

kubectl get namespaces

default、kube-system(建物の管理者がいる場所)、およびいくつかの Namespace が表示されます。

次に、dev アパートを作成します。

kubectl create namespace dev

作成されたことを確認します。

kubectl get namespaces

一覧に dev が表示されます。現時点では、壁も制限もない空のアパートなので、内部に任意のリソースを配置できます。

リソース制限を適用する

次に、ルールを設定します。dev チームがクラスター全体の CPU とメモリを使い果たさないようにします。

ResourceQuota オブジェクトを作成します。これにより、「dev Namespace では、最大で CPU 2 個分とメモリ 2Gi まで使用できる」と設定できます。

共有クラスターでは、CPU とメモリに限りがあるため、Quota が特に重要です。Quota がなければ、1 つの負荷の高いワークロードが公平な割り当てを超えてリソースを消費し、他の利用者にとってクラスターが不安定になる可能性があります。つまり、Quota は使用量を記録するだけの仕組みではなく、安定性を保つための手段でもあります。

quota.yaml という名前のファイルを作成します。

nano quota.yaml

次の設定を貼り付けます。

apiVersion: v1
kind: ResourceQuota
metadata:
  name: dev-quota
  namespace: dev
spec:
  hard:
    requests.cpu: "1"
    requests.memory: 1Gi
    limits.cpu: "2"
    limits.memory: 2Gi

Ctrl+X、Y、Enter を押して保存して終了します。

このルールをクラスターに適用します。

kubectl apply -f quota.yaml

ルールの詳細を確認できます。設定した「Hard」制限と、現在の「Used」使用量(現時点では 0)が表示されます。

kubectl describe resourcequota dev-quota --namespace=dev

Pod をデプロイする

ルールを設定できたので、実際に入居させてみましょう。

重要なルール:アパートに制限がある場合、持ち込むすべての家具にサイズを明示する必要があります。Kubernetes では、Namespace に Quota が設定されている場合、すべての Pod で resources(requests と limits)を明示的に指定する必要があります。指定しないと、建物の管理者である Kubernetes に入口で拒否されます。

ここで、関連する 2 つの考え方が登場します。request は、Pod を配置するときにスケジューラーが保証すべきリソース量を示します。limit は、コンテナが使用できるリソース量の上限です。Quota は Namespace 内の requests と limits を合計し、合計値がポリシーの範囲内に収まるようにします。

pod.yaml という名前のファイルを作成します。

nano pod.yaml

次の内容を貼り付けます。この Pod のサイズを明示的に指定している点に注目してください。

apiVersion: v1
kind: Pod
metadata:
  name: dev-pod
  namespace: dev ## <-- Putting it in the 'dev' apartment
spec:
  containers:
    - name: nginx
      image: nginx
      resources:
        requests:
          memory: "128Mi"
          cpu: "250m"
        limits:
          memory: "256Mi"
          cpu: "500m"

Ctrl+X、Y、Enter を押して保存して終了します。

Pod をデプロイします。

kubectl apply -f pod.yaml

dev Namespace 内で Pod が実行されているか確認します。

kubectl get pods --namespace=dev

Running と表示されるまで待ちます。

次に、Quota の使用量をもう一度確認します。「Used」列の値が増えていることを確認できます。

kubectl describe resourcequota dev-quota --namespace=dev

これで、予算に対するリソース使用量を正しく追跡できています。

分離を確認する

最後に、「アパート」の壁が実際に機能していることを確認します。

Namespace の分離は、主に名前、ポリシー、操作範囲を分ける仕組みです。デフォルトでワークロードが物理的に別のハードウェア上で実行されるという意味ではありません。この違いは、後でノード選択や、より強力な分離メカニズムを学ぶときに重要になります。

dev-pod は dev の内部に配置しました。そのため、ロビー(default)からは表示されないはずです。

default Namespace 内の Pod を一覧表示します。

kubectl get pods

No resources found in default namespace と表示されるか、少なくとも dev-pod が表示されないことを確認してください。

次に、default Namespace に Quota があるか確認します。

kubectl get resourcequota

何も表示されないはずです。設定した電力制限は建物全体ではなく、dev アパートにのみ適用されます。

これにより、Namespace がチーム間のリソースを分離できることを確認できます。

まとめ

この実験では、Kubernetes クラスターの建物管理者になって操作しました。

次の操作を完了しました。

  1. チーム専用の Namespace(dev)を作成しました。
  2. 過剰なリソース消費を防ぐため、厳しい ResourceQuota(電力制限)を設定しました。
  3. これらの制限を守るアプリケーションをデプロイしました。
  4. Namespace 間の壁によって、リソースが分離されることを確認しました。

このようにして、大規模な組織は、互いの作業を妨げることなく、数百のチームで 1 つの Kubernetes クラスターを共有できます。