Pojęcia dotyczące skalowalności

Ukończone

Przed znalezieniem rozwiązania do skalowania należy zrozumieć, jaka jest skalowalność i jak ma zastosowanie do aplikacji Kubernetes.

W tej lekcji zapoznamy się z niektórymi pojęciami dotyczącymi skalowalności.

Skalowalność

Skalowalność opisuje zdolność aplikacji lub systemu do obsługi rosnącej ilości pracy przez dodanie do niej większej liczby zasobów.

W naszym przykładowym scenariuszu ilość pracy, której dotyczy wzrost, to liczba żądań klientów. Ilość dodanych zasobów można przedstawić na dwa sposoby: skalowalność w pionie i skalowalność poziomą.

Skalowalność pionowa

Skalowalność w pionie lub skalowanie w górę odnosi się do skalowania systemu przez dodanie większej ilości zasobów fizycznych, takich jak pamięć lub moc procesora CPU. Jeśli na przykład witryna internetowa twojej firmy zużywa zbyt dużo pamięci, możesz zaktualizować wystąpienie maszyny wirtualnej, aby uwzględnić więcej pamięci przy zachowaniu tej samej aplikacji źródłowej.

Vertical scaling diagram.

Krótko mówiąc, skalowanie w pionie polega na zwiększeniu rozmiaru maszyny wirtualnej przy zachowaniu tej samej liczby aplikacji. Takie podejście jest przydatne, jeśli masz monolityczne aplikacje, które wymagają dużej mocy obliczeniowej, ale są zbyt kosztowne, aby podzielić się na mniejsze części. Te aplikacje są w większości hostowane na maszynach wirtualnych, a nie w systemach rozproszonych.

Pomimo bardziej zarządzanych kosztów bardzo duże maszyny wirtualne mogą stać się bardzo kosztowne. Koszt dodawania większej mocy obliczeniowej jest wyższy niż koszt duplikowania małych maszyn wirtualnych. Istnieje górny limit liczby zasobów, które można dodać do pojedynczej maszyny wirtualnej, co oznacza, że po osiągnięciu górnej granicy należy ostatecznie zduplikować maszynę wirtualną.

Skalowalność w poziomie

Skalowalność w poziomie lub skalowanie w poziomie odnosi się do skalowania systemu przez duplikowanie aplikacji i równoważenie obciążenia w wystąpieniach aplikacji.

Horizontal scaling diagram.

Skalowanie w poziomie jest przydatne w przypadku aplikacji rozproszonych, takich jak wdrożone w usłudze AKS, i systemów bezstanowych, ponieważ można uruchamiać kilka kontenerów z tą samą aplikacją na jednej maszynie wirtualnej. Skalowanie w górę umożliwia wyodrębnianie większości zasobów podczas płacenia za pojedynczą maszynę wirtualną.

W naszym przykładowym scenariuszu witryna firmy jest bezstanowa. Oznacza to, że skalowanie w górę jest najlepszym sposobem działania. Platforma Kubernetes udostępnia wbudowany zasób o nazwie HorizontalPodAutoscaler (HPA), który umożliwia skalowanie wdrożeń w poziomie.

Ręczna skalowalność na platformie Kubernetes

Zanim omówimy rozwiązanie HPA, sprawdźmy, jak ręcznie skalować aplikację Kubernetes.

Każde wdrożenie jest powiązane z innym zasobem o nazwie ReplicaSet. Zestaw replik jest odpowiedzialny za utrzymywanie "żądanego stanu repliki" i skalowanie rzeczywistej aplikacji w lub na wyjęcie, aby zachować żądany stan tak samo jak rzeczywisty. Liczbę replik we wdrożeniu można kontrolować za pomocą spec.replicas klucza w specyfikacji wdrożenia. Ten klucz ustawia liczbę żądanych replik w bazowym zestawie replik i wymusza zachowanie tej liczby replik w danym momencie przez kontroler replikacji.

Możesz również kontrolować liczbę replik we wdrożeniu kubectl scale deploy/contoso-website --replicas <number> za pomocą polecenia . To polecenie dynamicznie zmienia liczbę żądanych replik we wdrożeniu i skaluje aplikację w poziomie lub w poziomie.

HorizontalPodAutoscaler (HPA)

HpA to natywny zasób Kubernetes w wersji 1.8 lub nowszej, który zapewnia skalowalność poziomą zasobników w klastrze. Monitoruje interfejs API metryk co 30 sekund pod kątem wszelkich zmian w żądanej liczbie replik. Jeśli żądana liczba replik różni się od bieżącej liczby replik, menedżer kontrolera, który zarządza obiektami HPA, skaluje wdrożenie w poziomie lub w poziomie.

HorizontalPodAutoscaling design diagram.

Narzędzia HPA współpracują z grupą interfejsów autoscaling API na platformie Kubernetes. Istnieją dwie wersje tej grupy interfejsów API: v1 i v2. Wersja v1 umożliwia skalowanie wdrożenia tylko na podstawie metryk procesora CPU. Wersja v2 umożliwia natywne monitorowanie procesora CPU i pamięci. W tym module używamy v2 wersji.

Każde narzędzie HPA jest dołączone do odwołania do skali, które jest zdefiniowane w spec.scaleTargetRef kluczu manifestu HPA. To odwołanie skalowania musi mieć bazowe zasobniki do skalowania, w przeciwnym razie hpa nie działa, ponieważ nie można zastosować skalowania do obiektów, których nie można skalować, takich jak DaemonSets.

Ważne jest, aby każdy zasobnik miał żądanie zasobu ustawione w specyfikacji. Algorytm HPA nie może poprawnie obliczyć metryk i określić wykorzystanie zasobów bez tego ustawienia. Ten limit można ustawić za pomocą spec.template.spec.containers[].resources klucza w manifeście wdrożenia, jak pokazano w poniższym przykładzie:

spec:
  template:
    spec:
      containers:
        - resources:
            requests:
              cpu: 250m
              memory: 256M
            limits:
              cpu: 500m
              memory: 512M

Przykładowy manifest HPA

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: php-apache
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: php-apache
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50

Sprawdź swoją wiedzę

1.

Co to jest skalowanie w poziomie?

2.

Dlaczego ważne jest, aby żądanie zasobu było ustawione na zasobnikach powiązanych z hpa?

3.

Dlaczego skalowanie w pionie jest mniej zalecane w przypadku aplikacji bezstanowych?