Toleration とノードアフィニティを使用して、Pod を Elastic Compute Service (ECS)、Elastic Container Instance (ECI)、またはその両方にスケジュールし、優先度に基づくフォールバックを実現します。
基本概念
-
Taint:ノード上のルールで、特定の Pod がそのノードにスケジュールされるのを防ぎます。
-
Toleration:Pod 側の設定で、ノードの Taint を無視できるようにします。
-
ノードアフィニティ:特定のラベルを持つノードに Pod を引き寄せるための Pod のプロパティです。次の 2 種類があります。
-
requiredDuringSchedulingIgnoredDuringExecution:必須要件です。Pod は、一致するノードにのみスケジュールされます。 -
preferredDuringSchedulingIgnoredDuringExecution:優先的な条件です。スケジューラはルールへの一致を試みますが、一致が見つからない場合は別の場所に Pod をスケジュールします。
-
Taints and Tolerations と Node affinity をご参照ください。
前提条件
-
Kubernetes v1.22 以降を実行しているACK マネージド Pro クラスター。
-
ack-virtual-node アドオンのバージョン 2.10.0 以降 (「仮想ノード」を参照)。
-
仮想ノードのスケジューリングポリシーが有効になっている、バージョン 5.9 以降のkube-schedulerコンポーネント。
アドオン管理 ページで、[Kube Scheduler] を見つけ、設定 をクリックし、仮想ノードスケジューリングの有効化 が選択されていることを確認します。
設定例
ACK クラスターの仮想ノードには、デフォルトで Taint virtual-kubelet.io/provider=alibabacloud:NoSchedule が設定されています。仮想ノード (ECI) に Pod をスケジュールするには、この Taint に対する Toleration を追加する必要があります。
例:
tolerations:
- key: virtual-kubelet.io/provider
operator: Equal
value: alibabacloud
effect: NoSchedule
Toleration とノードアフィニティを組み合わせて、さまざまなリソース要件に対応するスケジューリングポリシーを作成できます。
-
ECS の優先:デフォルトで ECS を使用し、ECS のキャパシティが不足している場合は ECI にフォールバックします。
-
ECI のみの使用:ECI リソースのみを使用します。
-
ECS のみの使用:既存の ECS リソースのみを使用します。
ECS の優先
デフォルトの Taint に対する Toleration を追加し、preferredDuringSchedulingIgnoredDuringExecution を使用して、type: virtual-kubelet ラベルを持たないノード (ECS ノード) を優先します。
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は OR で結合されます。いずれかのmatchExpressionsが一致すると、ポッドがスケジュールされます。1 つのmatchExpressions内の複数の式は AND で結合されます。すべての式が一致する必要があります。 -
preferredDuringSchedulingIgnoredDuringExecutionは ECI のみへのフォールバックを保証するものではありません。ECS のキャパシティが十分な場合でも、Pod が ECI に配置される可能性があります。より厳密に制御するには、requiredDuringSchedulingIgnoredDuringExecutionと組み合わせてください。
次の YAML は、特定のラベル (例:label_1=key_1) を持つ ECS ノードを優先し、キャパシティが必要な場合は仮想ノードにフォールバックします。
ECI のみの使用
デフォルトの仮想ノード Taint に対する Toleration を追加し、requiredDuringSchedulingIgnoredDuringExecution を使用して 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 があるため、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