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:
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:
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.
Powiązana zawartość
Azure Kubernetes Service