クラウドバースティング
前回のデプロイを基に、「クラウドバースティング」のユースケースをシミュレートするシナリオを探ってみましょう。これにより、EKSハイブリッドノードで実行されているワークロードがピーク需要時に弾力的なクラウドキャパシティを活用して、EC2ノードに「バースト」する方法を実証します。
前回の例と同様に、nodeAffinityを使用してハイブリッドノードを優先する新しいワークロードをデプロイします。preferredDuringSchedulingIgnoredDuringExecution戦略は、スケジューリング時にはハイブリッドノードを優先するが、実行中は無視するようKubernetesに指示します。
これは、単一のハイブリッドノードに空きがなくなった場合、これらのポッドはクラスタ内の他の場所、つまりEC2インスタンスに自由にスケジュールされることを意味します。これは素晴らしいことです!これにより、私たちが望んでいたクラウドバースティングが実現されます。しかし、
IgnoredDuringExecutionの部分は、スケールダウン時にKubernetesがランダムにポッドを削除し、それが実行されている場所を気にしないことを意味します。これは実行中は無視されるからです。一般的に、Kubernetesは古いポッドから削除します。これは最初にハイブリッドノード上で実行されているポッドになります。私たちはそれを望みません!
Kubernetesのポリシーエン ジンであるKyvernoをデプロイします。Kyvernoは、ハイブリッドノード(eks.amazonaws.com/compute-type: hybridというラベルが付けられている)にスケジュールされるポッドを監視し、実行中のポッドにアノテーションを追加するポリシーを設定します。
controller.kubernetes.io/pod-deletion-cost
アノテーションは、Kubernetesに対して、最初にコストの低いポッドを削除するように指示します。
さっそく取り組んでみましょう。Helmを使用してKyvernoをインストールし、以下に含まれるポリシーをデプロイします:
以下のClusterPolicyマニフェストは、EKSハイブリッドノードインスタンスにランディングするポッドを監視し、pod-deletion-costアノテーションを追加するようにKyvernoに指示します。
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: set-pod-deletion-cost
annotations:
policies.kyverno.io/title: Set Pod Deletion Cost
policies.kyverno.io/category: Pod Management
policies.kyverno.io/severity: medium
policies.kyverno.io/description: >-
Sets pod-deletion-cost label on nginx pods scheduled to hybrid compute nodes.
spec:
rules:
- name: set-deletion-cost-for-nginx-on-hybrid
match:
any:
- resources:
kinds:
- Pod/binding
context:
- name: node
variable:
jmesPath: request.object.target.name
default: ""
- name: computeType
apiCall:
urlPath: "/api/v1/nodes/{{node}}"
jmesPath: metadata.labels."eks.amazonaws.com/compute-type" || 'empty'
preconditions:
all:
- key: "{{ computeType }}"
operator: Equals
value: hybrid
mutate:
targets:
- apiVersion: v1
kind: Pod
name: "{{ request.object.metadata.name }}"
namespace: "{{ request.object.metadata.namespace }}"
patchStrategicMerge:
metadata:
annotations:
controller.kubernetes.io/pod-deletion-cost: "1"