Container Service for Kubernetes (ACK) クラスターでサービスをデプロイする際、Toleration とノードアフィニティを使用して、Elastic Compute Service (ECS) リソースのみを使用するか、Elastic Container Instance (ECI) リソースのみを使用するかを指定できます。また、ECS リソースが不足している場合に ECI リソースを自動的にリクエストすることもできます。これにより、さまざまなワークロードシナリオの弾力的なリソース要件を満たすスケジューリングポリシーを設定できます。
関連概念
-
Taint:ノードに設定されるルールで、特定の Pod がそのノードにスケジュールされるのを拒否します。
-
Toleration:Pod に適用されるプロパティで、スケジューリング中にノードの Taint を無視できるようにします。
-
ノードアフィニティ:特定のラベルを持つノードに Pod をスケジュールする Pod のプロパティです。これには 2 つのタイプがあります:
-
requiredDuringSchedulingIgnoredDuringExecution:ハード要件です。スケジューラが Pod をスケジュールするためには、このルールが満たされる必要があります。 -
preferredDuringSchedulingIgnoredDuringExecution:ソフト要件です。スケジューラはルールを満たすノードを見つけようとします。一致するノードが見つからない場合でも、スケジューラは Pod をスケジュールします。
-
詳細については、「Taints and Tolerations」および「ノードアフィニティ」をご参照ください。
前提条件
-
クラスターは ACK Managed Cluster Pro Edition であり、そのバージョンは v1.22 以降です。
-
v2.10.0 以降の ack-virtual-node コンポーネントがクラスターにデプロイされていること。ack-virtual-node コンポーネントのインストールとアップグレードの詳細については、「仮想ノード」をご参照ください。
-
クラスター内の kube-scheduler コンポーネントのバージョンが v5.9 以降であり、仮想ノードのスケジューリングポリシーが有効になっていること。
アドオン管理 ページで Kube Scheduler を見つけ、設定 をクリックし、仮想ノードスケジューリングの有効化 が選択されていることを確認します。
設定例
ACK クラスターにデプロイされた仮想ノードには、デフォルトの Taint virtual-kubelet.io/provider=alibabacloud:NoSchedule があります。この Taint は、ECI リソースが意図せず使用されるのを防ぎます。Pod を仮想ノードにスケジュールして ECI リソースを使用するには、この Taint に対する Toleration を設定する必要があります。
tolerations:
- key: virtual-kubelet.io/provider
operator: Equal
value: alibabacloud
effect: NoSchedule
Toleration とノードアフィニティを組み合わせることで、優先ルールと必須ルールの両方を持つハイブリッドスケジューリングポリシーを実装できます。これにより、さまざまなサービスの異なるリソース要件を満たすことができます。
-
ECS の優先:ECS リソースの使用を優先します。クラスター内の ECS リソースが不足している場合は、ECI リソースを使用します。
-
ECI のみの使用:クラスター内の ECS リソースを使用せず、ECI リソースのみを使用します。
-
ECS のみの使用:クラスター内の既存の ECS リソースのみを使用します。
ECS の優先
Pod を仮想ノードにスケジュールするには、仮想ノードのデフォルトの 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の下に複数のmatchExpressionsを指定した場合、いずれかの式が満たされれば (論理 OR)、Pod はノードにスケジュールされます。単一のmatchExpressions内に複数の式を指定した場合、すべての式が満たされた場合にのみ (論理 AND)、Pod はノードにスケジュールされます。 -
preferredDuringSchedulingIgnoredDuringExecutionを使用して ECS スケジューリングを優先しても、ECS リソースが不足している場合にのみ Pod が ECI にスケジュールされるとは限りません。ECS リソースが利用可能な場合でも、Pod が ECI にスケジュールされることがあります。より厳格な要件については、requiredDuringSchedulingIgnoredDuringExecutionを使用して、より具体的で必須のルールを設定してください。
特定のラベル、例えば label_1=key_1 を持つ ECS ノードへの Pod のデプロイを優先し、それらのノードのリソースが不足した場合に仮想ノードをエラスティックスケーリングに使用するには、次の YAML 設定を使用します。
ECI のみの使用
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