1
0
Fork 0

Compare commits

...

10 Commits

23 changed files with 1172 additions and 21 deletions

View File

@ -0,0 +1,21 @@
# Patterns to ignore when building packages.
# This supports shell glob matching, relative path matching, and
# negation (prefixed with !). Only one pattern per line.
.DS_Store
# Common VCS dirs
.git/
.gitignore
.bzr/
.bzrignore
.hg/
.hgignore
.svn/
# Common backup files
*.swp
*.bak
*.tmp
*~
# Various IDEs
.project
.idea/
*.tmproj

View File

@ -0,0 +1,5 @@
apiVersion: v1
appVersion: "1.0"
description: HTTPD for MOLGENIS
name: molgenis-httpd
version: 0.1.0

View File

@ -0,0 +1,15 @@
# MOLGENIS - HTTPD Helm Chart
HTTPD (web)server for kubernetes to deploy on a kubernetes cluster with NFS-share
## Chart Details
This chart will deploy:
- 1 HTTPD container
## Installing the Chart
etc.

View File

@ -0,0 +1,31 @@
categories:
- MOLGENIS
questions:
- variable: ingress.hosts[0].name
default: "test.molgenis.org"
description: "Hostname for your stack"
type: hostname
required: true
group: "Services and Load Balancing"
label: Hostname
- variable: httpd.hostname
default: "test.molgenis.org"
description: "Hostname for your services (comma separated, example: [hostname]:[port])"
type: string
required: false
group: "Apache configuration"
label: Hostname
- variable: httpd.proxy
default: ""
description: "Proxy for your services (comma separated, example: [service]:[port]:[path])"
type: string
required: false
group: "Apache configuration"
label: Proxy
- variable: httpd.redirect
default: ""
description: "Redirection urls for your services (comma separated, example: [redirection_url])"
type: string
required: false
group: "Apache configuration"
label: Redirection

View File

@ -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 "httpd.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 "httpd.fullname" . }}'
export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ template "httpd.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 "httpd.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 }}

View File

@ -0,0 +1,32 @@
{{/* vim: set filetype=mustache: */}}
{{/*
Expand the name of the chart.
*/}}
{{- define "httpd.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 "httpd.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 "httpd.chart" -}}
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
{{- end -}}

View File

@ -0,0 +1,57 @@
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: {{ template "httpd.fullname" . }}
labels:
app: {{ template "httpd.name" . }}
chart: {{ template "httpd.chart" . }}
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: {{ template "httpd.name" . }}
release: {{ .Release.Name }}
template:
metadata:
labels:
app: {{ template "httpd.name" . }}
release: {{ .Release.Name }}
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- name: {{ .Values.service.name }}
containerPort: {{ .Values.service.port }}
env:
- name: SERVER_NAME
value: "{{ .Values.httpd.hostname }}"
- name: PROXY_SERVICE
value: "{{ .Values.httpd.proxy }}"
- name: REDIRECT_URL
value: "{{ .Values.httpd.redirect }}"
livenessProbe:
httpGet:
path: /
port: http
readinessProbe:
httpGet:
path: /
port: http
resources:
{{ toYaml .Values.resources | indent 12 }}
{{- with .Values.nodeSelector }}
nodeSelector:
{{ toYaml . | indent 8 }}
{{- end }}
{{- with .Values.affinity }}
affinity:
{{ toYaml . | indent 8 }}
{{- end }}
{{- with .Values.tolerations }}
tolerations:
{{ toYaml . | indent 8 }}
{{- end }}

View File

