przydzielanie zasobów sprzętowych kontenerom Dockera

Przydzielanie zasobów sprzętowych kontenerom Dockera

Zajmę się dzisiaj jednym z kluczowych aspektów, z którego powinieneś korzystać na co dzień przy tworzeniu kontenerów, a jest to przydzielanie zasobów sprzętowych kontenerom. Dzięki stosowaniu tej metody zapewniasz nim, odpowiednią wydajność i stabilność, przez co nie zmarnujesz zasobów, tylko wykorzystujesz odpowiednią ich ilość. Na pierwszy rzut oka może się to wydawać niewygodne i wcale nie tak pomocne. Jednak odpowiednie przydzielenie takich zasobów jak procesor, pamięć czy też miejsce na dysku sprawi, że kontener będzie posiadał limit, którego nie przekroczy. W związku z tym nie zakłóci on działania pozostałym kontenerom, jak i również w przypadku uzyskania do niego dostępu przez osobę niepowołaną uniemożliwi nadużycie związane z nadmiernym wykorzystaniem zasobów, co za tym idzie zakłóceniem działania serwera czy też pozostałych kontenerów.

W tym materiale zobaczysz jak można przeprowadzić przydzielanie zasobów sprzętowych kontenerom.

 

Sprawdź, czego nauczysz się dzięki kursowi Grafany!

Udostępniamy darmowo ponad godzinny materiał z kursu. Przekonaj się, że jest idealny dla Ciebie!

Chcesz wziąć udział w kursie? Kliknij w link i obejrzyj co Cię czeka: https://asdevops.pl/demo-grafana/

 

 

 

 

Znaczenie alokacji zasobów

W Dockerze ważne jest, aby odpowiednio przydzielić zasoby kontenerom. Ma to na celu upewnienie się, że uzyskają one taką ilość, aby mogły optymalnie działać. Niewłaściwe ich rozdzielenie może spowodować spadek wydajności, a nawet doprowadzić do awarii. Natomiast brak przydzielenia zasobów może skutkować nadmiernym ich zużyciem i gdy przekroczony zostanie limit zasobów hosta, wpłynie to na pozostałe kontenery i aplikacje w nich zawarte. Dlatego istotne jest, aby dla grupy kontenerów, które będą uruchomione w hoście stworzyć odpowiednią strategię efektywnej alokacji zasobów.

Strategia efektywnej alokacji zasobów

W celu stworzenia efektywnego alokowania zasobów powinniśmy wziąć pod uwagę kilka kluczowych elementów. Pierwszy z nich dotyczy zapoznania się z wymaganiami dotyczącymi zasobów, jakie aplikacja będzie zużywać. W tym celu należy sprawdzić minimalne oraz maksymalne wymagania co do procesora, pamięci RAM czy też miejsca na dysku. Po poznaniu powyższych czynników należy ustawić odpowiednie limity zasobów. W ten sposób na jednym hoście, na jednym serwerze możesz uruchomić kilka kontenerów i wykorzystać w pełni potencjał, jakim dysponuje.

W przypadku wspomnianych limitów możemy przeprowadzić tak zwane ustawienie limitów kontenera, jak i zarezerwować dodatkowe zasoby.

Pomocna może okazać się orkiestracja kontenerów za pomocą Docker Swarm lub Kubernetes dzięki swojej automatyzacji z tym związanej. To one zapewniają najbardziej efektywną alokację zasobów bez konieczności wykonywania tego w ręczny sposób. Jednak pomimo tego, w dalszej części tego materiału pokażę jak wykonać to ręcznie.

Ostatnim punktem strategii jest monitoring zużycia zasobów. Poprzez rozrost aplikacji z czasem wzrośnie zapotrzebowanie na zasoby. Dzięki monitoringowi jesteśmy w stanie taką potrzebę wykryć i odpowiednio na nią zareagować. Monitoring pomoże również w sytuacji, gdy kontenery zużywają o wiele mniej zasobów niż mają przydzielone. To dzięki monitoringowi sprawisz efektywniejsze wykorzystanie dostępnych możliwości twojego serwera, jak i również obniżysz koszty, ponieważ wykorzystasz w pełni, to co masz. Może to skutkować potrzebą zakupu mniejszej ilości serwerów.

Zrozumienie alokacji zasobów w Dockerze

