Add wekan chart

This commit is contained in:
Jonny Ervine 2024-02-09 22:55:39 +08:00
parent b9e633bce1
commit d8d75be4be
19 changed files with 428 additions and 109 deletions

View File

@ -19,4 +19,4 @@
.project
.idea/
*.tmproj
OWNERS
#OWNERS

BIN
wekan/.values.home.yaml.swp Normal file

Binary file not shown.

6
wekan/Chart.lock Normal file
View File

@ -0,0 +1,6 @@
dependencies:
- name: mongodb
repository: https://charts.bitnami.com/bitnami
version: 13.6.8
digest: sha256:f8ec7f31174e272828f048b7f64b8b211437c5982b1d71bea65a3f8f63e0a36f
generated: "2023-02-21T04:33:19.424480011+02:00"

View File

@ -1,13 +1,28 @@
name: wekan
version: 1.0.0
appVersion: 2.x.x
kubeVersion: "^1.8.0-0"
apiVersion: v2
appVersion: "7.30"
dependencies:
- condition: mongodb.enabled
name: mongodb
repository: https://charts.bitnami.com/bitnami
version: 13.6.x
description: Open Source kanban
home: https://wekan.github.io/
home: https://wekan.github.io
icon: https://wekan.github.io/wekan-logo.svg
keywords:
- kanban
maintainers:
- email: support@wekan.team
name: wekan
- email: x@xet7.org
name: xet7
- email: github@randall.cc
name: technotaff
- email: jiangyt.cn@gmail.com
name: jiangytcn
- email: varac@varac.net
name: varac
name: wekan
sources:
- https://github.com/wekan/wekan
maintainers:
- name: technotaff
email: github@randall.cc
engine: gotpl
type: application
version: 7.30.0

View File

@ -1,4 +1,6 @@
approvers:
- xet7
- technotaff
reviewers:
- xet7
- technotaff

View File

