Added Helm chart for deploying EMS at app. cluster

Change-Id: Iaecaac5fadb397965c38af57c89153d53ae0c2df
This commit is contained in:
ipatini 2024-04-16 18:32:36 +03:00
parent 8593e5a874
commit 9794f1b19c
11 changed files with 692 additions and 0 deletions

View File

@ -0,0 +1,23 @@
# 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
*.orig
*~
# Various IDEs
.project
.idea/
*.tmproj
.vscode/

View File

@ -0,0 +1,33 @@
#
# Copyright (C) 2017-2025 Institute of Communication and Computer Systems (imu.iccs.gr)
#
# This Source Code Form is subject to the terms of the Mozilla Public License, v2.0, unless
# Esper library is used, in which case it is subject to the terms of General Public License v2.0.
# If a copy of the MPL was not distributed with this file, you can obtain one at
# https://www.mozilla.org/en-US/MPL/2.0/
#
apiVersion: v2
name: ems-server
description: EMS server Helm chart for Kubernetes
# A chart can be either an 'application' or a 'library' chart.
#
# Application charts are a collection of templates that can be packaged into versioned archives
# to be deployed.
#
# Library charts provide useful utilities or functions for the chart developer. They're included as
# a dependency of application charts to inject those utilities and functions into the rendering
# pipeline. Library charts do not define any templates and therefore cannot be deployed.
type: application
# This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version.
# Versions are expected to follow Semantic Versioning (https://semver.org/)
version: 0.1.0
# This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application. Versions are not expected to
# follow Semantic Versioning. They should reflect the version the application is using.
# It is recommended to use it with quotes.
appVersion: "7.0.0-SNAPSHOT"

View File

