Sprytne Okazje — promocje, kody rabatowe i wyprzedaże

Generator Kubernetes StatefulSet

Manifest YAML z headless Service, osobnym wolumenem na replikę, limitami zasobów i securityContext bez uprawnień roota.

Bezpieczne (SSL)
Przetwarzanie Lokalne
100% Darmowe
Instrukcja
  • 1
    Wprowadź dane
    Wpisz treść, wklej tekst lub załaduj plik z dysku.
  • 2
    Kliknij przycisk
    Narzędzie natychmiast przetworzy Twoje dane w przeglądarce.
  • 3
    Pobierz wynik
    Skopiuj gotowy tekst lub zapisz plik na urządzeniu.
function runTool() {
  return "Wynik gotowy w 0.1s";
}

StatefulSet postgres

3 repliki

Namespace default, 2 dokumenty YAML (Service + StatefulSet). Pody postgres-0 … postgres-2, każdy z własnym wolumenem.

Dysk łącznie

30 Gi

3 × 10Gi

CPU requests

0,75 vCPU

CPU limity

3 vCPU

Pamięć requests

1,5 Gi

Pamięć limity

3 Gi

Długość manifestu

73 linii

Manifest YAML (statefulset.yaml)

apiVersion: v1 kind: Service metadata: name: postgres namespace: default labels: app: postgres spec: clusterIP: None selector: app: postgres ports: - port: 5432 name: postgres --- apiVersion: apps/v1 kind: StatefulSet metadata: name: postgres namespace: default labels: app: postgres spec: serviceName: postgres replicas: 3 selector: matchLabels: app: postgres template: metadata: labels: app: postgres spec: securityContext: runAsNonRoot: true runAsUser: 999 runAsGroup: 999 fsGroup: 999 seccompProfile: { type: RuntimeDefault } containers: - name: postgres image: postgres:16 securityContext: allowPrivilegeEscalation: false readOnlyRootFilesystem: false capabilities: { drop: ["ALL"] } ports: - containerPort: 5432 volumeMounts: - name: data mountPath: /var/lib/postgresql/data subPath: pgdata readinessProbe: tcpSocket: port: 5432 initialDelaySeconds: 10 periodSeconds: 10 resources: requests: cpu: "250m" memory: 512Mi limits: cpu: "1" memory: 1Gi volumeClaimTemplates: - metadata: name: data spec: accessModes: ["ReadWriteOnce"] storageClassName: standard resources: requests: storage: 10Gi
1 581 znaków · 127 słów · 74 linii
Pody, wolumeny i adresy DNS
PodWolumen (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

kubectl apply -f statefulset.yaml kubectl -n default get pods -l app=postgres kubectl -n default get pvc
  • 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

Wartości z gotowych ustawień (UID/GID to typowa wartość oficjalnych obrazów, sprawdź ją w swoim obrazie)
AplikacjaObrazPortKatalog danychsubPathUID/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

CechaDeploymentStatefulSet
Nazwy podówlosowy sufiksstałe (app-0, app-1…)
Dyskwspólny PVC dla wszystkich podów albo brakosobny PVC na replikę (volumeClaimTemplates)
Kolejność starturównoległapo kolei od indeksu 0; opcjonalnie Parallel
Adres w sieciwspólny adres Servicenazwa DNS każdego poda przez headless Service
Zastosowanieaplikacje bezstanowebazy, 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ę z clusterIP: None,
  • volumeClaimTemplates – szablon PVC o nazwie data z trybem ReadWriteOnce, rozmiarem i storageClassName (puste pole oznacza domyślną klasę klastra),
  • volumeMounts z katalogiem danych i opcjonalnym subPath,
  • resources – requests i limits CPU oraz pamięci dla jednego poda,
  • securityContext z runAsNonRoot: true, profilem seccomp RuntimeDefault, odebranymi capabilities i – jeśli podasz UID/GID – runAsUser, runAsGroup oraz fsGroup,
  • opcjonalnie envFrom z Secretem (np. z hasłem bazy), readinessProbe typu TCP na porcie kontenera i podManagementPolicy: 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

  1. Kliknij preset PostgreSQL. Nazwa to postgres, obraz postgres:16, port 5432, katalog danych /var/lib/postgresql/data, subPath pgdata, UID/GID 999.
  2. Ustaw liczbę replik na 3, rozmiar wolumenu 10Gi, klasę przechowywania standard i namespace default.
  3. 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.
  4. 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.
  5. 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.
  6. 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ścieSkąd pochodziZnaczenie
metadata.namepole nazwynazwa StatefulSet i Service oraz podstawa nazw podów i wolumenów
metadata.namespacepole Namespaceprzestrzeń nazw obu obiektów; inna niż default dodaje do poleceń kubectl create namespace
spec.replicaspole liczby replikliczba podów; każdy otrzymuje indeks od zera do liczby replik minus jeden
spec.serviceNamepole nazwywskazanie Service sterującego tożsamością sieciową podów
spec.selector.matchLabelsetykieta app z nazwywiąże StatefulSet z podami i nie podlega zmianie po wdrożeniu
containers[].imagepole obrazuobraz uruchamiany w każdej replice
containers[].ports[].containerPortpole portuport kontenera, powtarzany w Service i w readinessProbe
volumeMounts[].mountPath, subPathkatalog danych, podkatalogmiejsce podłączenia wolumenu w kontenerze
volumeClaimTemplates[].spec.resources.requests.storagepole rozmiaru wolumenupojemność jednego PVC, mnożona przez liczbę replik
volumeClaimTemplates[].spec.storageClassNamepole StorageClassklasa 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.

Zainstaluj Webp.pl Miej narzędzia we własnej kieszeni!