Udostępnij przez


Dodaj pulę węzłów Spot do klastra usługi Azure Kubernetes Service (AKS)

W tym artykule dodasz dodatkową pulę węzłów typu spot do istniejącego klastra usługi Azure Kubernetes Service (AKS).

Pula węzłów typu spot to pula węzłów wspierana przez zestaw skalowania maszyn wirtualnych typu spot platformy Azure. Dzięki maszynom wirtualnym typu spot w klastrze usługi AKS możesz korzystać z nieuprawnionej pojemności platformy Azure ze znacznymi oszczędnościami kosztów. Ilość dostępnej nieuprawnionej pojemności zależy od wielu czynników, takich jak rozmiar węzła, region i godzina dnia.

Podczas wdrażania puli węzłów typu spot platforma Azure przydziela węzły typu spot, jeśli jest dostępna pojemność i wdraża zestaw skalowania typu spot, który wspiera pulę węzłów typu Spot w pojedynczej domenie domyślnej. Nie ma umowy SLA dla węzłów typu spot. Brak gwarancji wysokiej dostępności. Jeśli platforma Azure potrzebuje pojemności z powrotem, infrastruktura platformy Azure eksmituje węzły typu Spot.

Węzły typu spot doskonale nadają się do obciążenia roboczego, które może obsługiwać przerwy w działaniu, wczesne zakończenia lub eksmisje. Na przykład obciążenia, takie jak zadania przetwarzania wsadowego, środowiska programistyczne i testowe oraz duże obciążenia obliczeniowe mogą być dobrymi kandydatami do planowania w puli węzłów typu spot.

Zanim rozpoczniesz

  • Artykuł zakłada podstawową znajomość pojęć związanych z Kubernetes i Azure Load Balancer. Aby uzyskać więcej informacji, zobacz temat Kubernetes core concepts for Azure Kubernetes Service (AKS) (Kubernetes — podstawowe pojęcia dotyczące usługi Azure Kubernetes Service (AKS)).
  • Jeśli nie masz subskrypcji Azure, przed rozpoczęciem utwórz darmowe konto.
  • Podczas tworzenia klastra do wykorzystania puli węzłów typu Spot, klaster musi korzystać z zestawów skalowania maszyn wirtualnych dla pul węzłów i z modułu równoważenia obciążenia w wersji Standard SKU. Należy również dodać kolejną pulę węzłów po utworzeniu klastra, co jest omówione w tym samouczku.
  • Ten artykuł wymaga interfejsu wiersza polecenia platformy Azure w wersji 2.14 lub nowszej. Uruchom az --version, aby znaleźć wersję. Jeśli konieczna będzie instalacja lub uaktualnienie, zobacz Instalowanie interfejsu wiersza polecenia platformy Azure.

Ograniczenia

Następujące ograniczenia mają zastosowanie podczas tworzenia klastrów usługi AKS i zarządzania nimi za pomocą puli węzłów typu Spot:

  • Pula węzłów typu spot nie może być domyślną pulą węzłów, może być używana tylko jako pula pomocnicza.
  • Nie można jednocześnie uaktualnić płaszczyzny sterowania i pul węzłów. Należy je uaktualnić oddzielnie lub usunąć pulę węzłów typu spot, aby uaktualnić płaszczyznę sterowania i pozostałe pule węzłów w tym samym czasie.
  • Pula węzłów typu spot musi używać zestawów skalowania maszyn wirtualnych.
  • Nie można zmienić ScaleSetPriority ani SpotMaxPrice po utworzeniu.
  • Podczas ustawiania SpotMaxPrice, wartość musi być -1 lub dodatnia z maksymalnie pięcioma miejscami dziesiętnymi.
  • Pula węzłów typu spot ma etykietę kubernetes.azure.com/scalesetpriority:spot, plamę kubernetes.azure.com/scalesetpriority=spot:NoSchedule, a zasobniki systemowe mają anty-afinity.
  • Musisz dodać odpowiednią tolerancję i koligację, aby zaplanować obciążenia na puli węzłów typu Spot.

Dodaj pulę węzłów typu spot do klastra AKS

Podczas dodawania puli węzłów typu spot do istniejącego klastra, klaster musi mieć włączone wiele pul węzłów. Podczas tworzenia klastra usługi AKS z włączonymi wieloma pulami węzłów domyślnie należy utworzyć pulę węzłów z wartością priorityRegular . Aby dodać pulę węzłów typu Spot, należy określić Spot jako wartość .priority Aby uzyskać więcej informacji na temat tworzenia klastra usługi AKS z wieloma pulami węzłów, zobacz Używanie wielu pul węzłów.

export SPOT_NODEPOOL="spotnodepool"

