{"id":80668,"date":"2021-08-30T18:44:20","date_gmt":"2021-08-30T16:44:20","guid":{"rendered":"https:\/\/jfrog.com\/?p=80668"},"modified":"2023-11-30T17:17:50","modified_gmt":"2023-11-30T15:17:50","slug":"helm-charts-best-practices","status":"publish","type":"post","link":"https:\/\/jfrog.com\/de\/blog\/helm-charts-best-practices\/","title":{"rendered":"Auf dem richtigen Kurs mit Best Practices f\u00fcr Helm-Charts"},"content":{"rendered":"<p><img decoding=\"async\" class=\"alignnone wp-image-44949 size-full\" src=\"https:\/\/media.jfrog.com\/wp-content\/uploads\/2019\/03\/20131058\/Helm-Chart-Best-Practices_862%C3%97%E2%80%8A300.png\" alt=\"\" width=\"863\" height=\"301\" srcset=\"https:\/\/speedmedia2.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/media.jfrog.com\/wp-content\/uploads\/2019\/03\/20131058\/Helm-Chart-Best-Practices_862%C3%97%E2%80%8A300.png?speedsize=w_863 863w, https:\/\/speedmedia2.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/media.jfrog.com\/wp-content\/uploads\/2019\/03\/20131058\/Helm-Chart-Best-Practices_862%C3%97%E2%80%8A300.png?speedsize=w_300 300w, https:\/\/speedmedia2.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/media.jfrog.com\/wp-content\/uploads\/2019\/03\/20131058\/Helm-Chart-Best-Practices_862%C3%97%E2%80%8A300.png?speedsize=w_768 768w\" sizes=\"(max-width: 863px) 100vw, 863px\" \/><\/p>\n<p><a href=\"https:\/\/kubernetes.io\/\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400\">Kubernetes<\/span><\/a><span style=\"font-weight: 400\">, das beliebte Orchestrierungswerkzeug f\u00fcr Containeranwendungen, ist nach dem griechischen Wort f\u00fcr &#8220;Lotse&#8221; benannt, also demjenigen, der das Schiff steuert. Aber wie bei jeder Reise kann der Navigator nur so erfolgreich sein wie die verf\u00fcgbare Karte.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Das <\/span><a href=\"https:\/\/helm.sh\/\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400\">Helm<\/span><\/a><span style=\"font-weight: 400\">-Chart ist eine Karte, also eine Sammlung von Dateien, die von einem <\/span><a href=\"https:\/\/jfrog.com\/de\/integration\/helm-repository\/\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400\">Helm-Chart-Repository<\/span><\/a><span style=\"font-weight: 400\">, das einen zusammenh\u00e4ngenden Satz von K8s-Ressourcen beschreibt, eingesetzt werden k\u00f6nnen. Wenn Sie Ihre Helm-Charts auf die effektivste Art und Weise gestalten, hilft dies Kubernetes, durch die Untiefen zu man\u00f6vrieren, wenn es Container in Ihrer Produktionsumgebung bereitstellt.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Aber es gibt auch andere M\u00f6glichkeiten, wie ich bei der Entwicklung von \u00f6ffentlich zug\u00e4nglichen K8s-Charts zum Deployment von Produkten festgestellt habe. Mit jeder Pull-Anfrage hat mir das Feedback der Helm-Community geholfen, <a href=\"https:\/\/jfrog.com\/de\/blog\/helm-charts-best-practices\/\">bew\u00e4hrte Verfahren f\u00fcr Helm-Charts<\/a> zu finden, mit denen die besten Ergebnisse f\u00fcr die Nutzung und Aktualisierung von Containern sichergestellt wurden.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Einige Dinge sind zu beachten, wenn Sie K8s-Charts schreiben, die von der Community oder Kunden in der Produktion verwendet werden sollen. Zu den Dingen, an die Sie denken m\u00fcssen, geh\u00f6rt:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Welche Abh\u00e4ngigkeiten m\u00fcssen Sie definieren?<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Ben\u00f6tigt Ihre Anwendung einen persistenten Zustand, um zu funktionieren?<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Wie handhaben Sie die Sicherheit durch Vertraulichkeiten und Berechtigungen?<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Wie kontrollieren Sie die Ausf\u00fchrung von Kubelet-Containern?<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Wie stellen Sie sicher, dass Ihre Anwendungen laufen und Anrufe empfangen k\u00f6nnen?<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Wie stellen Sie die Dienste der Anwendung der Welt zur Verf\u00fcgung?<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Wie testen Sie Ihr Chart?<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400\">Dieser Leitfaden bietet einige Best Practices zur Strukturierung und Spezifikation Ihrer Helm-Charts, die K8s dabei helfen, Ihre Container-Anwendungen reibungslos ins Dock zu bringen.<\/span><\/p>\n<h1><span style=\"font-weight: 400\">Erste Schritte<\/span><\/h1>\n<p><span style=\"font-weight: 400\">Bevor Sie beginnen, stellen Sie sicher, dass Sie mit den wesentlichen Verfahren zur <\/span><a href=\"https:\/\/docs.helm.sh\/developing_charts\/\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400\">Entwicklung von Helm-Charts<\/span><\/a><span style=\"font-weight: 400\"> vertraut sind.<\/span><\/p>\n<p><span style=\"font-weight: 400\">In diesem Leitfaden erstellen wir ein Helm-Chart, das den empfohlenen Best Practices folgt, um eine zweistufige<\/span> <span style=\"font-weight: 400\">Erstellen, Lesen, Aktualisieren und L\u00f6schen-Anwendung (<\/span><span style=\"font-weight: 400\">Create, Read, Update and Delete = CRUD) f\u00fcr die Mongo-Datenbank unter Verwendung von Express.js bereitzustellen. <\/span><\/p>\n<p><span style=\"font-weight: 400\">Sie finden den Quellcode unserer Beispielanwendung in <\/span><a href=\"https:\/\/github.com\/jainishshah17\/express-mongo-crud\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400\">express-crud in GitHub<\/span><\/a><span style=\"font-weight: 400\">.<\/span><\/p>\n<h1><span style=\"font-weight: 400\">Das Helm-Chart erstellen und ausf\u00fcllen<\/span><\/h1>\n<p><span style=\"font-weight: 400\">Lassen Sie uns das Vorlagen-Helm-Chart mit dem <\/span><a href=\"https:\/\/docs.helm.sh\/helm\/#helm-create\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400\">create-Befehl<\/span><\/a><span style=\"font-weight: 400\"> des Helm-Client erstellen:<\/span><\/p>\n<pre style=\"background: #e0e0e0;padding-left: 20px\">$ helm create express-crud<\/pre>\n<p><span style=\"font-weight: 400\">Dadurch wird eine Verzeichnisstruktur f\u00fcr ein <\/span><i><span style=\"font-weight: 400\">express-crud<\/span><\/i><span style=\"font-weight: 400\">-Helm-Chart erstellt.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Aktualisieren Sie zun\u00e4chst die Chart-Metadaten in der <\/span><i><span style=\"font-weight: 400\">Chart.yaml<\/span><\/i><span style=\"font-weight: 400\">-Datei, die gerade erstellt wurde. Stellen Sie sicher, dass Sie die richtigen Informationen f\u00fcr <\/span><i><span style=\"font-weight: 400\">appVersion <\/span><\/i><span style=\"font-weight: 400\">(die Anwendungsversion, die als Docker-Image-Tag verwendet werden soll), <\/span><i><span style=\"font-weight: 400\">description<\/span><\/i><span style=\"font-weight: 400\">,<\/span> <i><span style=\"font-weight: 400\">version <\/span><\/i><span style=\"font-weight: 400\">(ein <\/span><a href=\"https:\/\/semver.org\/\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400\">SemVer 2<\/span><\/a><span style=\"font-weight: 400\">-Versionsstring), <\/span><i><span style=\"font-weight: 400\">sources<\/span><\/i><span style=\"font-weight: 400\">, <\/span><i><span style=\"font-weight: 400\">maintainers <\/span><\/i><span style=\"font-weight: 400\">und <\/span><i><span style=\"font-weight: 400\">icon<\/span><\/i><span style=\"font-weight: 400\"> eingeben.<\/span><\/p>\n<div style=\"background: #272b33;overflow: auto;width: auto;border: solid gray;border-width: .1em .1em .1em .8em;padding: .2em .6em\">\n<pre style=\"margin: 0;line-height: 125%\"><span style=\"color: #999999\">apiVersion: v1\r\nappVersion: \"1.0.0\"\r\ndescription: Ein Helm-Chart f\u00fcr die Express-Crud-Anwendung\r\nname: express-crud\r\nversion: 0.1.0\r\nsources:\r\n- https:\/\/github.com\/jainishshah17\/express-mongo-crud\r\nmaintainers:\r\n- name: myaccount\r\n email: myacount@mycompany.com\r\nicon: https:\/\/github.com\/mycompany17\/mycompany.com\/blob\/master\/app\/public\/images\/logo.jpg\r\nhome: https:\/\/mycompany.com\/<\/span><\/pre>\n<\/div>\n<h2><span style=\"font-weight: 400\">Definieren von Abh\u00e4ngigkeiten<\/span><\/h2>\n<p><span style=\"font-weight: 400\">Wenn Ihre Anwendung <\/span><a href=\"https:\/\/docs.helm.sh\/helm\/#helm-dependency\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400\">Abh\u00e4ngigkeiten<\/span><\/a><span style=\"font-weight: 400\">hat, dann m\u00fcssen Sie eine <\/span><i><span style=\"font-weight: 400\">requirements.yaml<\/span><\/i><span style=\"font-weight: 400\">-Datei in der Verzeichnisstruktur des Helm-Charts erstellen, die diese spezifiziert. Da unsere Anwendung die <\/span><i><span style=\"font-weight: 400\">mongodb<\/span><\/i><span style=\"font-weight: 400\">-Datenbank ben\u00f6tigt, m\u00fcssen wir sie in der <\/span><i><span style=\"font-weight: 400\">Abh\u00e4ngigkeiten<\/span><\/i><span style=\"font-weight: 400\">-Liste der <\/span><i><span style=\"font-weight: 400\">requirements.yaml<\/span><\/i><span style=\"font-weight: 400\">-Datei spezifizieren, die wir erstellen.<\/span><span style=\"font-weight: 400\"><br \/>\n<\/span><span style=\"font-weight: 400\"><br \/>\n<\/span><span style=\"font-weight: 400\">Eine <\/span><i><span style=\"font-weight: 400\">requirements.yaml <\/span><\/i><span style=\"font-weight: 400\">f\u00fcr dieses Beispiel enth\u00e4lt<\/span><span style=\"font-weight: 400\">:<\/span><\/p>\n<div style=\"background: #272b33;overflow: auto;width: auto;border: solid gray;border-width: .1em .1em .1em .8em;padding: .2em .6em\">\n<pre style=\"margin: 0;line-height: 125%\"><span style=\"color: #999999\">dependencies:\r\n- name: mongodb\r\n version: 3.0.4\r\n repository: https:\/\/kubernetes-charts.storage.googleapis.com\/\r\n condition: mongodb.enabled\r\n<\/span><\/pre>\n<\/div>\n<p><span style=\"font-weight: 400\">Sobald eine <\/span><i><span style=\"font-weight: 400\">requirements.yaml<\/span><\/i><span style=\"font-weight: 400\">-Datei erstellt ist, m\u00fcssen Sie den <\/span><a href=\"https:\/\/docs.helm.sh\/helm\/#helm-dependency-update\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400\">dependency update<\/span><\/a><span style=\"font-weight: 400\">-Befehl im Helm-Client ausf\u00fchren:<\/span><\/p>\n<pre style=\"background: #e0e0e0;padding-left: 20px\">$ helm dep update<\/pre>\n<h1><span style=\"font-weight: 400\">Deployment-Dateien erstellen<\/span><\/h1>\n<p><span style=\"font-weight: 400\">Die Deployment-Dateien Ihres Helm-Charts befinden sich im <\/span><i><span style=\"font-weight: 400\">\\templates<\/span><\/i><span style=\"font-weight: 400\">-Unterverzeichnis und geben an, wie K8s die Container-Anwendung bereitstellt.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Bei der Entwicklung Ihrer Deployment-Dateien m\u00fcssen Sie einige wichtige Entscheidungen treffen.<\/span><\/p>\n<h2><span style=\"font-weight: 400\">Deployment-Objekt im Vergleich zum StatefulSet-Objekt <\/span><\/h2>\n<p><span style=\"font-weight: 400\">Welche Deployment-Datei Sie erstellen, h\u00e4ngt davon ab, ob es die Anwendung erforderlich macht, dass K8s sie als Deployment-Objekt oder als <\/span><a href=\"https:\/\/kubernetes.io\/docs\/tutorials\/stateful-application\/basic-stateful-set\/\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400\">StatefulSet-Objekt<\/span><\/a><span style=\"font-weight: 400\"> verwaltet.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Ein Deployment-Objekt ist eine zustandslose Anwendung, die im Dateinamen <\/span><i><span style=\"font-weight: 400\">deployment.yaml<\/span><\/i><span style=\"font-weight: 400\"> deklariert ist und die <\/span><i><span style=\"font-weight: 400\">kind<\/span><\/i><span style=\"font-weight: 400\">-Parameter als <\/span><b>deployment<\/b><span style=\"font-weight: 400\"> spezifiziert.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Ein Stateful-Objekt ist f\u00fcr Anwendungen, die zustandsabh\u00e4ngig sind und mit verteilten Systemen verwendet werden. Sie werden im Dateinamen <\/span><i><span style=\"font-weight: 400\">stateless.yaml<\/span><\/i><span style=\"font-weight: 400\"> deklariert und spezifizieren den <\/span><i><span style=\"font-weight: 400\">kind<\/span><\/i><span style=\"font-weight: 400\">-Parameter als <\/span><b>stateful<\/b><span style=\"font-weight: 400\">.<\/span><\/p>\n<table>\n<tbody>\n<tr bgcolor=\"#e0e0e0\">\n<td><b>Deployment<\/b><\/td>\n<td><b>StatefulSet<\/b><\/td>\n<\/tr>\n<tr>\n<td valign=\"top\"><span style=\"font-weight: 400\">Deployments sind f\u00fcr die zustandslose Nutzung gedacht und eher leichtgewichtig. <\/span><\/td>\n<td valign=\"top\"><span style=\"font-weight: 400\">StatefulSets werden verwendet, wenn der Zustand persistiert muss. Daher werden <\/span><span style=\"font-weight: 400\">volumeClaimTemplates<\/span><span style=\"font-weight: 400\"> auf persistenten Volumes verwendet, um sicherzustellen, dass sie den Status \u00fcber Komponenten-Neustarts hinweg beibehalten k\u00f6nnen.<\/span><\/td>\n<\/tr>\n<tr bgcolor=\"#e0e0e0\">\n<td valign=\"top\"><span style=\"font-weight: 400\">Wenn Ihre Anwendung zustandslos ist oder wenn der Zustand w\u00e4hrend des Starts aus Backend-Systemen aufgebaut werden kann, dann verwenden Sie Deployments.<\/span><\/td>\n<td valign=\"top\"><span style=\"font-weight: 400\">Wenn Ihre Anwendung zustandsabh\u00e4ngig ist oder wenn Sie zustandsabh\u00e4ngigen Speicher \u00fcber Kubernetes bereitstellen m\u00f6chten, verwenden Sie ein StatefulSet.<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400\">Da bei dieser Anwendung der Zustand nicht persistiert werden muss, verwende ich ein Deployment-Objekt.<\/span><span style=\"font-weight: 400\"><br \/>\n<\/span><span style=\"font-weight: 400\">Die <\/span><i><span style=\"font-weight: 400\">deployment.yaml<\/span><\/i><span style=\"font-weight: 400\">-Datei ist bereits durch den <\/span><span style=\"font-weight: 400\">helm create<\/span><span style=\"font-weight: 400\">-Befehl erstellt worden.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Wir werden AppVersion als Docker-Image-Tag f\u00fcr unsere Anwendung verwenden. Dadurch sind wir in der Lage, das Helm-Chart mit einer neuen Version der Anwendung zu aktualisieren, indem wir einfach den Wert in <\/span><i><span style=\"font-weight: 400\">Chart.yaml<\/span><\/i> \u00e4ndern<\/p>\n<div style=\"background: #272b33;overflow: auto;width: auto;border: solid gray;border-width: .1em .1em .1em .8em;padding: .2em .6em\">\n<pre style=\"margin: 0;line-height: 125%\"><span style=\"color: #999999\">image: \"{{ .Values.image.repository }}:{{ default .Chart.AppVersion .Values.image.tag }}\"<\/span><\/pre>\n<\/div>\n<h2><span style=\"font-weight: 400\">Secret im Vergleich zu ConfigMap <\/span><\/h2>\n<p><span style=\"font-weight: 400\">Sie m\u00fcssen festlegen, welche der Anmeldeinformationen oder Konfigurationsdaten geeignet sind, um sie als <\/span><a href=\"https:\/\/kubernetes.io\/docs\/concepts\/configuration\/secret\/\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400\">Secrets <\/span><\/a><span style=\"font-weight: 400\">zu speichern, und welche in einer <\/span><a href=\"https:\/\/kubernetes.io\/docs\/tasks\/configure-pod-container\/configure-pod-configmap\/\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400\">ConfigMap<\/span><\/a><span style=\"font-weight: 400\"> enthalten sein k\u00f6nnen.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Secrets sind f\u00fcr sensible Informationen wie Passw\u00f6rter, die K8s in einem verschl\u00fcsselten Format speichert.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Eine ConfigMap ist eine Datei mit Konfigurationsinformationen, die von Anwendungen gemeinsam genutzt werden k\u00f6nnen. Die Informationen in einer ConfigMap sind nicht verschl\u00fcsselt, sollten also keine sensiblen Informationen enthalten.<\/span><\/p>\n<table>\n<tbody>\n<tr>\n<td><b>Secret<\/b><\/td>\n<td><b>ConfigMap<\/b><\/td>\n<\/tr>\n<tr>\n<td valign=\"top\"><span style=\"font-weight: 400\">Diese Informationen in ein Secret zu packen ist sicherer und flexibler als sie wortw\u00f6rtlich in eine Pod-Definition oder in ein Docker-Image zu packen<\/span>;<\/td>\n<td valign=\"top\"><span style=\"font-weight: 400\">Mit einer ConfigMap k\u00f6nnen Sie Konfigurationsartefakte vom Image-Inhalt entkoppeln, um containerisierte Anwendungen portabel zu halten<\/span><\/td>\n<\/tr>\n<tr bgcolor=\"#e0e0e0\">\n<td valign=\"top\"><span style=\"font-weight: 400\">Wird f\u00fcr vertrauliche Daten verwendet<\/span><\/td>\n<td valign=\"top\"><span style=\"font-weight: 400\">Wird f\u00fcr nicht vertrauliche Daten verwendet<\/span><\/td>\n<\/tr>\n<tr>\n<td valign=\"top\"><span style=\"font-weight: 400\">Anwendungsbeispiele: API-Schl\u00fcssel, Passwort, Token und ssh-Schl\u00fcssel<\/span><\/td>\n<td valign=\"top\"><span style=\"font-weight: 400\">Anwendungsbeispiele: Log-Rotatoren, Konfiguration ohne vertrauliche Daten<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400\">In diesem Beispiel erm\u00f6glichen wir Helm, Images von privaten Docker-Registries unter Verwendung von Image-Pull-Secrets abzurufen.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Dieses Verfahren setzt voraus, dass dem Kubernetes-Cluster ein Secret zur Verf\u00fcgung steht, das die Anmeldedaten f\u00fcr den Repository-Manager angibt. Dieses Secret kann \u00fcber eine kubectl-Befehlszeile wie folgt erstellt werden: <\/span><\/p>\n<pre style=\"background: #e0e0e0;padding-left: 20px\">$ kubectl create secret docker-registry regsecret --docker-server=$DOCKER_REGISTRY_RUL --docker-username=$USERNAME --docker-password=$PASSWORD --docker-email=$EMAIL<\/pre>\n<p><span style=\"font-weight: 400\">In der <\/span><i><span style=\"font-weight: 400\">values.yaml<\/span><\/i><span style=\"font-weight: 400\">-Datei Ihres Helm-Charts k\u00f6nnen Sie dann den Secret-Namen an einen Wert \u00fcbergeben:<\/span><\/p>\n<div style=\"background: #272b33;overflow: auto;width: auto;border: solid gray;border-width: .1em .1em .1em .8em;padding: .2em .6em\">\n<pre style=\"margin: 0;line-height: 125%\"><span style=\"color: #999999\">imagePullSecrets: regsecret<\/span><\/pre>\n<\/div>\n<p><span style=\"font-weight: 400\">Sie k\u00f6nnen dann das Secret verwenden, um Helm den Zugriff auf die Docker-Registry \u00fcber diese Zeilen in <\/span><i><span style=\"font-weight: 400\">deployment.yaml<\/span><\/i><span style=\"font-weight: 400\"> zu gew\u00e4hren:<\/span><\/p>\n<div style=\"background: #272b33;overflow: auto;width: auto;border: solid gray;border-width: .1em .1em .1em .8em;padding: .2em .6em\">\n<pre style=\"margin: 0;line-height: 125%\"><span style=\"color: #999999\">{{- if .Values.imagePullSecrets }}\r\n imagePullSecrets:\r\n - name: {{ .Values.imagePullSecrets }}\r\n{{- end }}<\/span><\/pre>\n<\/div>\n<p><span style=\"font-weight: 400\">F\u00fcr Secrets, die f\u00fcr die Anwendung verf\u00fcgbar sind, sollten Sie diese Informationen direkt in <\/span><i><span style=\"font-weight: 400\">values.yaml<\/span><\/i><span style=\"font-weight: 400\"> eingeben.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Um zum Beispiel unsere Anwendung so zu konfigurieren, dass sie auf mongodb mit einem vorab erstellten Benutzer und einer Datenbank zugreift, geben Sie diese Informationen in <\/span><i><span style=\"font-weight: 400\">values.yaml<\/span><\/i> ein<\/p>\n<div style=\"background: #272b33;overflow: auto;width: auto;border: solid gray;border-width: .1em .1em .1em .8em;padding: .2em .6em\">\n<pre style=\"margin: 0;line-height: 125%\"><span style=\"color: #999999\">mongodb:\r\n enabled: true\r\n mongodbRootPassword:\r\n mongodbUsername: admin\r\n mongodbPassword: \r\n mongodbDatabase: test<\/span><\/pre>\n<\/div>\n<p><span style=\"font-weight: 400\">Beachten Sie, dass wir hier keine Standard-Anmeldeinformationen in unserem Helm-Chart hartcodieren. Stattdessen verwenden wir eine Logik zur zuf\u00e4lligen Generierung des Passworts, wenn es nicht \u00fcber &#8211;set flag oder <\/span><i><span style=\"font-weight: 400\">values.yaml<\/span><\/i> bereitgestellt wird<\/p>\n<p><span style=\"font-weight: 400\">Wir verwenden ein Secret, um die Mongodb-Anmeldeinformationen an unsere Anwendung zu \u00fcbergeben, und zwar durch diese Zeilen in <\/span><i><span style=\"font-weight: 400\">deployment.yaml<\/span><\/i><span style=\"font-weight: 400\">.<\/span><\/p>\n<div style=\"background: #272b33;overflow: auto;width: auto;border: solid gray;border-width: .1em .1em .1em .8em;padding: .2em .6em\">\n<pre style=\"margin: 0;line-height: 125%\"><span style=\"color: #999999\">env:\r\n- name: DATABASE_PASSWORD\r\n  valueFrom:\r\n    secretKeyRef:\r\n      name: {{ .Release.Name }}-mongodb\r\n      key: mongodb-password<\/span><\/pre>\n<\/div>\n<p><span style=\"font-weight: 400\">Sie k\u00f6nnen die Ausf\u00fchrung von Kubelet-Containern entweder durch spezialisierte <\/span><a href=\"https:\/\/kubernetes.io\/docs\/concepts\/workloads\/pods\/init-containers\/\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400\">Init-Container<\/span><\/a><span style=\"font-weight: 400\"> oder durch <\/span><a href=\"https:\/\/kubernetes.io\/docs\/concepts\/containers\/container-lifecycle-hooks\/\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400\">Container-Lifecycle-Hooks<\/span><\/a><span style=\"font-weight: 400\"> kontrollieren.<\/span><\/p>\n<p>&nbsp;<\/p>\n<table>\n<tbody>\n<tr>\n<td><b>InitContainer<\/b><\/td>\n<td><b>Container-Lifecycle-Hooks<\/b><\/td>\n<\/tr>\n<tr>\n<td valign=\"top\"><span style=\"font-weight: 400\"><b>InitContainer<\/b> sind spezialisierte Container, die vor App-Containern ausgef\u00fchrt werden und Dienstprogramme oder Setup-Skripte enthalten k\u00f6nnen, die in einem App-Image nicht vorhanden sind.<\/span><\/td>\n<td valign=\"top\"><span style=\"font-weight: 400\">Container k\u00f6nnen das Container-Lifecycle-Hook-Framework verwenden, um Code auszuf\u00fchren, der durch Ereignisse w\u00e4hrend ihres <a href=\"https:\/\/jfrog.com\/de\/devops-tools\/article\/was-ist-der-software-lebenszyklus\/\">Verwaltungslebenszyklus<\/a> ausgel\u00f6st wird.<\/span><\/td>\n<\/tr>\n<tr bgcolor=\"#e0e0e0\">\n<td valign=\"top\"><span style=\"font-weight: 400\">Ein Pod kann einen oder mehrere Init-Container haben, die ausgef\u00fchrt werden, bevor die App-Container gestartet werden.<\/span><\/p>\n<p>&nbsp;<\/td>\n<td valign=\"top\"><span style=\"font-weight: 400\">Ein Pod kann nur einen <\/span><b>PostStart<\/b><span style=\"font-weight: 400\">&#8211; oder <\/span><b>PreStop<\/b><span style=\"font-weight: 400\">-Hook haben<\/span><\/td>\n<\/tr>\n<tr>\n<td valign=\"top\"><\/td>\n<td valign=\"top\">Der <span style=\"font-weight: 400\"><b>PostStart<\/b>-Hook wird unmittelbar nach der Erstellung eines Containers ausgef\u00fchrt. Es gibt jedoch keine Garantie, dass der Hook vor dem Container-ENTRYPOINT ausgef\u00fchrt wird. Es werden keine Parameter an den Handler \u00fcbergeben.<\/span><br \/>\n<span style=\"font-weight: 400\">z. B. Verschieben von Dateien, die mit ConfigMap\/Secrets gemountet wurden, an einen anderen Ort.<\/span><\/td>\n<\/tr>\n<tr bgcolor=\"#e0e0e0\">\n<td valign=\"top\"><\/td>\n<td valign=\"top\">Der <span style=\"font-weight: 400\"><b>PreStop<\/b>-Hook wird unmittelbar vor dem Beenden eines Containers aufgerufen. Er blockiert, d.h. er ist synchron und muss daher abgeschlossen werden, bevor der Aufruf zum L\u00f6schen des Containers gesendet werden kann.<\/span><\/p>\n<p><span style=\"font-weight: 400\">z.B. Anwendung sanft herunterfahren<\/span><\/td>\n<\/tr>\n<tr>\n<td valign=\"top\"><span style=\"font-weight: 400\">Sie k\u00f6nnen <\/span><b>initContainers<\/b><span style=\"font-weight: 400\"> verwenden, um Wartezeiten hinzuzuf\u00fcgen und so zu pr\u00fcfen, ob abh\u00e4ngige Microservices funktionsf\u00e4hig sind, bevor Sie fortfahren.<\/span><\/td>\n<td valign=\"top\"><span style=\"font-weight: 400\">Sie k\u00f6nnen <\/span><b>PostStart <\/b><span style=\"font-weight: 400\">-Hook zum Aktualisieren von Dateien im selben Pod verwenden, z.B. um Konfigurationsdateien mit <\/span><b>Service IP<\/b> zu aktualisieren<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400\">In unserem Beispiel f\u00fcgen Sie diese <\/span><b>initContainers <\/b><span style=\"font-weight: 400\">-Spezifikationen der <\/span><i><span style=\"font-weight: 400\">deployments.yaml<\/span><\/i><span style=\"font-weight: 400\"> hinzu, um den Start unserer Anwendung zu verz\u00f6gern, bis die Datenbank eingerichtet ist. <\/span><span style=\"font-weight: 400\"><br \/>\n<\/span><\/p>\n<div style=\"background: #272b33;overflow: auto;width: auto;border: solid gray;border-width: .1em .1em .1em .8em;padding: .2em .6em\">\n<pre style=\"margin: 0;line-height: 125%\"><span style=\"color: #999999\">initContainers:\r\n- name: wait-for-db\r\n image: \"{{ .Values.initContainerImage }}\"\r\n command:\r\n - 'sh'\r\n - '-c'\r\n - &gt;\r\n   until nc -z -w 2 {{ .Release.Name }}-mongodb 27017 &amp;&amp; echo mongodb ok;\r\n     do sleep 2;\r\n   done<\/span><\/pre>\n<\/div>\n<h2><span style=\"font-weight: 400\">Hinzuf\u00fcgen von Bereitschafts- und Aktivit\u00e4tssonden<\/span><\/h2>\n<p><span style=\"font-weight: 400\">Es ist oft eine gute Idee, eine Readiness- und eine Liveness-Probe hinzuzuf\u00fcgen, um den laufenden Zustand der Anwendung zu \u00fcberpr\u00fcfen. Wenn Sie das nicht tun, k\u00f6nnte es sein, dass die Anwendung zwar zu laufen scheint, aber nicht auf Aufrufe oder Abfragen reagiert.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Diese Zeilen in der <\/span><i><span style=\"font-weight: 400\">deployment.yaml<\/span><\/i><span style=\"font-weight: 400\">-Datei f\u00fcgen diese Probes hinzu, um regelm\u00e4\u00dfige Pr\u00fcfungen durchzuf\u00fchren:<\/span><\/p>\n<div style=\"background: #272b33;overflow: auto;width: auto;border: solid gray;border-width: .1em .1em .1em .8em;padding: .2em .6em\">\n<pre style=\"margin: 0;line-height: 125%\"><span style=\"color: #999999\">livenessProbe:\r\n httpGet:\r\n   path: '\/health'\r\n   port: http\r\n initialDelaySeconds: 60\r\n periodSeconds: 10\r\n failureThreshold: 10\r\nreadinessProbe:\r\n httpGet:\r\n   path: '\/health'\r\n   port: http\r\n initialDelaySeconds: 60\r\n periodSeconds: 10\r\n failureThreshold: 10<\/span><\/pre>\n<\/div>\n<h2><span style=\"font-weight: 400\">Hinzuf\u00fcgen von RBAC-Unterst\u00fctzung <\/span><\/h2>\n<p><span style=\"font-weight: 400\">Diese Prozeduren f\u00fcgen Unterst\u00fctzung f\u00fcr <\/span><a href=\"https:\/\/kubernetes.io\/docs\/reference\/access-authn-authz\/rbac\/\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400\">rollenbasierte Zugriffskontrolle (RBAC)<\/span><\/a> <span style=\"font-weight: 400\">unserem Chart hinzu, wenn sie von einer Anwendung ben\u00f6tigt wird.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Schritt\u00a01: Erstellen Sie eine <\/span><i><span style=\"font-weight: 400\">Rolle, indem <\/span><\/i><span style=\"font-weight: 400\">Sie den folgenden Inhalt in einer <\/span><i><span style=\"font-weight: 400\">role.yaml<\/span><\/i><span style=\"font-weight: 400\">-Datei hinzuf\u00fcgen: <\/span><span style=\"font-weight: 400\"><br \/>\n<\/span><span style=\"font-weight: 400\">Eine Rolle kann nur verwendet werden, um Zugriff auf Ressourcen innerhalb eines einzelnen Namespace zu gew\u00e4hren.<\/span><\/p>\n<div style=\"background: #272b33;overflow: auto;width: auto;border: solid gray;border-width: .1em .1em .1em .8em;padding: .2em .6em\">\n<pre style=\"margin: 0;line-height: 125%\"><span style=\"color: #999999\">{{- if .Values.rbac.create }}\r\napiVersion: rbac.authorization.k8s.io\/v1\r\nkind: Role\r\nmetadata:\r\n labels:\r\n   app: {{ template \"express-crud.name\" . }}\r\n   chart: {{ template \"express-crud.chart\" . }}\r\n   heritage: {{ .Release.Service }}\r\n   release: {{ .Release.Name }}\r\n name: {{ template \"express-crud.fullname\" . }}\r\nrules:\r\n{{ toYaml .Values.rbac.role.rules }}\r\n{{- end }}<\/span><\/pre>\n<\/div>\n<p><span style=\"font-weight: 400\">Schritt\u00a02: Erstellen Sie ein <\/span><i><span style=\"font-weight: 400\">RoleBinding, indem <\/span><\/i><span style=\"font-weight: 400\">Sie den folgenden Inhalt in einer <\/span><i><span style=\"font-weight: 400\">rolebinding.yaml<\/span><\/i><span style=\"font-weight: 400\">-Datei hinzuf\u00fcgen<\/span><span style=\"font-weight: 400\">:<\/span><span style=\"font-weight: 400\"><br \/>\n<\/span><span style=\"font-weight: 400\">Eine ClusterRole kann verwendet werden, um die gleichen Berechtigungen wie eine Rolle zu gew\u00e4hren, aber da sie zum Cluster-Geltungsbereich geh\u00f6ren, k\u00f6nnen sie auch verwendet werden, um Zugriff auf Folgendes zu gew\u00e4hren:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Cluster-bezogene Ressourcen (wie Knoten)<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">nicht-Ressourcen-Endpunkte (wie &#8220;\/healthz&#8221;)<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">namespaced-Ressourcen (wie Pods) in allen Namespaces<\/span><\/li>\n<\/ul>\n<div style=\"background: #272b33;overflow: auto;width: auto;border: solid gray;border-width: .1em .1em .1em .8em;padding: .2em .6em\">\n<pre style=\"margin: 0;line-height: 125%\"><span style=\"color: #999999\">{{- if .Values.rbac.create }}\r\napiVersion: rbac.authorization.k8s.io\/v1\r\nkind: RoleBinding\r\nmetadata:\r\n labels:\r\n   app: {{ template \"express-crud.name\" . }}\r\n   chart: {{ template \"express-crud.chart\" . }}\r\n   heritage: {{ .Release.Service }}\r\n   release: {{ .Release.Name }}\r\n name: {{ template \"express-crud.fullname\" . }}\r\nsubjects:\r\n- kind: ServiceAccount\r\n name: {{ template \"express-crud.serviceAccountName\" . }}\r\nroleRef:\r\n kind: Role\r\n apiGroup: rbac.authorization.k8s.io\r\n name: {{ template \"express-crud.fullname\" . }}\r\n{{- end }}<\/span><\/pre>\n<\/div>\n<p><span style=\"font-weight: 400\">Schritt\u00a03: Erstellen Sie ein <\/span><i><span style=\"font-weight: 400\">ServiceAccount <\/span><\/i><span style=\"font-weight: 400\">durch <\/span><span style=\"font-weight: 400\">Hinzuf\u00fcgen des folgenden Inhalts in eine <\/span><i><span style=\"font-weight: 400\">serviceaccount.yaml<\/span><\/i><span style=\"font-weight: 400\">-Datei<\/span><span style=\"font-weight: 400\">:<\/span><\/p>\n<p><span style=\"font-weight: 400\">Ein Service Account bietet eine Identit\u00e4t f\u00fcr Prozesse, die in einem Pod laufen.<\/span><\/p>\n<div style=\"background: #272b33;overflow: auto;width: auto;border: solid gray;border-width: .1em .1em .1em .8em;padding: .2em .6em\">\n<pre style=\"margin: 0;line-height: 125%\"><span style=\"color: #999999\">{{- if .Values.serviceAccount.create }}\r\napiVersion: v1\r\nkind: ServiceAccount\r\nmetadata:\r\n labels:\r\n   app: {{ template \"express-crud.name\" . }}\r\n   chart: {{ template \"express-crud.chart\" . }}\r\n   heritage: {{ .Release.Service }}\r\n   release: {{ .Release.Name }}\r\n name: {{ template \"express-crud.serviceAccountName\" . }}\r\n{{- end }}<\/span><\/pre>\n<\/div>\n<p><span style=\"font-weight: 400\">Schritt\u00a04: Verwenden Sie die Hilfsvorlage, um den ServiceAccount-Namen festzulegen.<\/span><span style=\"font-weight: 400\"><br \/>\n<\/span><span style=\"font-weight: 400\">Wir tun dies, indem wir folgenden Inhalt in der <\/span><i><span style=\"font-weight: 400\">_helpers.tpl<\/span><\/i><span style=\"font-weight: 400\">-Datei hinzuf\u00fcgen<\/span><\/p>\n<div style=\"background: #272b33;overflow: auto;width: auto;border: solid gray;border-width: .1em .1em .1em .8em;padding: .2em .6em\">\n<pre style=\"margin: 0;line-height: 125%\"><span style=\"color: #999999\">{{\/*\r\nErstellen Sie den Namen des zu verwendenden Service Accounts\r\n*\/}}\r\n{{- define \"express-crud.serviceAccountName\" -}}\r\n{{- if .Values.serviceAccount.create -}}\r\n{{ default (include \"express-crud.fullname\" .) .Values.serviceAccount.name }}\r\n{{- else -}}\r\n{{ default \"default\" .Values.serviceAccount.name }}\r\n{{- end -}}\r\n{{- end -}}<\/span><\/pre>\n<\/div>\n<h2><span style=\"font-weight: 400\">Einen Dienst hinzuf\u00fcgen <\/span><\/h2>\n<p><span style=\"font-weight: 400\"> Jetzt ist es an der Zeit, unsere Anwendung der \u00d6ffentlichkeit \u00fcber einen entsprechenden Dienst zug\u00e4nglich zu machen. <\/span><\/p>\n<p><span style=\"font-weight: 400\">Ein Dienst erm\u00f6glicht es Ihrer Anwendung, Datenverkehr \u00fcber eine IP-Adresse zu empfangen. Dienste k\u00f6nnen auf unterschiedliche Weise exponiert werden, indem ein <\/span><i><span style=\"font-weight: 400\">Typ<\/span><\/i><span style=\"font-weight: 400\"> angegeben wird:<\/span><\/p>\n<table>\n<tbody>\n<tr>\n<td valign=\"top\"><b>ClusterIP<\/b><\/td>\n<td valign=\"top\"><span style=\"font-weight: 400\">Der Dienst ist nur \u00fcber eine interne IP von innerhalb des Clusters erreichbar.<\/span><\/td>\n<\/tr>\n<tr>\n<td valign=\"top\"><b>NodePort<\/b><\/td>\n<td valign=\"top\"><span style=\"font-weight: 400\">Der Dienst ist von au\u00dferhalb des Clusters \u00fcber die NodeIP und den NodePort erreichbar.<\/span><\/td>\n<\/tr>\n<tr>\n<td valign=\"top\"><b>LoadBalancer<\/b><\/td>\n<td valign=\"top\"><span style=\"font-weight: 400\">Der Dienst ist von au\u00dferhalb des Clusters \u00fcber einen externen Load Balancer erreichbar. Kann <\/span><a href=\"https:\/\/kubernetes.io\/docs\/concepts\/services-networking\/ingress\/\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400\">Ingress<\/span><\/a><span style=\"font-weight: 400\">-Funktion f\u00fcr die Anwendung haben.<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><span style=\"font-weight: 400\"><br \/>\n<\/span><span style=\"font-weight: 400\">Wir tun dies, indem wir den folgenden Inhalt der <\/span><i><span style=\"font-weight: 400\">service.yaml<\/span><\/i><span style=\"font-weight: 400\">-Datei hinzuf\u00fcgen:<\/span><\/p>\n<div style=\"background: #272b33;overflow: auto;width: auto;border: solid gray;border-width: .1em .1em .1em .8em;padding: .2em .6em\">\n<pre style=\"margin: 0;line-height: 125%\"><span style=\"color: #999999\">apiVersion: v1\r\nkind: Service\r\nmetadata:\r\n name: {{ template \"express-crud.fullname\" . }}\r\n labels:\r\n   app: {{ template \"express-crud.name\" . }}\r\n   chart: {{ template \"express-crud.chart\" . }}\r\n   release: {{ .Release.Name }}\r\n   heritage: {{ .Release.Service }}\r\nspec:\r\n type: {{ .Values.service.type }}\r\n ports:\r\n   - port: {{ .Values.service.externalPort }}\r\n     targetPort: http\r\n     protocol: TCP\r\n     name: http\r\n selector:\r\n   app: {{ template \"express-crud.name\" . }}\r\n   release: {{ .Release.Name }}<\/span><\/pre>\n<\/div>\n<p><span style=\"font-weight: 400\">Beachten Sie, dass wir im obigen Beispiel f\u00fcr unseren Dienst <\/span><i><span style=\"font-weight: 400\">type<\/span><\/i><span style=\"font-weight: 400\"> auf eine Einstellung in unserer <\/span><i><span style=\"font-weight: 400\">values.yam<\/span><\/i><span style=\"font-weight: 400\">l verweisen:<\/span><\/p>\n<div style=\"background: #272b33;overflow: auto;width: auto;border: solid gray;border-width: .1em .1em .1em .8em;padding: .2em .6em\">\n<pre style=\"margin: 0;line-height: 125%\"><span style=\"color: #999999\">service:\r\n  type: LoadBalancer\r\n  internalPort: 3000\r\n  externalPort: 80\r\n<\/span><\/pre>\n<\/div>\n<h1><span style=\"font-weight: 400\">Values.yaml-Zusammenfassung <\/span><\/h1>\n<p><span style=\"font-weight: 400\">Viele unserer Einstellungen in einer <\/span><i><span style=\"font-weight: 400\">values.yaml <\/span><\/i><span style=\"font-weight: 400\">-Datei zu definieren, ist eine gute Praxis, um die Helm-Charts wartbar zu halten.<\/span><\/p>\n<p><span style=\"font-weight: 400\">So sieht die <\/span><i><span style=\"font-weight: 400\">values.yaml<\/span><\/i><span style=\"font-weight: 400\">-Datei f\u00fcr unser Beispiel aus, wobei die Vielfalt der Einstellungen ersichtlich ist, die wir f\u00fcr viele der oben besprochenen Funktionen definieren:<\/span><\/p>\n<div style=\"background: #272b33;overflow: auto;width: auto;border: solid gray;border-width: .1em .1em .1em .8em;padding: .2em .6em\">\n<pre style=\"margin: 0;line-height: 125%\"><span style=\"color: #999999\"># Standardwerte f\u00fcr express-mongo-crud.\r\n# Dies ist eine YAML-formatierte Datei.\r\n# Deklarieren Sie Variablen, die an Ihre Vorlagen \u00fcbergeben werden sollen.\r\n\r\n## Rollenbasierte Zugriffskontrolle\r\n## Ref: https:\/\/kubernetes.io\/docs\/admin\/authorization\/rbac\/\r\nrbac:\r\n create: true\r\n role:\r\n   ## Zu erstellende Regeln. Gem\u00e4\u00df Rollenspezifikation\r\n   rules:\r\n   - apiGroups:\r\n     - ''\r\n     resources:\r\n     - services\r\n     - endpoints\r\n     - pods\r\n     verbs:\r\n     - get\r\n     - watch\r\n     - list\r\n\r\n## Service Account\r\n## Ref: https:\/\/kubernetes.io\/docs\/admin\/service-accounts-admin\/\r\n##\r\nserviceAccount:\r\n create: true\r\n ## Der Name des zu verwendenden ServiceAccounts.\r\n ## Wenn nicht eingestellt und create = true, wird ein Name unter Verwendung der fullname-Vorlage erzeugt\r\n name:\r\n\r\n## Konfigurationswerte f\u00fcr die mongodb-Abh\u00e4ngigkeit\r\n## ref: https:\/\/github.com\/kubernetes\/charts\/blob\/master\/stable\/mongodb\/README.md\r\n##\r\nmongodb:\r\n enabled: true\r\n image:\r\n   tag: 3.6.3\r\n   pullPolicy: IfNotPresent\r\n persistence:\r\n   size: 50Gi\r\n # resources:\r\n #  requests:\r\n #    memory: \"12Gi\"\r\n #    cpu: \"200m\"\r\n #  limits:\r\n #    memory: \"12Gi\"\r\n #    cpu: \"2\"\r\n ## Stellen Sie sicher, dass die --wiredTigerCacheSizeGB nicht mehr als die H\u00e4lfte der Speichergrenze betr\u00e4gt!\r\n ## Dies ist entscheidend f\u00fcr den Schutz vor OOMKill durch Kubernetes!\r\n mongodbExtraFlags:\r\n - \"--wiredTigerCacheSizeGB=1\"\r\n mongodbRootPassword:\r\n mongodbUsername: admin\r\n mongodbPassword:\r\n mongodbDatabase: test\r\n# livenessProbe:\r\n#    initialDelaySeconds: 60\r\n#    periodSeconds: 10\r\n#  readinessProbe:\r\n#    initialDelaySeconds: 30\r\n#    periodSeconds: 30\r\n\r\ningress:\r\n enabled: false\r\n annotations: {}\r\n   # kubernetes.io\/ingress.class: nginx\r\n   # kubernetes.io\/tls-acme: \"true\"\r\n path: \/\r\n hosts:\r\n   - chart-example.local\r\n tls: []\r\n #  - secretName: chart-example-tls\r\n #    hosts:\r\n #      - chart-example.local\r\n\r\ninitContainerImage: \"alpine:3.6\"\r\nimagePullSecrets:\r\nreplicaCount: 1\r\n\r\nimage:\r\n repository: jainishshah17\/express-mongo-crud\r\n # tag: 1.0.1\r\n pullPolicy: IfNotPresent\r\n\r\nservice:\r\n type: LoadBalancer\r\n internalPort: 3000\r\n externalPort: 80\r\n\r\nresources: {}\r\n # Wir empfehlen in der Regel, keine Standard-Ressourcen anzugeben und dies bewusst so zu belassen\r\n # Auswahl f\u00fcr den Benutzer. Dies erh\u00f6ht auch die Chancen, dass die Charts in Umgebungen mit wenig\r\n # Ressourcen laufen, wie z. B. Minikube. Wenn Sie Ressourcen angeben m\u00f6chten, lassen Sie die folgenden\r\n # Zeilen unkommentiert, passen Sie sie nach Bedarf an und entfernen Sie die geschweiften Klammern nach \"resources:\".\r\n # limits:\r\n #  cpu: 100m\r\n #  memory: 128Mi\r\n # requests:\r\n #  cpu: 100m\r\n #  memory: 128Mi\r\n\r\nnodeSelector: {}\r\n\r\ntolerations: []\r\n\r\naffinity: {}<\/span><\/pre>\n<\/div>\n<h1><span style=\"font-weight: 400\">Das Helm-Chart testen und installieren<\/span><\/h1>\n<p><span style=\"font-weight: 400\">Es ist sehr wichtig, dass wir unser Helm-Diagramm testen; dies tun wir mit dem <\/span><span style=\"font-weight: 400\">helm lint<\/span><span style=\"font-weight: 400\">-Befehl.<\/span><\/p>\n<pre style=\"background: #e0e0e0;padding-left: 20px\">$ helm lint .\/\r\n\r\n## Output\r\n==&gt; Linting .\/\r\nLint OK\r\n\r\n1 chart(s) linted, no failures<\/pre>\n<p><span style=\"font-weight: 400\">Verwenden Sie den <\/span><span style=\"font-weight: 400\">helm <em>install<\/em><\/span><span style=\"font-weight: 400\">-Befehl, um unsere Anwendung mithilfe von helm chart auf Kubernetes bereitzustellen.<\/span><\/p>\n<pre style=\"background: #e0e0e0;padding-left: 20px\">$ helm install --name test1 .\/ \r\n\r\n## Output\r\nNAME:   test1\r\nLAST DEPLOYED: Sat Sep 15 09:36:23 2018\r\nNAMESPACE: default\r\nSTATUS: DEPLOYED\r\n\r\nRESOURCES:\r\n==&gt; v1beta1\/Deployment\r\nNAME           DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE\r\ntest1-mongodb  1        1        1           0          0s\r\n\r\n==&gt; v1beta2\/Deployment\r\ntest1-express-crud  1  1  1  0  0s\r\n\r\n==&gt; v1\/Secret\r\nNAME           TYPE    DATA  AGE\r\ntest1-mongodb  Opaque  2     0s\r\n\r\n==&gt; v1\/PersistentVolumeClaim\r\nNAME           STATUS   VOLUME    CAPACITY  ACCESS MODES  STORAGECLASS  AGE\r\ntest1-mongodb  Pending  standard  0s\r\n\r\n==&gt; v1\/ServiceAccount\r\nNAME                SECRETS  AGE\r\ntest1-express-crud  1        0s\r\n\r\n==&gt; v1\/Service\r\nNAME                TYPE          CLUSTER-IP     EXTERNAL-IP  PORT(S)       AGE\r\ntest1-mongodb       ClusterIP     10.19.248.205         27017\/TCP     0s\r\ntest1-express-crud  LoadBalancer  10.19.254.169      80:31994\/TCP  0s\r\n\r\n==&gt; v1\/Role\r\nNAME                AGE\r\ntest1-express-crud  0s\r\n\r\n==&gt; v1\/RoleBinding\r\nNAME                AGE\r\ntest1-express-crud  0s\r\n\r\n==&gt; v1\/Pod(related)\r\nNAME                                READY  STATUS    RESTARTS  AGE\r\ntest1-mongodb-67b6697449-tppk5      0\/1    Pending   0         0s\r\ntest1-express-crud-dfdbd55dc-rdk2c  0\/1    Init:0\/1  0         0s\r\n\r\n\r\nHINWEISE:\r\n1. Rufen Sie die Anwendungs-URL ab, indem Sie diese Befehle ausf\u00fchren:\r\n     HINWEIS: Es kann ein paar Minuten dauern, bis die LoadBalancer-IP verf\u00fcgbar ist.\r\n           Sie k\u00f6nnen den Status von durch Ausf\u00fchren von \"kubectl get svc -w test1-express-crud\" verfolgen\r\n  export SERVICE_IP=$(kubectl get svc --namespace default test1-express-crud -o jsonpath='{.status.loadBalancer.ingress[0].ip}')\r\n  echo https:\/\/$SERVICE_IP:80<\/pre>\n<p><span style=\"font-weight: 400\">Durch Ausf\u00fchren des oben genannten helm install-Befehls wird eine External_IP f\u00fcr den Load Balancer erzeugt. Sie k\u00f6nnen diese IP-Adresse verwenden, um die Anwendung auszuf\u00fchren.<\/span><\/p>\n<p><span style=\"font-weight: 400\">So sieht unsere Anwendung aus, wenn sie ausgef\u00fchrt wird:<\/span><span style=\"font-weight: 400\"><br \/>\n<\/span><\/p>\n<p><img decoding=\"async\" class=\"alignnone wp-image-44890 size-large\" src=\"https:\/\/media.jfrog.com\/wp-content\/uploads\/2019\/03\/20131059\/Helm-BP-Result-1024x588.png\" alt=\"Result\" width=\"1024\" height=\"588\" srcset=\"https:\/\/speedmedia2.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/media.jfrog.com\/wp-content\/uploads\/2019\/03\/20131059\/Helm-BP-Result.png?speedsize=w_1024 1024w, https:\/\/speedmedia2.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/media.jfrog.com\/wp-content\/uploads\/2019\/03\/20131059\/Helm-BP-Result.png?speedsize=w_300 300w, https:\/\/speedmedia2.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/media.jfrog.com\/wp-content\/uploads\/2019\/03\/20131059\/Helm-BP-Result.png?speedsize=w_768 768w, https:\/\/speedmedia2.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/media.jfrog.com\/wp-content\/uploads\/2019\/03\/20131059\/Helm-BP-Result.png?speedsize=w_1600 1600w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<h1><span style=\"font-weight: 400\">Zusammenfassung<\/span><\/h1>\n<p><span style=\"font-weight: 400\">Wie Sie an diesem Beispiel sehen k\u00f6nnen, ist Helm ein extrem vielseitiges System, das Ihnen eine gro\u00dfe Flexibilit\u00e4t bei der Strukturierung und Entwicklung eines Charts bietet. Werden dabei die Konventionen der Helm-Community befolgt, vereinfacht dies die Einreichung Ihrer Helm-Charts f\u00fcr die \u00f6ffentliche Nutzung und die Pflege Ihrer Anwendung durch Aktualisierungen wird erheblich erleichtert.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Die fertiggestellten Helm-Charts f\u00fcr dieses Beispielprojekt finden Sie im <\/span><a href=\"https:\/\/github.com\/jainishshah17\/express-mongo-crud\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400\">express-crud<\/span><\/a><span style=\"font-weight: 400\">-Repository auf GitHub. Au\u00dferdem k\u00f6nnen Sie diese funktionierenden Dateien \u00fcberpr\u00fcfen, um die Funktionsweise besser zu verstehen.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Um weitere Beispiele kennenzulernen, k\u00f6nnen Sie sich mein Beispiel-Repository von <\/span><a href=\"https:\/\/github.com\/jfrog\/charts\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400\">Helm-Charts<\/span><\/a><span style=\"font-weight: 400\"> f\u00fcr Bereitstellung von Produkten in Kubernetes ansehen.<\/span><\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Kubernetes, das beliebte Orchestrierungswerkzeug f\u00fcr Containeranwendungen, ist nach dem griechischen Wort f\u00fcr &#8220;Lotse&#8221; benannt, also demjenigen, der das Schiff steuert. Aber wie bei jeder Reise kann der Navigator nur so erfolgreich sein wie die verf\u00fcgbare Karte. Das Helm-Chart ist eine Karte, also eine Sammlung von Dateien, die von einem Helm-Chart-Repository, das einen zusammenh\u00e4ngenden Satz von &hellip;<\/p>\n","protected":false},"author":140,"featured_media":53290,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[9245,9205],"tags":[9419,9420,9421],"class_list":["post-80668","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-artifactory-de","category-unkategorisiert","tag-best-practices-de","tag-helm-de","tag-helm-charts-de"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v22.6 (Yoast SEO v22.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Best Practices f\u00fcr Helm-Charts | JFrog Artifactory<\/title>\n<meta name=\"description\" content=\"Beim Aufbau Ihres Helm-Chart-Repositories sind dies einige bew\u00e4hrte Praktiken, die Sie befolgen sollten, um Ihr Kubernetes-Deployment durch die Untiefen der Entscheidungen zu steuern.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/jfrog.com\/de\/wp-json\/wp\/v2\/posts\/80668\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"M\u00f6glichkeiten, um Ihre Helm-Charts auf den richtigen Kurs zu bringen\" \/>\n<meta property=\"og:description\" content=\"Der Experte f\u00fcr Helm-Chart-Experte bei JFrog erl\u00e4utert die Best Practices, die er beim Durchst\u00f6bern der vielen M\u00f6glichkeiten der K8s-Automatisierung f\u00fcr die Nutzung und Aktualisierung von Containern gelernt hat.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/jfrog.com\/de\/blog\/helm-charts-best-practices\/\" \/>\n<meta property=\"og:site_name\" content=\"JFrog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/artifrog\" \/>\n<meta property=\"article:published_time\" content=\"2021-08-30T16:44:20+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-11-30T15:17:50+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/speedmedia.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/http:\/\/media.jfrog.com\/wp-content\/uploads\/2019\/03\/20125926\/HELM-203X148.png\" \/>\n\t<meta property=\"og:image:width\" content=\"203\" \/>\n\t<meta property=\"og:image:height\" content=\"148\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"giannit\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:title\" content=\"M\u00f6glichkeiten, um Ihre Helm-Charts auf den richtigen Kurs zu bringen\" \/>\n<meta name=\"twitter:description\" content=\"Der Experte f\u00fcr Helm-Chart-Experte bei JFrog erl\u00e4utert die Best Practices, die er beim Durchst\u00f6bern der vielen M\u00f6glichkeiten der K8s-Automatisierung f\u00fcr die Nutzung und Aktualisierung von Containern gelernt hat.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/jfrog.com\/wp-content\/uploads\/2019\/03\/Helm-Chart-Best-Practices_1200628-2.png\" \/>\n<meta name=\"twitter:creator\" content=\"@jfrog\" \/>\n<meta name=\"twitter:site\" content=\"@jfrog\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"giannit\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"14 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/jfrog.com\/de\/blog\/helm-charts-best-practices\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/jfrog.com\/de\/blog\/helm-charts-best-practices\/\"},\"author\":{\"name\":\"giannit\",\"@id\":\"https:\/\/jfrog.com\/de\/#\/schema\/person\/b554ace14b37da5eed75bbfc7dd1c1af\"},\"headline\":\"Auf dem richtigen Kurs mit Best Practices f\u00fcr Helm-Charts\",\"datePublished\":\"2021-08-30T16:44:20+00:00\",\"dateModified\":\"2023-11-30T15:17:50+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/jfrog.com\/de\/blog\/helm-charts-best-practices\/\"},\"wordCount\":1969,\"publisher\":{\"@id\":\"https:\/\/jfrog.com\/de\/#organization\"},\"image\":{\"@id\":\"https:\/\/jfrog.com\/de\/blog\/helm-charts-best-practices\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/speedmedia2.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/media.jfrog.com\/wp-content\/uploads\/2019\/03\/20125926\/HELM-203X148.png\",\"keywords\":[\"Best Practices\",\"helm\",\"Helm-Charts\"],\"articleSection\":[\"Artifactory\",\"Unkategorisiert\"],\"inLanguage\":\"de-DE\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/jfrog.com\/de\/blog\/helm-charts-best-practices\/\",\"url\":\"https:\/\/jfrog.com\/de\/blog\/helm-charts-best-practices\/\",\"name\":\"Best Practices f\u00fcr Helm-Charts | JFrog Artifactory\",\"isPartOf\":{\"@id\":\"https:\/\/jfrog.com\/de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/jfrog.com\/de\/blog\/helm-charts-best-practices\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/jfrog.com\/de\/blog\/helm-charts-best-practices\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/speedmedia2.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/media.jfrog.com\/wp-content\/uploads\/2019\/03\/20125926\/HELM-203X148.png\",\"datePublished\":\"2021-08-30T16:44:20+00:00\",\"dateModified\":\"2023-11-30T15:17:50+00:00\",\"description\":\"Beim Aufbau Ihres Helm-Chart-Repositories sind dies einige bew\u00e4hrte Praktiken, die Sie befolgen sollten, um Ihr Kubernetes-Deployment durch die Untiefen der Entscheidungen zu steuern.\",\"breadcrumb\":{\"@id\":\"https:\/\/jfrog.com\/de\/blog\/helm-charts-best-practices\/#breadcrumb\"},\"inLanguage\":\"de-DE\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/jfrog.com\/de\/blog\/helm-charts-best-practices\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de-DE\",\"@id\":\"https:\/\/jfrog.com\/de\/blog\/helm-charts-best-practices\/#primaryimage\",\"url\":\"https:\/\/speedmedia2.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/media.jfrog.com\/wp-content\/uploads\/2019\/03\/20125926\/HELM-203X148.png\",\"contentUrl\":\"https:\/\/speedmedia2.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/media.jfrog.com\/wp-content\/uploads\/2019\/03\/20125926\/HELM-203X148.png\",\"width\":203,\"height\":148,\"caption\":\"Helm\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/jfrog.com\/de\/blog\/helm-charts-best-practices\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/jfrog.com\/de\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Auf dem richtigen Kurs mit Best Practices f\u00fcr Helm-Charts\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/jfrog.com\/de\/#website\",\"url\":\"https:\/\/jfrog.com\/de\/\",\"name\":\"JFrog\",\"description\":\"Deliver Trusted Software Releases at Speed and Scale\",\"publisher\":{\"@id\":\"https:\/\/jfrog.com\/de\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/jfrog.com\/de\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"de-DE\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/jfrog.com\/de\/#organization\",\"name\":\"JFrog\",\"url\":\"https:\/\/jfrog.com\/de\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de-DE\",\"@id\":\"https:\/\/jfrog.com\/de\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/speedmedia2.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/media.jfrog.com\/wp-content\/uploads\/2025\/05\/27095207\/Logo.svg\",\"contentUrl\":\"https:\/\/speedmedia2.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/media.jfrog.com\/wp-content\/uploads\/2025\/05\/27095207\/Logo.svg\",\"width\":74,\"height\":73,\"caption\":\"JFrog\"},\"image\":{\"@id\":\"https:\/\/jfrog.com\/de\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/artifrog\",\"https:\/\/x.com\/jfrog\",\"https:\/\/www.linkedin.com\/company\/455737\",\"https:\/\/www.youtube.com\/channel\/UCh2hNg76zo3d1qQqTWIQxDg\",\"https:\/\/www.wikidata.org\/wiki\/Q98608948\"],\"description\":\"We set out on our Liquid Software journey in 2008, with the mission to transform the way enterprises manage and release software updates. The world expects software to update continuously, securely, non-intrusively and without user intervention. This hyper-connected experience can only be enabled by automation with an end-to-end DevOps platform and a binary-centric focus. With this in mind, we\u2019ve developed the JFrog Platform, ushering in a new era of DevOps and DevSecOps standards that power continuous updates. More than a decade after our founding, with thousands of customers and millions of users globally, JFrog has become the \u201cDatabase of DevOps\u201d and the de-facto standard in release and update management.\",\"legalName\":\"Jfrog, Inc.\",\"numberOfEmployees\":{\"@type\":\"QuantitativeValue\",\"minValue\":\"1001\",\"maxValue\":\"5000\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/jfrog.com\/de\/#\/schema\/person\/b554ace14b37da5eed75bbfc7dd1c1af\",\"name\":\"giannit\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de-DE\",\"@id\":\"https:\/\/jfrog.com\/de\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/fca3c188acf34ea94b72429eb16d496a8d0b50af476289bb5f51c8283e5c5b1c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/fca3c188acf34ea94b72429eb16d496a8d0b50af476289bb5f51c8283e5c5b1c?s=96&d=mm&r=g\",\"caption\":\"giannit\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Best Practices f\u00fcr Helm-Charts | JFrog Artifactory","description":"Beim Aufbau Ihres Helm-Chart-Repositories sind dies einige bew\u00e4hrte Praktiken, die Sie befolgen sollten, um Ihr Kubernetes-Deployment durch die Untiefen der Entscheidungen zu steuern.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/jfrog.com\/de\/wp-json\/wp\/v2\/posts\/80668","og_locale":"de_DE","og_type":"article","og_title":"M\u00f6glichkeiten, um Ihre Helm-Charts auf den richtigen Kurs zu bringen","og_description":"Der Experte f\u00fcr Helm-Chart-Experte bei JFrog erl\u00e4utert die Best Practices, die er beim Durchst\u00f6bern der vielen M\u00f6glichkeiten der K8s-Automatisierung f\u00fcr die Nutzung und Aktualisierung von Containern gelernt hat.","og_url":"https:\/\/jfrog.com\/de\/blog\/helm-charts-best-practices\/","og_site_name":"JFrog","article_publisher":"https:\/\/www.facebook.com\/artifrog","article_published_time":"2021-08-30T16:44:20+00:00","article_modified_time":"2023-11-30T15:17:50+00:00","og_image":[{"width":203,"height":148,"url":"https:\/\/speedmedia.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/http:\/\/media.jfrog.com\/wp-content\/uploads\/2019\/03\/20125926\/HELM-203X148.png","type":"image\/png"}],"author":"giannit","twitter_card":"summary_large_image","twitter_title":"M\u00f6glichkeiten, um Ihre Helm-Charts auf den richtigen Kurs zu bringen","twitter_description":"Der Experte f\u00fcr Helm-Chart-Experte bei JFrog erl\u00e4utert die Best Practices, die er beim Durchst\u00f6bern der vielen M\u00f6glichkeiten der K8s-Automatisierung f\u00fcr die Nutzung und Aktualisierung von Containern gelernt hat.","twitter_image":"https:\/\/jfrog.com\/wp-content\/uploads\/2019\/03\/Helm-Chart-Best-Practices_1200628-2.png","twitter_creator":"@jfrog","twitter_site":"@jfrog","twitter_misc":{"Written by":"giannit","Est. reading time":"14 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/jfrog.com\/de\/blog\/helm-charts-best-practices\/#article","isPartOf":{"@id":"https:\/\/jfrog.com\/de\/blog\/helm-charts-best-practices\/"},"author":{"name":"giannit","@id":"https:\/\/jfrog.com\/de\/#\/schema\/person\/b554ace14b37da5eed75bbfc7dd1c1af"},"headline":"Auf dem richtigen Kurs mit Best Practices f\u00fcr Helm-Charts","datePublished":"2021-08-30T16:44:20+00:00","dateModified":"2023-11-30T15:17:50+00:00","mainEntityOfPage":{"@id":"https:\/\/jfrog.com\/de\/blog\/helm-charts-best-practices\/"},"wordCount":1969,"publisher":{"@id":"https:\/\/jfrog.com\/de\/#organization"},"image":{"@id":"https:\/\/jfrog.com\/de\/blog\/helm-charts-best-practices\/#primaryimage"},"thumbnailUrl":"https:\/\/speedmedia2.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/media.jfrog.com\/wp-content\/uploads\/2019\/03\/20125926\/HELM-203X148.png","keywords":["Best Practices","helm","Helm-Charts"],"articleSection":["Artifactory","Unkategorisiert"],"inLanguage":"de-DE"},{"@type":"WebPage","@id":"https:\/\/jfrog.com\/de\/blog\/helm-charts-best-practices\/","url":"https:\/\/jfrog.com\/de\/blog\/helm-charts-best-practices\/","name":"Best Practices f\u00fcr Helm-Charts | JFrog Artifactory","isPartOf":{"@id":"https:\/\/jfrog.com\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/jfrog.com\/de\/blog\/helm-charts-best-practices\/#primaryimage"},"image":{"@id":"https:\/\/jfrog.com\/de\/blog\/helm-charts-best-practices\/#primaryimage"},"thumbnailUrl":"https:\/\/speedmedia2.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/media.jfrog.com\/wp-content\/uploads\/2019\/03\/20125926\/HELM-203X148.png","datePublished":"2021-08-30T16:44:20+00:00","dateModified":"2023-11-30T15:17:50+00:00","description":"Beim Aufbau Ihres Helm-Chart-Repositories sind dies einige bew\u00e4hrte Praktiken, die Sie befolgen sollten, um Ihr Kubernetes-Deployment durch die Untiefen der Entscheidungen zu steuern.","breadcrumb":{"@id":"https:\/\/jfrog.com\/de\/blog\/helm-charts-best-practices\/#breadcrumb"},"inLanguage":"de-DE","potentialAction":[{"@type":"ReadAction","target":["https:\/\/jfrog.com\/de\/blog\/helm-charts-best-practices\/"]}]},{"@type":"ImageObject","inLanguage":"de-DE","@id":"https:\/\/jfrog.com\/de\/blog\/helm-charts-best-practices\/#primaryimage","url":"https:\/\/speedmedia2.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/media.jfrog.com\/wp-content\/uploads\/2019\/03\/20125926\/HELM-203X148.png","contentUrl":"https:\/\/speedmedia2.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/media.jfrog.com\/wp-content\/uploads\/2019\/03\/20125926\/HELM-203X148.png","width":203,"height":148,"caption":"Helm"},{"@type":"BreadcrumbList","@id":"https:\/\/jfrog.com\/de\/blog\/helm-charts-best-practices\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/jfrog.com\/de\/"},{"@type":"ListItem","position":2,"name":"Auf dem richtigen Kurs mit Best Practices f\u00fcr Helm-Charts"}]},{"@type":"WebSite","@id":"https:\/\/jfrog.com\/de\/#website","url":"https:\/\/jfrog.com\/de\/","name":"JFrog","description":"Deliver Trusted Software Releases at Speed and Scale","publisher":{"@id":"https:\/\/jfrog.com\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/jfrog.com\/de\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"de-DE"},{"@type":"Organization","@id":"https:\/\/jfrog.com\/de\/#organization","name":"JFrog","url":"https:\/\/jfrog.com\/de\/","logo":{"@type":"ImageObject","inLanguage":"de-DE","@id":"https:\/\/jfrog.com\/de\/#\/schema\/logo\/image\/","url":"https:\/\/speedmedia2.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/media.jfrog.com\/wp-content\/uploads\/2025\/05\/27095207\/Logo.svg","contentUrl":"https:\/\/speedmedia2.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/media.jfrog.com\/wp-content\/uploads\/2025\/05\/27095207\/Logo.svg","width":74,"height":73,"caption":"JFrog"},"image":{"@id":"https:\/\/jfrog.com\/de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/artifrog","https:\/\/x.com\/jfrog","https:\/\/www.linkedin.com\/company\/455737","https:\/\/www.youtube.com\/channel\/UCh2hNg76zo3d1qQqTWIQxDg","https:\/\/www.wikidata.org\/wiki\/Q98608948"],"description":"We set out on our Liquid Software journey in 2008, with the mission to transform the way enterprises manage and release software updates. The world expects software to update continuously, securely, non-intrusively and without user intervention. This hyper-connected experience can only be enabled by automation with an end-to-end DevOps platform and a binary-centric focus. With this in mind, we\u2019ve developed the JFrog Platform, ushering in a new era of DevOps and DevSecOps standards that power continuous updates. More than a decade after our founding, with thousands of customers and millions of users globally, JFrog has become the \u201cDatabase of DevOps\u201d and the de-facto standard in release and update management.","legalName":"Jfrog, Inc.","numberOfEmployees":{"@type":"QuantitativeValue","minValue":"1001","maxValue":"5000"}},{"@type":"Person","@id":"https:\/\/jfrog.com\/de\/#\/schema\/person\/b554ace14b37da5eed75bbfc7dd1c1af","name":"giannit","image":{"@type":"ImageObject","inLanguage":"de-DE","@id":"https:\/\/jfrog.com\/de\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/fca3c188acf34ea94b72429eb16d496a8d0b50af476289bb5f51c8283e5c5b1c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/fca3c188acf34ea94b72429eb16d496a8d0b50af476289bb5f51c8283e5c5b1c?s=96&d=mm&r=g","caption":"giannit"}}]}},"_links":{"self":[{"href":"https:\/\/jfrog.com\/de\/wp-json\/wp\/v2\/posts\/80668","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jfrog.com\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jfrog.com\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jfrog.com\/de\/wp-json\/wp\/v2\/users\/140"}],"replies":[{"embeddable":true,"href":"https:\/\/jfrog.com\/de\/wp-json\/wp\/v2\/comments?post=80668"}],"version-history":[{"count":3,"href":"https:\/\/jfrog.com\/de\/wp-json\/wp\/v2\/posts\/80668\/revisions"}],"predecessor-version":[{"id":122732,"href":"https:\/\/jfrog.com\/de\/wp-json\/wp\/v2\/posts\/80668\/revisions\/122732"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jfrog.com\/de\/wp-json\/wp\/v2\/media\/53290"}],"wp:attachment":[{"href":"https:\/\/jfrog.com\/de\/wp-json\/wp\/v2\/media?parent=80668"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jfrog.com\/de\/wp-json\/wp\/v2\/categories?post=80668"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jfrog.com\/de\/wp-json\/wp\/v2\/tags?post=80668"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}