Udostępnij za pośrednictwem


Inteligentne umieszczanie zasobów kubernetes między klastrami przy użyciu usługi Azure Kubernetes Fleet Manager (wersja zapoznawcza)

Deweloperzy aplikacji często muszą wdrażać zasoby kubernetes w wielu klastrach. Operatorzy floty często muszą wybierać najlepsze klastry do umieszczania obciążeń na podstawie heurystyki, takich jak koszt obliczeń w klastrach lub dostępnych zasobów, takich jak pamięć i procesor CPU. Żmudne jest ręczne tworzenie, aktualizowanie i śledzenie tych zasobów Kubernetes w wielu klastrach. W tym artykule opisano, jak usługa Azure Kubernetes Fleet Manager (Kubernetes Fleet) umożliwia rozwiązanie tych scenariuszy przy użyciu funkcji inteligentnego umieszczania zasobów Kubernetes.

Omówienie

Platforma Kubernetes Fleet zapewnia możliwość umieszczania zasobów, które mogą podejmować decyzje dotyczące planowania na podstawie następujących właściwości:

  • Liczba węzłów
  • Koszt obliczeń w docelowych klastrach członkowskich
  • Dostępność zasobów (procesora CPU/pamięci) w docelowych klastrach składowych

Ważne

Funkcje usługi Azure Kubernetes Fleet Manager w wersji zapoznawczej są dostępne na zasadzie samoobsługi. Wersje zapoznawcze są udostępniane w wersji "as is" i "jako dostępne" i są wykluczone z umów dotyczących poziomu usług i ograniczonej gwarancji. Wersje zapoznawcze usługi Azure Kubernetes Fleet Manager są częściowo objęte pomocą techniczną w oparciu o najlepsze nakłady pracy. W związku z tym te funkcje nie są przeznaczone do użytku produkcyjnego.

Wymagania wstępne

Filtrowanie klastrów w czasie planowania na podstawie właściwości klastra członkowskiego

requiredDuringSchedulingIgnoredDuringExecution, typ koligacji umożliwia filtrowanie klastrów członkowskich kwalifikujących się do umieszczania przy użyciu selektorów właściwości. Selektor właściwości to tablica warunków wyrażeń względem właściwości klastra.

W każdym warunku, który określisz:

  • Nazwa: nazwa właściwości, która powinna mieć następujący format:

    resources.kubernetes-fleet.io/<CAPACITY-TYPE>-<RESOURCE-NAME>
    

    <CAPACITY-TYPE> jest jednym z total, allocatablelub available, w zależności od pojemności (informacji o użyciu), względem której chcesz sprawdzić, i <RESOURCE-NAME> jest nazwą zasobu (procesor/pamięć).

    Jeśli na przykład chcesz wybrać klastry na podstawie dostępnej pojemności procesora CPU klastra, nazwa używana w selektorze właściwości powinna mieć wartość resources.kubernetes-fleet.io/available-cpu. W przypadku pojemności pamięci możliwej do przysyłaniania można użyć polecenia resources.kubernetes-fleet.io/allocatable-memory.

  • Lista wartości, które są możliwymi wartościami właściwości.

  • Operator używany do wyrażania warunku między ograniczeniem/żądaną wartością a obserwowaną wartością w klastrze. Obecnie obsługiwane są następujące operatory:

    • Gt (Większe niż): obserwowana wartość danej właściwości klastra musi być większa niż wartość warunku, zanim będzie można ją wybrać do umieszczania zasobów.
    • Ge (Większe lub równe): obserwowana wartość danej właściwości klastra musi być większa lub równa wartości w warunku, zanim będzie można ją wybrać do umieszczania zasobów.
    • Lt (Mniej niż): obserwowana wartość danej właściwości klastra musi być mniejsza niż wartość warunku, zanim będzie można ją wybrać do umieszczania zasobów.
    • Le (Mniejsze niż lub równe): obserwowana wartość danej właściwości klastra musi być mniejsza lub równa wartości w warunku, zanim będzie można ją wybrać do umieszczania zasobów.
    • Eq (Równe): obserwowana wartość danej właściwości klastra musi być równa wartości w warunku, zanim będzie można ją wybrać do umieszczania zasobów.
    • Ne (Nie równe): obserwowana wartość danej właściwości klastra nie może być równa wartości warunku, zanim będzie można ją wybrać do umieszczania zasobów.

    Jeśli używasz operatora Gt, , Ge, LtLe, Eqlub Ne, lista wartości w warunku powinna mieć dokładnie jedną wartość.

Fleet ocenia każdy klaster na podstawie właściwości określonych w warunku. Niepowodzenie spełnienia warunków wymienionych w obszarze requiredDuringSchedulingIgnoredDuringExecution wyklucza ten klaster członkowski z umieszczania zasobów.

Uwaga

Jeśli klaster członkowski nie ma właściwości wyrażonej w warunku, automatycznie zakończy się niepowodzeniem warunku.

Przykładowe zasady umieszczania do wybierania tylko klastrów z większą lub równą pięcioma węzłami na potrzeby umieszczania zasobów:

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
  name: crp
spec:
  resourceSelectors:
    - ...
  policy:
    placementType: PickAll
    affinity:
        clusterAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
                clusterSelectorTerms:
                - propertySelector:
                    matchExpressions:
                    - name: "kubernetes.azure.com/node-count"
                      operator: Ge
                      values:
                      - "5"

Możesz użyć zarówno selektorów etykiet, jak i właściwości w requiredDuringSchedulingIgnoredDuringExecution ramach terminu koligacji, aby filtrować kwalifikujące się klastry członkowskie w obu tych ograniczeniach.

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
  name: crp
