From 843e6524726ade4414a155293461cd0e760d2b08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Reinhard=20N=C3=A4gele?= Date: Fri, 16 Jun 2017 09:18:26 +0200 Subject: [PATCH] Improve chart examples --- docs/examples/alpine/Chart.yaml | 2 +- docs/examples/alpine/README.md | 2 - docs/examples/alpine/templates/_helpers.tpl | 16 +++++ .../examples/alpine/templates/alpine-pod.yaml | 23 ++++---- docs/examples/alpine/values.yaml | 8 ++- docs/examples/nginx/Chart.yaml | 4 +- docs/examples/nginx/README.md | 2 +- docs/examples/nginx/templates/_helpers.tpl | 16 ++--- docs/examples/nginx/templates/configmap.yaml | 17 +++--- docs/examples/nginx/templates/deployment.yaml | 59 ++++++++++++------- .../nginx/templates/post-install-job.yaml | 36 ++++++----- .../nginx/templates/pre-install-secret.yaml | 7 ++- .../nginx/templates/service-test.yaml | 9 ++- docs/examples/nginx/templates/service.yaml | 39 ++++++++++++ docs/examples/nginx/templates/svc.yaml | 18 ------ docs/examples/nginx/values.yaml | 29 ++++++--- 16 files changed, 184 insertions(+), 103 deletions(-) create mode 100644 docs/examples/alpine/templates/_helpers.tpl create mode 100644 docs/examples/nginx/templates/service.yaml delete mode 100644 docs/examples/nginx/templates/svc.yaml diff --git a/docs/examples/alpine/Chart.yaml b/docs/examples/alpine/Chart.yaml index e4c7ab7b7..f4b660d4f 100644 --- a/docs/examples/alpine/Chart.yaml +++ b/docs/examples/alpine/Chart.yaml @@ -1,7 +1,7 @@ name: alpine description: Deploy a basic Alpine Linux pod version: 0.1.0 -home: https://k8s.io/helm +home: https://github.com/kubernetes/helm sources: - https://github.com/kubernetes/helm appVersion: 3.3 diff --git a/docs/examples/alpine/README.md b/docs/examples/alpine/README.md index eb4fb9571..3e354724c 100644 --- a/docs/examples/alpine/README.md +++ b/docs/examples/alpine/README.md @@ -2,8 +2,6 @@ Run a single pod of Alpine Linux. -This example was generated using the command `helm create alpine`. - The `templates/` directory contains a very simple pod resource with a couple of parameters. diff --git a/docs/examples/alpine/templates/_helpers.tpl b/docs/examples/alpine/templates/_helpers.tpl new file mode 100644 index 000000000..f0d83d2ed --- /dev/null +++ b/docs/examples/alpine/templates/_helpers.tpl @@ -0,0 +1,16 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +*/}} +{{- define "fullname" -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} diff --git a/docs/examples/alpine/templates/alpine-pod.yaml b/docs/examples/alpine/templates/alpine-pod.yaml index c15ab8efc..14995675e 100644 --- a/docs/examples/alpine/templates/alpine-pod.yaml +++ b/docs/examples/alpine/templates/alpine-pod.yaml @@ -1,26 +1,23 @@ apiVersion: v1 kind: Pod metadata: - name: "{{.Release.Name}}-{{.Values.Name}}" + name: {{ template "fullname" . }} labels: # The "heritage" label is used to track which tool deployed a given chart. # It is useful for admins who want to see what releases a particular tool # is responsible for. - heritage: {{.Release.Service | quote }} + heritage: {{ .Release.Service }} # The "release" convention makes it easy to tie a release to all of the # Kubernetes resources that were created as part of that release. - release: {{.Release.Name | quote }} + release: {{ .Release.Name }} # This makes it easy to audit chart usage. - chart: "{{.Chart.Name}}-{{.Chart.Version}}" - annotations: - "helm.sh/created": {{.Release.Time.Seconds | quote }} + chart: {{ .Chart.Name }}-{{ .Chart.Version }} + app: {{ template "name" . }} spec: - # This shows how to use a simple value. This will look for a passed-in value - # called restartPolicy. If it is not found, it will use the default value. - # {{default "Never" .restartPolicy}} is a slightly optimized version of the - # more conventional syntax: {{.restartPolicy | default "Never"}} - restartPolicy: {{default "Never" .Values.restartPolicy}} + # This shows how to use a simple value. This will look for a passed-in value called restartPolicy. + restartPolicy: {{ .Values.restartPolicy }} containers: - name: waiter - image: "alpine:3.3" - command: ["/bin/sleep","9000"] + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + command: ["/bin/sleep", "9000"] diff --git a/docs/examples/alpine/values.yaml b/docs/examples/alpine/values.yaml index 879d760f9..afe8cc6c0 100644 --- a/docs/examples/alpine/values.yaml +++ b/docs/examples/alpine/values.yaml @@ -1,2 +1,6 @@ -# The pod name -Name: my-alpine +image: + repository: alpine + tag: 3.3 + pullPolicy: IfNotPresent + +restartPolicy: Never diff --git a/docs/examples/nginx/Chart.yaml b/docs/examples/nginx/Chart.yaml index 3f8b73324..6ca92998d 100644 --- a/docs/examples/nginx/Chart.yaml +++ b/docs/examples/nginx/Chart.yaml @@ -6,9 +6,9 @@ keywords: - nginx - www - web -home: "https://github.com/kubernetes/helm" +home: https://github.com/kubernetes/helm sources: - - "https://hub.docker.com/_/nginx/" + - https://hub.docker.com/_/nginx/ maintainers: - name: technosophos email: mbutcher@deis.com diff --git a/docs/examples/nginx/README.md b/docs/examples/nginx/README.md index a156d70de..9b53e213b 100644 --- a/docs/examples/nginx/README.md +++ b/docs/examples/nginx/README.md @@ -13,7 +13,7 @@ pattern: - A `Deployment` is used to create a Replica Set of nginx pods. ([templates/deployment.yaml](templates/deployment.yaml)) - A `Service` is used to create a gateway to the pods running in the - replica set ([templates/svc.yaml](templates/svc.yaml)) + replica set ([templates/svc.yaml](templates/service.yaml)) The [values.yaml](values.yaml) exposes a few of the configuration options in the charts, though there are some that are not exposed there (like diff --git a/docs/examples/nginx/templates/_helpers.tpl b/docs/examples/nginx/templates/_helpers.tpl index 24f76db73..f0d83d2ed 100644 --- a/docs/examples/nginx/templates/_helpers.tpl +++ b/docs/examples/nginx/templates/_helpers.tpl @@ -2,15 +2,15 @@ {{/* Expand the name of the chart. */}} -{{define "name"}}{{default "nginx" .Values.nameOverride | trunc 63 | trimSuffix "-" }}{{end}} +{{- define "name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} {{/* Create a default fully qualified app name. - -We truncate at 63 chars because some Kubernetes name fields are limited to this -(by the DNS naming spec). +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). */}} -{{define "fullname"}} -{{- $name := default "nginx" .Values.nameOverride -}} -{{printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{end}} +{{- define "fullname" -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} diff --git a/docs/examples/nginx/templates/configmap.yaml b/docs/examples/nginx/templates/configmap.yaml index ec4b9e5c3..641e62ea4 100644 --- a/docs/examples/nginx/templates/configmap.yaml +++ b/docs/examples/nginx/templates/configmap.yaml @@ -1,15 +1,14 @@ -# This is a simple example of using a config map to create a single page -# static site. +# This is a simple example of using a config map to create a single page static site. apiVersion: v1 kind: ConfigMap metadata: - name: {{template "fullname" .}} + name: {{ template "fullname" . }} labels: - release: {{ .Release.Name | quote }} - app: {{template "fullname" .}} - heritage: {{.Release.Service | quote }} + heritage: {{ .Release.Service }} + release: {{ .Release.Name }} + chart: {{ .Chart.Name }}-{{ .Chart.Version }} + app: {{ template "name" . }} data: - # When the config map is mounted as a volume, these will be created as - # files. - index.html: {{default "Hello" .Values.index | quote}} + # When the config map is mounted as a volume, these will be created as files. + index.html: {{ .Values.index | quote }} test.txt: test diff --git a/docs/examples/nginx/templates/deployment.yaml b/docs/examples/nginx/templates/deployment.yaml index e31bd542d..ca929c278 100644 --- a/docs/examples/nginx/templates/deployment.yaml +++ b/docs/examples/nginx/templates/deployment.yaml @@ -4,39 +4,54 @@ metadata: # This uses a "fullname" template (see _helpers) # Basing names on .Release.Name means that the same chart can be installed # multiple times into the same namespace. - name: {{template "fullname" .}} + name: {{ template "fullname" . }} labels: # The "heritage" label is used to track which tool deployed a given chart. # It is useful for admins who want to see what releases a particular tool # is responsible for. - heritage: {{ .Release.Service | quote }} - # This makes it easy to search for all components of a release using kubectl. - release: {{ .Release.Name | quote }} + heritage: {{ .Release.Service }} + # The "release" convention makes it easy to tie a release to all of the + # Kubernetes resources that were created as part of that release. + release: {{ .Release.Name }} # This makes it easy to audit chart usage. - chart: "{{.Chart.Name}}-{{.Chart.Version}}" + chart: {{ .Chart.Name }}-{{ .Chart.Version }} + app: {{ template "name" . }} spec: - replicas: {{default 1 .Values.replicaCount}} + replicas: {{ .Values.replicaCount }} template: metadata: +{{- if .Values.podAnnotations }} + # Allows custom annotations to be specified + annotations: +{{ toYaml .Values.podAnnotations | indent 8 }} +{{- end }} labels: - app: {{template "fullname" .}} - release: {{.Release.Name | quote }} + app: {{ template "name" . }} + release: {{ .Release.Name }} spec: containers: - - name: nginx - # Making image configurable is not necessary. Making imageTag configurable - # is a nice option for the user. Especially in the strange cases like - # nginx where the base distro is determined by the tag. Using :latest - # is frowned upon, using :stable isn't that great either. - image: "{{default "nginx" .Values.image}}:{{default "stable-alpine" .Values.imageTag}}" - imagePullPolicy: {{default "IfNotPresent" .Values.pullPolicy}} - ports: - - containerPort: 80 - # This (and the volumes section below) mount the config map as a volume. - volumeMounts: - - mountPath: /usr/share/nginx/html - name: wwwdata-volume + - name: {{ template "name" . }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + ports: + - name: http + containerPort: 80 + protocol: TCP + # This (and the volumes section below) mount the config map as a volume. + volumeMounts: + - mountPath: /usr/share/nginx/html + name: wwwdata-volume + resources: +# Allow chart users to specify resources. Usually, no default should be set, so this is left to be a conscious +# choice to the chart users and avoids that charts don't run out of the box on, e. g., Minikube when high resource +# requests are specified by default. +{{ toYaml .Values.resources | indent 12 }} + {{- if .Values.nodeSelector }} + nodeSelector: + # Node selectors can be important on mixed Windows/Linux clusters. +{{ toYaml .Values.nodeSelector | indent 8 }} + {{- end }} volumes: - name: wwwdata-volume configMap: - name: {{template "fullname" .}} + name: {{ template "fullname" . }} diff --git a/docs/examples/nginx/templates/post-install-job.yaml b/docs/examples/nginx/templates/post-install-job.yaml index a2281a8f5..06e7024f2 100644 --- a/docs/examples/nginx/templates/post-install-job.yaml +++ b/docs/examples/nginx/templates/post-install-job.yaml @@ -1,11 +1,18 @@ apiVersion: batch/v1 kind: Job metadata: - name: "{{template "fullname" . }}" + name: {{ template "fullname" . }} labels: - heritage: {{.Release.Service | quote }} - release: {{.Release.Name | quote }} - chart: "{{.Chart.Name}}-{{.Chart.Version}}" + # The "heritage" label is used to track which tool deployed a given chart. + # It is useful for admins who want to see what releases a particular tool + # is responsible for. + heritage: {{ .Release.Service }} + # The "release" convention makes it easy to tie a release to all of the + # Kubernetes resources that were created as part of that release. + release: {{ .Release.Name }} + # This makes it easy to audit chart usage. + chart: {{ .Chart.Name }}-{{ .Chart.Version }} + app: {{ template "name" . }} annotations: # This is what defines this resource as a hook. Without this line, the # job is considered part of the release. @@ -13,19 +20,18 @@ metadata: spec: template: metadata: - name: "{{template "fullname" . }}" + name: {{ template "fullname" . }} labels: - heritage: {{.Release.Service | quote }} - release: {{.Release.Name | quote }} - chart: "{{.Chart.Name}}-{{.Chart.Version}}" + release: {{ .Release.Name }} + app: {{ template "name" . }} spec: # This shows how to use a simple value. This will look for a passed-in value # called restartPolicy. If it is not found, it will use the default value. - # {{default "Never" .restartPolicy}} is a slightly optimized version of the - # more conventional syntax: {{.restartPolicy | default "Never"}} - restartPolicy: Never + # {{ default "Never" .restartPolicy }} is a slightly optimized version of the + # more conventional syntax: {{ .restartPolicy | default "Never" }} + restartPolicy: {{ .Values.restartPolicy }} containers: - - name: post-install-job - image: "alpine:3.3" - # All we're going to do is sleep for a minute, then exit. - command: ["/bin/sleep","{{default "10" .Values.sleepyTime}}"] + - name: post-install-job + image: "alpine:3.3" + # All we're going to do is sleep for a while, then exit. + command: ["/bin/sleep", "{{ .Values.sleepyTime }}"] diff --git a/docs/examples/nginx/templates/pre-install-secret.yaml b/docs/examples/nginx/templates/pre-install-secret.yaml index c2ca3e1d2..405f4e531 100644 --- a/docs/examples/nginx/templates/pre-install-secret.yaml +++ b/docs/examples/nginx/templates/pre-install-secret.yaml @@ -3,7 +3,12 @@ apiVersion: v1 kind: Secret metadata: - name: "{{.Release.Name}}-secret" + name: {{ template "fullname" . }} + labels: + heritage: {{ .Release.Service }} + release: {{ .Release.Name }} + chart: {{ .Chart.Name }}-{{ .Chart.Version }} + app: {{ template "name" . }} # This declares the resource to be a hook. By convention, we also name the # file "pre-install-XXX.yaml", but Helm itself doesn't care about file names. annotations: diff --git a/docs/examples/nginx/templates/service-test.yaml b/docs/examples/nginx/templates/service-test.yaml index 0accd4c2a..107b19a79 100644 --- a/docs/examples/nginx/templates/service-test.yaml +++ b/docs/examples/nginx/templates/service-test.yaml @@ -1,7 +1,12 @@ apiVersion: v1 kind: Pod metadata: - name: "{{.Release.Name}}-service-test" + name: "{{ template "fullname" . }}-service-test" + labels: + heritage: {{ .Release.Service }} + release: {{ .Release.Name }} + chart: {{ .Chart.Name }}-{{ .Chart.Version }} + app: {{ template "name" . }} annotations: "helm.sh/hook": test-success spec: @@ -9,5 +14,5 @@ spec: - name: curl image: radial/busyboxplus:curl command: ['curl'] - args: [ '{{ template "fullname" .}}:{{default 80 .Values.httpPort}}' ] + args: ['{{ template "fullname" . }}:{{ .Values.service.port }}'] restartPolicy: Never diff --git a/docs/examples/nginx/templates/service.yaml b/docs/examples/nginx/templates/service.yaml new file mode 100644 index 000000000..bad29b14e --- /dev/null +++ b/docs/examples/nginx/templates/service.yaml @@ -0,0 +1,39 @@ +apiVersion: v1 +kind: Service +metadata: +{{- if .Values.service.annotations }} + annotations: +{{ toYaml .Values.service.annotations | indent 4 }} +{{- end }} + labels: + app: {{ template "name" . }} + chart: {{ .Chart.Name }}-{{ .Chart.Version }} + heritage: {{ .Release.Service }} + release: {{ .Release.Name }} + name: {{ template "fullname" . }} +spec: +# Provides options for the service so chart users have the full choice + type: "{{ .Values.service.type }}" + clusterIP: "{{ .Values.service.clusterIP }}" +{{- if .Values.service.externalIPs }} + externalIPs: +{{ toYaml .Values.service.externalIPs | indent 4 }} +{{- end }} +{{- if .Values.service.loadBalancerIP }} + loadBalancerIP: "{{ .Values.service.loadBalancerIP }}" +{{- end }} +{{- if .Values.service.loadBalancerSourceRanges }} + loadBalancerSourceRanges: +{{ toYaml .Values.service.loadBalancerSourceRanges | indent 4 }} +{{- end }} + ports: + - name: http + port: {{ .Values.service.port }} + protocol: TCP + targetPort: http + {{- if (and (eq .Values.service.type "NodePort") (not (empty .Values.service.nodePort))) }} + nodePort: {{ .Values.service.nodePort }} + {{- end }} + selector: + app: {{ template "name" . }} + release: {{ .Release.Name }} diff --git a/docs/examples/nginx/templates/svc.yaml b/docs/examples/nginx/templates/svc.yaml deleted file mode 100644 index 98f7d0ec5..000000000 --- a/docs/examples/nginx/templates/svc.yaml +++ /dev/null @@ -1,18 +0,0 @@ -# This is a service gateway to the replica set created by the deployment. -# Take a look at the deployment.yaml for general notes about this chart. -apiVersion: v1 -kind: Service -metadata: - name: {{template "fullname" .}} - labels: - heritage: {{ .Release.Service | quote }} - release: {{ .Release.Name | quote }} - chart: "{{.Chart.Name}}-{{.Chart.Version}}" -spec: - ports: - - port: {{default 80 .Values.httpPort}} - targetPort: 80 - protocol: TCP - name: http - selector: - app: {{template "fullname" .}} diff --git a/docs/examples/nginx/values.yaml b/docs/examples/nginx/values.yaml index e0aff99b4..b40208cce 100644 --- a/docs/examples/nginx/values.yaml +++ b/docs/examples/nginx/values.yaml @@ -2,14 +2,8 @@ # This is a YAML-formatted file. # Declare name/value pairs to be passed into your templates. -# See the list at https://hub.docker.com/r/library/nginx/tags/ -imageTag: "1.11.0" - -# The port (defined on the service) to access the HTTP server. -httpPort: 8888 - -# Number of nginx instances to run replicaCount: 1 +restartPolicy: Never # Evaluated by the post-install hook sleepyTime: "10" @@ -17,3 +11,24 @@ sleepyTime: "10" index: >-

Hello

This is a test

+ +image: + repository: nginx + tag: 1.11.0 + pullPolicy: IfNotPresent + +service: + annotations: {} + clusterIP: "" + externalIPs: [] + loadBalancerIP: "" + loadBalancerSourceRanges: [] + type: ClusterIP + port: 8888 + nodePort: "" + +podAnnotations: {} + +resources: {} + +nodeSelector: {}