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:
Azure Kubernetes Service