az aks nodepool add \
    --resource-group $RESOURCE_GROUP \
    --cluster-name $AKS_CLUSTER \
    --name $SPOT_NODEPOOL \
    --priority Spot \
    --eviction-policy Delete \
    --spot-max-price -1 \
    --enable-cluster-autoscaler \
    --min-count 1 \
    --max-count 3 \
    --no-wait

W poprzednim poleceniu wartość parametru priority powoduje, że pula węzłów Spot staje się pulą węzłów typu Spot. Parametr eviction-policy jest ustawiony na Deletewartość , która jest wartością domyślną. Po ustawieniu zasad eksmisji na Deletewęzły w bazowym zestawie skalowania puli węzłów zostaną usunięte po ich eksmisji.

Można również ustawić zasady eksmisji na Deallocate, co oznacza, że węzły w podstawowym zestawie skalowania są ustawione na stan zatrzymanych i nieprzydzielonych po eksmisji. Węzły w stanie zatrzymanym i dealokowanym liczą się do twojego limitu zasobów obliczeniowych i mogą powodować problemy ze skalowaniem lub aktualizacją klastra. Wartości priority i eviction-policy można ustawić tylko podczas tworzenia puli węzłów. Tych wartości nie można zaktualizować później.

Poprzednie polecenie włącza również narzędzie do automatycznego skalowania klastra, którego zalecamy używać z pulami węzłów typu spot. Na podstawie obciążeń uruchomionych w klastrze funkcja automatycznego skalowania klastra skaluje liczbę węzłów w górę i w dół. W przypadku pul węzłów typu spot narzędzie do automatycznego skalowania klastra będzie skalować w górę liczbę węzłów po eksmisji, jeśli więcej węzłów jest nadal potrzebnych. Jeśli zmienisz maksymalną liczbę węzłów, którą może mieć pula węzłów, musisz również dostosować maxCount wartość skojarzona z funkcją automatycznego skalowania klastra. Jeśli nie używasz narzędzia do automatycznego skalowania klastra, po eksmisji pula typu Spot ostatecznie zmniejszy się do 0 i będzie wymagać ręcznej operacji odbierania dodatkowych węzłów typu Spot.

Ważne

Zaplanuj obciążenia tylko w pulach węzłów typu Spot, które mogą tolerować przerwy, takie jak zadania przetwarzania wsadowego i środowiska testowe. Zalecamy skonfigurowanie zabrudzeń i tolerancji w puli węzłów typu spot, aby upewnić się, że są tam zaplanowane tylko obciążenia, które mogą obsłużyć usunięcie węzłów. Na przykład powyższe polecenie dodaje defekt , kubernetes.azure.com/scalesetpriority=spot:NoSchedulewięc w tym węźle zaplanowano tylko zasobniki z odpowiednią tolerancją.

Weryfikacja puli węzłów typu spot

  • Sprawdź, czy pula węzłów została dodana za pomocą polecenia az aks nodepool show i upewnij się, że scaleSetPriority jest Spot.
az aks nodepool show --resource-group $RESOURCE_GROUP --cluster-name $AKS_CLUSTER --name $SPOT_NODEPOOL

Wyniki:

{
  "artifactStreamingProfile": null,
  "availabilityZones": null,
  "capacityReservationGroupId": null,
  "count": 3,
  "creationData": null,
  "currentOrchestratorVersion": "1.30.10",
  "eTag": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "enableAutoScaling": true,
  "enableCustomCaTrust": false,
  "enableEncryptionAtHost": false,
  "enableFips": false,
  "enableNodePublicIp": false,
  "enableUltraSsd": false,
  "gatewayProfile": null,
  "gpuInstanceProfile": null,
  "gpuProfile": null,
  "hostGroupId": null,
  "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/xxxxxxxxxxxxxxxx/providers/Microsoft.ContainerService/managedClusters/xxxxxxxxxxxxxxxx/agentPools/xxxxxxxxxxxx",
  "kubeletConfig": null,
  "kubeletDiskType": "OS",
  "linuxOsConfig": null,
  "maxCount": 3,
  "maxPods": 30,
  "messageOfTheDay": null,
  "minCount": 1,
  "mode": "User",
  "name": "xxxxxxxxxxxx",
  "networkProfile": {
    "allowedHostPorts": null,
    "applicationSecurityGroups": null,
    "nodePublicIpTags": null
  },
  "nodeImageVersion": "AKSUbuntu-2204gen2containerd-xxxxxxxx.xx.x",
  "nodeInitializationTaints": null,
  "nodeLabels": {
    "kubernetes.azure.com/scalesetpriority": "spot"
  },
  "nodePublicIpPrefixId": null,
  "nodeTaints": [
    "kubernetes.azure.com/scalesetpriority=spot:NoSchedule"
  ],
  "orchestratorVersion": "x.xx.xx",
  "osDiskSizeGb": 128,
  "osDiskType": "Managed",
  "osSku": "Ubuntu",
  "osType": "Linux",
  "podIpAllocationMode": null,
  "podSubnetId": null,
  "powerState": {
    "code": "Running"
  },
  "provisioningState": "Creating",
  "proximityPlacementGroupId": null,
  "resourceGroup": "xxxxxxxxxxxxxxxx",
  "scaleDownMode": "Delete",
  "scaleSetEvictionPolicy": "Delete",
  "scaleSetPriority": "Spot",
  "securityProfile": {
    "enableSecureBoot": false,
    "enableVtpm": false,
    "sshAccess": "LocalUser"
  },
  "spotMaxPrice": -1.0,
  "status": null,
  "tags": null,
  "type": "Microsoft.ContainerService/managedClusters/agentPools",
  "typePropertiesType": "VirtualMachineScaleSets",
  "upgradeSettings": {
    "drainTimeoutInMinutes": null,
    "maxSurge": null,
    "maxUnavailable": null,
    "nodeSoakDurationInMinutes": null,
    "undrainableNodeBehavior": null
  },
  "virtualMachineNodesStatus": null,
  "virtualMachinesProfile": null,
  "vmSize": "Standard_DS2_v2",
  "vnetSubnetId": null,
  "windowsProfile": null,
  "workloadRuntime": "OCIContainer"
}