spec:
  resourceSelectors:
    - ...
  policy:
    placementType: PickAll
    affinity:
        clusterAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
                clusterSelectorTerms:
                - labelSelector:
                    matchLabels:
                      region: east
                  propertySelector:
                    matchExpressions:
                    - name: "kubernetes.azure.com/node-count"
                      operator: Ge
                      values:
                      - "5"

W tym przykładzie platforma Kubernetes Fleet uwzględnia klaster tylko do umieszczania zasobów, jeśli ma etykietę region=east i liczbę węzłów większą lub równą pięciu.

Klasyfikacja klastrów kolejności w czasie planowania na podstawie właściwości klastra członkowskiego

Gdy preferredDuringSchedulingIgnoredDuringExecution jest używany, sortator właściwości klasyfikuje wszystkie klastry w floty na podstawie ich wartości w kolejności rosnącej lub malejącej. Wagi są obliczane na podstawie wartości wagi określonej w obszarze preferredDuringSchedulingIgnoredDuringExecution.

Sorter właściwości składa się z:

  • Nazwa: nazwa właściwości z większą ilością informacji o formatowaniu właściwości omówionej w poprzedniej sekcji.
  • Kolejność sortowania: kolejność sortowania może mieć wartość Ascending lub Descending. Gdy Ascending jest używana kolejność, flota Kubernetes preferuje klastry członkowskie z niższymi obserwowanymi wartościami. W przypadku Descending użycia kolejności preferowane są klastry członkowskie o wyższej obserwowanej wartości.

W przypadku kolejności Descendingsortowania proporcjonalna waga jest obliczana przy użyciu formuły:

((Observed Value - Minimum observed value) / (Maximum observed value - Minimum observed value)) * Weight

Załóżmy na przykład, że chcesz sklasyfikować klastry na podstawie właściwości dostępnej pojemności procesora CPU w kolejności malejącej i że masz flotę trzech klastrów z następującym dostępnym procesorem CPU:

Klaster Dostępna pojemność procesora CPU
bravelion 100
smartfish 20
jumpingcat 10

W tym przypadku sorter oblicza następujące wagi:

Klaster Dostępna pojemność procesora CPU Weight
bravelion 100 (100-10) / (100 - 10) = 100% wagi
smartfish 20 (20 - 10) / (100 - 10) = 11,11% wagi
jumpingcat 10 (10 - 10) / (100 - 10) = 0% wagi

W przypadku kolejności Ascendingsortowania proporcjonalna waga jest obliczana przy użyciu formuły:

(1 - ((Observed Value - Minimum observed value) / (Maximum observed value - Minimum observed value))) * Weight

Załóżmy na przykład, że chcesz sklasyfikować klastry na podstawie ich kosztu rdzenia procesora CPU w kolejności rosnącej i że masz flotę trzech klastrów z następującymi kosztami rdzeni procesora CPU:

Klaster Koszt rdzenia procesora CPU
bravelion 1
smartfish 0,2
jumpingcat 0.1

W tym przypadku sorter oblicza następujące wagi:

Klaster Koszt rdzenia procesora CPU Weight
bravelion 1 1 - ((1 - 0,1) / (1 - 0,1)) = 0% wagi
smartfish 0,2 1 - ((0,2 - 0,1) / (1 - 0,1)) = 88,89% wagi
jumpingcat 0.1 1 - (0,1 - 0,1) / (1 - 0,1) = 100% wagi

W poniższym przykładzie przedstawiono sortowanie właściwości przy użyciu Descending kolejności:

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
  name: crp
spec:
  resourceSelectors:
    - ...
  policy:
    placementType: PickN
    numberOfClusters: 10
    affinity:
        clusterAffinity:
            preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 20
              preference:
                metricSorter:
                  name: kubernetes.azure.com/node-count
                  sortOrder: Descending

W tym przykładzie flota preferuje klastry o wyższych liczbach węzłów. Klaster z największą liczbą węzłów otrzyma wagę 20, a klaster o najniższym poziomie otrzyma 0. Inne klastry otrzymują proporcjonalne wagi obliczane przy użyciu formuły obliczania wagi.

Można użyć selektora etykiet i sortowania właściwości w ramach preferredDuringSchedulingIgnoredDuringExecution koligacji. Klaster członkowski, który kończy się niepowodzeniem selektora etykiet, nie otrzyma żadnej wagi. Klastry członkowskie spełniające selektor etykiet otrzymują proporcjonalne wagi, jak określono w obszarze sortowania właściwości.

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
  name: crp
spec:
  resourceSelectors:
    - ...
  policy:
    placementType: PickN
    numberOfClusters: 10
    affinity:
        clusterAffinity:
            preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 20
              preference:
                labelSelector:
                  matchLabels:
                    env: prod
                metricSorter:
                  name: resources.kubernetes-fleet.io/total-cpu
                  sortOrder: Descending

W tym przykładzie klaster otrzyma dodatkową wagę tylko wtedy, gdy ma etykietę env=prod. Jeśli spełnia to ograniczenie oparte na etykiecie, klaster ma proporcjonalną wagę na podstawie całkowitej ilości procesora CPU w tym klastrze członkowskim.

Czyszczenie zasobów

Jeśli nie chcesz już używać ClusterResourcePlacement obiektów utworzonych w tym artykule, możesz je usunąć za pomocą kubectl delete polecenia . Na przykład:

kubectl delete clusterresourceplacement <name-of-the-crp-resource>

Następne kroki

Aby dowiedzieć się więcej na temat propagacji zasobów, zobacz następujące zasoby: