From 8ca53ea4d544b6113459064c2a5586651d12fdf1 Mon Sep 17 00:00:00 2001 From: Jason Hansen Date: Thu, 26 Sep 2019 20:08:14 -0700 Subject: [PATCH] feat(lob): application --- charts/ghost/.helmignore | 1 + charts/ghost/Chart.yaml | 21 ++++ charts/ghost/OWNERS | 8 ++ charts/ghost/README.md | 124 ++++++++++++++++++++ charts/ghost/requirements.lock | 6 + charts/ghost/requirements.yaml | 5 + charts/ghost/templates/NOTES.txt | 54 +++++++++ charts/ghost/templates/_helpers.tpl | 45 +++++++ charts/ghost/templates/deployment.yaml | 130 +++++++++++++++++++++ charts/ghost/templates/pvc.yaml | 24 ++++ charts/ghost/templates/secrets.yaml | 17 +++ charts/ghost/templates/svc.yaml | 20 ++++ charts/ghost/values.yaml | 155 +++++++++++++++++++++++++ namespaces/demo.yaml | 6 + releases/ghost.yaml | 27 +++++ releases/mongodb.yaml | 26 +++++ releases/redis-auth.yaml | 10 ++ releases/redis.yaml | 38 ++++++ workloads/podinfo-dep.yaml | 65 +++++++++++ workloads/podinfo-hpa.yaml | 19 +++ workloads/podinfo-svc.yaml | 16 +++ 21 files changed, 817 insertions(+) create mode 100755 charts/ghost/.helmignore create mode 100755 charts/ghost/Chart.yaml create mode 100755 charts/ghost/OWNERS create mode 100755 charts/ghost/README.md create mode 100755 charts/ghost/requirements.lock create mode 100755 charts/ghost/requirements.yaml create mode 100755 charts/ghost/templates/NOTES.txt create mode 100755 charts/ghost/templates/_helpers.tpl create mode 100755 charts/ghost/templates/deployment.yaml create mode 100755 charts/ghost/templates/pvc.yaml create mode 100755 charts/ghost/templates/secrets.yaml create mode 100755 charts/ghost/templates/svc.yaml create mode 100755 charts/ghost/values.yaml create mode 100644 namespaces/demo.yaml create mode 100644 releases/ghost.yaml create mode 100644 releases/mongodb.yaml create mode 100644 releases/redis-auth.yaml create mode 100644 releases/redis.yaml create mode 100644 workloads/podinfo-dep.yaml create mode 100644 workloads/podinfo-hpa.yaml create mode 100644 workloads/podinfo-svc.yaml diff --git a/charts/ghost/.helmignore b/charts/ghost/.helmignore new file mode 100755 index 0000000..6b8710a --- /dev/null +++ b/charts/ghost/.helmignore @@ -0,0 +1 @@ +.git diff --git a/charts/ghost/Chart.yaml b/charts/ghost/Chart.yaml new file mode 100755 index 0000000..e567d86 --- /dev/null +++ b/charts/ghost/Chart.yaml @@ -0,0 +1,21 @@ +name: ghost +version: 2.1.16 +appVersion: 1.21.5 +description: A simple, powerful publishing platform that allows you to share your + stories with the world +keywords: +- ghost +- blog +- http +- web +- application +- nodejs +- javascript +home: http://www.ghost.org/ +icon: https://bitnami.com/assets/stacks/ghost/img/ghost-stack-220x234.png +sources: +- https://github.com/bitnami/bitnami-docker-ghost +maintainers: +- name: Bitnami + email: containers@bitnami.com +engine: gotpl diff --git a/charts/ghost/OWNERS b/charts/ghost/OWNERS new file mode 100755 index 0000000..0d4d6f1 --- /dev/null +++ b/charts/ghost/OWNERS @@ -0,0 +1,8 @@ +approvers: +- prydonius +- tompizmor +- sameersbn +reviewers: +- prydonius +- tompizmor +- sameersbn diff --git a/charts/ghost/README.md b/charts/ghost/README.md new file mode 100755 index 0000000..dd99a94 --- /dev/null +++ b/charts/ghost/README.md @@ -0,0 +1,124 @@ +# Ghost + +[Ghost](https://ghost.org/) is one of the most versatile open source content management systems on the market. + +## TL;DR; + +```console +$ helm install stable/ghost +``` + +## Introduction + +This chart bootstraps a [Ghost](https://github.com/bitnami/bitnami-docker-ghost) deployment on a [Kubernetes](http://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager. + +It also packages the [Bitnami MariaDB chart](https://github.com/kubernetes/charts/tree/master/stable/mariadb) which is required for bootstrapping a MariaDB deployment for the database requirements of the Ghost application. + +## Prerequisites + +- Kubernetes 1.4+ with Beta APIs enabled +- PV provisioner support in the underlying infrastructure + +## Installing the Chart + +To install the chart with the release name `my-release`: + +```console +$ helm install --name my-release stable/ghost +``` + +The command deploys Ghost on the Kubernetes cluster in the default configuration. The [configuration](#configuration) section lists the parameters that can be configured during installation. + +> **Tip**: List all releases using `helm list` + +## Uninstalling the Chart + +To uninstall/delete the `my-release` deployment: + +```console +$ helm delete my-release +``` + +The command removes all the Kubernetes components associated with the chart and deletes the release. + +## Configuration + +The following tables lists the configurable parameters of the Ghost chart and their default values. + +| Parameter | Description | Default | +|-------------------------------|---------------------------------------------------------------|----------------------------------------------------------| +| `image` | Ghost image | `bitnami/ghost:{VERSION}` | +| `imagePullPolicy` | Image pull policy | `Always` if `image` tag is `latest`, else `IfNotPresent` | +| `ghostHost` | Ghost host to create application URLs | `nil` | +| `ghostPort` | Ghost port to create application URLs along with host | `80` | +| `ghostLoadBalancerIP` | `loadBalancerIP` for the Ghost Service | `nil` | +| `ghostUsername` | User of the application | `user@example.com` | +| `ghostPassword` | Application password | Randomly generated | +| `ghostEmail` | Admin email | `user@example.com` | +| `ghostBlogTitle` | Ghost Blog name | `User's Blog` | +| `allowEmptyPassword` | Allow DB blank passwords | `yes` | +| `externalDatabase.host` | Host of the external database | `nil` | +| `externalDatabase.user` | Existing username in the external db | `bn_ghost` | +| `externalDatabase.password` | Password for the above username | `nil` | +| `externalDatabase.database` | Name of the existing database | `bitnami_ghost` | +| `mariadb.enabled` | Whether or not to install MariaDB (disable if using external) | `true` | +| `mariadb.mariadbRootPassword` | MariaDB admin password | `nil` | +| `mariadb.mariadbDatabase` | MariaDB Database name to create | `bitnami_ghost` | +| `mariadb.mariadbUser` | MariaDB Database user to create | `bn_ghost` | +| `mariadb.mariadbPassword` | MariaDB Password for user | _random 10 character long alphanumeric string_ | +| `serviceType` | Kubernetes Service type | `LoadBalancer` | +| `persistence.enabled` | Enable persistence using PVC | `true` | +| `persistence.storageClass` | PVC Storage Class for Ghost volume | `nil` (uses alpha storage annotation) | +| `persistence.accessMode` | PVC Access Mode for Ghost volume | `ReadWriteOnce` | +| `persistence.size` | PVC Storage Request for Ghost volume | `8Gi` | +| `resources` | CPU/Memory resource requests/limits | Memory: `512Mi`, CPU: `300m` | + +The above parameters map to the env variables defined in [bitnami/ghost](http://github.com/bitnami/bitnami-docker-ghost). For more information please refer to the [bitnami/ghost](http://github.com/bitnami/bitnami-docker-ghost) image documentation. + +> **Note**: +> +> For the Ghost application function correctly, you should specify the `ghostHost` parameter to specify the FQDN (recommended) or the public IP address of the Ghost service. +> +> Optionally, you can specify the `ghostLoadBalancerIP` parameter to assign a reserved IP address to the Ghost service of the chart. However please note that this feature is only available on a few cloud providers (f.e. GKE). +> +> To reserve a public IP address on GKE: +> +> ```bash +> $ gcloud compute addresses create ghost-public-ip +> ``` +> +> The reserved IP address can be associated to the Ghost service by specifying it as the value of the `ghostLoadBalancerIP` parameter while installing the chart. + +Specify each parameter using the `--set key=value[,key=value]` argument to `helm install`. For example, + +```console +$ helm install --name my-release \ + --set ghostUsername=admin,ghostPassword=password,mariadb.mariadbRootPassword=secretpassword \ + stable/ghost +``` + +The above command sets the Ghost administrator account username and password to `admin` and `password` respectively. Additionally it sets the MariaDB `root` user password to `secretpassword`. + +Alternatively, a YAML file that specifies the values for the above parameters can be provided while installing the chart. For example, + +```console +$ helm install --name my-release -f values.yaml stable/ghost +``` + +> **Tip**: You can use the default [values.yaml](values.yaml) + +## Using an existing database + +Sometimes you may want to have Ghost connect to an external database rather than installing one inside your cluster, e.g. to use a managed database service, or use run a single database server for all your applications. To do this, the chart allows you to specify credentials for an external database under the [`externalDatabase` parameter](#configuration). You should also disable the MariaDB installation with the `mariadb.enabled` option. For example: + +```console +$ helm install stable/ghost \ + --set mariadb.enabled=false,externalDatabase.host=myexternalhost,externalDatabase.user=myuser,externalDatabase.password=mypassword,externalDatabase.database=mydatabase +``` + +## Persistence + +The [Bitnami Ghost](https://github.com/bitnami/bitnami-docker-ghost) image stores the Ghost data and configurations at the `/bitnami/ghost` and `/bitnami/apache` paths of the container. + +Persistent Volume Claims are used to keep the data across deployments. This is known to work in GCE, AWS, and minikube. +See the [Configuration](#configuration) section to configure the PVC or to disable persistence. diff --git a/charts/ghost/requirements.lock b/charts/ghost/requirements.lock new file mode 100755 index 0000000..3670004 --- /dev/null +++ b/charts/ghost/requirements.lock @@ -0,0 +1,6 @@ +dependencies: +- name: mariadb + repository: https://kubernetes-charts.storage.googleapis.com/ + version: 0.7.0 +digest: sha256:f59f68030aa5c50b9e776b813804875fac911f91c2aa384e991f37a795c5ae34 +generated: 2017-11-27T16:40:56.867665764Z diff --git a/charts/ghost/requirements.yaml b/charts/ghost/requirements.yaml new file mode 100755 index 0000000..7c0c6a8 --- /dev/null +++ b/charts/ghost/requirements.yaml @@ -0,0 +1,5 @@ +dependencies: +- name: mariadb + version: 0.7.0 + repository: https://kubernetes-charts.storage.googleapis.com/ + condition: mariadb.enabled diff --git a/charts/ghost/templates/NOTES.txt b/charts/ghost/templates/NOTES.txt new file mode 100755 index 0000000..6c93697 --- /dev/null +++ b/charts/ghost/templates/NOTES.txt @@ -0,0 +1,54 @@ +{{- if empty (include "ghost.host" .) -}} +############################################################################### +### ERROR: You did not provide an external host in your 'helm install' call ### +############################################################################### + +This deployment will be incomplete until you configure Ghost with a resolvable +host. To configure Ghost with the URL of your service: + +1. Get the Ghost URL by running: + + {{- if contains "NodePort" .Values.serviceType }} + + export APP_HOST=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") + + {{- else if contains "LoadBalancer" .Values.serviceType }} + + NOTE: It may take a few minutes for the LoadBalancer IP to be available. + Watch the status with: 'kubectl get svc --namespace {{ .Release.Namespace }} -w {{ template "ghost.fullname" . }}' + + export APP_HOST=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ template "ghost.fullname" . }} --template "{{ "{{ range (index .status.loadBalancer.ingress 0) }}{{ . }}{{ end }}" }}") + {{- end }} + +2. Complete your Ghost deployment by running: + + helm upgrade {{ .Release.Name }} \ + --set serviceType={{ .Values.serviceType }},ghostHost=$APP_HOST stable/ghost +{{- else -}} +1. Get the Ghost URL by running: + +{{- if eq .Values.serviceType "ClusterIP" }} + + export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app={{ template "ghost.fullname" . }}" -o jsonpath="{.items[0].metadata.name}") + echo Blog URL : http://127.0.0.1:{{ default "80" .Values.ghostPort }}/ + echo Admin URL : http://127.0.0.1:{{ default "80" .Values.ghostPort }}/ghost + kubectl port-forward $POD_NAME {{ default "80" .Values.ghostPort }}:2368 + +{{- else if eq .Values.serviceType "NodePort" }} + export APP_HOST=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") + export APP_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ template "fullname" . }}) + + echo Blog URL : http://$APP_HOST:$APP_PORT/ + echo Admin URL : http://$APP_HOST:$APP_PORT/ghost + +{{- else }} + + echo Blog URL : http://{{ include "ghost.host" . }}/ + echo Admin URL : http://{{ include "ghost.host" . }}/ghost +{{- end }} + +2. Get your Ghost login credentials by running: + + echo Email: {{ .Values.ghostEmail }} + echo Password: $(kubectl get secret --namespace {{ .Release.Namespace }} {{ template "ghost.fullname" . }} -o jsonpath="{.data.ghost-password}" | base64 --decode) +{{- end }} diff --git a/charts/ghost/templates/_helpers.tpl b/charts/ghost/templates/_helpers.tpl new file mode 100755 index 0000000..399f894 --- /dev/null +++ b/charts/ghost/templates/_helpers.tpl @@ -0,0 +1,45 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "ghost.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 "ghost.fullname" -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- printf "%s-%s" .Release.Name $name | 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 "ghost.mariadb.fullname" -}} +{{- printf "%s-%s" .Release.Name "mariadb" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Get the user defined LoadBalancerIP for this release. +Note, returns 127.0.0.1 if using ClusterIP. +*/}} +{{- define "ghost.serviceIP" -}} +{{- if eq .Values.serviceType "ClusterIP" -}} +127.0.0.1 +{{- else -}} +{{- index .Values (printf "%sLoadBalancerIP" .Chart.Name) | default "" -}} +{{- end -}} +{{- end -}} + +{{/* +Gets the host to be used for this application. +If not using ClusterIP, or if a host or LoadBalancerIP is not defined, the value will be empty. +*/}} +{{- define "ghost.host" -}} +{{- $host := index .Values (printf "%sHost" .Chart.Name) | default "" -}} +{{- default (include "ghost.serviceIP" .) $host -}} +{{- end -}} diff --git a/charts/ghost/templates/deployment.yaml b/charts/ghost/templates/deployment.yaml new file mode 100755 index 0000000..955d4fb --- /dev/null +++ b/charts/ghost/templates/deployment.yaml @@ -0,0 +1,130 @@ +{{- if include "ghost.host" . -}} +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: {{ template "ghost.fullname" . }} + labels: + app: {{ template "ghost.fullname" . }} + chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" + release: "{{ .Release.Name }}" + heritage: "{{ .Release.Service }}" +spec: + replicas: 1 + template: + metadata: + labels: + app: {{ template "ghost.fullname" . }} + spec: + initContainers: + - name: volume-permissions + image: "{{ .Values.volumePermissions.image.name }}:{{ .Values.volumePermissions.image.tag }}" + imagePullPolicy: {{ default "" .Values.volumePermissions.image.pullPolicy | quote }} + command: ['sh', '-c', 'chmod -R g+rwX /bitnami'] + volumeMounts: + - mountPath: /bitnami + name: ghost-data + containers: + - name: {{ template "ghost.fullname" . }} + image: "{{ .Values.image }}" + imagePullPolicy: {{ default "" .Values.imagePullPolicy | quote }} + env: + - name: ALLOW_EMPTY_PASSWORD + {{- if .Values.allowEmptyPassword }} + value: "yes" + {{- else }} + value: "no" + {{- end }} + - name: MARIADB_HOST + {{- if .Values.mariadb.enabled }} + value: {{ template "ghost.mariadb.fullname" . }} + {{- else }} + value: {{ default "" .Values.externalDatabase.host | quote }} + {{- end }} + - name: MARIADB_PORT_NUMBER + value: "3306" + - name: GHOST_DATABASE_NAME + {{- if .Values.mariadb.enabled }} + value: {{ default "" .Values.mariadb.mariadbDatabase | quote }} + {{- else }} + value: {{ default "" .Values.externalDatabase.database | quote }} + {{- end }} + - name: GHOST_DATABASE_USER + {{- if .Values.mariadb.enabled }} + value: {{ default "" .Values.mariadb.mariadbUser | quote }} + {{- else }} + value: {{ default "" .Values.externalDatabase.user | quote }} + {{- end }} + - name: GHOST_DATABASE_PASSWORD + {{- if .Values.mariadb.enabled }} + valueFrom: + secretKeyRef: + name: {{ template "ghost.mariadb.fullname" . }} + key: mariadb-password + {{- else }} + value: {{ default "" .Values.externalDatabase.password | quote }} + {{- end }} + - name: GHOST_HOST + value: {{ include "ghost.host" . | quote }} + - name: GHOST_PORT_NUMBER + value: {{ default "80" .Values.ghostPort | quote }} + - name: GHOST_USERNAME + value: {{ default "" .Values.ghostUsername | quote }} + - name: GHOST_PASSWORD + valueFrom: + secretKeyRef: + name: {{ template "ghost.fullname" . }} + key: ghost-password + - name: GHOST_EMAIL + value: {{ default "" .Values.ghostEmail | quote }} + - name: BLOG_TITLE + value: {{ default "" .Values.ghostBlogTitle | quote }} + - name: SMTP_HOST + value: {{ default "" .Values.smtpHost | quote }} + - name: SMTP_PORT + value: {{ default "" .Values.smtpPort | quote }} + - name: SMTP_USER + value: {{ default "" .Values.smtpUser | quote }} + - name: SMTP_PASSWORD + valueFrom: + secretKeyRef: + name: {{ template "ghost.fullname" . }} + key: smtp-password + - name: SMTP_SERVICE + value: {{ default "" .Values.smtpService | quote }} + ports: + - name: http + containerPort: 2368 + livenessProbe: + httpGet: + path: /ghost + port: http + httpHeaders: + - name: Host + value: {{ include "ghost.host" . | quote }} + initialDelaySeconds: 120 + timeoutSeconds: 5 + failureThreshold: 6 + readinessProbe: + httpGet: + path: /ghost + port: http + httpHeaders: + - name: Host + value: {{ include "ghost.host" . | quote }} + initialDelaySeconds: 30 + timeoutSeconds: 3 + periodSeconds: 5 + resources: +{{ toYaml .Values.resources | indent 10 }} + volumeMounts: + - name: ghost-data + mountPath: /bitnami/ghost + volumes: + - name: ghost-data + {{- if .Values.persistence.enabled }} + persistentVolumeClaim: + claimName: {{ template "ghost.fullname" . }} + {{- else }} + emptyDir: {} + {{- end }} +{{- end -}} diff --git a/charts/ghost/templates/pvc.yaml b/charts/ghost/templates/pvc.yaml new file mode 100755 index 0000000..36e1ab8 --- /dev/null +++ b/charts/ghost/templates/pvc.yaml @@ -0,0 +1,24 @@ +{{- if .Values.persistence.enabled -}} +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: {{ template "ghost.fullname" . }} + labels: + app: {{ template "ghost.fullname" . }} + chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" + release: "{{ .Release.Name }}" + heritage: "{{ .Release.Service }}" +spec: + accessModes: + - {{ .Values.persistence.accessMode | quote }} + resources: + requests: + storage: {{ .Values.persistence.size | quote }} +{{- if .Values.persistence.storageClass }} +{{- if (eq "-" .Values.persistence.storageClass) }} + storageClassName: "" +{{- else }} + storageClassName: "{{ .Values.persistence.storageClass }}" +{{- end }} +{{- end }} +{{- end -}} diff --git a/charts/ghost/templates/secrets.yaml b/charts/ghost/templates/secrets.yaml new file mode 100755 index 0000000..db1c841 --- /dev/null +++ b/charts/ghost/templates/secrets.yaml @@ -0,0 +1,17 @@ +apiVersion: v1 +kind: Secret +metadata: + name: {{ template "ghost.fullname" . }} + labels: + app: {{ template "ghost.fullname" . }} + chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" + release: "{{ .Release.Name }}" + heritage: "{{ .Release.Service }}" +type: Opaque +data: + {{ if .Values.ghostPassword }} + ghost-password: {{ .Values.ghostPassword | b64enc | quote }} + {{ else }} + ghost-password: {{ randAlphaNum 10 | b64enc | quote }} + {{ end }} + smtp-password: {{ default "" .Values.smtpPassword | b64enc | quote }} diff --git a/charts/ghost/templates/svc.yaml b/charts/ghost/templates/svc.yaml new file mode 100755 index 0000000..f482a7f --- /dev/null +++ b/charts/ghost/templates/svc.yaml @@ -0,0 +1,20 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ template "ghost.fullname" . }} + labels: + app: {{ template "ghost.fullname" . }} + chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" + release: "{{ .Release.Name }}" + heritage: "{{ .Release.Service }}" +spec: + type: {{ .Values.serviceType }} + {{- if eq .Values.serviceType "LoadBalancer" }} + loadBalancerIP: {{ default "" .Values.ghostLoadBalancerIP }} + {{- end }} + ports: + - name: http + port: {{ default "80" .Values.ghostPort }} + targetPort: http + selector: + app: {{ template "ghost.fullname" . }} diff --git a/charts/ghost/values.yaml b/charts/ghost/values.yaml new file mode 100755 index 0000000..2b707c8 --- /dev/null +++ b/charts/ghost/values.yaml @@ -0,0 +1,155 @@ +## Bitnami Ghost image version +## ref: https://hub.docker.com/r/bitnami/ghost/tags/ +## +image: bitnami/ghost:1.21.5-r0 + +## Busybox image used to configure volume permissions +## +volumePermissions: + image: + name: busybox + tag: 1.27.1 +# pullPolicy: + +## Specify a imagePullPolicy +## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' +## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images +## +# imagePullPolicy: + +## Ghost host to create application URLs +## ref: https://github.com/bitnami/bitnami-docker-ghost#configuration +## +# ghostHost: + +## Ghost port to create application URLs along with host. +## ref: https://github.com/bitnami/bitnami-docker-ghost#configuration +## +ghostPort: 80 + +## loadBalancerIP for the Ghost Service (optional, cloud specific) +## ref: http://kubernetes.io/docs/user-guide/services/#type-loadbalancer +## +# ghostLoadBalancerIP: + +## User of the application +## ref: https://github.com/bitnami/bitnami-docker-ghost#configuration +## +ghostUsername: user@example.com + +## Application password +## Defaults to a random 10-character alphanumeric string if not set +## ref: https://github.com/bitnami/bitnami-docker-ghost#configuration +## +# ghostPassword: + +## Admin email +## ref: https://github.com/bitnami/bitnami-docker-ghost#configuration +## +ghostEmail: user@example.com + +## Ghost Blog name +## ref: https://github.com/bitnami/bitnami-docker-ghost#environment-variables +## +ghostBlogTitle: User's Blog + +## Set to `yes` to allow the container to be started with blank passwords +## ref: https://github.com/bitnami/bitnami-docker-wordpress#environment-variables +allowEmptyPassword: yes + +## SMTP mail delivery configuration +## ref: https://github.com/bitnami/bitnami-docker-redmine/#smtp-configuration +## +# smtpHost: +# smtpPort: +# smtpUser: +# smtpPassword: +# smtpService: + +## +## External database configuration +## +externalDatabase: + ## Database host + # host: + + ## Database user + # user: bn_ghost + + ## Database password + # password: + + ## Database name + # database: bitnami_ghost + +## +## MariaDB chart configuration +## +mariadb: + ## Whether to use the database specified as a requirement or not. For example, to configure the chart with an existing database server. + enabled: true + + ## MariaDB admin password + ## ref: https://github.com/bitnami/bitnami-docker-mariadb/blob/master/README.md#setting-the-root-password-on-first-run + ## + # mariadbRootPassword: + ## Create a database + + ## ref: https://github.com/bitnami/bitnami-docker-mariadb/blob/master/README.md#creating-a-database-on-first-run + ## + mariadbDatabase: bitnami_ghost + + ## Create a database user + ## ref: https://github.com/bitnami/bitnami-docker-mariadb/blob/master/README.md#creating-a-database-user-on-first-run + ## + mariadbUser: bn_ghost + + ## Password for mariadbUser + ## ref: https://github.com/bitnami/bitnami-docker-mariadb/blob/master/README.md#creating-a-database-user-on-first-run + ## + # mariadbPassword: + + ## Enable persistence using Persistent Volume Claims + ## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/ + ## + persistence: + enabled: true + ## mariadb data Persistent Volume Storage Class + ## If defined, storageClassName: + ## If set to "-", storageClassName: "", which disables dynamic provisioning + ## If undefined (the default) or set to null, no storageClassName spec is + ## set, choosing the default provisioner. (gp2 on AWS, standard on + ## GKE, AWS & OpenStack) + ## + # storageClass: "-" + accessMode: ReadWriteOnce + size: 8Gi + +## Kubernetes configuration +## For minikube, set this to NodePort, elsewhere use LoadBalancer +## +serviceType: LoadBalancer + +## Enable persistence using Persistent Volume Claims +## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/ +## +persistence: + enabled: true + ## ghost data Persistent Volume Storage Class + ## If defined, storageClassName: + ## If set to "-", storageClassName: "", which disables dynamic provisioning + ## If undefined (the default) or set to null, no storageClassName spec is + ## set, choosing the default provisioner. (gp2 on AWS, standard on + ## GKE, AWS & OpenStack) + ## + # storageClass: "-" + accessMode: ReadWriteOnce + size: 8Gi + +## Configure resource requests and limits +## ref: http://kubernetes.io/docs/user-guide/compute-resources/ +## +resources: + requests: + memory: 512Mi + cpu: 300m diff --git a/namespaces/demo.yaml b/namespaces/demo.yaml new file mode 100644 index 0000000..45ab8cc --- /dev/null +++ b/namespaces/demo.yaml @@ -0,0 +1,6 @@ +apiVersion: v1 +kind: Namespace +metadata: + labels: + name: demo + name: demo diff --git a/releases/ghost.yaml b/releases/ghost.yaml new file mode 100644 index 0000000..7fa2556 --- /dev/null +++ b/releases/ghost.yaml @@ -0,0 +1,27 @@ +--- +apiVersion: flux.weave.works/v1beta1 +kind: HelmRelease +metadata: + name: ghost + namespace: demo + annotations: + flux.weave.works/automated: "false" + flux.weave.works/tag.chart-image: glob:1.21.* +spec: + releaseName: ghost + chart: + git: ssh://git@github.com/weaveworks/flux-get-started + ref: master + path: charts/ghost + values: + image: bitnami/ghost:1.21.5-r0 + persistence: + enabled: false + resources: + requests: + memory: 32Mi + cpu: 10m + serviceType: ClusterIP + mariadb: + persistence: + enabled: false diff --git a/releases/mongodb.yaml b/releases/mongodb.yaml new file mode 100644 index 0000000..0a8a8bd --- /dev/null +++ b/releases/mongodb.yaml @@ -0,0 +1,26 @@ +--- +apiVersion: flux.weave.works/v1beta1 +kind: HelmRelease +metadata: + name: mongodb + namespace: demo + annotations: + flux.weave.works/automated: "false" + flux.weave.works/tag.chart-image: semver:~4.0 +spec: + releaseName: mongodb + chart: + repository: https://kubernetes-charts.storage.googleapis.com/ + name: mongodb + version: 4.9.0 + values: + image: + repository: bitnami/mongodb + tag: 4.0.3 + usePassword: false + persistence: + enabled: false + securityContext: + enabled: true + fsGroup: 0 + runAsUser: 0 diff --git a/releases/redis-auth.yaml b/releases/redis-auth.yaml new file mode 100644 index 0000000..87335aa --- /dev/null +++ b/releases/redis-auth.yaml @@ -0,0 +1,10 @@ +--- +# This secret should be stored in Git encrypted +# Sealed Secrets example: https://github.com/stefanprodan/gitops-helm#managing-kubernetes-secrets +apiVersion: v1 +kind: Secret +metadata: + name: redis-auth + namespace: demo +data: + values.yaml: cGFzc3dvcmQ6IGFkbWlu diff --git a/releases/redis.yaml b/releases/redis.yaml new file mode 100644 index 0000000..ba310e5 --- /dev/null +++ b/releases/redis.yaml @@ -0,0 +1,38 @@ +--- +apiVersion: flux.weave.works/v1beta1 +kind: HelmRelease +metadata: + name: redis + namespace: demo + annotations: + flux.weave.works/automated: "true" + flux.weave.works/tag.chart-image: semver:~4.0 + flux.weave.works/locked: 'true' + flux.weave.works/locked_msg: '"Halt updates for now"' + flux.weave.works/locked_user: Stefan Prodan +spec: + releaseName: redis + chart: + repository: https://kubernetes-charts.storage.googleapis.com/ + name: redis + version: 5.1.3 + valueFileSecrets: + # the redis-auth secret contains the password value + - name: redis-auth + values: + usePassword: true + image: + repository: bitnami/redis + tag: 4.0.12 + service: + type: ClusterIP + port: 6379 + cluster: + enabled: false + master: + securityContext: + enabled: false + fsGroup: 0 + runAsUser: 0 + persistence: + enabled: false diff --git a/workloads/podinfo-dep.yaml b/workloads/podinfo-dep.yaml new file mode 100644 index 0000000..2f84b7a --- /dev/null +++ b/workloads/podinfo-dep.yaml @@ -0,0 +1,65 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: podinfo + namespace: demo + labels: + app: podinfo + annotations: + flux.weave.works/automated: "true" + flux.weave.works/tag.init: regex:^3.10.* + flux.weave.works/tag.podinfod: semver:~2.1 +spec: + strategy: + rollingUpdate: + maxUnavailable: 0 + type: RollingUpdate + selector: + matchLabels: + app: podinfo + template: + metadata: + annotations: + prometheus.io/scrape: "true" + labels: + app: podinfo + spec: + initContainers: + - name: init + image: alpine:3.10.1 + command: + - sleep + - "1" + containers: + - name: podinfod + image: stefanprodan/podinfo:2.1.0 + imagePullPolicy: IfNotPresent + ports: + - containerPort: 9898 + name: http + protocol: TCP + command: + - ./podinfo + - --port=9898 + - --level=info + - --random-delay=false + - --random-error=false + env: + - name: PODINFO_UI_MESSAGE + value: "Greetings human!" + livenessProbe: + httpGet: + path: /healthz + port: 9898 + readinessProbe: + httpGet: + path: /readyz + port: 9898 + resources: + limits: + cpu: 1000m + memory: 128Mi + requests: + cpu: 10m + memory: 64Mi diff --git a/workloads/podinfo-hpa.yaml b/workloads/podinfo-hpa.yaml new file mode 100644 index 0000000..93bc135 --- /dev/null +++ b/workloads/podinfo-hpa.yaml @@ -0,0 +1,19 @@ +apiVersion: autoscaling/v2beta1 +kind: HorizontalPodAutoscaler +metadata: + name: podinfo + namespace: demo +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: podinfo + minReplicas: 2 + maxReplicas: 4 + metrics: + - type: Resource + resource: + name: cpu + # scale up if usage is above + # 99% of the requested CPU (10m) + targetAverageUtilization: 99 diff --git a/workloads/podinfo-svc.yaml b/workloads/podinfo-svc.yaml new file mode 100644 index 0000000..5d2b811 --- /dev/null +++ b/workloads/podinfo-svc.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Service +metadata: + name: podinfo + namespace: demo + labels: + app: podinfo +spec: + type: ClusterIP + selector: + app: podinfo + ports: + - name: http + port: 9898 + protocol: TCP + targetPort: http