Planowanie uruchamiania zasobnika w węźle typu spot

Aby zaplanować uruchamianie zasobnika w węźle typu Spot, można dodać tolerancję i koligację węzła odpowiadającą defektowi zastosowanemu do węzła typu Spot.

W poniższym przykładzie pokazano część pliku YAML, która definiuje tolerancję odpowiadającą skazie oraz afinitet węzła odpowiadający etykiecie użytej w poprzednim kroku, zgodnie z regułami afinitetu węzłów.

spec:
  containers:
  - name: spot-example
  tolerations:
  - key: "kubernetes.azure.com/scalesetpriority"
    operator: "Equal"
    value: "spot"
    effect: "NoSchedule"
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: "kubernetes.azure.com/scalesetpriority"
            operator: In
            values:
            - "spot"
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: another-node-label-key
            operator: In
            values:
            - another-node-label-value

Po wdrożeniu zasobnika z tą tolerancją i koligacją węzła, Kubernetes pomyślnie planuje zasobnik na węzłach z zastosowanym zabarwieniem i etykietą. W tym przykładzie obowiązują następujące reguły:

  • Węzeł musi mieć etykietę z kluczem kubernetes.azure.com/scalesetpriority, a wartość tej etykiety musi mieć wartość spot.
  • Węzeł najlepiej ma etykietę z kluczem another-node-label-key, a wartość tej etykiety musi mieć wartość another-node-label-value.

Aby uzyskać więcej informacji, zobacz Przypisywanie zasobników do węzłów.

Zaktualizuj pulę węzłów typu Spot

Podczas uaktualniania puli węzłów typu Spot usługa AKS wewnętrznie wystawia kordon i powiadomienie o eksmisji, ale nie jest stosowane żadne opróżnianie. Brak dostępnych węzłów przepięcia dla uaktualnień puli węzłów typu spot. Poza wskazanymi zmianami, zachowanie podczas uaktualniania pul węzłów typu Spot jest zgodne z zachowaniem innych typów pul węzłów.

Aby uzyskać więcej informacji na temat uaktualniania, zobacz Uaktualnianie klastra usługi AKS.

Maksymalna cena za pulę typu spot

Ceny wystąpień typu spot są zmienne na podstawie regionu i jednostki SKU. Aby uzyskać więcej informacji, zobacz informacje o cenach dla systemów Linux i Windows.

Ze zmiennymi cenami możesz ustawić maksymalną cenę w dolarach amerykańskich (USD) przy użyciu maksymalnie pięciu miejsc dziesiętnych. Na przykład wartość 0,98765 będzie maksymalną ceną 0,98765 USD za godzinę. Jeśli ustawisz maksymalną cenę na -1, wystąpienie nie zostanie wykluczone na podstawie ceny. O ile jest dostępna pojemność i limit dostępności, cena instancji będzie niższa, biorąc pod uwagę obecną cenę instancji typu Spot lub standardowej.

Dalsze kroki

W tym artykule przedstawiono sposób dodawania puli węzłów typu spot do klastra usługi AKS. Aby uzyskać więcej informacji na temat kontrolowania zasobników w pulach węzłów, zapoznaj się z Najlepszymi praktykami dotyczącymi zaawansowanych funkcji harmonogramu w usłudze AKS.