Sdílet prostřednictvím


Umístění prostředků Kubernetes z clusteru centra do členských clusterů

Tento článek popisuje koncept umístění prostředků Kubernetes z centrálních clusterů do členských clusterů pomocí Azure Kubernetes Fleet Manageru (Kubernetes Fleet).

Správci platformy často potřebují nasadit prostředky Kubernetes do několika clusterů z různých důvodů, například:

  • Správa řízení přístupu pomocí rolí a vazeb rolí napříč několika clustery
  • Spouštění aplikací infrastruktury, jako je Například Prometheus nebo Flux, které musí být na všech clusterech.

Vývojáři aplikací často potřebují nasadit prostředky Kubernetes do několika clusterů z různých důvodů, například:

  • Nasazení aplikace obsluhující video do několika clusterů v různých oblastech za účelem sledování nízké latence
  • Nasazení aplikace nákupního košíku do dvou spárovaných oblastí, aby zákazníci mohli pokračovat v nákupu během výpadku jedné oblasti.
  • Nasazení dávkové výpočetní aplikace do clusterů s levnými fondy spotových uzlů.

Je zdlouhavé vytvářet, aktualizovat a sledovat tyto prostředky Kubernetes napříč několika clustery ručně. Fleet poskytuje šíření prostředků Kubernetes, které umožňuje správu prostředků Kubernetes ve velkém měřítku. Pomocí Kubernetes Fleet můžete vytvářet prostředky Kubernetes v clusteru centra a šířit je do vybraných členských clusterů prostřednictvím vlastních prostředků Kubernetes: MemberCluster a ClusterResourcePlacement.

Kubernetes Fleet podporuje tyto vlastní prostředky založené na opensourcovém cloudovém nativním řešení, o kterém si můžete přečíst další informace o opensourcové dokumentaci k fleetu.

Představujeme ClusterResourcePlacement

Objekt ClusterResourcePlacement slouží k oznámení plánovači vozového parku, jak umístit danou sadu objektů s oborem clusteru z clusteru centra flotily na členské clustery. Objekty s oborem názvů, jako jsou Nasazení, StatefulSets, DaemonSets, ConfigMaps, Tajné kódy a PersistentVolumeClaims, jsou zahrnuty při výběru jejich oboru názvů.

Pomocí ClusterResourcePlacement:

  • Vyberte, které prostředky Kubernetes s oborem clusteru se mají rozšířit na členské clustery.
  • Zadejte zásady umístění pro ruční nebo automatický výběr členských clusterů jako cílových clusterů.
  • Určete strategie zavedení pro bezpečné zavedení všech aktualizací vybraných prostředků Kubernetes do více cílových clusterů.
  • Zobrazte průběh šíření směrem ke každému cílovému clusteru.

Příklad je znázorněn v následujícím diagramu.

Diagram znázorňující, jak se prostředek Kubernetes rozšíří do členských clusterů

Zapouzdření prostředků

ClusterResourcePlacement podporuje použití ConfigMap k obálce určitých typů prostředků Kubernetes, aby je bylo možné uspořádat v clusteru centra bez nežádoucích vedlejších účinků na cluster centra. Seznam typů prostředků a vysvětlení, jak tato funkce funguje, najdete v dokumentaci k objektu obálky.

Typy umístění

Pro řízení počtu clusterů, do kterých je potřeba rozšířit zadaný prostředek Kubernetes, jsou k dispozici následující typy umístění:

  • PickFixed umístí prostředek do konkrétního seznamu členských clusterů podle názvu.
  • Funkce PickAll umístí prostředek do všech členských clusterů nebo do všech členských clusterů, které splňují kritéria. Tato zásada je užitečná pro umístění úloh infrastruktury, jako jsou monitorování clusteru nebo aplikace pro vytváření sestav.
  • PickN je nejflexibilnější možnost umístění a umožňuje výběr clusterů na základě omezení rozložení spřažení nebo topologie a je užitečný při šíření úloh mezi několik vhodných clusterů, aby se zajistila požadovaná dostupnost.

Typ umístění PickFixed

Pokud chcete nasadit úlohu do známé sady členských clusterů, můžete pomocí PickFixed zásady umístění vybrat clustery podle názvu.

clusterNames je jedinou platnou možností zásad pro tento typ umístění.

Následující příklad ukazuje, jak nasadit test-deployment obor názvů na členské clustery cluster1 a cluster2.

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
  name: crp-fixed
spec:
  policy:
    placementType: PickFixed
    clusterNames:
    - cluster1
    - cluster2
  resourceSelectors:
    - group: ""
      kind: Namespace
      name: test-deployment
      version: v1

