Udostępnij za pośrednictwem


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

Deweloperzy aplikacji często muszą wdrażać zasoby kubernetes w wielu klastrach. Operatorzy floty często muszą wybierać najlepsze klastry dla obciążeń na podstawie heurystyki (takich jak koszt obliczeń) 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 sposób rozwiązywania tych scenariuszy przy użyciu inteligentnej funkcji umieszczania zasobów kubernetes w usłudze Azure Kubernetes Fleet Manager (Kubernetes Fleet).

Możliwość umieszczania zasobów w usłudze Kubernetes Fleet może podejmować decyzje dotyczące planowania na podstawie następujących właściwości klastra:

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

Aby uzyskać więcej informacji na temat pojęć w tym artykule, zobacz Umieszczanie zasobów Kubernetes z klastra koncentratora do klastrów członkowskich.

Wymagania wstępne

  • Potrzebujesz konta platformy Azure z aktywną subskrypcją. Utwórz konto bezpłatnie.

  • Musisz mieć zasób Platformy Kubernetes Fleet z co najmniej jednym klastrem członkowskim. Jeśli go nie masz, postępuj zgodnie z przewodnikiem Szybki start , aby utworzyć zasób Rozwiązania Kubernetes Fleet z klastrem koncentratora. Następnie dołącz do klastrów usługi Azure Kubernetes Service (AKS) jako członków.

    Napiwek

    Upewnij się, że klastry członkowskie usługi AKS są skonfigurowane tak, aby można było testować umieszczanie przy użyciu właściwości klastra, które cię interesują (lokalizacja, liczba węzłów, zasoby lub koszt).

  • Ustaw następujące zmienne środowiskowe:

    export GROUP=<resource-group>
    export FLEET=<fleet-name>
    export MEMBERCLUSTER01=<cluster01>
    export MEMBERCLUSTER02=<cluster02>
    
  • Aby ukończyć ten artykuł, musisz zainstalować interfejs wiersza polecenia platformy Azure w wersji 2.58.0 lub nowszej. Aby zainstalować lub uaktualnić, zobacz Instalowanie interfejsu wiersza polecenia platformy Azure.

  • Jeśli nie masz jeszcze interfejsu wiersza polecenia platformy Kubernetes (kubectl), możesz go zainstalować przy użyciu tego polecenia:

    az aks install-cli
    
  • Potrzebujesz rozszerzenia interfejsu wiersza polecenia platformy fleet Azure. Można go zainstalować, uruchamiając następujące polecenie:

    az extension add --name fleet
    

    Uruchom polecenie , az extension update aby zaktualizować rozszerzenie do najnowszej wersji:

    az extension update --name fleet
    
  • Autoryzuj narzędzie kubectl w celu nawiązania połączenia z klastrem koncentratora Kubernetes Fleet:

    az fleet get-credentials --resource-group $GROUP --name $FLEET
    

Sprawdzanie właściwości klastra składowego

Pobierz etykiety, właściwości i zasoby dla klastra członkowskiego, wysyłając zapytanie do klastra koncentratora. Dane wyjściowe jako YAML umożliwiające odczytywanie wyników.

kubectl get membercluster $MEMBERCLUSTER01 –o yaml

Wynikowy plik YAML zawiera szczegóły (etykiety i właściwości), których można użyć do tworzenia zasad umieszczania. Oto przykład:

apiVersion: cluster.kubernetes-fleet.io/v1
kind: MemberCluster
metadata:
  annotations:
    ...
  labels:
    fleet.azure.com/location: eastus2
    fleet.azure.com/resource-group: resource-group
    fleet.azure.com/subscription-id: 8xxxxxxx-dxxx-4xxx-bxxx-xxxxxxxxxxx8
  name: cluster01
  resourceVersion: "123456"
  uid: 7xxxxxxx-5xxx-4xxx-bxxx-xxxxxxxxxxx4
spec:
  ...
status:
  ...
  properties:
    kubernetes-fleet.io/node-count:
      observationTime: "2024-09-19T01:33:54Z"
      value: "2"
    kubernetes.azure.com/per-cpu-core-cost:
      observationTime: "2024-09-19T01:33:54Z"
      value: "0.073"
    kubernetes.azure.com/per-gb-memory-cost:
      observationTime: "2024-09-19T01:33:54Z"
      value: "0.022"
  resourceUsage:
    allocatable:
      cpu: 3800m
      memory: 10320392Ki
    available:
      cpu: 2740m
      memory: 8821256Ki
    capacity:
      cpu: "4"
      memory: 14195208Ki

Powtórz ten krok dla każdego dodanego klastra członkowskiego, aby zidentyfikować etykiety i właściwości, których można użyć w zasadach.

Przygotowywanie obciążenia do umieszczania