@ -0,0 +1,36 @@
{{- if .Values.ingress.enabled }}
{{- range .Values.ingress.hosts }}
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: "{{ $.Release.Name }}-ingress"
labels:
app: {{ template "httpd.fullname" $ }}
chart: "{{ $.Chart.Name }}-{{ $.Chart.Version }}"
release: "{{ $.Release.Name }}"
heritage: "{{ $.Release.Service }}"
annotations:
{{- if .tls }}
ingress.kubernetes.io/secure-backends: "true"
{{- end }}
{{- range $key, $value := .annotations }}
{{ $key }}: {{ $value | quote }}
{{- end }}
spec:
rules:
- host: {{ .name }}
http:
paths:
- path: {{ default "/" .path }}
backend:
serviceName: {{ template "httpd.fullname" $ }}
servicePort: 80
{{- if .tls }}
tls:
- hosts:
- {{ .name }}
secretName: {{ .tlsSecret }}
{{- end }}
---
{{- end }}
{{- end }}

View File

@ -0,0 +1,18 @@
apiVersion: v1
kind: Service
metadata:
name: {{ template "httpd.fullname" . }}
labels:
app: {{ template "httpd.name" . }}
chart: {{ template "httpd.chart" . }}
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
spec:
type: {{ .Values.service.type }}
ports:
- name: {{ .Values.service.name }}
port: {{ .Values.service.port }}
selector:
app: {{ template "httpd.name" . }}
release: {{ .Release.Name }}

View File

@ -0,0 +1,51 @@
# Default values for jenkins.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
replicaCount: 1
image:
repository: registry.webhosting.rug.nl/molgenis/httpd
tag: lts
pullPolicy: Always
service:
name: httpd
type: ClusterIP
port: 80
httpd:
proxy: httpd:80:/
redirect: redirect.molgenis.local
hostname: test.molgenis.local
ingress:
enabled: true
annotations: {}
# kubernetes.io/ingress.class: nginx
# kubernetes.io/tls-acme: "true"
path: /
hosts:
- name: test.molgenis.org
tls: []
# - secretName: chart-example-tls
# hosts:
# - chart-example.local
resources: {}
# We usually recommend not to specify default resources and to leave this as a conscious
# choice for the user. This also increases chances charts run on environments with little
# resources, such as Minikube. If you do want to specify resources, uncomment the following
# lines, adjust them as necessary, and remove the curly braces after 'resources:'.
# limits:
# cpu: 100m
# memory: 128Mi
# requests:
# cpu: 100m
# memory: 128Mi
nodeSelector: {}
tolerations: []
affinity: {}

View File

@ -34,53 +34,53 @@ data:
<name>{{ $podName }}</name>
<instanceCap>2147483647</instanceCap>
<idleMinutes>0</idleMinutes>
<label>{{ $.Release.Name }}-{{ $pod.Label }}</label>
<label>{{ $.Release.Name }}-{{ .Label }}</label>
<nodeSelector>
{{- $local := dict "first" true }}
{{- range $key, $value := $pod.NodeSelector }}
{{- range $key, $value := .NodeSelector }}
{{- if not $local.first }},{{- end }}
{{- $key }}={{ $value }}
{{- $_ := set $local "first" false }}
{{- end }}</nodeSelector>
<nodeUsageMode>$pod.NodeUsageMode</nodeUsageMode>
<nodeUsageMode>.NodeUsageMode</nodeUsageMode>
<volumes>
{{- range $index, $volume := $pod.volumes }}
<org.csanchez.jenkins.plugins.kubernetes.volumes.{{ $volume.type }}Volume>
{{- range $index, $volume := .volumes }}
<org.csanchez.jenkins.plugins.kubernetes.volumes.{{ .type }}Volume>
{{- range $key, $value := $volume }}{{- if not (eq $key "type") }}
<{{ $key }}>{{ $value }}</{{ $key }}>
{{- end }}{{- end }}
</org.csanchez.jenkins.plugins.kubernetes.volumes.{{ $volume.type }}Volume>
</org.csanchez.jenkins.plugins.kubernetes.volumes.{{ .type }}Volume>
{{- end }}
</volumes>
<containers>
{{- range $containerName, $container := $pod.Containers }}
{{- range $containerName, $container := .Containers }}
<org.csanchez.jenkins.plugins.kubernetes.ContainerTemplate>
<name>{{ $containerName }}</name>
<image>{{ $container.Image }}:{{ $container.ImageTag | default "latest" }}</image>
{{- if $container.Privileged }}
<image>{{ .Image }}:{{ .ImageTag | default "latest" }}</image>
{{- if .Privileged }}
<privileged>true</privileged>
{{- else }}
<privileged>false</privileged>
{{- end }}
{{- if $container.AlwaysPullImage }}
{{- if .AlwaysPullImage }}
<alwaysPullImage>true</alwaysPullImage>
{{- else }}
<alwaysPullImage>false</alwaysPullImage>
{{- end }}
<workingDir>/home/jenkins</workingDir>
<command>{{ $container.Command | default "cat" }}</command>
<args>{{ $container.Args | default "" }}</args>
{{- if $container.TTY }}
<command>{{ .Command | default "cat" }}</command>
<args>{{ .Args | default "" }}</args>
{{- if .TTY }}
<ttyEnabled>true</ttyEnabled>
{{- else }}
<ttyEnabled>false</ttyEnabled>
{{- end }}
{{- if $container.resources }}
{{- if $container.resources.requests }}
{{- if .resources }}
{{- if .resources.requests }}
<resourceRequestCpu>{{ $container.resources.requests.cpu | default "" }}</resourceRequestCpu>
<resourceRequestMemory>{{ $container.resources.requests.memory | default "" }}</resourceRequestMemory>
{{- end }}
{{- if $container.resources.limits }}
{{- if .resources.limits }}
<resourceLimitCpu>{{ $container.resources.limits.cpu | default "" }}</resourceLimitCpu>
<resourceLimitMemory>{{ $container.resources.limits.memory | default "" }}</resourceLimitMemory>
{{- end }}
@ -93,19 +93,19 @@ data:
<key>JENKINS_URL</key>
<value>http://{{ template "jenkins.fullname" $ }}:{{$.Values.Master.ServicePort}}{{ default "" $.Values.Master.JenkinsUriPrefix }}</value>
</org.csanchez.jenkins.plugins.kubernetes.model.KeyValueEnvVar>
{{- range $index, $envVar := $pod.EnvVars }}
<org.csanchez.jenkins.plugins.kubernetes.model.{{ $envVar.type }}EnvVar>
{{- range $index, $envVar := .EnvVars }}
<org.csanchez.jenkins.plugins.kubernetes.model.{{ .type }}EnvVar>
{{- range $key, $value := $envVar }}{{- if not (eq $key "type") }}
<{{ $key }}>{{ $value }}</{{ $key }}>
{{- end }}{{- end }}
</org.csanchez.jenkins.plugins.kubernetes.model.{{ $envVar.type }}EnvVar>
</org.csanchez.jenkins.plugins.kubernetes.model.{{ .type }}EnvVar>
{{- end }}
</envVars>
<annotations/>
{{- if $pod.ImagePullSecret }}
{{- if .ImagePullSecret }}
<imagePullSecrets>
<org.csanchez.jenkins.plugins.kubernetes.PodImagePullSecret>
<name>{{ $pod.ImagePullSecret }}</name>
<name>{{ .ImagePullSecret }}</name>
</org.csanchez.jenkins.plugins.kubernetes.PodImagePullSecret>
</imagePullSecrets>
{{- else }}

View File

@ -0,0 +1,21 @@
# Patterns to ignore when building packages.
# This supports shell glob matching, relative path matching, and
# negation (prefixed with !). Only one pattern per line.
.DS_Store
# Common VCS dirs
.git/
.gitignore
.bzr/
.bzrignore
.hg/
.hgignore
.svn/
# Common backup files
*.swp
*.bak
*.tmp
*~
# Various IDEs
.project
.idea/
*.tmproj

View File