Typ umístění PickAll

Typ umístění můžete použít PickAll k nasazení úlohy napříč všemi členskými clustery ve vozovém parku nebo do podmnožiny clusterů, které splňují vámi nastavená kritéria.

Při vytváření tohoto typu umístění je možné zadat následující typy spřažení clusteru:

  • requiredDuringSchedulingIgnoredDuringExecution: protože se tato zásada vyžaduje během plánování, filtruje clustery na základě zadaných kritérií.

Následující příklad ukazuje, jak nasadit prod-deployment obor názvů a všechny jeho objekty ve všech clusterech označených environment: productionpomocí:

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
  name: crp-pickall
spec:
  policy:
    placementType: PickAll
    affinity:
        clusterAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
                clusterSelectorTerms:
                - labelSelector:
                    matchLabels:
                        environment: production
  resourceSelectors:
    - group: ""
      kind: Namespace
      name: prod-deployment
      version: v1

Typ umístění PickN

Typ PickN umístění je nejflexibilnější možností a umožňuje umístění prostředků do konfigurovatelného počtu clusterů na základě omezení rozložení spřažení i topologie.

Při vytváření tohoto typu umístění je možné zadat následující typy spřažení clusteru:

  • requiredDuringSchedulingIgnoredDuringExecution: protože se tato zásada vyžaduje během plánování, filtruje clustery na základě zadaných kritérií.
  • preferredDuringSchedulingIgnoredDuringExecution: tato zásada se upřednostňuje, ale nevyžaduje se při plánování, řadí clustery podle zadaných kritérií.

Můžete nastavit požadované i upřednostňované spřažení. Požadované spřažení brání umístění do clusterů, které se neshodují, a upřednostňované spřažení zajišťují řazení platných clusterů.

PickN spřažením

Použití spřažení s funkcemi PickN zásad umístění podobně jako použití spřažení s plánováním podů

Následující příklad ukazuje, jak nasadit úlohu do tří clusterů. Platné cíle umístění jsou pouze clustery s critical-allowed: "true" popiskem a předvolba je udělena clusterům s popiskem critical-level: 1:

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
  name: crp-pickn-01
spec:
  resourceSelectors:
    - ...
  policy:
    placementType: PickN
    numberOfClusters: 3
    affinity:
        clusterAffinity:
            preferredDuringSchedulingIgnoredDuringExecution:
              weight: 20
              preference:
              - labelSelector:
                  matchLabels:
                    critical-level: 1
            requiredDuringSchedulingIgnoredDuringExecution:
                clusterSelectorTerms:
                - labelSelector:
                    matchLabels:
                      critical-allowed: "true"

PickN s omezeními rozložení topologie

Omezení rozložení topologie můžete použít k vynucení rozdělení umístění clusteru napříč hranicemi topologie, aby splňovaly požadavky na dostupnost. Tato omezení můžete například použít k rozdělení umístění mezi oblasti nebo aktualizační kanály. Omezení rozložení topologie můžete také nakonfigurovat tak, aby se zabránilo plánování, pokud omezení nejde splnit (whenUnsatisfiable: DoNotSchedule) nebo naplánovat co nejlépe (whenUnsatisfiable: ScheduleAnyway).

Následující příklad ukazuje, jak rozšířit danou sadu prostředků do více oblastí a jak se pokusit naplánovat mezi členské clustery s různými dny aktualizace.

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
  name: crp-pickn-02
spec:
  resourceSelectors:
    - ...
  policy:
    placementType: PickN
    topologySpreadConstraints:
    - maxSkew: 2
      topologyKey: region
      whenUnsatisfiable: DoNotSchedule
    - maxSkew: 2
      topologyKey: updateDay
      whenUnsatisfiable: ScheduleAnyway

Další informace najdete v opensourcové topologii topologie dokumentace pro flotilu.

Možnosti zásad umístění

Tabulka shrnuje dostupná pole zásad plánování pro každý typ umístění.

Pole Zásady PickFixed PickAll PickN
placementType
affinity
clusterNames
numberOfClusters
topologySpreadConstraints

Výběr clusterů na základě popisků a vlastností

Dostupné popisky a vlastnosti pro výběr clusterů

Při použití PickN typů a PickAll umístění můžete jako součást zásad použít následující popisky a vlastnosti.

Popisky

Následující popisky se automaticky přidají do všech členských clusterů a dají se použít pro výběr cílového clusteru v zásadách umístění prostředků.

