Sdílet prostřednictvím


Inteligentní umístění prostředků Kubernetes napříč clustery pomocí Azure Kubernetes Fleet Manageru

Vývojáři aplikací často potřebují nasazovat prostředky Kubernetes do několika clusterů. Operátoři vozového parku často potřebují vybrat nejlepší clustery pro úlohy na základě heuristiky (například nákladů na výpočetní prostředky) nebo dostupných prostředků (například paměti a procesoru). Je zdlouhavé vytvářet, aktualizovat a sledovat tyto prostředky Kubernetes napříč několika clustery ručně. Tento článek popisuje, jak můžete tyto scénáře řešit pomocí inteligentní funkce umísťování prostředků Kubernetes v Azure Kubernetes Fleet Manageru (Kubernetes Fleet).

Schopnost umístění prostředků Kubernetes Fleet může provádět rozhodnutí o plánování na základě následujících vlastností clusteru:

  • Počet uzlů
  • Náklady na výpočetní prostředky nebo paměť v cílových členských clusterech
  • Dostupnost prostředků (procesoru nebo paměti) v cílových členských clusterech

Další informace o konceptech v tomto článku najdete v tématu Umístění prostředků Kubernetes z clusteru centra do členských clusterů.

Požadavky

  • Potřebujete účet Azure s aktivním předplatným. Vytvoření účtu zdarma

  • Musíte mít prostředek Kubernetes Fleet s jedním nebo více členskými clustery. Pokud ho nemáte, vytvořte pomocí rychlého startu prostředek Kubernetes Fleet s clusterem centra. Pak připojte clustery Azure Kubernetes Service (AKS) jako členy.

    Tip

    Ujistěte se, že jsou vaše členské clustery AKS nakonfigurované tak, abyste mohli otestovat umístění pomocí vlastností clusteru, které vás zajímají (umístění, počet uzlů, prostředky nebo náklady).

  • Nastavte následující proměnné prostředí:

    export GROUP=<resource-group>
    export FLEET=<fleet-name>
    export MEMBERCLUSTER01=<cluster01>
    export MEMBERCLUSTER02=<cluster02>
    
  • K dokončení tohoto článku potřebujete azure CLI verze 2.58.0 nebo novější. Pokud chcete nainstalovat nebo upgradovat, přečtěte si téma Instalace Azure CLI.

  • Pokud rozhraní příkazového řádku Kubernetes (kubectl) ještě nemáte, můžete ho nainstalovat pomocí tohoto příkazu:

    az aks install-cli
    
  • Potřebujete fleet rozšíření Azure CLI. Můžete ho nainstalovat spuštěním následujícího příkazu:

    az extension add --name fleet
    

    Spuštěním az extension update příkazu aktualizujte na nejnovější verzi rozšíření:

    az extension update --name fleet
    
  • Autorizovat kubectl pro připojení ke clusteru Centra flotily Kubernetes:

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

Kontrola vlastností člena clusteru

Načtěte popisky, vlastnosti a prostředky pro váš členský cluster dotazováním clusteru centra. Výstup jako YAML, abyste mohli číst výsledky.

kubectl get membercluster $MEMBERCLUSTER01 –o yaml

Výsledný soubor YAML obsahuje podrobnosti (popisky a vlastnosti), které můžete použít k sestavení zásad umístění. Tady je příklad:

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

Tento krok opakujte pro každý členský cluster, který přidáte, abyste identifikovali popisky a vlastnosti, které můžete použít ve svých zásadách.

Příprava úlohy na umístění

Dále publikujte úlohu do clusteru centra, aby ji bylo možné umístit do členských clusterů:

  1. Vytvořte obor názvů pro úlohu v clusteru centra:

    kubectl create namespace test-app 
    
  2. Ukázkovou úlohu je možné nasadit do nového oboru názvů v clusteru centra. Vzhledem k tomu, že tyto typy prostředků Kubernetes nevyžadují zapouzdření, můžete je nasadit beze změny.

    1. Uložte následující YAML do souboru s názvem 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. Nasaďte definici úlohy do clusteru centra:

      kubectl apply -f sample-workload.yaml
      

S nasazenou definicí úlohy je teď možné otestovat inteligentní umísťování kubernetes fleetu.

Testování zásad umístění úloh

Následující ukázky můžete použít spolu s koncepční dokumentací jako vodítka k psaní vlastního ClusterResourcePlacement objektu.

Poznámka:

Pokud chcete vyzkoušet jednotlivé ukázkové zásady, nezapomeňte předchozí objekt odstranit ClusterResourcePlacement .

Umístění na základě počtu uzlů clusteru

Tento příklad ukazuje řazení vlastností, které používá Descending pořadí. Toto pořadí znamená, že Kubernetes Fleet upřednostňuje clustery s vyšším počtem uzlů.

Cluster s nejvyšším počtem uzlů přijímá váhu 20 a cluster s nejnižší hodnotou přijímá váhu 0. Ostatní shluky přijímají proporcionální váhy vypočítané pomocí vzorce výpočtu hmotnosti.

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

Umístění s selektorem popisků a řazením vlastností

V tomto příkladu cluster obdrží váhu pouze v případě, že má popisek env=prod. Pokud cluster splňuje toto omezení popisku, je daná proporcionální váha na základě celkového využití procesoru v daném členském clusteru.

Tento příklad ukazuje, jak můžete pro spřažení použít selektor popisků i řazení preferredDuringSchedulingIgnoredDuringExecution vlastností. Členový cluster, který selže selektorem popisku, neobdrží žádnou váhu. Členské clustery, které vyhovují selektoru popisků, přijímají proporcionální váhy, jak je uvedeno v rámci řazení vlastností.

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

Umístění na základě nákladů na paměť a jádro procesoru

Vzhledem k tomu, že řazení v tomto příkladu má Ascending pořadí, dává Kubernetes Fleet přednost clusterům s nižšími náklady na paměť a jádra procesoru. Cluster s nejnižšími náklady na paměť a jádro procesoru přijímá váhu 20 a cluster s nejvyšší váhu přijímá 0. Ostatní shluky přijímají proporcionální váhy vypočítané pomocí vzorce výpočtu hmotnosti.

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

Zobrazení stavu umístění

Pokud chcete zobrazit stav umístění, můžete použít příkaz Azure Portal nebo kubectl.

Podrobnosti o tom, jak zobrazit průběh umístění, najdete v části Použití rozhraní API ClusterResourcePlacement k šíření prostředků do členských clusterů.

Vyčištění prostředků

Podrobnosti o odebrání umístění prostředků clusteru prostřednictvím webu Azure Portal nebo příkazu kubectl najdete v tématu Vyčištění prostředků v článku o šíření prostředků.