Generator Kubernetes StatefulSet
Manifest YAML z headless Service, osobnym wolumenem na replikę, limitami zasobów i securityContext bez uprawnień roota.
-
1Wprowadź dane
Wpisz treść, wklej tekst lub załaduj plik z dysku. -
2Kliknij przycisk
Narzędzie natychmiast przetworzy Twoje dane w przeglądarce. -
3Pobierz wynik
Skopiuj gotowy tekst lub zapisz plik na urządzeniu.
return "Wynik gotowy w 0.1s";
}
StatefulSet postgres
Namespace default, 2 dokumenty YAML (Service + StatefulSet). Pody postgres-0 … postgres-2, każdy z własnym wolumenem.
Dysk łącznie
3 × 10Gi
CPU requests
CPU limity
Pamięć requests
Pamięć limity
Długość manifestu
Manifest YAML (statefulset.yaml)
| Pod | Wolumen (PVC) | Adres DNS w klastrze |
|---|---|---|
| postgres-0 | data-postgres-0 | postgres-0.postgres.default.svc.cluster.local |
| postgres-1 | data-postgres-1 | postgres-1.postgres.default.svc.cluster.local |
| postgres-2 | data-postgres-2 | postgres-2.postgres.default.svc.cluster.local |
Polecenia kubectl
- Kubernetes uruchomi 3 niezależnych Podów, każdy z własnym dyskiem. Replikację danych (np. główny i replika bazy) musi zapewnić aplikacja lub operator; sam StatefulSet jej nie konfiguruje.
- Obrazy baz danych zwykle wymagają haseł w zmiennych środowiskowych (np. POSTGRES_PASSWORD, MYSQL_ROOT_PASSWORD). Podaj nazwę Secretu, z którego klucze trafią do kontenera (envFrom). Secret jest tylko referencją i musi istnieć w klastrze.
- Readiness probe sprawdza tylko, czy port TCP jest otwarty. To nie dowodzi, że aplikacja przyjmuje zapytania; dopasuj probe do swojej aplikacji.
Ściąga: ustawienia popularnych aplikacji
| Aplikacja | Obraz | Port | Katalog danych | subPath | UID/GID |
|---|---|---|---|---|---|
| PostgreSQL | postgres:16 | 5432 | /var/lib/postgresql/data | pgdata | 999 |
| Redis | redis:7 | 6379 | /data | — | 999 |
| MySQL | mysql:8 | 3306 | /var/lib/mysql | mysql | 999 |
| MongoDB | mongo:7 | 27017 | /data/db | — | 999 |
Jak to liczymy
Dysk łącznie: 3 × 10Gi = 30 Gi. CPU (requests): 3 × 250m = 0,75 vCPU. Pamięć (requests): 3 × 512Mi = 1,5 Gi. To sumy dla całego StatefulSet; 1 Gi = 1024 Mi, a 250m to jedna czwarta rdzenia.
Stałe nazwy i adresy DNS
Pody dostają numery: nazwa-0, nazwa-1 i kolejne. Każdy ma własny wolumen z volumeClaimTemplates (data-nazwa-0) i, przy headless Service, adres nazwa-0.nazwa.namespace.svc.cluster.local (przy domyślnej domenie klastra).
Co z dyskami po usunięciu
Domyślnie wolumeny (PVC) zostają po zmniejszeniu liczby replik i po usunięciu StatefulSetu. To chroni dane, ale nieużywane dyski usuwasz ręcznie poleceniem kubectl delete pvc.
Typowe pułapki
Obraz działający jako root nie wystartuje z runAsNonRoot, dlatego podaj UID/GID. Świeży wolumen bywa niepusty (lost+found), co psuje start baz; pomaga subPath. Requests nie mogą przekraczać limits. Tag :latest jest zablokowany.
Oceń to narzędzie:
Powiązane narzędzia
Inne narzędzia, które mogą Ci się przydaćGenerator Kubernetes StatefulSet
StatefulSet służy aplikacjom wymagającym trwałej tożsamości i dysku – bazom danych, kolejkom, systemom rozproszonym. W odróżnieniu od Deployment każda replika ma stałą nazwę, własny wolumen i własny adres DNS. Generator składa gotowy manifest Kubernetes StatefulSet (opcjonalnie z headless Service), liczy łączne zużycie dysku, CPU i pamięci oraz pokazuje nazwy podów, PVC i adresy, które powstaną w klastrze.
StatefulSet kontra Deployment
| Cecha | Deployment | StatefulSet |
|---|---|---|
| Nazwy podów | losowy sufiks | stałe (app-0, app-1…) |
| Dysk | wspólny PVC dla wszystkich podów albo brak | osobny PVC na replikę (volumeClaimTemplates) |
| Kolejność startu | równoległa | po kolei od indeksu 0; opcjonalnie Parallel |
| Adres w sieci | wspólny adres Service | nazwa DNS każdego poda przez headless Service |
| Zastosowanie | aplikacje bezstanowe | bazy, klastry, brokery wiadomości |
Co zawiera wygenerowany manifest
serviceName– wskazuje Service o tej samej nazwie co StatefulSet; po zaznaczeniu opcji generator dokłada jego definicję zclusterIP: None,volumeClaimTemplates– szablon PVC o nazwiedataz trybemReadWriteOnce, rozmiarem istorageClassName(puste pole oznacza domyślną klasę klastra),volumeMountsz katalogiem danych i opcjonalnymsubPath,resources– requests i limits CPU oraz pamięci dla jednego poda,securityContextzrunAsNonRoot: true, profilem seccompRuntimeDefault, odebranymi capabilities i – jeśli podasz UID/GID –runAsUser,runAsGrouporazfsGroup,- opcjonalnie
envFromz Secretem (np. z hasłem bazy),readinessProbetypu TCP na porcie kontenera ipodManagementPolicy: Parallel.
Przyciski PostgreSQL, MySQL, Redis i MongoDB wypełniają obraz, port, katalog danych, subPath i UID/GID typowymi wartościami oficjalnych obrazów. Wynik możesz skopiować albo pobrać jako statefulset.yaml; pod manifestem są też polecenia kubectl do wdrożenia i sprawdzenia podów oraz PVC.
Jak działa generator
Generator przyjmuje nazwę obiektu, obraz, liczbę replik (1–100), port, namespace, parametry dysku i zasoby, a następnie składa z nich manifest YAML. Narzędzie nie łączy się z klastrem i nie odczytuje z niego żadnych danych, więc każda wartość w polu wynikowym jest wprost konsekwencją tego, co wpisałeś. Przed wygenerowaniem sprawdza poprawność danych: nazwy muszą spełniać reguły DNS (do 63 znaków, małe litery, cyfry i myślniki), obraz musi mieć tag lub digest, a tag :latest jest odrzucany. Request CPU lub pamięci większy niż limit też blokuje wynik, bo Kubernetes nie przyjąłby takiego manifestu.
Podstawą działania StatefulSet jest tożsamość wyprowadzona z liczby porządkowej. Przy liczbie replik równej N pody nazywają się nazwa obiektu plus myślnik i indeks od zera do N minus jeden. Nazwa nie zawiera losowego sufiksu, więc pozostaje niezmieniona po restarcie. Ten sam indeks wiąże pod z wolumenem: volumeClaimTemplates tworzy osobny PVC dla każdej repliki, a Kubernetes nadaje mu nazwę zbudowaną z nazwy szablonu i nazwy poda. Dzięki temu usunięty i ponownie utworzony pod wraca do tego samego dysku.
Generator wypisuje spójną etykietę app w spec.selector, w szablonie poda i w selektorze Service. Kolejność pól i wcięcia są stałe, więc dwa uruchomienia z tymi samymi parametrami dają identyczny plik, co ułatwia porównywanie manifestów w repozytorium.
Przykład krok po kroku: PostgreSQL z 3 replikami
- Kliknij preset PostgreSQL. Nazwa to postgres, obraz postgres:16, port 5432, katalog danych /var/lib/postgresql/data, subPath pgdata, UID/GID 999.
- Ustaw liczbę replik na 3, rozmiar wolumenu 10Gi, klasę przechowywania standard i namespace default.
- Wygenerowany manifest tworzy pody postgres-0, postgres-1 i postgres-2 oraz wolumeny data-postgres-0, data-postgres-1 i data-postgres-2. Łączne zapotrzebowanie na dysk to 3 × 10 Gi = 30 Gi, ponieważ każda replika dostaje własny PVC.
- Przy domyślnych zasobach (request 250m CPU i 512Mi pamięci, limit 1 CPU i 1Gi) cały StatefulSet rezerwuje 3 × 250m = 0,75 vCPU i 3 × 512 Mi = 1,5 Gi pamięci, a może zużyć do 3 vCPU i 3 Gi.
- Zmień liczbę replik na 5: dochodzą pody postgres-3 i postgres-4 oraz dwa nowe wolumeny po 10 Gi, więc dysk łącznie to 50 Gi, a requests rosną do 1,25 vCPU i 2,5 Gi.
- Przy włączonym headless Service każdy pod ma adres w postaci postgres-0.postgres.default.svc.cluster.local (przy domyślnej domenie klastra). W obrębie tego samego namespace wystarczy krótsza forma postgres-0.postgres, co pozwala adresować konkretną replikę.
Pola manifestu i ich źródło
| Pole w manifeście | Skąd pochodzi | Znaczenie |
|---|---|---|
| metadata.name | pole nazwy | nazwa StatefulSet i Service oraz podstawa nazw podów i wolumenów |
| metadata.namespace | pole Namespace | przestrzeń nazw obu obiektów; inna niż default dodaje do poleceń kubectl create namespace |
| spec.replicas | pole liczby replik | liczba podów; każdy otrzymuje indeks od zera do liczby replik minus jeden |
| spec.serviceName | pole nazwy | wskazanie Service sterującego tożsamością sieciową podów |
| spec.selector.matchLabels | etykieta app z nazwy | wiąże StatefulSet z podami i nie podlega zmianie po wdrożeniu |
| containers[].image | pole obrazu | obraz uruchamiany w każdej replice |
| containers[].ports[].containerPort | pole portu | port kontenera, powtarzany w Service i w readinessProbe |
| volumeMounts[].mountPath, subPath | katalog danych, podkatalog | miejsce podłączenia wolumenu w kontenerze |
| volumeClaimTemplates[].spec.resources.requests.storage | pole rozmiaru wolumenu | pojemność jednego PVC, mnożona przez liczbę replik |
| volumeClaimTemplates[].spec.storageClassName | pole StorageClass | klasa wolumenów w klastrze; pominięta, gdy pole jest puste |
Praktyczne wskazówki
- Utrzymuj serviceName spójne z istniejącym Service. Jeśli wyłączysz opcję Service, a nie utworzysz go osobno, pody nie dostaną stabilnych nazw DNS i komunikacja między replikami przestanie działać.
- Nie zmieniaj nazwy obiektu po wdrożeniu. Nowa nazwa oznacza nowy StatefulSet i nowe wolumeny, a poprzednie PVC zostają w klastrze i nadal zajmują miejsce.
- Sprawdź, czy klasa przechowywania istnieje (
kubectl get storageclass). Generator wpisuje storageClassName dosłownie; przy nieistniejącej klasie wolumeny pozostaną w stanie Pending. - Podaj UID/GID zgodny z obrazem. Manifest zawsze ma runAsNonRoot: true, więc obraz, który domyślnie startuje jako root, bez runAsUser się nie uruchomi.
- Ustaw subPath dla baz danych. Świeży wolumen bywa niepusty (katalog lost+found), przez co PostgreSQL lub MySQL odmawia inicjalizacji katalogu danych.
- Trzymaj manifest w repozytorium. Deterministyczne wyjście sprawia, że w porównaniu wersji widać dokładnie tę zmianę, którą wprowadziłeś.
Ograniczenia narzędzia
- Brak walidacji względem klastra. Narzędzie nie sprawdza wersji API, dostępności klasy przechowywania, istnienia Secretu ani limitów przydziału w przestrzeni nazw.
- Tylko szkielet obiektu. Nie generuje konfiguracji aplikacji, samego Secretu, ConfigMap ani reguł sieciowych. Nie konfiguruje też replikacji danych: trzy pody PostgreSQL to trzy niezależne bazy, dopóki nie zajmie się tym aplikacja lub operator.
- Brak polityki usuwania wolumenów. Manifest nie ustawia persistentVolumeClaimRetentionPolicy, więc obowiązuje domyślne zachowanie: PVC zostają po usunięciu StatefulSet i po zmniejszeniu liczby replik.
- Prosta sonda gotowości. Readiness probe sprawdza tylko, czy port TCP jest otwarty, a nie czy aplikacja przyjmuje zapytania.
- Nie weryfikuje obrazu w rejestrze. Literówka w nazwie lub nieistniejący tag ujawnią się dopiero przy wdrożeniu.
Najczęstsze pytania o Kubernetes StatefulSet
Czym jest headless Service?
To Service bez adresu ClusterIP (clusterIP: None). Zamiast jednego adresu z rozkładaniem ruchu DNS zwraca adresy poszczególnych podów, co umożliwia komunikację z konkretną repliką.
Czy StatefulSet wymaga headless Service?
Pole serviceName jest wymagane w specyfikacji, a wskazany Service powinien mieć clusterIP: None. Zwykły Service rozkłada ruch, ale nie daje podom stabilnych nazw DNS.
Jak nazywają się pody i wolumeny w StatefulSet?
Pody to nazwa obiektu plus indeks, np. postgres-0 i postgres-1. Wolumeny z szablonu data nazywają się data-postgres-0, data-postgres-1 i nie zmieniają się po restarcie poda.
Co dzieje się z danymi przy skalowaniu w dół?
Kubernetes usuwa pody od najwyższego indeksu, ale ich PVC domyślnie zostają. Po ponownym zwiększeniu liczby replik pod postgres-4 wraca do tego samego wolumenu data-postgres-4.
Czy można zmienić rozmiar wolumenu w volumeClaimTemplates?
Nie w istniejącym StatefulSet: volumeClaimTemplates jest polem niezmiennym i kubectl apply odrzuci taką zmianę. Istniejące PVC rozszerza się osobno, o ile klasa przechowywania ma allowVolumeExpansion: true.
Jak usunąć StatefulSet razem z wolumenami?
Usunięcie StatefulSet nie kasuje PVC. Trzeba je usunąć osobno, np. kubectl delete pvc data-postgres-0, po upewnieniu się, że dane nie są już potrzebne.