Štítek Popis
fleet.azure.com/location Oblast Azure clusteru (westus)
fleet.azure.com/resource-group Skupina prostředků Azure clusteru (rg_prodapps_01)
fleet.azure.com/subscription-id Identifikátor předplatného Azure, ve kterém se cluster nachází. Formátováno jako UUID/GUID.

Můžete také použít jakékoli vlastní popisky, které použijete u clusterů.

Vlastnosti

Následující vlastnosti jsou k dispozici pro použití v rámci zásad umístění.

Vlastnosti procesoru a paměti jsou reprezentovány jako jednotky prostředků Kubernetes.

Vlastnosti nákladů jsou desetinná místa, která představují hodinové náklady v amerických dolarech pro výpočetní prostředky Azure využívané pro uzly v clusteru. Náklady jsou založené na veřejných cenách Azure.

Název vlastnosti Popis
kubernetes-fleet.io/node-count Dostupné uzly v členském clusteru.
resources.kubernetes-fleet.io/total-cpu Celkový počet jednotek prostředků procesoru clusteru
resources.kubernetes-fleet.io/allocatable-cpu Jednotky prostředků procesoru s možností přidělování prostředků clusteru
resources.kubernetes-fleet.io/available-cpu Dostupné jednotky prostředků procesoru clusteru.
resources.kubernetes-fleet.io/total-memory Celková jednotka prostředků paměti clusteru
resources.kubernetes-fleet.io/allocatable-memory Jednotky prostředků paměti s možností přidělování paměti clusteru
resources.kubernetes-fleet.io/available-memory Dostupné jednotky prostředků paměti clusteru
kubernetes.azure.com/per-cpu-core-cost Náklady na jádro procesoru clusteru.
kubernetes.azure.com/per-gb-memory-cost Náklady na paměť na GiB clusteru.

Zadání kritérií shody výběru

Při použití vlastností clusteru v kritériích zásad zadáte:

  • Název: Název vlastnosti, která je jednou z vlastností uvedených v tomto článku.

  • Operátor: Operátor použitý k vyjádření podmínky mezi omezující/požadovanou hodnotou a pozorovanou hodnotou v clusteru. V současné době jsou podporovány následující operátory:

    • Gt (Větší než): Pozorovaná hodnota clusteru dané vlastnosti musí být větší než hodnota v podmínce, aby bylo možné ji vybrat pro umístění prostředků.
    • Ge (Větší než nebo rovno): Pozorovaná hodnota clusteru dané vlastnosti musí být větší nebo rovna hodnotě v podmínce, aby bylo možné vybrat umístění prostředků.
    • Lt (Menší než): Pozorovaná hodnota clusteru dané vlastnosti musí být menší než hodnota v podmínce, aby bylo možné ji vybrat pro umístění prostředků.
    • Le (Menší než nebo rovno): Pozorovaná hodnota clusteru dané vlastnosti musí být menší nebo rovna hodnotě v podmínce, než bude možné ji vybrat pro umístění prostředků.
    • Eq (Rovná se): Pozorovaná hodnota clusteru dané vlastnosti musí být rovna hodnotě v podmínce, aby bylo možné ji vybrat pro umístění prostředků.
    • Ne (Nerovná se): Pozorovaná hodnota clusteru dané vlastnosti nesmí být rovna hodnotě v podmínce, aby bylo možné ji vybrat pro umístění prostředků.

    Pokud použijete operátor Gt, , Ge, Lt, LeEqnebo Ne, seznam hodnot v podmínce by měl mít přesně jednu hodnotu.

  • Hodnoty: Seznam hodnot, které jsou možné hodnoty vlastnosti.

Flotila vyhodnocuje každý cluster na základě vlastností zadaných v podmínce. Nepodařilo se splnit podmínky uvedené v rámci requiredDuringSchedulingIgnoredDuringExecution vyloučení tohoto člena clusteru z umístění prostředků.

Poznámka:

Pokud členský cluster nemá vlastnost vyjádřenou v podmínce, podmínka se automaticky nezdaří.

Tady je příklad zásad umístění pro výběr pouze clusterů s pěti nebo více uzly.

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

Jak funguje řazení vlastností

Při preferredDuringSchedulingIgnoredDuringExecution použití seřadí řazení vlastností všechny clustery ve flotile na základě jejich hodnot ve vzestupném nebo sestupném pořadí. Váhy použité pro řazení se počítají na základě zadané hodnoty.

Řazení vlastností se skládá z:

  • Název: Název vlastnosti clusteru.
  • Pořadí řazení: Pořadí řazení může být buď Ascending nebo Descending. Při Ascending použití pořadí se preferují členské clustery s nižšími pozorovanými hodnotami. Při Descending použití pořadí se preferují členské clustery s vyšší pozorovanou hodnotou.