Jak już wiesz możesz przydzielać zasoby sprzętowe do kontenerów i wiesz już po co. Natomiast taki przydział powoduje, że kontener ma określony próg zasobów jakiego nie może przekroczyć. W ten sposób poprzez prostą kalkulację wiesz co możesz na danym serwerze uruchomić i jaki lub jakie będziesz jeszcze potrzebował. Zasobami jakimi możesz zarządzać są:

  • procesor;
  • pamięć RAM;
  • przestrzeń dyskowa;

Limit, a rezerwacja zasobów

Choć oba zagadnienia mogą się wydawać identyczne, to jednak różnią się od siebie. Zarówno jedno, jak i drugie służy do ustawienia zasobów, wymienionych w poprzednim akapicie, jednak wykorzystanie zasobów przydzielonych za pomocą jednej i drugiej opcji jest wykorzystywana w zupełnie innych momentach.

Poprzez limit zasobów mówimy kontenerowi jaką ilością pamięci RAM, przestrzeni dyskowej czy też ilością procesorów dysponuje. Po osiągnięciu tego limitu Docker zacznie wprowadzać ograniczenia na procesor i pamięć RAM. Gdy dojdzie do pewnego krytycznego stanu, może zatrzymać kontener. Wymusza to tak naprawdę jądro systemowe i w ten sposób blokuje możliwość przekroczenia określonej wartości przez kontener. Natomiast rezerwacja zasobów polega na przydzieleniu, zarezerwowaniu dodatkowej ilości procesorów, pamięci RAM czy też przestrzeni dyskowej, z której kontener korzysta, gdy wyczerpie określony mu limit.

Metody alokacji zasobów do kontenerów

Poznałeś już podstawowe zagadnienia związane z przydzielaniem zasobów w Dockerze. Teraz chciałbym pokazać na przykładach jak to zrobić w poszczególnych narzędziach.

Docker Compose

Jest to narzędzie, dzięki któremu zdefiniujesz, a następnie uruchomisz wielokontenerowe aplikacje Dockera. Posiada on możliwość określenia ilości zasobów do każdego z kontenerów w swojej strukturze. Zerknijmy na poniższy przykład:

version: '3.8'

services:
  web:
	image: nginx
	ports:
  	  - "80:80"
	networks:
  	  - my-network
	deploy:
  	  resources:
    	    limits:
      	      cpus: '0.5'
      	      memory: '512M'

  db:
	image: postgres
	volumes:
  	  - db-data:/var/lib/postgresql/data
	networks:
  	  - my-network
	deploy:
  	  resources:
    	    limits:
      	      cpus: '0.5'
      	      memory: '512M'

volumes:
  db-data:

networks:
  my-network:

Jeżeli znasz konstrukcje plików yaml, dla Docker Compose powyższy przykład nie powinien sprawić Ci żadnych problemów. Przydzielenie zasobów sprzętowych kontenerom za pomocą Docker Compose nie należy do niczego skomplikowanego. Natomiast w tym wypadku ustawiliśmy identyczne limity dla jednego, jak i drugiego kontenera. Natomiast chciałbym jeszcze przytoczyć przykład, gdzie przydzielamy limity i rezerwujemy dodatkowe zasoby:

version: "3.8"

services:
  my-service:
	image: my-image
	container_name: my-container
	restart: always
	environment:
  	  - NODE_ENV=production
	ports:
  	  - "8080:8080"
	deploy:
  	  resources:
    	    limits:
      	      cpus: "1.5"
      	      memory: 1g
      	      disk: 2g
    	    reservations:
      	      cpus: "1"
      	      memory: 512m
      	      disk: 1g

Od razu zaznaczę, że jest to abstrakcyjny przykład, ponieważ nie zawiera rzeczywistego obrazu. Jednak w nim przydzielamy limity, jak i również rezerwujemy dodatkowe zasoby do wskazanego obrazu. Musisz jednak pamiętać, że nie możesz rezerwować zasobów, o wartościach wyższych niż określiłeś w limicie.

Docker Swarm

Docker Swarm jest narzędziem służącym do orkiestracji kontenerów Dockera. Dzięki niemu możesz wdrażać aplikacje wielokontenerowe i nimi zarządzać w klastrze za pomocą węzłów. Jak działa Docker Compose i Docker Swarm opisywaliśmy w kursie dla Administratora, dlatego teraz zerknijmy, w jaki sposób za pomocą poleceń jesteśmy w stanie przydzielić limity:

docker service create --replicas 1 --name my-service --image my-image --reserve-cpu 1 --reserve-memory 512m --limit-cpu 1.5 --limit-memory 1g --mount type=tmpfs,destination=/path/to/mount,tmpfs-size=1g --limit-disk 2g

Oczywiście ustawienia odpowiednich wartości jest zależne od potrzeb aplikacji. Jednak co istotne w powyższym poleceniu ustawiliśmy limity, jak i również zarezerwowaliśmy dodatkowe zasoby. Zwróć uwagę, że dla montowania typu tmpfs podzieliliśmy również limit. Jeżeli zaistnieje konieczność, możemy aktualizować powyższe wartości. Zamiast create wprowadzamy update i wpisujemy wartości, na jakie chcemy zmienić.

Kubernetes

Kubernetes to platforma orkiestracji kontenerów, która umożliwia wdrażanie, skalowanie i zarządzanie aplikacjami kontenerowymi. Jest to bardziej rozbudowany system niż prezentowany przed chwilą Docker Swarm. Posiada o wiele większe możliwości, dlatego jest często wybierany przy aplikacjach bardzo złożonych. W celu przydzielenia określonych limitów zasobów oraz rezerwacji plik yaml powinien być skonstruowany w następujący sposób:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
     image: my-image
     resources:
       limits:
         cpu: "1.5"
         memory: 1Gi
         ephemeral-storage: 2Gi
       requests:
         cpu: "1"
         memory: 512Mi
         ephemeral-storage: 1Gi

Bardzo zbliżona konstrukcja jak w przypadku Docker Compose. W powyższym przykładzie dla Poda wyznaczmy limity CPU, pamięci RAM oraz przestrzeni dyskowej, jak i do każdego z tych elementów rezerwujemy dodatkowe zasoby.

Alokacja zasobów dla kontenerów Dockera za pomocą poleceń

Możesz także ręcznie przydzielać zasoby do kontenerów Dockera. Wiąże się to z ustalaniem limitów zasobów i rezerwacji dla każdego kontenera indywidualnie, na podstawie jego wymagania. Chociaż ta metoda wymaga więcej wysiłku i uwagi na szczegóły, może być przydatna w sytuacjach, w których inne metody nie są dostępne lub z nich nie korzystasz. Oto przykład ustawiający limity oraz rezerwację cpu, pamięci ram oraz przydzielający przestrzeń dyskową:

docker run -it --name my-container --cpus 1.5 --memory 1g --memory-reservation 512m --mount type=tmpfs,destination=/path/to/mount,tmpfs-size=1g --storage-opt size=2g my-image

W przypadku użycia, polecenia do określenia limitów oraz rezerwacji CPU, Docker używa jednego polecenia. Dlatego opcja –cpus zarówno ustawi limit, jak i zarezerwuje określoną liczbę procesorów. W powyższym przypadku opcje –cpus i –memory służą do ustawiania limitów zasobów, natomiast opcję –memory-reservation, –mount i –storage-opt służą do ustawiania rezerwacji zasobów.

Podsumowanie – przydzielanie zasobów sprzętowych kontenerom Dockera

Przydzielanie zasobów sprzętowych kontenerom nie należy do zadań bardzo skomplikowanych. Jak zapewne zauważyłeś, polega to na ustawieniu kilku opcji, które w większości przypadku są bardzo intuicyjne. Jeżeli jeszcze nie zacząłeś korzystać z ustawiania limitów dla swoich kontenerów, to mam nadzieję, że dzięki temu materiałowi zaczniesz to robić.

Chcesz wiedzieć więcej na temat konteneryzacji? Przeczytaj nasze artykuły, a także weź udział w kursach!

 

 

 

Sprawdź, czego nauczysz się dzięki kursowi Grafany!

Udostępniamy darmowo ponad godzinny materiał z kursu. Przekonaj się, że jest idealny dla Ciebie!

Chcesz wziąć udział w kursie? Kliknij w link i obejrzyj co Cię czeka: https://asdevops.pl/demo-grafana/

 
 
 

Lekcja demo kursu Grafany!

X