diff --git a/molgenis-preview/Chart.yaml b/molgenis-preview/Chart.yaml index 8b2e040..4b35807 100644 --- a/molgenis-preview/Chart.yaml +++ b/molgenis-preview/Chart.yaml @@ -1,7 +1,7 @@ apiVersion: v1 appVersion: "1.0" -description: A Helm chart for Kubernetes -name: molgenis +description: MOLGENIS - helm stack for testing purposes +name: molgenis-preview version: 0.2.0 sources: - https://git.webhosting.rug.nl/molgenis/molgenis-ops-docker-helm.git diff --git a/molgenis-preview/README.md b/molgenis-preview/README.md index 25dad2f..1a047bc 100644 --- a/molgenis-preview/README.md +++ b/molgenis-preview/README.md @@ -1,5 +1,5 @@ # MOLGENIS preview -Is used for integration testing purposes. +This chart is used for testing purposes. It can be used by data managers or developers to test MOLGENIS (e.g. integration testing). ## Containers This chart spins up a complete stack to run MOLGENIS. The created containers are: @@ -9,3 +9,8 @@ This chart spins up a complete stack to run MOLGENIS. The created containers are - Elasticsearch - OpenCPU +## Rancher +You can spin up a test instance by navigating to https://rancher.molgenis.org:7777 and login with your LDAP-account. + +Go to the test-environment and click on "Launch". Search for MOLGENIS. + diff --git a/molgenis-preview/test.yaml b/molgenis-preview/test.yaml deleted file mode 100644 index ed0e0fe..0000000 --- a/molgenis-preview/test.yaml +++ /dev/null @@ -1,120 +0,0 @@ -# Source: molgenis/templates/deployment.yaml -apiVersion: apps/v1beta2 -kind: Deployment -metadata: - name: lanky-ragdoll-molgenis - labels: - app: molgenis - chart: molgenis-0.1.0 - release: lanky-ragdoll - heritage: Tiller -spec: - replicas: 1 - selector: - matchLabels: - app: molgenis - release: lanky-ragdoll - template: - metadata: - labels: - app: molgenis - release: lanky-ragdoll - spec: - containers: - - name: molgenis - image: "registry.molgenis.org/molgenis/molgenis-app:latest" - imagePullPolicy: Always - env: - - name: molgenis.home - value: /home/molgenis - - name: opencpu.uri.host - value: opencpu - - name: elasticsearch.transport.addresses - value: elasticsearch:9300 - - name: elasticsearch.cluster.name - value: molgenis - - name: db_uri - value: "jdbc:postgresql://postgres/molgenis" - - name: db_user - value: molgenis - - name: db_password - value: molgenis - - name: admin.password - value: admin - - name: CATALINA_OPTS - value: "-Xmx1g -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled" - ports: - - containerPort: 8080 - livenessProbe: - httpGet: - path: / - port: http - readinessProbe: - httpGet: - path: /api/v2/version - port: http - resources: - limits: - cpu: 1 - memory: 1250Mi - requests: - cpu: 200m - memory: 1Gi - - - - name: elasticsearch - image: "docker.elastic.co/elasticsearch/elasticsearch:5.5.3" - imagePullPolicy: IfNotPresent - env: - - name: cluster.name - value: molgenis - - name: bootstrap.memory_lock - value: true - - name: ES_JAVA_OPTS - value: "-Xms512m -Xmx512m" - - name: xpack.security.enabled - value: false - - name: discovery.type - value: single-node - ports: - - containerPort: 9200 - - containerPort: 9300 - limits: - cpu: 1 - memory: 1500Mi - requests: - cpu: 100m - memory: 1Gi - - - - name: postgres - image: "postgres:9.6-alpine" - imagePullPolicy: IfNotPresent - env: - - name: POSTGRES_USER - value: molgenis - - name: POSTGRES_PASSWORD - value: molgenis - - name: POSTGRES_DB - value: molgenis - ports: - - containerPort: 5432 - limits: - cpu: 1 - memory: 250Mi - requests: - cpu: 100m - memory: 250Mi - - - - name: opencpu - image: "molgenis/opencpu:latest" - imagePullPolicy: Always - ports: - - containerPort: 8004 - limits: - cpu: 1 - memory: 512Mi - requests: - cpu: 100m - memory: 256Mi \ No newline at end of file diff --git a/molgenis/Chart.yaml b/molgenis/Chart.yaml new file mode 100644 index 0000000..e60f8cc --- /dev/null +++ b/molgenis/Chart.yaml @@ -0,0 +1,8 @@ +apiVersion: v1 +appVersion: "1.0" +description: MOLGENIS - helm stack (in BETA) +name: molgenis-beta +version: 0.1.0 +sources: +- https://git.webhosting.rug.nl/molgenis/molgenis-ops-docker-helm.git +icon: https://git.webhosting.rug.nl/molgenis/molgenis-ops-docker-helm/raw/master/molgenis/catalogIcon-molgenis.svg \ No newline at end of file diff --git a/molgenis/README.md b/molgenis/README.md new file mode 100644 index 0000000..c85b200 --- /dev/null +++ b/molgenis/README.md @@ -0,0 +1,83 @@ +# MOLGENIS +This chart is used for acceptance and production use cases. + +## Containers +This chart spins up a MOLGENIS instance with HTTPD. The created containers are: + +- MOLGENIS + +## Provisioning +You can choose from which registry you want to pull. There are 2 registries: +- https://registry.molgenis.org +- https://hub.docker.com + +The registry.molgenis.org contains the bleeding edge versions (PR's and master merges). The hub.docker.com contains the released artifacts (MOLGENIS releases and release candidates). + +The three properties you need to specify are: +- ```molgenis.image.repository``` +- ```molgenis.image.name``` +- ```molgenis.image.tag``` + +Besides determining which image you want to pull, you also have to set an administrator password. You can do this by specifying the following property. +- ```molgenis.adminPassword``` + +## Services +When you start MOLGENIS you need: +- an elasticsearch instance (5.5.6) +- an postgres instance (9.6) + +You can attach additional services like: +- an opencpu instance + +### Elasticsearch +You can configure elasticsearch by giving in the cluster location. + +To configure the transport address you can address the node communication channel but also the native JAVA API. Which MOLGENIS uses to communicate with Elasticsearch. +From Elasticsearch version 6 and further the JAVA API is not supported anymore. At this moment you can only use Elastic instance till major version 5. +- ```molgenis.services.elasticsearch.transportAddresses: localhost:9300``` + +To configure the index on a Elasticsearch cluster you can specify the clusterName property. +- ```molgenis.services.elasticsearch.clusterName: molgenis``` + +### Postgres +You can specify the location of the postgres instance by specify the following property: +- ```molgenis.services.postgres.host: localhost``` + +You can specify the schema by filling out this property: +- ```molgenis.services.postgres.scheme: molgenis``` + +You can specify credentials for the database scheme by specifying the following properties: +- ```molgenis.services.postgres.user: molgenis``` +- ```molgenis.services.postgres.password: molgenis``` + +To test you can use the **PostgreSQL**-helm chart of Kubernetes and specify these answers: + +```bash +# answers for postgresql chart +postgresUser=molgenis +postgresPassword=molgenis +postgresDatabase=molgenis +persistence.enabled=false +``` + +### OpenCPU +You can specify the location of the OpenCPU cluster by specifying this property: +- ```molgenis.services.opencpu.host: localhost``` + +You can test OpenCPU settings using the **OpenCPU**-helm chart of MOLGENIS. + +## Resources +You can specify resources by resource type. There are 2 resource types. +- memory of container +- maximum heap space JVM + +Specify memory usage of container: +- ```molgenis.resources.limits.memory``` + +Specify memory usage for Java JVM: +- ```molgenis.javaOpts.maxHeapSpace``` + +Select the resources you need dependant on the customer you need to serve. + +## Firewall +Is defined at cluster level. This chart does not facilitate firewall configuration. diff --git a/molgenis/catalogIcon-molgenis.svg b/molgenis/catalogIcon-molgenis.svg new file mode 100644 index 0000000..f5e6b5d --- /dev/null +++ b/molgenis/catalogIcon-molgenis.svg @@ -0,0 +1,1024 @@ + + + + diff --git a/molgenis/questions.yml b/molgenis/questions.yml new file mode 100644 index 0000000..27dbee5 --- /dev/null +++ b/molgenis/questions.yml @@ -0,0 +1,99 @@ + +categories: +- MOLGENIS +questions: +- variable: ingress.hosts[0].name + label: Hostname + default: "test.molgenis.org" + description: "Hostname for your stack" + type: hostname + required: true + group: "Load Balancing" +- variable: molgenis.image.repository + label: Registry + default: "registry.hub.docker.com" + description: "Select a registry to pull from" + type: enum + options: + - "registry.hub.docker.com" + - "registry.molgenis.org" + required: true + group: "Provisioning" +- variable: molgenis.image.tag + label: Version + default: "" + description: "Select a MOLGENIS version (check the registry.molgenis.org or hub.docker.com for released tags)" + type: string + required: true + group: "Provisioning" +- variable: molgenis.adminPassword + label: Administrator password + default: "" + description: "Enter an administrator password" + type: password + required: true + group: "Provisioning" +- variable: molgenis.services.opencpu.host + label: OpenCPU cluster + default: "localhost" + description: "Specify the OpenCPU cluster" + type: string + required: true + group: "Services" +- variable: molgenis.services.postgres.host + label: Postgres cluster location + default: "postgresql.molgenis-postgresql.svc" + description: "Set the location of the postgres cluster" + type: string + required: true + group: "Services" +- variable: molgenis.services.postgres.scheme + label: Database scheme + default: "molgenis" + description: "Set the database scheme" + type: string + required: true + group: "Services" +- variable: molgenis.services.postgres.user + label: Database username + default: "molgenis" + description: "Set user of the database scheme" + type: string + required: true + group: "Services" +- variable: molgenis.services.postgres.password + label: Database password + default: "molgenis" + description: "Set the password of the database scheme" + type: string + required: true + group: "Services" +- variable: molgenis.resources.limits.memory + label: Container memory limit + default: 1250Mi + description: "Memory limit for this MOLGENIS container" + type: enum + options: + - "1250Mi" + - "2500Mi" + required: true + group: "Resources" +- variable: molgenis.resources.requests.memory + label: Container memory reservation + default: 1250Mi + description: "Memory reservation for this MOLGENIS container" + type: enum + options: + - "1250Mi" + - "2500Mi" + required: true + group: "Resources" +- variable: molgenis.javaOpts.maxHeapSpace + label: Maximum heap space (JVM) + default: "1g" + description: "Maximum heap space MOLGENIS container JVM. Please not this should fit in your container memory limit" + type: enum + options: + - "1g" + - "2g" + group: "Resources" \ No newline at end of file diff --git a/molgenis/templates/NOTES.txt b/molgenis/templates/NOTES.txt new file mode 100644 index 0000000..b5a4d24 --- /dev/null +++ b/molgenis/templates/NOTES.txt @@ -0,0 +1,19 @@ +1. Get the application URL by running these commands: +{{- if .Values.ingress.enabled }} +{{- range .Values.ingress.hosts }} + http{{ if $.Values.ingress.tls }}s{{ end }}://{{ . }}{{ $.Values.ingress.path }} +{{- end }} +{{- else if contains "NodePort" .Values.service.type }} + export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ template "molgenis.fullname" . }}) + export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") + echo http://$NODE_IP:$NODE_PORT +{{- else if contains "LoadBalancer" .Values.service.type }} + NOTE: It may take a few minutes for the LoadBalancer IP to be available. + You can watch the status of by running 'kubectl get svc -w {{ template "molgenis.fullname" . }}' + export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ template "molgenis.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}') + echo http://$SERVICE_IP:{{ .Values.service.port }} +{{- else if contains "ClusterIP" .Values.service.type }} + export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app={{ template "molgenis.name" . }},release={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") + echo "Visit http://127.0.0.1:8080 to use your application" + kubectl port-forward $POD_NAME 8080:80 +{{- end }} diff --git a/molgenis/templates/_helpers.tpl b/molgenis/templates/_helpers.tpl new file mode 100644 index 0000000..e7cf3ea --- /dev/null +++ b/molgenis/templates/_helpers.tpl @@ -0,0 +1,32 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "molgenis.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). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "molgenis.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "molgenis.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} diff --git a/molgenis/templates/deployment.yaml b/molgenis/templates/deployment.yaml new file mode 100644 index 0000000..9d4b356 --- /dev/null +++ b/molgenis/templates/deployment.yaml @@ -0,0 +1,106 @@ +apiVersion: apps/v1beta2 +kind: Deployment +metadata: + {{- with .Values.ingress.annotations }} + annotations: +{{ toYaml . | indent 4 }} + {{- end }} + name: {{ template "molgenis.fullname" . }} + labels: + app: {{ template "molgenis.name" . }} + chart: {{ template "molgenis.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + app: {{ template "molgenis.name" . }} + release: {{ .Release.Name }} + template: + metadata: + labels: + app: {{ template "molgenis.name" . }} + release: {{ .Release.Name }} + spec: + containers: + - name: molgenis + {{- with .Values.molgenis }} + image: {{ .image.repository }}/{{ .image.name }}:{{ .image.tag }} + imagePullPolicy: {{ .image.pullPolicy }} + env: + - name: molgenis.home + value: /home/molgenis + - name: opencpu.uri.host + value: {{ .services.opencpu.host }} + - name: elasticsearch.transport.addresses + value: {{ .services.elasticsearch.transportAddresses }} + - name: elasticsearch.cluster.name + value: {{ .services.elasticsearch.clusterName }} + - name: db_uri + value: jdbc:postgresql://{{ .services.postgres.host }}/{{ .services.postgres.scheme }} + - name: db_user + value: {{ .services.postgres.user }} + - name: db_password + value: {{ .services.postgres.password }} + - name: admin.password + value: {{ .adminPassword }} + - name: CATALINA_OPTS + value: "-Xmx{{ .javaOpts.maxHeapSpace }} -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled" + ports: + - containerPort: 8080 + livenessProbe: + httpGet: + path: / + port: 8080 + initialDelaySeconds: 60 + periodSeconds: 5 + failureThreshold: 25 + successThreshold: 1 + readinessProbe: + httpGet: + path: /api/v2/version + port: 8080 + initialDelaySeconds: 120 + periodSeconds: 30 + failureThreshold: 3 + successThreshold: 1 + resources: +{{ toYaml .resources | indent 12 }} + {{- end }} + + - name: elasticsearch + {{- with .Values.elasticsearch }} + image: "{{ .image.repository }}:{{ .image.tag }}" + imagePullPolicy: {{ .image.pullPolicy }} + env: + - name: cluster.name + value: {{ .clusterName }} + - name: bootstrap.memory_lock + value: "true" + - name: ES_JAVA_OPTS + value: "{{ .javaOpts }}" + - name: xpack.security.enabled + value: "false" + - name: discovery.type + value: single-node + ports: + - containerPort: 9200 + - containerPort: 9300 + resources: +{{ toYaml .resources | indent 12 }} + {{- end }} + + + {{- with .Values.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} diff --git a/molgenis/templates/ingress.yaml b/molgenis/templates/ingress.yaml new file mode 100644 index 0000000..26c3c76 --- /dev/null +++ b/molgenis/templates/ingress.yaml @@ -0,0 +1,38 @@ +{{- if .Values.ingress.enabled -}} +{{- $fullName := include "molgenis.fullname" . -}} +{{- $ingressPath := .Values.ingress.path -}} +apiVersion: extensions/v1beta1 +kind: Ingress +metadata: + name: {{ $fullName }} + labels: + app: {{ template "molgenis.name" . }} + chart: {{ template "molgenis.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +{{- with .Values.ingress.annotations }} + annotations: +{{ toYaml . | indent 4 }} +{{- end }} +spec: +{{- if .Values.ingress.tls }} + tls: + {{- range .Values.ingress.tls }} + - hosts: + {{- range .hosts }} + - {{ . }} + {{- end }} + secretName: {{ .secretName }} + {{- end }} +{{- end }} + rules: + {{- range .Values.ingress.hosts }} + - host: {{ .name }} + http: + paths: + - path: {{ $ingressPath }} + backend: + serviceName: {{ $fullName }} + servicePort: 8080 + {{- end }} +{{- end }} diff --git a/molgenis/templates/service.yaml b/molgenis/templates/service.yaml new file mode 100644 index 0000000..26d1322 --- /dev/null +++ b/molgenis/templates/service.yaml @@ -0,0 +1,17 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ template "molgenis.fullname" . }} + labels: + app: {{ template "molgenis.name" . }} + chart: {{ template "molgenis.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + type: {{ .Values.service.type }} + ports: + - name: molgenis + port: {{ .Values.service.port }} + selector: + app: {{ template "molgenis.name" . }} + release: {{ .Release.Name }} diff --git a/molgenis/values.yaml b/molgenis/values.yaml new file mode 100644 index 0000000..86d3cc1 --- /dev/null +++ b/molgenis/values.yaml @@ -0,0 +1,65 @@ +# Default values for molgenis. + +replicaCount: 1 + +service: + type: LoadBalancer + port: 8080 + +ingress: + enabled: true + annotations: + nginx.ingress.kubernetes.io/proxy-body-size: "0" + path: / + hosts: + - name: test.molgenis.org + tls: [] + +molgenis: + image: + repository: registry.hub.docker.com + name: molgenis/molgenis-app + tag: stable + pullPolicy: Always + adminPassword: + javaOpts: + maxHeapSpace: "1g" + resources: + limits: + cpu: 1 + memory: 1250Mi + requests: + cpu: 200m + memory: 1250Mi + services: + opencpu: + host: localhost + elasticsearch: + transportAddresses: localhost:9300 + clusterName: molgenis + postgres: + host: localhost + scheme: molgenis + user: molgenis + password: molgenis + +elasticsearch: + image: + repository: docker.elastic.co/elasticsearch/elasticsearch + tag: 5.5.3 + pullPolicy: IfNotPresent + javaOpts: "-Xms1g -Xmx1g" + clusterName: molgenis + resources: + limits: + cpu: 2 + memory: 3Gi + requests: + cpu: 100m + memory: 1Gi + +nodeSelector: {} + +tolerations: [] + +affinity: {}