Sestupné pořadí

Pro pořadí řazení Sestupně se vypočítá proporcionální váha pomocí vzorce:

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

Řekněme například, že chcete seřadit clustery na základě vlastnosti dostupné kapacity procesoru v sestupném pořadí a že máte flotilu tří clusterů s následujícím dostupným procesorem:

Cluster Dostupná kapacita procesoru
cluster-a 100
cluster-b 20
cluster-c 10

V tomto případě vypočítá řazení následující váhy:

Cluster Dostupná kapacita procesoru Výpočet Hmotnost
cluster-a 100 (100 - 10) / (100 - 10) 100 %
cluster-b 20 (20 - 10) / (100 - 10) 11.11%
cluster-c 10 (10 - 10) / (100 - 10) 0 %
Vzestupné pořadí

Pro vzestupné pořadí řazení se proporcionální váha vypočítá pomocí vzorce:

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

Řekněme například, že chcete seřadit clustery na základě jejich nákladů na jádro procesoru vzestupně a že máte flotilu tří clusterů s následujícími náklady na jádra procesoru:

Cluster Náklady na jádro procesoru
cluster-a 0
cluster-b 0,2
cluster-c 0,1

V tomto případě vypočítá řazení následující váhy:

Cluster Náklady na jádro procesoru Výpočet Hmotnost
cluster-a 0 1 - ((1 - 0.1) / (1 - 0.1)) 0 %
cluster-b 0,2 1 - ((0.2 - 0.1) / (1 - 0.1)) 88.89%
cluster-c 0,1 1 - (0.1 - 0.1) / (1 - 0.1) 100 %

Používání tolerance

ClusterResourcePlacement objekty podporují specifikaci tolerance, která se vztahuje na ClusterResourcePlacement objekt. Každý objekt tolerance se skládá z následujících polí:

  • key: Klíč tolerance.
  • value: Hodnota tolerance.
  • effect: Účinek tolerance, například NoSchedule.
  • operator: Operátor tolerance, například Exists nebo Equal.

Každá tolerance se používá k tolerování jednoho nebo více specifických taintů použitých na ClusterResourcePlacement. Jakmile jsou všechny tainty na serveru MemberCluster tolerovány, plánovač pak může rozšířit prostředky do clusteru. Po vytvoření objektu ClusterResourcePlacement není možné aktualizovat ani odebrat tolerance.

Další informace najdete v opensourcové dokumentaci k sadě Fleet týkající se tolerance.

Konfigurace strategie zavedení

Flotila používá strategii postupné aktualizace k řízení způsobu zavádění aktualizací napříč clustery.

V následujícím příkladu plánovač flotily postupně zavede aktualizace jednotlivých clusterů a čeká alespoň unavailablePeriodSeconds mezi clustery. Stav zavedení se považuje za úspěšný, pokud byly na cluster správně použity všechny prostředky. Kontrola stavu zavedení se nespadá do podřízených prostředků, takže například nepotvrdí, že se pody vytvořené nasazením připraví.

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
  name: crp
spec:
  resourceSelectors:
    - ...
  policy:
    ...
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
      unavailablePeriodSeconds: 60

Další informace najdete v opensourcové dokumentaci k nasazení flotily.

Určení stavu umístění

Plánovač Flotily aktualizuje podrobnosti a stav rozhodnutí o umístění objektu ClusterResourcePlacement . Výstup obsahuje následující informace:

  • Podmínky, které se aktuálně vztahují na umístění, mezi které patří, pokud bylo umístění úspěšně dokončeno.
  • Oddíl stavu umístění pro každý členský cluster, který zobrazuje stav nasazení do tohoto clusteru.

Následující příklad ukazuje ClusterResourcePlacement , že nasadili test obor názvů a test-1 objekt ConfigMap do dvou členských clusterů pomocí PickN. Umístění bylo úspěšně dokončeno a prostředky byly umístěny do clusterůaks-member-1.aks-member-2

Tyto informace můžete zobrazit pomocí kubectl describe crp <name> příkazu.

kubectl describe crp crp-1
Name:         crp-1
Namespace:
Labels:       <none>
Annotations:  <none>
API Version:  placement.kubernetes-fleet.io/v1
Kind:         ClusterResourcePlacement
Metadata:
  ...
Spec:
  Policy:
    Number Of Clusters:  2
    Placement Type:      PickN
  Resource Selectors:
    Group:
    Kind:                  Namespace
    Name:                  test
    Version:               v1
  Revision History Limit:  10