@ -0,0 +1,22 @@
1. Get the application URL by running these commands:
{{- if .Values.ingress.enabled }}
{{- range $host := .Values.ingress.hosts }}
{{- range .paths }}
http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }}
{{- end }}
{{- end }}
{{- else if contains "NodePort" .Values.service.type }}
export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "ems-server.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 --namespace {{ .Release.Namespace }} svc -w {{ include "ems-server.fullname" . }}'
export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "ems-server.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
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.kubernetes.io/name={{ include "ems-server.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
echo "Visit http://127.0.0.1:8080 to use your application"
kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT
{{- end }}

View File

@ -0,0 +1,62 @@
{{/*
Expand the name of the chart.
*/}}
{{- define "ems-server.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 "ems-server.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 "ems-server.chart" -}}
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
{{- end }}
{{/*
Common labels
*/}}
{{- define "ems-server.labels" -}}
helm.sh/chart: {{ include "ems-server.chart" . }}
{{ include "ems-server.selectorLabels" . }}
{{- if .Chart.AppVersion }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end }}
{{/*
Selector labels
*/}}
{{- define "ems-server.selectorLabels" -}}
app.kubernetes.io/name: {{ include "ems-server.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}
{{/*
Create the name of the service account to use
*/}}
{{- define "ems-server.serviceAccountName" -}}
{{- if .Values.serviceAccount.create }}
{{- default (include "ems-server.fullname" .) .Values.serviceAccount.name }}
{{- else }}
{{- default "default" .Values.serviceAccount.name }}
{{- end }}
{{- end }}

View File

@ -0,0 +1,181 @@
#
# Copyright (C) 2017-2025 Institute of Communication and Computer Systems (imu.iccs.gr)
#
# This Source Code Form is subject to the terms of the Mozilla Public License, v2.0, unless
# Esper library is used, in which case it is subject to the terms of General Public License v2.0.
# If a copy of the MPL was not distributed with this file, you can obtain one at
# https://www.mozilla.org/en-US/MPL/2.0/
#
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "ems-server.fullname" . }}
labels:
{{- include "ems-server.labels" . | nindent 4 }}
spec:
{{- if not .Values.autoscaling.enabled }}
replicas: {{ .Values.replicaCount }}
{{- end }}
selector:
matchLabels:
{{- include "ems-server.selectorLabels" . | nindent 6 }}
template:
metadata:
{{- with .Values.podAnnotations }}
annotations:
{{- toYaml . | nindent 8 }}
{{- end }}
labels:
{{- include "ems-server.selectorLabels" . | nindent 8 }}
spec:
{{- with .Values.imagePullSecrets }}
imagePullSecrets:
{{- toYaml . | nindent 8 }}
{{- end }}
serviceAccountName: {{ include "ems-server.serviceAccountName" . }}
securityContext:
{{- toYaml .Values.podSecurityContext | nindent 8 }}
terminationGracePeriodSeconds: 10
containers:
- name: {{ .Chart.Name }}
securityContext:
{{- toYaml .Values.securityContext | nindent 12 }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
env:
#
# EMS server configuration -- Environment variables from command line
#
- name: APPLICATION_ID
value: "{{ .Values.app_uuid }}"
- name: EXTERNAL_BROKER_ADDRESS
value: "{{ .Values.broker_address }}"
- name: EXTERNAL_BROKER_PORT
value: "{{ .Values.broker_port }}"
- name: EXTERNAL_BROKER_USERNAME
value: "{{ .Values.broker_username }}"
- name: EXTERNAL_BROKER_PASSWORD
value: "{{ .Values.broker_password }}"
#
# EMS server configuration -- Environment variables from values.yaml
#
{{- range .Values.env }}
- name: {{ .name }}
value: {{ .value | quote }}
{{- end }}
#
# K8S cluster node info
#
- name: EMS_SERVER_K8S_NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: EMS_SERVER_K8S_NODE_ADDRESS
valueFrom:
fieldRef:
fieldPath: status.hostIP
#
# EMS server Pod info
#
- name: EMS_SERVER_POD_UID
valueFrom:
fieldRef:
fieldPath: metadata.uid
- name: EMS_SERVER_POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: EMS_SERVER_POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: EMS_SERVER_POD_ADDRESS
valueFrom:
fieldRef:
fieldPath: status.podIP
ports:
{{- range .Values.ports }}
- name: {{ .name }}
containerPort: {{ .containerPort }}
protocol: {{ .protocol }}
{{- end }}
livenessProbe:
tcpSocket:
port: http
readinessProbe:
tcpSocket:
port: http
resources:
{{- toYaml .Values.resources | nindent 12 }}
{{- with .Values.nodeSelector }}
nodeSelector:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.affinity }}
affinity:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.tolerations }}
tolerations:
{{- toYaml . | nindent 8 }}
{{- end }}
---
# The configmap to be updated
#apiVersion: v1
#kind: ConfigMap
#metadata:
# name: ems-client-configmap
#---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: ems-server-role-binding
subjects:
- kind: ServiceAccount
name: {{ include "ems-server.serviceAccountName" . }}
# namespace: default
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: ems-server-role
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: ems-server-role
# Benefit of using RBAC over giving your personal access token as a secret to your application: You can pinpoint which access you want to allow
rules:
- apiGroups: ["", "apps"] # Empty string for kubernetes system
resources: ["configmaps", "daemonsets"]
resourceNames: ["monitoring-configmap", "ems-client-configmap", "ems-client-daemonset"]
verbs: ["get", "update", "delete", "list", "watch", "patch"]
- apiGroups: ["", "apps"] # Empty string for kubernetes system
resources: ["configmaps", "daemonsets"]
verbs: ["create"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: ems-server-cluster-role-binding
subjects:
- kind: ServiceAccount
name: {{ include "ems-server.serviceAccountName" . }}
namespace: default
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: ems-server-cluster-role
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: ems-server-cluster-role
rules:
- apiGroups: ["", "apps"]
resources: ["pods", "nodes"]
verbs: ["get", "list", "watch"]

View File

@ -0,0 +1,28 @@
{{- if .Values.autoscaling.enabled }}
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: {{ include "ems-server.fullname" . }}
labels:
{{- include "ems-server.labels" . | nindent 4 }}
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: {{ include "ems-server.fullname" . }}
minReplicas: {{ .Values.autoscaling.minReplicas }}
maxReplicas: {{ .Values.autoscaling.maxReplicas }}
metrics:
{{- if .Values.autoscaling.targetCPUUtilizationPercentage }}
- type: Resource
resource:
name: cpu
targetAverageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }}
{{- end }}
{{- if .Values.autoscaling.targetMemoryUtilizationPercentage }}
- type: Resource
resource:
name: memory
targetAverageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }}
{{- end }}
{{- end }}

View File

