Kubernetes のコードンとアンコードンコマンド

KubernetesBeginner
オンラインで実践に進む

はじめに

Kubernetes クラスタでは、ノードは「準備完了」や「準備未完了」などのさまざまな状態になることがあります。cordon コマンドと uncordon コマンドは、特定のノード上のポッドのスケジューリングを制御するために使用されます。cordon コマンドはノードを「スケジューリング不可」にマークして、そのノードに新しいポッドがスケジューリングされないようにします。一方、uncordon コマンドはノードを再び「スケジューリング可能」にマークして、そのノードに新しいポッドがスケジューリングされるようにします。この実験では、Kubernetes クラスタのノード上のポッドのスケジューリングを制御するためにこれらのコマンドをどのように使用するかを探ります。

Minikube クラスタを起動する

リソースを作成する前に、動作中の Kubernetes クラスタが必要です。Minikube は、ローカルマシン上で動作する軽量の Kubernetes 環境です。

  1. 作業ディレクトリに移動する:

    ターミナルを開き、デフォルトのプロジェクトフォルダに移動します。

    cd /home/labex/project
  2. Minikube を起動する:

    Minikube を起動して Kubernetes クラスタを初期化します。

    minikube start
    • このコマンドは、ローカルマシン上に単一ノードの Kubernetes クラスタをセットアップします。
    • Minikube の起動には、システムの性能に応じて数分かかる場合があります。
  3. Minikube が動作していることを確認する:

    Minikube クラスタの状態を確認します。

    minikube status
    • kubeletapiserverなどのコンポーネントがRunningと表示されていることを確認します。
    • クラスタが動作していない場合は、minikube startを再度実行します。

Minikube の起動に問題がある場合は、必要に応じてminikube deleteを使用して環境をリセットします。

ノードのコードン化

このステップでは、cordon コマンドを使用してノードを「スケジューリング不可」にマークし、そのノードに新しいポッドがスケジューリングされないようにします。手順は以下の通りです。

  1. 次のコマンドを使用してクラスタ内のノードを一覧表示します。
kubectl get nodes
  1. 次のコマンドを使用してノードをコードンします。
kubectl cordon minikube
  1. 次のコマンドを使用してノードのステータスの SchedulingDisabled フィールドを確認することで、ノードがコードンされたことを確認します。
kubectl get node | grep SchedulingDisabled

ノードのアンコードン化

このステップでは、uncordon コマンドを使用してノードを再び「スケジューリング可能」にマークし、そのノードに新しいポッドがスケジューリングされるようにします。手順は以下の通りです。

  1. 次のコマンドを使用してノードのアンコードンを行います。
kubectl uncordon minikube
  1. 次のコマンドを使用してノードのステータスの SchedulingDisabled フィールドを確認することで、ノードがアンコードンされたことを確認します。
kubectl get node | grep SchedulingDisabled

ポッド付きノードのコードン化とアンコードン化

このステップでは、ポッドが実行されている間にノードをコードンしてアンコードンするシナリオをシミュレートします。手順は以下の通りです。

  1. 次のコマンドを実行して /home/labex/project/ ディレクトリに移動します。
cd /home/labex/project/
  1. /home/labex/project/ ディレクトリに次の YAML ファイルを使用して、複数コピーの "deploy.yaml" という名前のデプロイメントを作成します。
## deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.16
          ports:
            - containerPort: 80
  1. 次のコマンドを使用してノードをコードンします。
kubectl cordon minikube
  1. 次のコマンドを使用して YAML ファイルを適用します。
kubectl apply -f deploy.yaml
  1. 次のコマンドを使用してノード上で実行されているポッドを一覧表示します。
kubectl get pods -o wide

ポッドが適切にスケジューリングされて起動しているかどうかを確認します。

  1. 次のコマンドを使用してノードのアンコードンを行います。
kubectl uncordon minikube
  1. 次のコマンドを使用して、アンコードンされたノードにポッドが再スケジューリングされていることを確認するため、ノード上で実行されているポッドの状態を確認します。
kubectl get pods -o wide

ラベルを使用したノードのコードン化とアンコードン化

このステップでは、特定の基準に基づいてノードをコードンおよびアンコードンするためにラベルを使用します。手順は以下の通りです。

  1. 次のコマンドを使用してクラスタ内のノードにラベルを付けます。
kubectl label nodes minikube org=labex
  1. 次のコマンドを使用して、指定されたラベルを持つノードをコードンします。
kubectl cordon -l org=labex
  1. 次のコマンドを使用して、ノードのステータスの SchedulingDisabled フィールドを確認することで、ノードがコードンされたことを確認します。
kubectl get node -l org=labex | grep SchedulingDisabled
  1. 次のコマンドを使用して、指定されたラベルを持つノードのアンコードンを行います。
kubectl uncordon -l org=labex
  1. 次のコマンドを使用して、ノードのステータスの SchedulingDisabled フィールドを確認することで、ノードがアンコードンされたことを確認します。
kubectl get node -l org=labex | grep SchedulingDisabled

まとめ

この実験では、Kubernetes で cordonuncordon コマンドを使用してノード上のポッドのスケジューリングを制御する方法を検討しました。実行中のポッドがある場合でも、ノードをどのようにコードンおよびアンコードンするか、および特定の基準に基づいてノードを選択的にコードンおよびアンコードンするためにラベルをどのように使用するかを学びました。これらのコマンドは、Kubernetes クラスタ内のポッドの可用性とレジリエンスを管理するのに役立ちます。