Status:
  Conditions:
    Last Transition Time:  2023-11-10T08:14:52Z
    Message:               found all the clusters needed as specified by the scheduling policy
    Observed Generation:   5
    Reason:                SchedulingPolicyFulfilled
    Status:                True
    Type:                  ClusterResourcePlacementScheduled
    Last Transition Time:  2023-11-10T08:23:43Z
    Message:               All 2 cluster(s) are synchronized to the latest resources on the hub cluster
    Observed Generation:   5
    Reason:                SynchronizeSucceeded
    Status:                True
    Type:                  ClusterResourcePlacementSynchronized
    Last Transition Time:  2023-11-10T08:23:43Z
    Message:               Successfully applied resources to 2 member clusters
    Observed Generation:   5
    Reason:                ApplySucceeded
    Status:                True
    Type:                  ClusterResourcePlacementApplied
  Placement Statuses:
    Cluster Name:  aks-member-1
    Conditions:
      Last Transition Time:  2023-11-10T08:14:52Z
      Message:               Successfully scheduled resources for placement in aks-member-1 (affinity score: 0, topology spread score: 0): picked by scheduling policy
      Observed Generation:   5
      Reason:                ScheduleSucceeded
      Status:                True
      Type:                  ResourceScheduled
      Last Transition Time:  2023-11-10T08:23:43Z
      Message:               Successfully Synchronized work(s) for placement
      Observed Generation:   5
      Reason:                WorkSynchronizeSucceeded
      Status:                True
      Type:                  WorkSynchronized
      Last Transition Time:  2023-11-10T08:23:43Z
      Message:               Successfully applied resources
      Observed Generation:   5
      Reason:                ApplySucceeded
      Status:                True
      Type:                  ResourceApplied
    Cluster Name:            aks-member-2
    Conditions:
      Last Transition Time:  2023-11-10T08:14:52Z
      Message:               Successfully scheduled resources for placement in aks-member-2 (affinity score: 0, topology spread score: 0): picked by scheduling policy
      Observed Generation:   5
      Reason:                ScheduleSucceeded
      Status:                True
      Type:                  ResourceScheduled
      Last Transition Time:  2023-11-10T08:23:43Z
      Message:               Successfully Synchronized work(s) for placement
      Observed Generation:   5
      Reason:                WorkSynchronizeSucceeded
      Status:                True
      Type:                  WorkSynchronized
      Last Transition Time:  2023-11-10T08:23:43Z
      Message:               Successfully applied resources
      Observed Generation:   5
      Reason:                ApplySucceeded
      Status:                True
      Type:                  ResourceApplied
  Selected Resources:
    Kind:       Namespace
    Name:       test
    Version:    v1
    Kind:       ConfigMap
    Name:       test-1
    Namespace:  test
    Version:    v1
Events:
  Type    Reason                     Age                    From                                   Message
  ----    ------                     ----                   ----                                   -------
  Normal  PlacementScheduleSuccess   12m (x5 over 3d22h)    cluster-resource-placement-controller  Successfully scheduled the placement
  Normal  PlacementSyncSuccess       3m28s (x7 over 3d22h)  cluster-resource-placement-controller  Successfully synchronized the placement
  Normal  PlacementRolloutCompleted  3m28s (x7 over 3d22h)  cluster-resource-placement-controller  Resources have been applied to the selected clusters

Aktivační události změny umístění

Plánovač flotily upřednostňuje stabilitu stávajících umístění úloh. Toto stanovení priority může omezit počet změn, které způsobují odebrání a přeplánování úlohy. Následující scénáře můžou aktivovat změny umístění:

  • Změny zásad umístění v objektu ClusterResourcePlacement můžou aktivovat odebrání a přeplánování úlohy.
    • Operace horizontálního navýšení kapacity (zvýšení numberOfClusters bez dalších změn) umístí úlohy pouze do nových clusterů a neovlivní stávající umístění.
  • Změny clusteru, včetně:
    • Nový cluster, který se stane způsobilým, může aktivovat umístění, pokud nový cluster splňuje zásady umístění, například zásadu PickAll .
    • Cluster s umístěním se odebere z flotily. V závislosti na zásadách se plánovač pokusí umístit všechny ovlivněné úlohy do zbývajících clusterů bez ovlivnění stávajících umístění.

Změny pouze prostředků (aktualizace prostředků nebo aktualizace objektu ResourceSelector ClusterResourcePlacement ) se postupně zavádět v existujících umístěních, ale neaktivují opětovné plánování úlohy.

Další kroky