Sprytne Okazje — promocje, kody rabatowe i wyprzedaże

Generator Helm chart

Tworzy Chart.yaml, values.yaml oraz szablony Deployment, Service i opcjonalnego Ingressu gotowe do helm lint i helm install.

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";
}

Host jest używany tylko po zaznaczeniu „Dodaj Ingress”.

Zmieniono dane. Kliknij „Generuj chart”, aby odświeżyć wynik.

Chart „myapp”

4 pliki OK

Gotowy do helm lint i helm install. Skopiuj pliki osobno albo wklej skrypt, który utworzy cały katalog chartu.

Linii

77

Repliki

2

Port kontenera

8080

Service

ClusterIP

Ingress

wyłączony

Chart.yaml

apiVersion: v2 name: myapp description: Helm chart dla myapp type: application version: 0.1.0 appVersion: "1.0.0"
113 znaków · 15 słów · 6 linii

values.yaml

replicaCount: 2 image: repository: registry.example.com/myapp tag: "1.0.0" pullPolicy: IfNotPresent service: type: ClusterIP port: 80 targetPort: 8080 resources: requests: cpu: 100m memory: 128Mi limits: cpu: 500m memory: 512Mi
262 znaków · 27 słów · 19 linii

templates/deployment.yaml

apiVersion: apps/v1 kind: Deployment metadata: name: myapp labels: app: myapp spec: replicas: {{ .Values.replicaCount }} selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: securityContext: runAsNonRoot: true seccompProfile: { type: RuntimeDefault } containers: - name: myapp image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" imagePullPolicy: {{ .Values.image.pullPolicy }} securityContext: allowPrivilegeEscalation: false readOnlyRootFilesystem: true capabilities: { drop: ["ALL"] } ports: - containerPort: {{ .Values.service.targetPort }} resources: {{- toYaml .Values.resources | nindent 12 }} readinessProbe: tcpSocket: { port: {{ .Values.service.targetPort }} }
921 znaków · 79 słów · 33 linii

templates/service.yaml

apiVersion: v1 kind: Service metadata: name: myapp labels: app: myapp spec: {{- if eq .Values.service.type "None" }} type: ClusterIP clusterIP: None {{- else }} type: {{ .Values.service.type }} {{- end }} selector: app: myapp ports: - name: http port: {{ .Values.service.port }} targetPort: {{ .Values.service.targetPort }}
361 znaków · 46 słów · 19 linii

Szybki start

Skrypt tworzący katalog chartu (bash)

mkdir -p myapp/templates cat > myapp/Chart.yaml <<'HELM_EOF' apiVersion: v2 name: myapp description: Helm chart dla myapp type: application version: 0.1.0 appVersion: "1.0.0" HELM_EOF cat > myapp/values.yaml <<'HELM_EOF' replicaCount: 2 image: repository: registry.example.com/myapp tag: "1.0.0" pullPolicy: IfNotPresent service: type: ClusterIP port: 80 targetPort: 8080 resources: requests: cpu: 100m memory: 128Mi limits: cpu: 500m memory: 512Mi HELM_EOF cat > myapp/templates/deployment.yaml <<'HELM_EOF' apiVersion: apps/v1 kind: Deployment metadata: name: myapp labels: app: myapp spec: replicas: {{ .Values.replicaCount }} selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: securityContext: runAsNonRoot: true seccompProfile: { type: RuntimeDefault } containers: - name: myapp image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" imagePullPolicy: {{ .Values.image.pullPolicy }} securityContext: allowPrivilegeEscalation: false readOnlyRootFilesystem: true capabilities: { drop: ["ALL"] } ports: - containerPort: {{ .Values.service.targetPort }} resources: {{- toYaml .Values.resources | nindent 12 }} readinessProbe: tcpSocket: { port: {{ .Values.service.targetPort }} } HELM_EOF cat > myapp/templates/service.yaml <<'HELM_EOF' apiVersion: v1 kind: Service metadata: name: myapp labels: app: myapp spec: {{- if eq .Values.service.type "None" }} type: ClusterIP clusterIP: None {{- else }} type: {{ .Values.service.type }} {{- end }} selector: app: myapp ports: - name: http port: {{ .Values.service.port }} targetPort: {{ .Values.service.targetPort }} HELM_EOF
1 898 znaków · 190 słów · 91 linii

Sprawdzenie i instalacja

helm lint ./myapp helm template myapp ./myapp helm install myapp ./myapp --dry-run helm install myapp ./myapp
110 znaków · 16 słów · 5 linii

Chart używa non-root, read-only root filesystem i TCP readiness probe. Upewnij się, że obraz obsługuje te ograniczenia.

Ściąga: z czego składa się chart Helm

Pliki chartu i ich rola
PlikDo czego służyW tym chartcie
Chart.yaml Metadane chartu: nazwa, version (wersja chartu) i appVersion (wersja aplikacji). Tak
values.yaml Domyślne wartości, które nadpisujesz przez --set albo -f własny.yaml. Tak
templates/deployment.yaml Szablon Deploymentu: pody, obraz, zabezpieczenia i sonda gotowości. Tak
templates/service.yaml Szablon Service: stały adres podów wewnątrz klastra. Tak
templates/ingress.yaml Szablon Ingress: wystawienie aplikacji pod domeną. Nie (zaznacz Ingress)

Skąd szablony biorą wartości

Pola formularza a klucze w values.yaml
PoleKlucz w values.yamlTwoja wartość
Liczba replik replicaCount 2
Obraz i tag image.repository, image.tag registry.example.com/myapp:1.0.0
Typ usługi service.type ClusterIP
Port usługi service.port 80
Port kontenera service.targetPort 8080
Host Ingress ingress.host —

Na co uważać przed wdrożeniem

Tag „latest” jest odrzucany

Ten sam tag może wskazywać różne obrazy w różnym czasie, więc wdrożenie nie jest powtarzalne, a powrót do poprzedniej wersji bywa trudny. Podaj konkretną wersję obrazu.

Non-root i read-only filesystem

Pody działają jako użytkownik inny niż root i nie mogą zapisywać w systemie plików kontenera. Obraz powinien mieć numeryczny USER, a katalogi zapisu (np. /tmp) wymagają wolumenu emptyDir.

Service typu None

Wariant „None (headless)” tworzy Service z clusterIP: None, czyli bez wirtualnego adresu. DNS zwraca adresy samych podów, co przydaje się przy workerach i StatefulSet.

Sprawdź, zanim zainstalujesz

helm lint wykrywa błędy w strukturze chartu, a helm template pokazuje gotowy YAML bez instalowania. Opcja --dry-run przy install symuluje wdrożenie na klastrze.

Oceń to narzędzie:

Powiązane narzędzia

Inne narzędzia, które mogą Ci się przydać

Generator Helm chart

Helm pakuje manifesty Kubernetes w chart — wielokrotnie używalny szablon konfigurowany przez values.yaml. Generator Helm chart składa taki pakiet z formularza: dostajesz Chart.yaml, values.yaml oraz szablony Deployment i Service, a po zaznaczeniu opcji także Ingress. To standardowy punkt wyjścia do wdrażania aplikacji w klastrze.

Struktura chartu

PlikRolaKiedy powstaje
Chart.yamlmetadane chartu: apiVersion v2, nazwa, version, appVersionzawsze
values.yamldomyślne wartości: repliki, obraz, Service, zasobyzawsze
templates/deployment.yamlszablon Deployment z ustawieniami bezpieczeństwa i sondą gotowościzawsze
templates/service.yamlszablon Service: ClusterIP, NodePort, LoadBalancer albo headlesszawsze
templates/ingress.yamlIngress dla jednej domenypo zaznaczeniu „Dodaj Ingress”

Przykład szablonu

Fragment templates/deployment.yaml. Wartości nie są wpisane na sztywno, tylko pobierane z values.yaml:

replicas: {{ .Values.replicaCount }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
containerPort: {{ .Values.service.targetPort }}

Instalacja

Pod wynikiem generator podaje polecenia dopasowane do nazwy chartu. Dla nazwy myapp wyglądają tak:

helm lint ./myapp
helm template myapp ./myapp
helm install myapp ./myapp --dry-run
helm install myapp ./myapp

Późniejsza zmiana wersji obrazu bez edycji plików: helm upgrade myapp ./myapp --set image.tag=1.1.0.

Jak działa generator chartu Helm

Podajesz nazwę chartu, wersję chartu i wersję aplikacji, repozytorium i tag obrazu, liczbę replik (1–100), port kontenera i typ Service, a opcjonalnie host Ingressu. Narzędzie rozdziela te dane na dwa rodzaje plików: wartości trafiają do values.yaml, a szablony do katalogu templates/. Bez Ingressu powstają 4 pliki, z Ingressem 5. Każdy skopiujesz osobno, wszystkie naraz albo jako skrypt bash, który poleceniem mkdir -p i blokami cat > plik <<'HELM_EOF' tworzy katalog o nazwie chartu z podkatalogiem templates/. Nic nie jest przy tym instalowane w klastrze — powstaje wyłącznie tekst, który wgrywasz do repozytorium i uruchamiasz lokalnie lub w potoku CI.

Formularz sprawdza dane, zanim cokolwiek wygeneruje. Nazwa chartu może zawierać tylko małe litery, cyfry i myślniki (bez myślnika na początku i końcu, do 63 znaków), wersja chartu musi być w formacie SemVer, np. 0.1.0 albo 1.2.3-rc.1, port mieści się w zakresie 1–65535, a host Ingressu musi być poprawną domeną. Tag latest jest odrzucany. Jeśli któreś pole jest błędne, komunikat pojawia się przy nim, a chart nie powstaje.

Trzy szablony startowe ustawiają typowe warianty jednym kliknięciem: Web (Service ClusterIP, port 8080), API + Ingress (ClusterIP i włączony Ingress) oraz Worker (3 repliki i Service headless). Zmieniają tylko wymienione pola, resztę formularza zostawiają bez zmian.

Mechanizm opiera się na rozdzieleniu danych od szablonu. Wartości są podstawiane z values.yaml w momencie renderowania, więc jeden plik templates/deployment.yaml obsługuje dowolne środowisko — zmieniasz dane w values, a nie strukturę manifestu.

Helm scala wartości w ustalonej kolejności: najpierw domyślne z values.yaml, potem plik wskazany flagą -f, a na końcu pojedyncze nadpisania z --set. Wygrywa wartość stojąca najpóźniej, więc --set jest najsilniejszym źródłem. Chart.yaml trzyma metadane: nazwę chartu, wersję chartu i wersję aplikacji. Jest wymagany przy publikacji chartu w repozytorium i przy pracy z zależnościami.

Ustawienia bezpieczeństwa i zasobów w wygenerowanym chartcie

Deployment ma od razu zaostrzone ustawienia: runAsNonRoot: true, profil seccomp RuntimeDefault, allowPrivilegeEscalation: false, readOnlyRootFilesystem: true i usunięte wszystkie capabilities. Sonda gotowości sprawdza połączenie TCP na porcie kontenera. W values.yaml zasoby są ustawione na requests 100m CPU i 128Mi pamięci oraz limits 500m CPU i 512Mi.

Te ustawienia mają skutki dla obrazu. Kontener musi działać jako użytkownik inny niż root, najlepiej z numerycznym USER w Dockerfile, bo przy nazwie użytkownika Kubernetes nie zweryfikuje runAsNonRoot. Aplikacja, która zapisuje do /tmp albo do katalogu cache, potrzebuje wolumenu emptyDir — chart go nie zawiera, więc dopisz go w templates/deployment.yaml. Service zawsze nasłuchuje na porcie 80 i przekazuje ruch na port kontenera (service.targetPort).

Przykład krok po kroku: chart myapp

  1. Zostawiasz dane przykładowe: myapp, chart 0.1.0, aplikacja 1.0.0, obraz registry.example.com/myapp:1.0.0, 2 repliki, port 8080, ClusterIP, bez Ingressu. Powstają 4 pliki: Chart.yaml, values.yaml, templates/deployment.yaml i templates/service.yaml.
  2. W Chart.yaml lądują metadane: name: myapp, version: 0.1.0 i appVersion: "1.0.0".
  3. W values.yaml zapisane są wartości domyślne: replicaCount: 2, image.repository, image.tag: "1.0.0", service.port: 80 i service.targetPort: 8080.
  4. Wklejasz skrypt w terminalu, co tworzy katalog myapp/, i uruchamiasz helm install myapp ./myapp. W klastrze powstaje Deployment z 2 replikami i Service na porcie 80.
  5. Wdrażasz nowszą wersję obrazu bez dotykania plików: helm upgrade myapp ./myapp --set image.tag=1.1.0. Zmieniona zostaje dokładnie 1 wartość, a szablony pozostają nietknięte.
  6. Gdy aplikacja ma być dostępna z zewnątrz, zaznaczasz „Dodaj Ingress” z hostem app.example.com. Pojawia się templates/ingress.yaml, a values.yaml dostaje sekcję ingress z enabled: true i hostem.

Tabela referencyjna: elementy chartu i skutki nadpisania

ElementZa co odpowiadaKiedy go zmieniasz
templates/deployment.yamlSzablon DeploymentGdy potrzebujesz zmiennych środowiskowych, wolumenów albo innej sondy
templates/service.yamlSzablon ServiceGdy potrzebujesz dodatkowych portów lub adnotacji load balancera
templates/ingress.yamlOpcjonalny IngressGdy wystawiasz aplikację na ruch zewnętrzny
.Values.image.repositoryOdwołanie do repozytorium obrazu w szabloniePrzy zmianie rejestru lub nazwy obrazu
.Values.image.tagOdwołanie do tagu obrazu w szabloniePrzy wdrożeniu nowej wersji obrazu, na przykład 1.1.0
.Values.replicaCountOdwołanie do liczby replik w szabloniePrzy skalowaniu aplikacji w górę lub w dół
.Values.service.typeTyp Service; None daje Service headlessPrzy zmianie sposobu wystawienia usługi
.Values.service.targetPortPort kontenera i port sondy gotowościGdy aplikacja w obrazie nasłuchuje na innym porcie
--setNadpisanie pojedynczej wartości z linii poleceńPrzy jednorazowej zmianie, bez edycji plików

Praktyczne wskazówki

  • Trzymaj dane wdrażane w values.yaml. Obraz, tag i liczbę replik definiuj raz, w values, a nie w treści szablonu. Wtedy zmiana środowiska sprowadza się do podmiany jednego pliku, a templates/deployment.yaml zostaje bez zmian.
  • Nadpisuj przez -f dla środowisk, przez --set dla wyjątków. Osobny plik wartości dla stagingu i produkcji jest czytelniejszy niż długie polecenia, a --set nie zapisuje się w historii projektu.
  • Podnoś version w Chart.yaml przy każdej zmianie szablonów, a appVersion przy zmianie wersji aplikacji. Ułatwia to wycofanie wdrożenia i publikację w repozytorium.
  • Renderuj chart przed instalacją: helm template myapp ./myapp pokazuje gotowe manifesty bez dotykania klastra, a helm lint ./myapp wyłapuje błędy w strukturze chartu.
  • Nie wklejaj sekretów do values.yaml. Wartości z tego pliku trafiają do repozytorium i do historii zmian. Hasła i klucze trzymaj poza chartem i wstrzykuj je przy wdrożeniu.

Ograniczenia generatora

  • Sprawdza tylko dane z formularza. Narzędzie pilnuje formatu nazwy, wersji, tagu, portu i domeny, ale nie sprawdza, czy wyrenderowany Deployment przejdzie walidację API twojego klastra. Przed wdrożeniem użyj helm lint, helm template albo helm install --dry-run.
  • Nie zna twojej infrastruktury. Ingress nie ma ingressClassName ani sekcji TLS i obsługuje jedną ścieżkę / z pathType Prefix. Klasę kontrolera, certyfikaty, klasy storage i polityki sieciowe dopisz samodzielnie.
  • Brakuje subchartów, sekcji dependencies w Chart.yaml oraz hooków wdrożeniowych i migracyjnych. Przy złożonych aplikacjach chart z generatora jest punktem wyjścia.
  • Chart nie zawiera zmiennych środowiskowych, wolumenów, sondy liveness, autoskalowania (HPA) ani obiektów Secret. Wartości wrażliwe musisz dostarczyć własnym mechanizmem, poza wygenerowanym chartem.

Najczęstsze pytania

Czym jest values.yaml?

Plik z domyślnymi wartościami chartu: tu liczba replik, obraz, typ i porty Service oraz zasoby. Można je nadpisać przez --set lub własny plik -f.

Czym różni się wersja chartu od wersji aplikacji?

Pole version w Chart.yaml opisuje zmiany w szablonach i metadanych i musi być zgodne z SemVer, a appVersion to wersja wdrażanej aplikacji. Tag obrazu ustawiasz osobno w values.yaml.

Czy generator Helm chart działa online i bez instalacji?

Tak. Narzędzie działa w przeglądarce i zwraca pliki chartu do skopiowania pojedynczo, wszystkie naraz albo jako skrypt bash tworzący katalog. Helm i dostęp do klastra są potrzebne dopiero przy sprawdzaniu i instalacji chartu.

Dlaczego tag latest jest niedozwolony?

Ten sam tag latest może w różnym czasie wskazywać różne obrazy, więc wdrożenie nie jest powtarzalne, a powrót do poprzedniej wersji bywa trudny. Generator wymaga konkretnej wersji, np. 1.0.0.

Co oznacza typ Service None?

To Service headless: szablon ustawia type: ClusterIP i clusterIP: None, więc usługa nie dostaje wirtualnego adresu, a DNS zwraca adresy samych podów. Taki wariant ustawia szablon startowy Worker.

Jak nadpisać wartości bez edycji values.yaml?

Użyj flagi --set przy instalacji lub aktualizacji, na przykład helm upgrade myapp ./myapp --set replicaCount=3, albo wskaż własny plik wartości flagą -f. Wartości z --set mają najwyższy priorytet w kolejności scalania.

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