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 zasobów obliczeniowych 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 (Fleet) umożliwia rozwiązanie tych scenariuszy przy użyciu funkcji inteligentnego umieszczania zasobów Kubernetes.

Omówienie

Flota zapewnia możliwość umieszczania zasobów, które mogą 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

Zapoznaj się z omówieniem koncepcyjnym propagacji zasobów, aby zrozumieć pojęcia używane w tym przewodniku.

Wymagania wstępne

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

  • Musisz mieć zasób Fleet z co najmniej jednym klastrem członkowskim. Jeśli nie, postępuj zgodnie z przewodnikiem Szybki start , aby utworzyć zasób Fleet z klastrem centrum, a następnie dołączyć klastry usługi Azure Kubernetes Service (AKS) jako elementy członkowskie.

    Zalecenie: Upewnij się, że klastry członkowskie usługi AKS są skonfigurowane, aby można było przetestować umieszczanie przy użyciu interesujących Cię właściwości klastra (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ć instrukcje, 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 jeszcze go nie masz, możesz zainstalować interfejs wiersza polecenia platformy Kubernetes (kubectl), używając następującego polecenia:

    az aks install-cli
    
  • Potrzebne jest również rozszerzenie interfejsu wiersza polecenia platformy fleet Azure, które można zainstalować, uruchamiając następujące polecenie:

    az extension add --name fleet
    

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

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

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

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

Powtórz te kroki dla każdego dodanego 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.

    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 klastra składowego, 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 centrum, aby można je było umieścić w klastrach członkowskich.

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

    kubectl create namespace test-app 
    
  • 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.

    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
    

    Wdróż definicję obciążenia w klastrze centrum przy użyciu polecenia .

    kubectl apply -f sample-workload.yaml 
    

    Po wdrożeniu definicji obciążenia można teraz przetestować inteligentne możliwości umieszczania floty.

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 klastraResourcePlacement.

Uwaga

Jeśli chcesz wypróbować poszczególne przykładowe zasady, upewnij się, że usunięto poprzedni klasterResourcePlacement.

Umieszczanie na podstawie liczby węzłów klastra

W tym przykładzie pokazano sortowanie właściwości przy użyciu Descending kolejności, co oznacza, że flota preferuje klastry z wyższą liczbą 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.

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 otrzyma wagę tylko wtedy, gdy ma etykietę env=prod. Jeśli spełnia to ograniczenie etykiety, klaster ma 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 na potrzeby 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/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 preferuje klastry z niższymi kosztami pamięci i rdzeni procesora CPU. Klaster o najniższym koszcie pamięci i rdzeniu procesora CPU otrzyma wagę 20, a klaster o najwyższym poziomie otrzyma 0. Inne klastry otrzymują proporcjonalne wagi obliczane przy użyciu 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 przewodniku Szybki start dotyczący propagacji zasobów.

Czyszczenie zasobów

Szczegółowe informacje na temat usuwania umieszczania zasobów klastra za pośrednictwem witryny Azure Portal lub polecenia kubectl można znaleźć w sekcji zasobów czyszczenia w przewodniku Szybki start propagacji zasobów.

Następne kroki

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