Kubernetes ポッドのスケジューリングの基本
Kubernetes は、コンテナ化されたアプリケーションの展開とスケーリングを管理するための高度なスケジューリング機能を備えた強力なコンテナオーケストレーション プラットフォームです。Kubernetes スケジューリングの核心は、ポッドの概念であり、これは Kubernetes クラスタによってスケジュールされ、管理される最小の展開可能単位です。
このセクションでは、Kubernetes ポッドのスケジューリングの基本的な側面、すなわち基本的なスケジューリング プロセス、ポッドのリソース要件、および一般的なスケジューリング戦略について解説します。
Kubernetes ポッドの理解
Kubernetes ポッドは、Kubernetes クラスタの基本的な構成要素です。ポッドは、1 つ以上のコンテナのグループであり、共有ストレージとネットワーク リソースを持ち、コンテナを実行する方法の仕様があります。ポッドは、Kubernetes によって作成、スケジュールされ、管理される最小の展開可能単位です。
graph LR
Pod --> Container1
Pod --> Container2
Pod --> SharedVolume
Pod --> SharedNetwork
Kubernetes のスケジューリング プロセス
Kubernetes スケジューラは、クラスタ内の適切なノードにポッドを割り当てる責任があります。スケジューリング プロセスには、次のステップが含まれます。
- ポッドの作成:新しいポッドが作成され、Kubernetes API サーバーに追加されます。
- フィルタリング:スケジューラは、ポッドのリソース要件とその他の制約に基づいて、利用可能なノードをフィルタリングします。
- スコア付け:スケジューラは、リソースの利用可能性、アフィニティ、その他のスケジューリング ポリシーなどのさまざまな要因に基づいて、フィルタリングされたノードにスコアを付けます。
- 選択:スケジューラは、最も高いスコアを持つノードを選択し、そのノードにポッドをバインドします。
sequenceDiagram
participant API Server
participant Scheduler
participant Node1
participant Node2
API Server->>Scheduler: New Pod created
Scheduler->>Node1: Filter and score
Scheduler->>Node2: Filter and score
Scheduler->>API Server: Bind Pod to Node1
ポッドのリソース要件
Kubernetes のポッドは、CPU やメモリなどの特定のリソース要件を持つことができます。これらのリソース要件は、ポッド仕様に定義されており、スケジューラによってポッドに最適なノードを見つけるために使用されます。
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
containers:
- name: example-container
image: nginx
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 256Mi
上記の例では、ポッドは 100 ミリコアの CPU 要求と 128 MiB のメモリ要求を持っています。また、ポッドは 500 ミリコアの CPU 制限と 256 MiB のメモリ制限を持っています。
スケジューリング戦略
Kubernetes は、さまざまなポッド配置要件を処理するためのさまざまなスケジューリング戦略を提供しています。一般的なスケジューリング戦略には、次のものがあります。
- デフォルト スケジューリング:デフォルトの Kubernetes スケジューラは、リソースの利用可能性とその他の制約に基づいて、ポッドをノードに割り当てます。
- ノード アフィニティ:ポッドは、ラベルとノード セレクターに基づいて特定のノードにスケジュールされることができます。
- ポッド アフィニティとアンチ アフィニティ:ポッドは、ポッド間の関係に基づいて、同じノードまたは異なるノード上で実行するようにスケジュールされることができます。
- テイントとトレラション:ノードは、特定のポッドに対して利用不可にマークされることができ、ポッドは特定のテイントを許容するように構成することができます。
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: environment
operator: In
values:
- production
tolerations:
- key: "node-role.kubernetes.io/master"
operator: "Exists"
effect: "NoSchedule"
containers:
- name: example-container
image: nginx
上記の例では、ポッドは environment=production
のラベルが付いたノードにスケジュールされるように構成されており、node-role.kubernetes.io/master
のテイントを許容するようにも構成されています。