‫Jak dotąd w Kubernetes tak naprawdę nie rozmawialiśmy o pamięci
‫ani woluminach.
‫Poradziłeś sobie z tym z Dockerem, a następnie
‫z Compose i Swarm, i do pewnego stopnia w Kubernetes
‫jest tak samo.
‫Masz pojemniki, a my zakładamy, że pojemniki
‫są bezstanowe, co oznacza, że kiedy wyrzucisz
‫pojemnik, wszystko w nim zniknie.
‫Kiedy zamienisz pojemnik na aktualizację lub zmienisz coś
‫i zastosujesz go za pomocą aplikacji kubectl, stracisz pojemnik, stracisz wszystko
‫w nim.
‫Oczywiście Kubernetes, podobnie jak inni orkiestratorzy,
‫musi mieć sposób, aby trwałe
‫dane pozostały. To nawet więcej niż same tomy.
‫Nawet kontenery i wdrożenia mogą być różne w Kubernetes
‫z czymś zwanym StatefulSets.
‫Są to zasoby inne
‫niż wdrożenia.
‫Zasadniczo są one zaprojektowane wokół baz danych i rzeczy, które wymagają znacznie
‫większej trwałości, w tym tej samej nazwy
‫i takich samych adresów IP.
‫Nie dostaliśmy tego poza zasięgiem Swarma
‫lub Dockera.
‫Tak naprawdę nie było sposobu, aby zachować
‫te różne atrybuty między kontenerami.
‫StatefulSets to nowa funkcja w
‫Kubernetes, której nie ma tu trochę czasu.
‫To jest to, na co spojrzysz, jeśli
‫weźmiesz pod uwagę bazy danych lub coś bardzo wrażliwego na
‫zmiany, takie jak nazwy, adresy IP, woluminy i trwałe
‫dane. Słowo ostrzeżenia tutaj.
‫Powodem, dla którego nie będziemy omawiać
‫wielu szczegółów, jest to, że nie polecam, aby twoje
‫pierwsze wdrożenie Kubernetes obejmowało wiele
‫zestawów StatefulSets. W rzeczywistości idealnie byłoby, gdyby
‫twoje pierwsze wdrożenie orkiestratora, dowolnego orkiestratora, niezależnie
‫od tego, czy jest to Swarm, czy Kubernetes,
‫dotyczyło tylko bezpaństwowców. Może po prostu wykonuj nakładki
‫WWW, niektóre interfejsy API, niektóre funkcje robocze lub coś, co
‫nie wymaga baz danych. W rzeczywistości, jeśli możesz korzystać z baz
‫danych w chmurze, zrób to.
‫Zawsze polecam outsourcing twoich baz danych, chyba że
‫masz określone wymagania, których po prostu nie możesz
‫uniknąć podczas samodzielnego uruchamiania. Początkowo organizacja była
‫zaprojektowana tak, aby pojemniki były niezmienne, dystrybuowane
‫i wymienialne.
‫Ta idea lepkości dla stanu będzie dodawać więcej pracy
‫i złożoności oraz wiele więcej
‫testów dla Ciebie. Idealnie, poza bramą, nie musisz
‫się o to martwić.
‫Później, kiedy już poczujesz się bardziej komfortowo ze wszystkimi innymi rzeczami
‫w Kubernetes, możesz wrócić i powiedzieć, teraz
‫chcę rozważyć moje bazy danych.
‫Nie jest tak, że nie powinieneś uruchamiać baz danych w klastrach.
‫To po prostu więcej pracy. Trudniej
‫Bazy danych i trwałe przechowywanie są zawsze trudniejsze i
‫wymagają więcej szczegółów. Oto moja pro wskazówka.
‫Do dowolnego kontenera możesz dodać wolumin bardzo
‫podobny do tego, co zrobiłeś w Swarm oraz
‫w Docker i Docker Compose. Możesz po prostu dodać instrukcję woluminu
‫do szablonu wewnątrz specyfikacji. Jeśli myślisz o pliku YAML,
‫możemy po prostu umieścić tam wolumin, tak jak można
‫się spodziewać, a dokładny format i szczegóły
‫znajdują się w zasobach. W przeciwieństwie do Dockera
‫i Swarma, w których objętość jest z pojemnikiem, w
‫tym przypadku jest to technicznie z zasobnikiem. Łączy się z każdym pojemnikiem lub tylko jednym pojemnikiem
‫w kapsule, jeśli tak mówisz.
‫Więc kontrolujesz to na poziomie pojemnika, ale jego wytrwałość jest na
‫poziomie zasobnika. Nowszą
‫funkcją są trwałe woluminy.
‫Działa to z czymś innym, co nazywa się roszczeniem.
‫Ciekawym pomysłem jest to, że
‫używasz go lub definiujesz poza
‫zasobnikami. Zasadniczo tworzysz ten
‫zasób samodzielnie, a następnie wysuwasz roszczenie przeciwko
‫temu zasobowi w specyfikacji poda.
‫Jest to bardziej interesujące, ponieważ Kubernetes przejmuje
‫firmę, często ludzie zajmują się pamięcią,
‫często pamięcią zewnętrzną, to nie ten sam zespół
‫zarządzający Kubernetes.
‫Będą oni zaangażowani w zarządzanie i tworzenie
‫tych trwałych woluminów.
‫W takim razie to wdrażający aplikacje powiedzą:
‫hej, potrzebuję
‫woluminu tego typu. Tak więc zamierzam zgłosić roszczenie dotyczące
‫dysku SSD, bo może potrzebujemy pamięci RAM, a może potrzebuję NFS lub
‫cokolwiek innego. Pamięć ta
‫zostanie zapewniona automatycznie, ponieważ zespół pamięci już
‫skonfigurował ją w Kubernetes.
‫Taki jest pomysł trwałych tomów.
‫Jeśli potrzebujesz tylko prostej pamięci na
‫jednym serwerze tymczasowo dla zasobnika, skorzystaj z atrybutu
‫standardowych woluminów.
‫Ostatnia sprawa
‫dotyczy tworzenia wtyczek CSI. W historii
‫Kubernetes wszystko, co było pamięcią zewnętrzną, czy to
‫pamięć w chmurze, czy pamięć innego dostawcy, czy
‫coś niestandardowego, którekolwiek z tych rzeczy
‫zostało dodane w drzewie.
‫Oznacza to, że został dodany do plików binarnych
‫Kubernetes i dostarczony z Kubernetes.
‫Oznacza to, że Kubernetes został dostarczony z pamięcią Amazon i Azure
‫zbudowaną od razu po wyjęciu z pudełka.
‫To było całkiem wygodne, ale dodało tak
‫wielu wyzwań.
‫Większość z nich była związana z faktem, że
‫dostawcy pamięci masowej wnieśli teraz kod do rdzenia twojego systemu, którego
‫prawdopodobnie nawet nie potrzebowałeś, ponieważ możesz używać tylko jednego dostawcy pamięci masowej, więc
‫dlaczego wszyscy z nich?
‫Ponadto dostawcy pamięci masowych musieli następnie kontrolować swoje cykle wydawnicze
‫wokół cyklu wydawniczego Kubernetes i nie był to
‫zbyt elastyczny model.
‫Tak więc branża połączyła się i
‫podobnie jak w przypadku sieci, plików Docker i samych
‫obrazów stworzyła standard. Tym standardem jest CSI.
‫To oznacza interfejs do przechowywania kontenerów.
‫Zapewni to teraz wtyczki, aby każdy dostawca pamięci masowej
‫mógł utworzyć wtyczkę, którą zainstalowałbyś na wszystkich węzłach
‫i która byłaby inna w zależności od
‫wtyczki i jej instrukcji.
‫Następnie będą działać na standardowym interfejsie API udostępnianym przez CSI, dzięki czemu
‫każdy z twoich kontenerów będzie
‫mógł użyć tej wtyczki, aby dostać się do swojego magazynu.
‫To znacznie lepszy i bardziej elastyczny model.
‫To rodzaj przyszłości Kubernetes, ale wciąż
‫jest całkiem nowy. Tak często w przykładach,
‫a nawet twoi dostawcy pamięci masowej mogą zalecić, w
‫zależności od ich dojrzałości CSI, użycie tradycyjnej wtyczki, która jest
‫wbudowana w Kubernetes i jest gotowa do użycia.