Następnie opublikuj obciążenie w klastrze piasty, aby można je było umieścić w klastrach członkowskich:

  1. Utwórz przestrzeń nazw dla obciążenia w klastrze centrum:

    kubectl create namespace test-app 
    
  2. Przykładowe obciążenie można wdrożyć w nowej przestrzeni nazw w klastrze centrum. Ponieważ te typy zasobów platformy Kubernetes nie wymagają hermetyzacji, można je wdrożyć bez zmian.

    1. Zapisz następujący kod YAML w pliku o nazwie sample-workload.yaml:

      apiVersion: v1
      kind: Service
      metadata:
        name: nginx-service
        namespace: test-app
      spec:
        selector:
          app: nginx
        ports:
        - protocol: TCP
          port: 80
          targetPort: 80
        type: LoadBalancer
      ---
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: nginx-deployment
        namespace: test-app
      spec:
        selector:
          matchLabels:
            app: nginx
        replicas: 2
        template:
          metadata:
            labels:
              app: nginx
          spec:
            containers:
            - name: nginx
              image: nginx:1.16.1 
              ports:
              - containerPort: 80
      
    2. Wdróż definicję obciążenia w klastrze centrum:

      kubectl apply -f sample-workload.yaml
      

Po wdrożeniu definicji obciążenia można teraz przetestować możliwości inteligentnego umieszczania w usłudze Kubernetes Fleet.

Testowanie zasad umieszczania obciążeń

Możesz użyć poniższych przykładów wraz z dokumentacją koncepcyjną jako przewodniki dotyczące pisania własnego ClusterResourcePlacement obiektu.

Uwaga

Jeśli chcesz wypróbować poszczególne przykładowe zasady, pamiętaj o usunięciu poprzedniego ClusterResourcePlacement obiektu.

Umieszczanie na podstawie liczby węzłów klastra

W tym przykładzie przedstawiono sortowanie właściwości, które używa Descending kolejności. Ta kolejność oznacza, że platforma Kubernetes Fleet preferuje klastry z wyższą liczbą węzłów.

Klaster z największą liczbą węzłów otrzymuje wagę 20, a klaster z najniższym otrzymuje wagę 0. Inne klastry otrzymują proporcjonalne wagi obliczane za pomocą formuły obliczania wagi.

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
  name: crp-demo
spec:
  resourceSelectors:
    - group: ""
      kind: Namespace
      name: test-app
      version: v1
  policy:
    placementType: PickN
    numberOfClusters: 10
    affinity:
        clusterAffinity:
            preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 20
              preference:
                metricSorter:
                  name: kubernetes-fleet.io/node-count
                  sortOrder: Descending

Umieszczanie za pomocą selektora etykiet i sortowania właściwości

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

W tym przykładzie pokazano, jak można użyć selektora etykiet i selektora właściwości dla preferredDuringSchedulingIgnoredDuringExecution koligacji. Klaster członkowski, który kończy się niepowodzeniem selektora etykiet, nie otrzymuje żadnej wagi. Klastry składowe, które spełniają wymagania selektora etykiet, otrzymują proporcjonalne wagi, jak określono w obszarze sortowania właściwości.

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
  name: crp-demo
spec:
  resourceSelectors:
    - group: ""
      kind: Namespace
      name: test-app
      version: v1
  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

Umieszczanie na podstawie kosztu pamięci i rdzenia procesora CPU

Ponieważ sortowanie w tym przykładzie ma Ascending kolejność, flota Kubernetes preferuje klastry o niższych kosztach pamięci i rdzeni procesora CPU. Klaster o najniższym koszcie pamięci i rdzeniu procesora CPU otrzymuje wagę 20, a klaster o najwyższej wadze wynosi 0. Inne klastry otrzymują proporcjonalne wagi obliczane za pomocą formuły obliczania wagi.

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
  name: crp-demo
spec:
  resourceSelectors:
    - group: ""
      kind: Namespace
      name: test-app
      version: v1
  policy:
    placementType: PickN
    numberOfClusters: 2
    affinity:
      clusterAffinity:
        preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 20
            preference:
              propertySorter:
                name: kubernetes.azure.com/per-gb-memory-core-cost
                sortOrder: Ascending
          - weight: 20
            preference:
              propertySorter:
                name: kubernetes.azure.com/per-cpu-core-cost
                sortOrder: Ascending

Wyświetlanie stanu umieszczania

Jeśli chcesz wyświetlić stan umieszczania, możesz użyć witryny Azure Portal lub polecenia kubectl.

Szczegółowe informacje na temat wyświetlania postępu umieszczania można znaleźć w temacie Use the ClusterResourcePlacement API to propagate resources to member clusters (Używanie interfejsu API klastraResourcePlacement do propagowania zasobów do klastrów członkowskich).

Czyszczenie zasobów

Aby uzyskać szczegółowe informacje na temat usuwania umieszczania zasobów klastra za pośrednictwem witryny Azure Portal lub polecenia kubectl, zobacz Czyszczenie zasobów w artykule dotyczącym propagowania zasobów.

  • Aby dowiedzieć się więcej na temat propagacji zasobów, zobacz dokumentację rozwiązania Kubernetes Fleet typu open source.