@ -0,0 +1,61 @@
{{- if .Values.ingress.enabled -}}
{{- $fullName := include "ems-server.fullname" . -}}
{{- $svcPort := .Values.service.port -}}
{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }}
{{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }}
{{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}}
{{- end }}
{{- end }}
{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}}
apiVersion: networking.k8s.io/v1
{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
apiVersion: networking.k8s.io/v1beta1
{{- else -}}
apiVersion: extensions/v1beta1
{{- end }}
kind: Ingress
metadata:
name: {{ $fullName }}
labels:
{{- include "ems-server.labels" . | nindent 4 }}
{{- with .Values.ingress.annotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
spec:
{{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }}
ingressClassName: {{ .Values.ingress.className }}
{{- end }}
{{- if .Values.ingress.tls }}
tls:
{{- range .Values.ingress.tls }}
- hosts:
{{- range .hosts }}
- {{ . | quote }}
{{- end }}
secretName: {{ .secretName }}
{{- end }}
{{- end }}
rules:
{{- range .Values.ingress.hosts }}
- host: {{ .host | quote }}
http:
paths:
{{- range .paths }}
- path: {{ .path }}
{{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }}
pathType: {{ .pathType }}
{{- end }}
backend:
{{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }}
service:
name: {{ $fullName }}
port:
number: {{ $svcPort }}
{{- else }}
serviceName: {{ $fullName }}
servicePort: {{ $svcPort }}
{{- end }}
{{- end }}
{{- end }}
{{- end }}

View File

@ -0,0 +1,24 @@
#
# Copyright (C) 2017-2025 Institute of Communication and Computer Systems (imu.iccs.gr)
#
# This Source Code Form is subject to the terms of the Mozilla Public License, v2.0, unless
# Esper library is used, in which case it is subject to the terms of General Public License v2.0.
# If a copy of the MPL was not distributed with this file, you can obtain one at
# https://www.mozilla.org/en-US/MPL/2.0/
#
apiVersion: v1
kind: Service
metadata:
name: {{ include "ems-server.fullname" . }}
labels:
{{- include "ems-server.labels" . | nindent 4 }}
spec:
type: {{ .Values.service.type }}
ports:
- port: {{ .Values.service.port }}
targetPort: http
protocol: TCP
name: http
selector:
{{- include "ems-server.selectorLabels" . | nindent 4 }}

View File

@ -0,0 +1,12 @@
{{- if .Values.serviceAccount.create -}}
apiVersion: v1
kind: ServiceAccount
metadata:
name: {{ include "ems-server.serviceAccountName" . }}
labels:
{{- include "ems-server.labels" . | nindent 4 }}
{{- with .Values.serviceAccount.annotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
{{- end }}

View File

@ -0,0 +1,15 @@
apiVersion: v1
kind: Pod
metadata:
name: "{{ include "ems-server.fullname" . }}-test-connection"
labels:
{{- include "ems-server.labels" . | nindent 4 }}
annotations:
"helm.sh/hook": test
spec:
containers:
- name: wget
image: busybox
command: ['wget']
args: ['{{ include "ems-server.fullname" . }}:{{ .Values.service.port }}']
restartPolicy: Never

View File

@ -0,0 +1,231 @@
#
# Copyright (C) 2017-2025 Institute of Communication and Computer Systems (imu.iccs.gr)
#
# This Source Code Form is subject to the terms of the Mozilla Public License, v2.0, unless
# Esper library is used, in which case it is subject to the terms of General Public License v2.0.
# If a copy of the MPL was not distributed with this file, you can obtain one at
# https://www.mozilla.org/en-US/MPL/2.0/
#
# Default values for ems-server.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
replicaCount: 1
image:
repository: "registry.gitlab.com/nebulous-project/ems-main/ems-server"
pullPolicy: IfNotPresent
# Overrides the image tag whose default is the chart appVersion.
# tag: &image_tag "2024-apr-nebulous"
imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""
serviceAccount:
# Specifies whether a service account should be created
create: true
# Annotations to add to the service account
annotations: {}
# The name of the service account to use.
# If not set and create is true, a name is generated using the fullname template
name: "ems-server-service-account"
podAnnotations: {}
podSecurityContext: {}
# fsGroup: 2000
securityContext: {}
# capabilities:
# drop:
# - ALL
# readOnlyRootFilesystem: true
# runAsNonRoot: true
# runAsUser: 1000
service:
type: ClusterIP
port: 8111
ingress:
enabled: false
className: ""
annotations: {}
# kubernetes.io/ingress.class: nginx
# kubernetes.io/tls-acme: "true"
hosts:
- host: chart-example.local
paths:
- path: /
pathType: ImplementationSpecific
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
autoscaling:
enabled: false
minReplicas: 1
maxReplicas: 1
targetCPUUtilizationPercentage: 80
# targetMemoryUtilizationPercentage: 80
nodeSelector: {}
tolerations: []
affinity: {}
ports:
- name: http
containerPort: 8111
protocol: TCP
- name: openwire
containerPort: 61616
protocol: TCP
- name: openwire-tls
containerPort: 61617
protocol: TCP
- name: stomp
containerPort: 61610
protocol: TCP
#
# ===== Configuration passed at command line =====
# ===== (see also: deployment.yaml file) =====
#
app_uuid: ''
broker_address: ''
broker_port: '5672'
broker_username: ''
broker_password: ''
env:
#
# ===== Development and Debug settings =====
#
#- name: APPLICATION_ID
# value: ""
#- name: METRIC_MODEL_URL
# value: "https://gitlab.com/nebulous-project/tests-new/-/raw/master/ems-at-nebulous/models/nebulous/test2.yml"
#- name: EMS_PRELOAD_APP_MODEL
# value: "test2.yml"
#
# ===== EMS server configuration =====
#
# ===== INITIALIZATION settings =====
- name: JASYPT_PASSWORD
value: 'password'
- name: NET_UTIL_ADDRESS_DISCOVERY_SERVICES
value: '-'
- name: EMS_IP_SETTING
value: 'DEFAULT_IP'
- name: K8S_WATCHER_ENABLED
value: 'true'
- name: EMS_LOG_REQUESTS
value: 'false'
- name: CONTROL_SKIP_METASOLVER
value: 'true'
- name: CONTROL_SKIP_NOTIFICATION
value: 'true'
- name: CONTROL_EXIT_ALLOWED
value: 'true'
- name: RESTART_EXIT_CODE
value: '99'
# ===== Security and Authentication settings =====
- name: JWT_SECRET
value: 'ENC(I0mRWgH2FVDDNs4OBcdh7Z+o3lOQDa3ztaEtmnXT2HN0aClkChp/lqm9zM5HyTk0stJ7v2Di75U=)'
- name: WEB_SECURITY_API_KEY_AUTHENTICATION_VALUE
value: '1234567890'
- name: WEB_SECURITY_FORM_AUTHENTICATION_PASSWORD
value: 'ems'
# ===== EMS Boot (server) settings =====
- name: BOOT_ENABLED
value: 'false'
# ===== EMS Boot Initializer (client) settings =====
- name: BOOT_INITIALIZER_ENABLED
value: 'true'
# ===== EMS-Nebulous K8S service settings =====
- name: K8S_DEPLOY_EMS_CLIENTS_ON_KUBERNETES_ENABLED
value: 'true'
# ===== External Broker settings =====
- name: EXTERNAL_ENABLED
value: 'true'
#- name: EXTERNAL_BROKER_ADDRESS
# value: ''
#- name: EXTERNAL_BROKER_PORT
# value: '5672'
#- name: EXTERNAL_BROKER_USERNAME
# value: ''
#- name: EXTERNAL_BROKER_PASSWORD
# value: ''
# ===== Broker settings =====
- name: BROKERCEP_ADDITIONAL_BROKER_CREDENTIALS
value: 'aaa/111, bbb/222' # 'ENC(axeJUxNHajYfBffUwvuT3kwTgLTpRliDMz/ZQ9hROZ3BNOv0Idw72NJsawzIZRuZ)'
- name: BROKERCEP_EVENT_RECORDER_ENABLED
value: 'false'
- name: BROKERCEP_EVENT_RECORDER_FILTER_MODE
value: 'ALL'
# ===== Baguette Server settings =====
- name: BAGUETTE_SERVER_CREDENTIALS
value: '{ "aa":"xx" }' # 'ENC(y46CiW6przlpXvz8ToE+T1Sn6uGfO2haP7OhATB0SXo=)'
#
# ===== EMS server K8sClientInstaller configuration =====
#
- name: EMS_CLIENT_DEPLOYMENT_DRY_RUN
value: "false"
- name: K8S_SERVICE_ACCOUNT_SECRETS_PATH
value: "/var/run/secrets/kubernetes.io/serviceaccount"
- name: APP_CONFIG_MAP_NAME
value: "monitoring-configmap"
- name: EMS_CLIENT_CONFIG_MAP_NAME
value: "ems-client-configmap"
#- name: EMS_CLIENT_DAEMONSET_SPECIFICATION_FILE
# value: "/ems-client-daemonset.yaml"
- name: EMS_CLIENT_DAEMONSET_NAME
value: "ems-client-daemonset"
- name: EMS_CLIENT_DAEMONSET_IMAGE_REPOSITORY
value: "registry.gitlab.com/nebulous-project/ems-main/ems-client"
- name: EMS_CLIENT_DAEMONSET_IMAGE_TAG
value: "latest"
# value: *image_tag
- name: EMS_CLIENT_DAEMONSET_IMAGE_PULL_POLICY
value: "IfNotPresent"
# ===== EMS clients - Security and Authentication settings =====
- name: EMS_CLIENT_ADDITIONAL_BROKER_CREDENTIALS
value: 'aaa/111, bbb/222'
# value: "ENC(axeJUxNHajYfBffUwvuT3kwTgLTpRliDMz/ZQ9hROZ3BNOv0Idw72NJsawzIZRuZ)"
#- name: EMS_CLIENT_BROKER_USERNAME # It is appended to EMS_CLIENT_ADDITIONAL_BROKER_CREDENTIALS
# value: "ccc"
#- name: EMS_CLIENT_BROKER_PASSWORD
# value: "333"
- name: EMS_CLIENT_KEYSTORE_SECRET
value: ""
- name: EMS_CLIENT_TRUSTSTORE_SECRET
value: ""