Container Service for Kubernetes (ACK) クラスターでサービスをデプロイする際、Toleration とノードアフィニティを使用して、Elastic Compute Service (ECS) インスタンスまたは Elastic Container Instance のみを使用するか、ECS リソースが不足している場合に Elastic Container Instance を自動的にリクエストするかを指定できます。さまざまなスケジューリングポリシーを設定して、さまざまなシナリオでリソースをスケーリングできます。
用語
Taint: ノードに設定されるルールで、特定の Pod がノードにスケジュールされないように除外するために使用されます。
Toleration: Pod に適用され、特定の Taint を持つノードにスケジュールされることを許可します。
ノードアフィニティ: 特定のラベルを持つノードに Pod を引き寄せる Pod のプロパティです。以下のタイプのノードアフィニティが含まれます:
requiredDuringSchedulingIgnoredDuringExecution: スケジューリングが行われるために満たす必要があるハード要件です。スケジューラは、これらのルールが満たされた場合にのみ Pod をスケジュールできます。preferredDuringSchedulingIgnoredDuringExecution: スケジューリング中に考慮されるプリファレンスです。スケジューラは、対応するルールを満たすノードを見つけようとします。一致するノードが見つからない場合でも、スケジューラは Pod をスケジュールします。
詳細については、「Taint と Toleration」および「ノードアフィニティ」をご参照ください。
前提条件
Kubernetes v1.22 以降を実行する ACK マネージド Pro 版クラスターが作成されていること。
クラスターに ack-virtual-node コンポーネントがデプロイされており、バージョンが v2.10.0 以降であること。ack-virtual-node コンポーネントのインストールとアップグレードについては、「仮想ノード」をご参照ください。
クラスター内の kube-scheduler コンポーネントのバージョンが 5.9 以降であり、仮想ノードスケジューリングポリシーが有効になっていること。
[アドオン] ページで [Kube Scheduler] を見つけ、[設定] をクリックし、[仮想ノードベースの Pod スケジューリングを有効にする] が選択されていることを確認します。
設定例
ACK クラスターにデプロイされた仮想ノードには、デフォルトの Taint virtual-kubelet.io/provider=alibabacloud:NoSchedule があります。これは、ユーザーが知らないうちに Elastic Container Instance が使用されるのを防ぐためのものです。したがって、Pod を仮想ノードにスケジュールして Elastic Container Instance を使用するには、この Taint に対する Toleration を設定する必要があります。
tolerations:
- key: virtual-kubelet.io/provider
operator: Equal
value: alibabacloud
effect: NoScheduleToleration とノードアフィニティを組み合わせることで、優先順位と要件を持つ混合スケジューリングポリシーを実装して、さまざまなサービスのさまざまなリソースニーズに対応できます。
ECS インスタンスを優先的に使用する: ECS リソースを優先します。クラスター内の ECS リソースが不足している場合は、Elastic Container Instance を使用します。
Elastic Container Instance のみを使用する: クラスター内の Elastic Container Instance のみを使用します。
ECS インスタンスのみを使用する: クラスター内の既存の ECS リソースのみを使用します。
ECS インスタンスを優先的に使用する
仮想ノードにはデフォルトの Taint があるため、Pod を仮想ノードにスケジュールするには、これらの Taint に対する Toleration を設定する必要があります。同時に、ノードアフィニティを設定します。preferredDuringSchedulingIgnoredDuringExecution を使用して、Pod のスケジューリングプリファレンスを指定できます。つまり、type: virtual-kubelet ラベルのないノード (ECS ノード) に Pod を優先的にスケジュールします。
apiVersion: apps/v1
kind: Deployment
metadata:
name: ecs-prefer
spec:
replicas: 2
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
tolerations:
- key: virtual-kubelet.io/provider
operator: Equal
value: alibabacloud
effect: NoSchedule
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: type
operator: NotIn
values:
- virtual-kubelet
containers:
- name: my-container
image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6ノードアフィニティを設定する際には、次の情報に注意してください。
nodeSelectorTermsに複数の条件 (複数のmatchExpressions) を設定した場合、いずれかの条件が満たされていれば、Pod は対応するノードにスケジュールできます (条件は論理 OR 演算で結合されます)。単一のmatchExpressionsに複数の式を設定した場合、すべての式が満たされた場合にのみ、Pod は対応するノードにスケジュールできます (式は論理 AND 演算で結合されます)。preferredDuringSchedulingIgnoredDuringExecutionを使用して ECS の優先スケジューリングを実装する場合、ECS リソースが不足している場合にのみ Pod が Elastic Container Instance にスケジュールされることを保証できません。ECS リソースが十分な場合でも、Pod が Elastic Container Instance にスケジュールされる可能性があります。より高い要件がある場合は、requiredDuringSchedulingIgnoredDuringExecutionを組み合わせて、より詳細な必須ルールを設定することをお勧めします。
特定のラベル (例: label_1=key_1) を持つ ECS ノードに Pod を優先的にデプロイし、これらのノードのリソースが不足している場合に仮想ノードを弾性スケーリングに使用したい場合は、以下の YAML 設定を使用できます。
Elastic Container Instance のみを使用する
仮想ノードにはデフォルトの Taint があるため、Pod を仮想ノードにスケジュールするには、これらの Taint に対する Toleration を設定する必要があります。同時に、ノードアフィニティを設定します。requiredDuringSchedulingIgnoredDuringExecution を使用して、Pod を type: virtual-kubelet ラベルを持つノード (仮想ノード) にスケジュールする必要があることを指定できます。
apiVersion: apps/v1
kind: Deployment
metadata:
name: eci-only
spec:
replicas: 2
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
tolerations:
- key: virtual-kubelet.io/provider
operator: Equal
value: alibabacloud
effect: NoSchedule
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: type
operator: In
values:
- virtual-kubelet
containers:
- name: my-container
image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
ECS インスタンスのみを使用する
仮想ノードにはデフォルトの Taint があるため、これらの Taint に対する Toleration を設定しない限り、Pod は ECS ノードにのみスケジュールされます。
apiVersion: apps/v1
kind: Deployment
metadata:
name: ecs-only
spec:
replicas: 2
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-container
image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6