@ -0,0 +1,6 @@
apiVersion: v1
appVersion: "1.0"
description: Nexus stack for MOLGENIS
name: molgenis-nexus
version: 0.2.0
icon: https://github.com/sidohaakma/molgenis-docker-helm/blob/master/nexus/catalogIcon-molgenis-nexus.svg

View File

@ -0,0 +1,16 @@
# MOLGENIS - NEXUS Helm Chart
NEXUS repository for kubernetes to deploy on a kubernetes cluster with NFS-share
## Chart Details
This chart will deploy:
- 1 NEXUS container
- 1 MOLGENIS-httpd container ()to proxy the registry and docker to one domain)
## Installing the Chart
etc.

View File

@ -0,0 +1,551 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="500px" height="264px" viewBox="0 0 500 264" enable-background="new 0 0 500 264" xml:space="preserve"> <image id="image0" width="500" height="264" x="0" y="0"
xlink:href="data:image/png;base64,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
7wAAAABJRU5ErkJggg==" />
</svg>

After

Width:  |  Height:  |  Size: 42 KiB

View File

@ -0,0 +1,32 @@
{{/* vim: set filetype=mustache: */}}
{{/*
Expand the name of the chart.
*/}}
{{- define "nexus.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 "nexus.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 "nexus.chart" -}}
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
{{- end -}}

View File

@ -0,0 +1,34 @@
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
creationTimestamp: null
name: {{ .Values.httpd.name }}
labels:
app: {{ .Values.httpd.name }}
environment: {{ .Values.environment }}
spec:
replicas: {{ .Values.replicaCount }}
strategy:
type: {{ .Values.httpd.strategy.type }}
selector:
matchLabels:
app: {{ .Values.httpd.selector }}
template:
metadata:
labels:
app: {{ .Values.httpd.name }}
creationTimestamp: null
spec:
restartPolicy: {{ .Values.httpd.restartPolicy }}
containers:
- name: {{ .Values.httpd.name }}
image: "{{ .Values.httpd.image.repository }}:{{ .Values.httpd.image.tag }}"
imagePullPolicy: {{ .Values.httpd.image.pullPolicy }}
env:
- name: PROXY_SERVICE
value: "{{ .Values.nexus.name }}:{{ .Values.nexus.port.ui }},{{ .Values.nexus.name }}:{{ .Values.nexus.port.docker }}:{{ .Values.nexus.path.dockerV2 }}"
- name: SERVER_NAME
value: {{ .Values.httpd.hostname }}
ports:
- containerPort: {{ .Values.httpd.port }}
resources: {}

View File

@ -0,0 +1,44 @@
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
creationTimestamp: null
name: {{ .Values.nexus.name }}
labels:
app: {{ .Values.nexus.name }}
environment: {{ .Values.environment }}
spec:
replicas: {{ .Values.replicaCount }}
strategy:
type: {{ .Values.nexus.strategy.type }}
selector:
matchLabels:
app: {{ .Values.nexus.selector }}
template:
metadata:
labels:
app: {{ .Values.nexus.name }}
creationTimestamp: null
spec:
volumes:
- name: {{ .Values.persistence.name }}
persistentVolumeClaim:
claimName: {{ .Values.persistence.name }}
restartPolicy: {{ .Values.nexus.restartPolicy }}
initContainers:
- name: volume-mount-nexus
image: busybox
command: ["sh", "-c", "chown -R 200:200 {{ .Values.persistence.mountPath }}"]
volumeMounts:
- name: {{ .Values.persistence.name }}
mountPath: "{{ .Values.persistence.mountPath }}"
containers:
- name: {{ .Values.nexus.name }}
image: "{{ .Values.nexus.image.repository }}:{{ .Values.nexus.image.tag }}"
imagePullPolicy: {{ .Values.nexus.image.pullPolicy }}
ports:
- containerPort: {{ .Values.nexus.port.ui }}
- containerPort: {{ .Values.nexus.port.docker }}
volumeMounts:
- name: {{ .Values.persistence.name }}
mountPath: "/nexus-data"