@ -1,12 +1,38 @@
# Helm Chart for Wekan
# WeKan ® - Open Source kanban
## Installing the Chart
To install the chart with the release name `my-release`:
```bash
helm repo add wekan https://wekan.github.io/charts
helm install my-release wekan/wekan
```
These commands deploy Wekan on the Kubernetes cluster in the default configuration.
Tip: List all releases using `helm list`
For all available values see `helm show values wekan/wekan`.
## Uninstalling the Chart
To uninstall/delete the my-release deployment:
```bash
helm delete my-release
```
The command removes all the Kubernetes components associated with the chart and
deletes the release.
## Features
o Uses a MongoDB replica set by default - this allows fault-tolerant
* Uses a MongoDB replica set by default - this allows fault-tolerant
and scalable MongoDB deployment (or just set the replicas to 1 for
a single server install)
o Optional Horizontal Pod Autoscaler (HPA), so that your Wekan pods
* Optional Horizontal Pod Autoscaler (HPA), so that your Wekan pods
will scale automatically with increased CPU load.
## The configurable values (values.yaml)
@ -19,7 +45,9 @@ Scaling Wekan:
replicaCount: 1
```
**replicaCount** Will set the initial number of replicas for the Wekan pod (and container)
**replicaCount** will set the initial number of replicas for the Wekan pod
(and container)
```yaml
## Configure an horizontal pod autoscaler
@ -34,13 +62,17 @@ autoscaling:
##
targetCPUUtilizationPercentage: 80
```
This section (if *enabled* is set to **true**) will enable the Kubernetes Horizontal Pod Autoscaler (HPA).
**minReplicas:** this is the minimum number of pods to scale down to (We recommend setting this to the same value as **replicaCount**).
This section (if *enabled* is set to **true**) will enable the Kubernetes
Horizontal Pod Autoscaler (HPA).
**minReplicas:** this is the minimum number of pods to scale down to
(We recommend setting this to the same value as **replicaCount**).
**maxReplicas:** this is the maximum number of pods to scale up to.
**targetCPUUtilizationPercentage:** This is the CPU at which the HPA will scale-out the number of Wekan pods.
**targetCPUUtilizationPercentage:** This is the CPU at which the HPA will
scale-out the number of Wekan pods.
```yaml
mongodb-replicaset:
@ -55,11 +87,16 @@ mongodb-replicaset:
This section controls the scale of the MongoDB redundant Replica Set.
**replicas:** This is the number of MongoDB instances to include in the set. You can set this to 1 for a single server - this will still allow you to scale-up later with a helm upgrade.
**replicas:** This is the number of MongoDB instances to include in the set.
You can set this to 1 for a single server - this will still allow you to
scale-up later with a helm upgrade.
### Install OCP route
If you use this chart to deploy Wekan on an OCP cluster, you can create route instead of ingress with following command:
``` bash
$ helm template --set route.enabled=true,ingress.enabled=false values.yaml . | oc apply -f-
If you use this chart to deploy Wekan on an OCP cluster, you can create route
instead of ingress with following command:
```bash
helm template --set route.enabled=true,ingress.enabled=false values.yaml . | \
oc apply -f-
```

View File

@ -1 +0,0 @@

View File

@ -1,5 +0,0 @@
dependencies:
- name: mongodb-replicaset
version: 3.11.x
repository: "https://kubernetes-charts.storage.googleapis.com/"
condition: mongodb-replicaset.enabled

View File

@ -62,21 +62,27 @@ Create the name of the service account to use for the api component
Create a default fully qualified mongodb-replicaset name.
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
*/}}
{{- define "wekan.mongodb-replicaset.fullname" -}}
{{- $name := default "mongodb-replicaset" (index .Values "mongodb-replicaset" "nameOverride") -}}
{{- define "wekan.mongodb.svcname" -}}
{{- $name := default "mongodb" (index .Values "mongodb" "nameOverride") -}}
{{- if eq .Values.mongodb.architecture "replicaset" }}
{{- printf "%s-%s-headless" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
{{- else -}}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
{{- end -}}
{{- end -}}
{{/*
Create the MongoDB URL. If MongoDB is installed as part of this chart, use k8s service discovery,
else use user-provided URL.
*/}}
{{- define "mongodb-replicaset.url" -}}
{{- if (index .Values "mongodb-replicaset" "enabled") -}}
{{- $count := (int (index .Values "mongodb-replicaset" "replicas")) -}}
{{- define "mongodb.url" -}}
{{- if (index .Values "mongodb" "enabled") -}}
{{- $count := (int (index .Values "mongodb" "replicaCount")) -}}
{{- $release := .Release.Name -}}
mongodb://{{ $release }}-mongodb-replicaset:27017/admin?replicaSet={{ index .Values "mongodb-replicaset" "replicaSetName" }}
{{- $replicaSetName := (index .Values "mongodb" "replicaSetName") -}}
{{- $mongodbSvcName := include "wekan.mongodb.svcname" . -}}
mongodb://{{- range $v := until $count }}{{ $release }}-mongodb-{{ $v }}.{{ $mongodbSvcName }}:27017{{ if ne $v (sub $count 1) }},{{- end -}}{{- end -}}/{{ .Values.dbname }}?replicaSet={{ $replicaSetName }}
{{- else -}}
{{- index .Values "mongodb-replicaset" "url" -}}
{{- index .Values "mongodb" "url" -}}
{{- end -}}
{{- end -}}

View File

@ -0,0 +1,26 @@
{{- if .Values.sharedDataFolder.enabled }}
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: {{ template "wekan.fullname" . }}-shared-data
labels:
app: {{ template "wekan.name" . }}
chart: {{ template "wekan.chart" . }}
component: wekan
heritage: {{ .Release.Service }}
release: {{ .Release.Name }}
spec:
accessModes:
{{- if .Values.sharedDataFolder.accessMode }}
- {{ .Values.sharedDataFolder.accessMode }}
{{- else }}
- ReadWriteMany
{{- end }}
{{- if .Values.sharedDataFolder.storageClass }}
storageClassName: {{ .Values.sharedDataFolder.storageClass | quote }}
{{- end }}
{{- with .Values.sharedDataFolder.resources }}
resources:
{{- toYaml . | nindent 4 }}
{{- end }}
{{ end }}

View File

@ -8,6 +8,9 @@ metadata:
component: wekan
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
{{- if .Values.deploymentLabels }}
{{- toYaml .Values.deploymentLabels | nindent 4 }}
{{- end }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
@ -22,8 +25,21 @@ spec:
app: {{ template "wekan.name" . }}
component: wekan
release: {{ .Release.Name }}
{{- if .Values.podLabels }}
{{- toYaml .Values.podLabels | nindent 8 }}
{{- end }}
spec:
serviceAccountName: {{ template "wekan.serviceAccountName" . }}
{{- if ne .Values.platform "openshift" }}
initContainers:
- name: volume-permissions
image: busybox
imagePullPolicy: {{ .Values.image.pullPolicy }}
command: ['sh', '-c', 'chown -R 999:999 /data']
volumeMounts:
- name: shared-data-volume
mountPath: /data
{{- end }}
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
@ -31,23 +47,52 @@ spec:
terminationMessagePolicy: FallbackToLogsOnError
ports:
- name: http
containerPort: 8080
containerPort: {{ .Values.service.port }}
env:
- name: ROOT_URL
value: {{ .Values.root_url | default "https://wekan.local" | quote }}
value: {{ .Values.root_url | quote }}
{{- $mongo_url_is_secret := false }}
{{- range $key := .Values.secretEnv }}
{{- if eq .name "MONGO_URL" }}
{{- $mongo_url_is_secret = true }}
{{- end }}
{{- end }}
{{- if not $mongo_url_is_secret }}
- name: MONGO_URL
value: "{{ template "mongodb-replicaset.url" . }}"
value: "{{ template "mongodb.url" . }}"
{{- end }}
{{- range $key := .Values.env }}
{{- if .value }}
- name: {{ .name }}
value: {{ .value | quote }}
{{- end }}
{{- end }}
{{- range $key := .Values.secretEnv }}
- name: {{ .name }}
valueFrom:
secretKeyRef:
name: {{ template "wekan.fullname" $ }}-secret
key: {{ .name }}
{{- end }}
envFrom:
{{- with .Values.extraEnvFrom }}
{{- tpl . $ | nindent 10 }}
{{- end }}
readinessProbe:
httpGet:
path: /
port: {{ .Values.service.port }}
initialDelaySeconds: 20
livenessProbe:
httpGet:
path: /
port: 8080
port: {{ .Values.service.port }}
initialDelaySeconds: 60
{{ if .Values.sharedDataFolder.enabled }}
volumeMounts:
- name: shared-data-volume
mountPath: /data
{{ end }}
resources:
{{ toYaml .Values.resources | indent 12 }}
{{- with .Values.nodeSelector }}
@ -62,3 +107,9 @@ spec:
tolerations:
{{ toYaml . | indent 8 }}
{{- end }}
{{ if .Values.sharedDataFolder.enabled }}
volumes:
- name: shared-data-volume
persistentVolumeClaim:
claimName: {{ template "wekan.fullname" . }}-shared-data
{{ end }}

View File

@ -0,0 +1,4 @@
{{- range .Values.extraDeploy }}
---
{{ toYaml . }}
{{- end }}

View File

@ -2,7 +2,8 @@
{{- $fullName := include "wekan.fullname" . -}}
{{- $servicePort := .Values.service.port -}}
{{- $ingressPath := .Values.ingress.path -}}
apiVersion: extensions/v1beta1
{{- $ingressPathType := .Values.ingress.pathtype -}}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: {{ $fullName }}
@ -33,8 +34,11 @@ spec:
http:
paths:
- path: {{ $ingressPath }}
pathType: {{ $ingressPathType }}
backend:
serviceName: {{ $fullName }}
servicePort: 80
service:
name: {{ $fullName }}
port:
number: 8080
{{- end }}
{{- end }}

View File

@ -0,0 +1,13 @@
{{ if .Values.secretEnv }}
apiVersion: v1
kind: Secret
metadata:
name: {{ template "wekan.fullname" $ }}-secret
type: Opaque
data:
{{- range $key := .Values.secretEnv -}}
{{ if $key.value }}
{{ $key.name | indent 2 }}: {{ $key.value | b64enc }}
{{- end }}
{{- end }}
{{ end }}

View File

@ -1,14 +0,0 @@
apiVersion: v1
kind: Secret
metadata:
name: {{ template "wekan.fullname" . }}
labels:
app: {{ template "wekan.name" . }}
chart: {{ template "wekan.chart" . }}
component: wekan
heritage: {{ .Release.Service }}
release: {{ .Release.Name }}
type: Opaque
data:
accessKey: {{ .Values.credentials.accessKey | b64enc }}
secretKey: {{ .Values.credentials.secretKey | b64enc }}

View File

@ -1,27 +0,0 @@
apiVersion: v1
kind: Pod
metadata:
name: {{ template "wekan.fullname" . }}-test
annotations:
"helm.sh/hook": test-success
spec:
containers:
- name: {{ template "wekan.fullname" . }}-test
imagePullPolicy: IfNotPresent
image: "docker.io/mesosphere/aws-cli:1.14.5"
command:
- sh
- -c
- aws s3 --endpoint-url=http://{{ include "wekan.fullname" . }} --region=us-east-1 ls
env:
- name: AWS_ACCESS_KEY_ID
valueFrom:
secretKeyRef:
name: {{ template "wekan.fullname" . }}
key: accessKey
- name: AWS_SECRET_ACCESS_KEY
valueFrom:
secretKeyRef:
name: {{ template "wekan.fullname" . }}
key: secretKey
restartPolicy: Never

View File

@ -0,0 +1,19 @@
apiVersion: v1
kind: Pod
metadata:
name: "{{ template "wekan.fullname" . }}-test-http"
labels:
app: {{ template "wekan.name" . }}
chart: {{ template "wekan.chart" . }}
component: wekan
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
annotations:
"helm.sh/hook": test
spec:
containers:
- name: wget
image: busybox
command: ['wget', '-O', '/dev/stdout']
args: ['{{ template "wekan.fullname" . }}:{{ .Values.service.port }}']
restartPolicy: Never

150
wekan/values.home.yaml Normal file
View File

@ -0,0 +1,150 @@
# ------------------------------------------------------------------------------
# Wekan:
# ------------------------------------------------------------------------------
## Define platform where helm chart is deployed (set to 'openshift' to disable initContainer with chown command)
platform: kubernetes
## Define serviceAccount names to create or use. Defaults to component's fully
## qualified name.
##
serviceAccounts:
create: true
name: ""
annotations: ""
## Wekan image configuration
##
image:
repository: ghcr.io/wekan/wekan
tag: v7.30
pullPolicy: IfNotPresent
## Configuration for wekan component
##
replicaCount: 1
dbname: wekan
## Specify additional environmental variables for the Deployment
##
env:
- name: ""
value: ""
# Additional environment variables for Wekan mapped from Secret or ConfigMap
extraEnvFrom: ""
# extraEnvFrom: |
# - secretRef:
# name: "{{ template "wekan.fullname" $ }}-test-secret"
## Specify additional secret environmental variables for the
## Deployment. These can e.g. be provided by a Secret and allow
## to store passwords separately
##
secretEnv: {}
# - name: ""
## value: ""
service:
type: ClusterIP
port: 8080
annotations: {}
prometheus.io/scrape: "true"
prometheus.io/port: "8000"
prometheus.io/path: "/_/monitoring/metrics"
## Comma-separated string of allowed virtual hosts for external access.
## This should match the ingress hosts
##
endpoint: wekan.wekan,kan.k8s.ipa.champion,kan.ervine.cloud,wekan.local
## Main URL (including http:// or https://) where your Wekan
## instance is accessible
##
root_url: https://kan.ervine.cloud
ingress:
enabled: false
annotations: {}
# kubernetes.io/ingress.class: nginx
# kubernetes.io/tls-acme: "true"
path: /
pathtype: ImplementationSpecific
# This must match 'endpoint', unless your client supports different
# hostnames.
hosts: [ wekan.local ]
# - wekan.local
tls: []
# - secretName: wekan-example-tls
# hosts:
# - wekan-example.local
route:
enabled: false
resources:
requests:
memory: 128Mi
cpu: 300m
limits:
memory: 1Gi
## Node labels for pod assignment
## ref: https://kubernetes.io/docs/user-guide/node-selection/
##
nodeSelector:
location: bedRoom
## Tolerations for pod assignment
## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/
##
tolerations: []
## Affinity for pod assignment
## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity
##
affinity: {}
## Configure an horizontal pod autoscaler
##
autoscaling:
enabled: true
config:
minReplicas: 1
maxReplicas: 16
## Note: when setting this, a `resources.request.cpu` is required. You
## likely want to set it to `1` or some lower value.
##
targetCPUUtilizationPercentage: 80
# Optional custom labels for the deployment resource.
deploymentLabels: {}
# Optional custom labels for the pods created by the deployment.
podLabels: {}
sharedDataFolder:
enabled: true
path: /data
accessMode: ReadWriteOnce
storageClass:
resources:
requests:
storage: 5Gi
extraDeploy: []
# ------------------------------------------------------------------------------
# MongoDB:
# ref: https://github.com/bitnami/charts/blob/master/bitnami/mongodb/values.yaml
# ------------------------------------------------------------------------------
mongodb:
enabled: true
architecture: replicaset
replicaCount: 1
replicaSetName: rs0
auth:
enabled: false
# Optional specify an existing PVC
persistence:
existingClaim: "wekan-mongodb"

View File

@ -1,6 +1,8 @@
# ------------------------------------------------------------------------------
# Wekan:
# ------------------------------------------------------------------------------
## Define platform where helm chart is deployed (set to 'openshift' to disable initContainer with chown command)
platform: kubernetes
## Define serviceAccount names to create or use. Defaults to component's fully
## qualified name.
@ -13,20 +15,15 @@ serviceAccounts:
## Wekan image configuration
##
image:
repository: quay.io/wekan/wekan
tag: latest
repository: ghcr.io/wekan/wekan
tag: v7.30
pullPolicy: IfNotPresent
## Configuration for wekan component
##
replicaCount: 1
## Specify wekan credentials
##
credentials:
accessKey: access-key
secretKey: secret-key
dbname: wekan
## Specify additional environmental variables for the Deployment
##
@ -34,25 +31,45 @@ env:
- name: ""
value: ""
# Additional environment variables for Wekan mapped from Secret or ConfigMap
extraEnvFrom: ""
# extraEnvFrom: |
# - secretRef:
# name: "{{ template "wekan.fullname" $ }}-test-secret"
## Specify additional secret environmental variables for the
## Deployment. These can e.g. be provided by a Secret and allow
## to store passwords separately
##
secretEnv: {}
# - name: ""
## value: ""
service:
type: ClusterIP
port: 80
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "8000"
prometheus.io/path: "/_/monitoring/metrics"
port: 8080
annotations: {}
# prometheus.io/scrape: "true"
# prometheus.io/port: "8000"
# prometheus.io/path: "/_/monitoring/metrics"
## Comma-separated string of allowed virtual hosts for external access.
## This should match the ingress hosts
##
endpoint: wekan.wekan,kan.k8s.ipa.champion,kan.ervine.cloud
endpoint: wekan.local
## Main URL (including http:// or https://) where your Wekan
## instance is accessible
##
root_url: https://wekan.local
ingress:
enabled: false
enabled: true
annotations: {}
# kubernetes.io/ingress.class: nginx
# kubernetes.io/tls-acme: "true"
path: /*
path: /
pathtype: ImplementationSpecific
# This must match 'endpoint', unless your client supports different
# hostnames.
hosts: [ wekan.local ]
@ -76,8 +93,7 @@ resources:
## Node labels for pod assignment
## ref: https://kubernetes.io/docs/user-guide/node-selection/
##
nodeSelector:
location: bedRoom
nodeSelector: {}
## Tolerations for pod assignment
## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/
@ -95,23 +111,40 @@ autoscaling:
enabled: true
config:
minReplicas: 1
maxReplicas: 4
maxReplicas: 16
## Note: when setting this, a `resources.request.cpu` is required. You
## likely want to set it to `1` or some lower value.
##
targetCPUUtilizationPercentage: 80
# Optional custom labels for the deployment resource.
deploymentLabels: {}
# Optional custom labels for the pods created by the deployment.
podLabels: {}
sharedDataFolder:
enabled: true
path: /data
accessMode: ReadWriteOnce
storageClass:
resources:
requests:
storage: 5Gi
extraDeploy: []
# ------------------------------------------------------------------------------
# MongoDB:
# ref: https://github.com/bitnami/charts/blob/master/bitnami/mongodb/values.yaml
# ------------------------------------------------------------------------------
mongodb-replicaset:
mongodb:
enabled: true
replicas: 1
architecture: replicaset
replicaCount: 3
replicaSetName: rs0
securityContext:
runAsUser: 1000
fsGroup: 1000
runAsNonRoot: true
#image:
# tag: 3.2.21
auth:
enabled: false
# Optional specify an existing PVC
persistence:
existingClaim: ""