Kubernetes jest systemem zarządzania kontenerami, który umożliwia tworzenie i uruchamianie aplikacji w chmurze. Jedną z głównych zalet Kubernetes jest to, że automatycznie skaluje aplikacje w zależności od zapotrzebowania na zasoby i ruchu. W tym artykule wyjaśnię, jak działa skalowanie w Kubernetes i jakie są jego rodzaje.
Skalowanie w Kubernetes można podzielić na dwa poziomy: skalowanie poziome i skalowanie pionowe. Skalowanie poziome polega na zwiększaniu lub zmniejszaniu liczby podów, czyli podstawowych jednostek obliczeniowych w Kubernetes. Pod to grupa jednego lub więcej kontenerów, które współdzielą zasoby i sieć. Skalowanie pionowe polega na zwiększaniu lub zmniejszaniu zasobów przydzielonych do podów, takich jak CPU, pamięć czy dysk.
Skalowanie poziome można wykonywać na dwa sposoby: ręcznie lub automatycznie. Skalowanie ręczne polega na ustawieniu żądanej liczby podów dla danego zbioru replik (ReplicaSet), który jest odpowiedzialny za utrzymywanie określonej liczby identycznych podów. Można to zrobić za pomocą polecenia kubectl scale lub poprzez edycję pliku YAML definiującego zbiór replik. Przykładowo, aby ustawić liczbę podów na 5 dla zbioru replik o nazwie my-app, można użyć polecenia:
kubectl scale --replicas=5 replicaset/my-app
Skalowanie automatyczne polega na wykorzystaniu mechanizmu nazywanego HPA (Horizontal Pod Autoscaler), który monitoruje obciążenie podów i automatycznie dostosowuje ich liczbę do aktualnego zapotrzebowania. HPA bazuje na metrykach takich jak średnie zużycie CPU lub pamięci przez pod lub średnia liczba żądań na sekundę obsługiwanych przez pod. Aby skorzystać z HPA, należy utworzyć obiekt typu HorizontalPodAutoscaler, który określa minimalną i maksymalną liczbę podów oraz docelową wartość metryki, do której ma dążyć HPA. Przykładowo, aby utworzyć HPA dla zbioru replik o nazwie my-app, który ma utrzymywać średnie zużycie CPU na poziomie 50%, przy minimalnej liczbie podów równej 1 i maksymalnej równej 10, można użyć polecenia:
kubectl autoscale rs my-app --min=1 --max=10 --cpu-percent=50
Skalowanie pionowe również można wykonywać na dwa sposoby: ręcznie lub automatycznie. Skalowanie ręczne polega na określeniu żądanych i/lub limitów zasobów dla kontenerów wewnątrz poda. Żądania określają minimalne zasoby gwarantowane dla kontenera, natomiast limity określają maksymalne zasoby dozwolone dla kontenera. Można to zrobić poprzez edycję pliku YAML definiującego pod lub za pomocą polecenia kubectl set resources. Przykładowo, aby ustawić żądanie CPU na 0.5 i limit CPU na 1 dla kontenera o nazwie my-container wewnątrz poda o nazwie my-pod, można użyć polecenia:
kubectl set resources pod my-pod --containers=my-container --requests=cpu=0.5 --limits=cpu=1
Skalowanie automatyczne polega na wykorzystaniu mechanizmu nazywanego VPA (Vertical Pod Autoscaler), który monitoruje zużycie zasobów przez pod i automatycznie dostosowuje ich żądania i limity do aktualnego zapotrzebowania. VPA bazuje na historii zużycia zasobów przez pod i na podstawie tego wyznacza optymalne wartości żądań i limitów. Aby skorzystać z VPA, należy utworzyć obiekt typu VerticalPodAutoscaler, który określa pod lub zbiór replik, dla którego ma działać VPA, oraz tryb działania VPA, który może być następujący:
– Off: VPA nie zmienia żądań i limitów podów, tylko generuje rekomendacje.
– Initial: VPA ustawia żądania i limity podów tylko przy ich tworzeniu, na podstawie rekomendacji.
– Auto: VPA ustawia żądania i limity podów zarówno przy ich tworzeniu, jak i podczas ich działania, na podstawie rekomendacji. W tym trybie VPA może restartować pod, jeśli uzna to za konieczne.
Przykładowo, aby utworzyć VPA dla zbioru replik o nazwie my-app w trybie Auto, można użyć polecenia:
kubectl apply -f vpa.yaml
gdzie plik vpa.yaml ma następującą zawartość:
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: my-app-vpa
spec:
targetRef:
apiVersion: "apps/v1"
kind: ReplicaSet
name: my-app
updatePolicy:
updateMode: "Auto"
Podsumowując, skalowanie w Kubernetes jest kluczowym elementem zapewniającym wysoką dostępność i wydajność aplikacji w chmurze. Istnieją różne sposoby i narzędzia do skalowania aplikacji w Kubernetes, w zależności od potrzeb i preferencji użytkowników. Skalowanie poziome pozwala na elastyczne dostosowywanie liczby podów do zmieniającego się ruchu, natomiast skalowanie pionowe pozwala na optymalne wykorzystanie zasobów przez pod. Skalowanie można wykonywać ręcznie lub automatycznie, korzystając z mechanizmów takich jak HPA i VPA.