View File

@ -0,0 +1,38 @@
{{- if .Values.ingress.enabled }}
{{- range .Values.ingress.hosts }}
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: "{{ $.Release.Name }}-ingress"
labels:
app: httpd
chart: "{{ $.Chart.Name }}-{{ $.Chart.Version }}"
release: "{{ $.Release.Name }}"
heritage: "{{ $.Release.Service }}"
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/proxy-body-size: "0"
{{- if .tls }}
ingress.kubernetes.io/secure-backends: "true"
{{- end }}
{{- range $key, $value := .annotations }}
{{ $key }}: {{ $value | quote }}
{{- end }}
spec:
rules:
- host: {{ .name }}
http:
paths:
- path: {{ default "/" .path }}
backend:
serviceName: httpd
servicePort: 80
{{- if .tls }}
tls:
- hosts:
- {{ .name }}
secretName: {{ .tlsSecret }}
{{- end }}
---
{{- end }}
{{- end }}

View File

@ -0,0 +1,15 @@
apiVersion: v1
kind: Service
metadata:
name: {{ .Values.nexus.name }}
labels:
app: {{ .Values.nexus.name }}
spec:
type: ClusterIP
ports:
- name: ui
port: {{ .Values.nexus.port.ui }}
- name: docker
port: {{ .Values.nexus.port.docker }}
selector:
app: {{ .Values.nexus.selector }}

View File

@ -0,0 +1,16 @@
apiVersion: v1
kind: PersistentVolume
metadata:
name: {{ .Values.persistence.name }}
labels:
name: nfs2
spec:
storageClassName: {{ .Values.persistence.storageClass }}
capacity:
storage: {{ .Values.persistence.size }}
accessModes:
- {{ .Values.persistence.accessMode }}
persistentVolumeReclaimPolicy: {{ .Values.persistence.reclaimPolicy }}
nfs:
server: {{ .Values.persistence.server }}
path: {{ .Values.persistence.mountPath }}

View File

@ -0,0 +1,11 @@
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: {{ .Values.persistence.name }}
spec:
storageClassName: {{ .Values.persistence.storageClass }}
accessModes:
- {{ .Values.persistence.accessMode }}
resources:
requests:
storage: {{ .Values.persistence.size }}

View File

@ -0,0 +1,82 @@
# Default values for nexus.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
replicaCount: 1
environment: production
service:
type: NodePort
port: 80
nexus:
name: nexus
strategy:
type: Recreate
selector: nexus
restartPolicy: Always
image:
repository: sonatype/nexus3
tag: latest
pullPolicy: Always
port:
docker: 5000
ui: 8081
path:
dockerV2: v2
httpd:
name: httpd
hostname: registry.molgenis.org
strategy:
type: Recreate
selector: httpd
restartPolicy: Always
image:
repository: registry.webhosting.rug.nl/molgenis/httpd
tag: lts
pullPolicy: Always
port: 80
ingress:
enabled: true
annotations: {}
# kubernetes.io/ingress.class: nginx
# kubernetes.io/tls-acme: "true"
path: /
hosts:
- name: registry.molgenis.org
tls: []
# - secretName: chart-example-tls
# hosts:
# - chart-example.local
persistence:
name: molgenis-nexus-data
storageClass: nfs-class
size: 30G
reclaimPolicy: Retain
server: 192.168.64.12
accessMode: ReadWriteMany
mountPath: /gcc/molgenis/nexus
resources: {}
# We usually recommend not to specify default resources and to leave this as a conscious
# choice for the user. This also increases chances charts run on environments with little
# resources, such as Minikube. If you do want to specify resources, uncomment the following
# lines, adjust them as necessary, and remove the curly braces after 'resources:'.
# limits:
# cpu: 100m
# memory: 128Mi
# requests:
# cpu: 100m
# memory: 128Mi
nodeSelector: {}
tolerations: []
affinity: {}