Ilum Core helm chart config.
TL;DR
$ helm repo add ilum https://charts.ilum.cloud $ helm install ilum-core ilum/ilum-core
Installing the Chart
To install the chart with the release name ilum-core:
$ helm install ilum-core ilum/ilum-core
The command deploys ilum-core on the Kubernetes cluster in the default configuration. The Parameters
section lists the parameters that can be configured during installation.
Uninstalling the Chart
To uninstall/delete the ilum-core deployment:
The command removes all the Kubernetes components associated with the chart and deletes the release.
Parameters
Common parameters
Name Description Value nameOverrideString to partially override ilum-core.fullname template (will maintain the release name) ""replicaCountNumber of ilum-core replicas 1fullnameOverrideString to fully override ilum-core.fullname template ""nodeSelectorilum-core node selection constraint tolerationsilum-core pods tolerations [] affinityilum-core node affinity
ilum-core deployment parameters
Name Description Value imageilum-core image ilum/core:6.2.0pullPolicyilum-core image pull policy IfNotPresentimagePullSecretsilum-core image pull secrets []
ilum-core communication parameters
Name Description Value communication.typeilum-core communication type with spark jobs, available options: grpc, kafka grpc
ilum-core service parameters
Name Description Value service.typeilum-core service type ClusterIPservice.portilum-core service port 9888service.nodePortilum-core service node port - required when type is LoadBalancer or NodePort ""service.clusterIPilum-core service cluster IP - required when type is ClusterIP ""service.loadBalancerIPilum-core service load balancer IP - required when type is LoadBalancer ""service.annotationsilum-core service annotations {}
ilum-core ingress parameters
Name Description Value ingress.enabledilum-core ingress enabled flag falseingress.versionilum-core ingress version v1ingress.classNameilum-core ingress class name ""ingress.hostilum-core ingress host hostingress.tlsilum-core ingress tls configuration []ingress.tls[x].secretNameilum-core ingress secret name to apply for a single tls configuration entry ingress.tls[x].hostsilum-core ingress hosts list to apply for a single tls configuration entry ingress.annotationsilum-core ingress annotations in yaml format nginx.ingress.kubernetes.io/rewrite-target: /$1nginx.ingress.kubernetes.io/proxy-body-size: "600m"nginx.org/client-max-body-size: "600m"ingress.pathilum-core ingress path /(.*)ingress.pathTypeilum-core ingress pathType Prefix
ilum-core livenessProbe/readinessProbe parameters
Name Description Value readinessProbeilum-core readinessProbe configuration readinessProbe: failureThreshold: 3 httpGet: path: /api/dev/reactive/health port: http scheme: HTTP initialDelaySeconds: 60 periodSeconds: 10 successThreshold: 1 timeoutSeconds: 1 livenessProbeilum-core livenessProbe configuration livenessProbe: failureThreshold: 3 httpGet: path: /api/dev/reactive/health port: http scheme: HTTP initialDelaySeconds: 60 periodSeconds: 10 successThreshold: 1 timeoutSeconds: 1
ilum-core mongo parameters
Name Description Value mongo.instancesilum-core mongo instances to connect to mongo:27017mongo.replicaSetNameilum-core mongo replica set name rs0mongo.statusProbe.enanbledilum-core mongo healthcheck flag truemongo.statusProbe.imageilum-core mongo healthcheck image ilum/mongodb:6.0.5
ilum-core kafka parameters
Name Description Value kafka.addressilum-core kafka address to connect to kafka:9092kafka.requestSizeilum-core kafka max.request.size parameter for ilum jobs kafka producers 20000000kafka.maxPollRecordsilum-core kafka max.poll.records parameter for ilum jobs kafka consumers 500kafka.maxPollIntervalilum-core kafka max.poll.interval.ms parameter for ilum jobs kafka consumers 60000kafka.statusProbe.enanbledilum-core kafka healthcheck flag truekafka.statusProbe.imageilum-core kafka healthcheck image bitnami/kafka:3.4.1
ilum-core grpc service parameters
Name Description Value grpc.service.typeilum-core grpc service type ClusterIPgrpc.service.portilum-core grpc service port 9999grpc.service.nodePortilum-core grpc service node port - required when type is LoadBalancer or NodePort ""grpc.service.clusterIPilum-core grpc service cluster IP - required when type is ClusterIP ""grpc.service.loadBalancerIPilum-core grpc service load balancer IP - required when type is LoadBalancer ""grpc.service.annotationsilum-core grpc service annotations {}
ilum-core grpc parameters for spark job
Name Description Value grpc.job.hostilum-core grpc host for spark job to connect to ilum-grpcgrpc.job.portilum-core grpc port for spark job to connect to 9999
ilum-core kubernetes cluster initializer parameters
Name Description Value kubernetes.initClusterOnStartupilum-core default kubernetes cluster initialization flag truekubernetes.upgradeClusterOnStartupilum-core default kubernetes cluster upgrade from values in config map flag falsekubernetes.api.urlilum-core default kubernetes cluster api url https://kubernetes.default.svckubernetes.container.imageilum-core default kubernetes cluster container image ilum/spark:3.5.2-deltakubernetes.sparkNamespaceilum-core default kubernetes cluster namespace to store spark resources {{ .Release.Namespace }}kubernetes.storage.typeilum-core default kubernetes cluster storage type, available options: s3, gcs, wasbs, hdfs s3
Default cluster reconciliation
The two flags above govern how the bundled default Spark cluster is reconciled from chart values. The default cluster is bootstrap-once. When kubernetes.initClusterOnStartup is true (the default), the cluster is created on first startup if it does not already exist. When a cluster named default is already present, its stored specification is re-synced from chart values only if kubernetes.upgradeClusterOnStartup is true. That flag defaults to false, so a routine helm upgrade followed by a pod rollout does not push changed kubernetes.* values onto an existing default cluster. This preserves edits made through the UI or the dev API, at the cost of chart values no longer being authoritative once the cluster exists.
When kubernetes.upgradeClusterOnStartup is enabled, the reconciliation is partial:
Re-synced from chart values Never chart-driven on an existing cluster sparkImage, defaultApplicationConfig, environment variables, namespace, serviceAccountName, attached presetsscalaVersion, TLS certificates, credentials, cluster id and description
The fields in the right-hand column are always preserved from the stored cluster, even with the flag enabled. They can only be changed by editing the cluster through the UI or the dev API.
Metastore is reconciled independently
The bundled default metastore row (metastore.type and the corresponding metastore..config ) is reconciled unconditionally on every startup, independent of kubernetes.upgradeClusterOnStartup. A hive to nessie switch therefore takes effect on a plain pod rollout.
To apply changed default-cluster values, either enable reconciliation:
ilum-core : kubernetes : upgradeClusterOnStartup : "true"
and run helm upgrade followed by kubectl rollout restart deploy/ilum-core, or delete the existing cluster and re-bootstrap it from current chart values.
After the default cluster is deleted from the Clusters list under Workloads , it can be rebuilt from chart values without restarting ilum-core: while no clusters remain, the Clusters list shows a Restore Default Cluster button that re-creates it from chart values. The button is offered only when no default cluster exists; it never overwrites a cluster that is still present.
Restarting ilum-core after the delete has the equivalent effect, since the startup initializer recreates the missing cluster:
kubectl -n ilum rollout restart deploy/ilum-core
Enabling kubernetes.upgradeClusterOnStartup re-applies chart values on every boot, which overwrites subsequent UI or dev-API edits to the default cluster, and still does not migrate scalaVersion, certificates, or credentials.
s3 kubernetes storage parameters
Name Description Value kubernetes.s3.hostilum-core default kubernetes cluster S3 storage host to store spark resources s3kubernetes.s3.portilum-core default kubernetes cluster S3 storage port to store spark resources 7000kubernetes.s3.sparkBucketilum-core default kubernetes cluster S3 storage bucket to store spark resources ilum-fileskubernetes.s3.dataBucketilum-core default kubernetes cluster S3 storage bucket to store ilum tables ilum-tableskubernetes.s3.accessKeyilum-core default kubernetes cluster S3 storage access key to store spark resources ""kubernetes.s3.secretKeyilum-core default kubernetes cluster S3 storage secret key to store spark resources ""
gcs kubernetes storage parameters
Name Description Value kubernetes.gcs.clientEmaililum-core default kubernetes cluster GCS storage client email ""kubernetes.gcs.sparkBucketilum-core default kubernetes cluster GCS storage bucket to store spark resources "ilum-files"kubernetes.gcs.dataBucketilum-core default kubernetes cluster GCS storage bucket to store ilum tables "ilum-tables"kubernetes.gcs.privateKeyilum-core default kubernetes cluster GCS storage private key to store spark resources ""kubernetes.gcs.privateKeyIdilum-core default kubernetes cluster GCS storage private key id to store spark resources ""
wasbs kubernetes storage parameters
Name Description Value kubernetes.wasbs.accountNameilum-core default kubernetes cluster WASBS storage account name ""kubernetes.wasbs.accessKeyilum-core default kubernetes cluster WASBS storage access key to store spark resources ""kubernetes.wasbs.sparkContainerilum-core default kubernetes cluster WASBS storage container name to store spark resources "ilum-files"kubernetes.wasbs.dataContainerilum-core default kubernetes cluster WASBS storage container name to store ilum tables "ilum-tables"
hdfs kubernetes storage parameters
Name Description Value kubernetes.hdfs.hadoopUsernameilum-core default kubernetes cluster HDFS storage hadoop username ""kubernetes.hdfs.configilum-core default kubernetes cluster HDFS storage dict of config files with name as key and base64 encoded content as value ""kubernetes.hdfs.sparkCatalogilum-core default kubernetes cluster HDFS storage catalog to store spark resources "ilum-files"kubernetes.hdfs.dataCatalogilum-core default kubernetes cluster HDFS storage catalog to store ilum-tables "ilum-tables"kubernetes.hdfs.keyTabilum-core default kubernetes cluster HDFS storage keytab file base64 encoded content ""kubernetes.hdfs.principalilum-core default kubernetes cluster HDFS storage principal name ""kubernetes.hdfs.krb5ilum-core default kubernetes cluster HDFS storage krb5 file base64 encoded content ""kubernetes.hdfs.trustStoreilum-core default kubernetes cluster HDFS storage trustStore file base64 encoded content ""kubernetes.hdfs.logDirectoryilum-core default kubernetes cluster HDFS storage directory path to store eventLog for history server ""
Important! Make sure S3/GCS buckets or WASBS containers are already created and reachable!
Important! Make sure HDFS logDirectory is absolute path of configured sparkCatalog with /ilum/logs suffix! Eg hdfs://name-node/user/username/spark-catalog/ilum/logs
ilum-core security parameters
Name Description Value security.typeilum-core authentication type, available options: internal, ldap, oauth2 internalsecurity.jwt.issuerUrlilum-core frontend URI used in the jwt iss claim https://ilum.cloudsecurity.jwt.timeToLiveilum-core jwt time to live in specified time units 8hsecurity.jwt.publicKeyilum-core base64 encoded string containing the X.509 RSA 2048 bit public key ""security.jwt.privateKeyilum-core base64 encoded string containing the PKCS8 RSA 2048 bit private key ""security.authoritiesilum-core authorities mapping rules configuration. Used when authorization is ldap or oauth2. Allows to translate external auth provider groups and scopes to ilum roles authorities: roles: prefix: ROLE_ claim-name: groups scopes: prefix: SCOPE__ claim-name: scp security.authorities.roles.prefixilum-core authentication role prefix ROLE_security.authorities.roles.claimNameilum-core external authentication provider ID of the jwt claim which contains list of roles/groups groupssecurity.authorities.roles.mappingsilum-core role mapping definitions in form of a map external_role: ilum_role {}security.authorities.scopes.prefixilum-core authentication scope prefix SCOPE_security.authorities.scopes.claimNameilum-core external authentication provider ID of the jwt claim which contains list of scopes scpsecurity.authorities.scopes.mappingsilum-core scope mapping definitions in form of a map external_scope: ilum_scope {}
Internal config-map based authentication parameters
Name Description Value security.internal.usersilum-core internal users configuration users: - username: "admin" password: "admin" roles: - "ADMIN" security.internal.users[].usernameilum-core user username ""security.internal.users[].passwordilum-core user plain password ""security.internal.users[].rolesilum-core user roles, available options: ADMIN, USER, VIEWER []
LDAP based authentication parameters
Name Description Value security.ldap.urlsilum-core LDAP URLs of the server []security.ldap.baseilum-core LDAP base suffix from which all operations should originate ""security.ldap.usernameilum-core LDAP login username of the server ""security.ldap.passwordilum-core LDAP login password of the server ""security.ldap.passwordEncoderilum-core LDAP password encoder. LDAP server authenticates users (bind operations) if empty, available options: adaptive - password encoder that delegates to another encoder based upon a prefixed identifier bcrypt md5 sha256 ""security.ldap.userSearch.baseilum-core LDAP base DN from which the search for an user should be performed ""security.ldap.userSearch.filterilum-core LDAP pattern to be used for the user search. 0 is the username uid={0}security.ldap.userSearch.passwordAttrilum-core LDAP ID of the attribute which contains the password of a user userPasswordsecurity.ldap.groupSearch.baseilum-core LDAP base DN from which the search for group membership should be performed ""security.ldap.groupSearch.filterilum-core LDAP pattern to be used for the group search. 0 is the user's DN (member={0})security.ldap.groupSearch.roleAttrilum-core LDAP ID of the attribute which contains the role name for a group cn
OAuth2 based authentication parameters
Name Description Value security.oauth2.clientIdilum-core oauth2 Client ID ""security.oauth2.clientSecretilum-core oauth2 Client SECRET ""security.oauth2.issuerUriilum-core oauth2 URI that can either be an OpenID Connect discovery endpoint or an OAuth 2.0 Authorization Server Metadata endpoint defined by RFC 8414. ""
ilum-core license parameters
Name Description Value license.privateKeyilum license key ""
ilum-core external spark submit parameters
Name Description Value externalSparkSubmit.enabledilum-core external spark-submit flag falseexternalSparkSubmit.imageilum-core external spark-submit base images ilum/spark-launcher:spark-3.5.1externalSparkSubmit.resourcesilum-core external spark-submit pod kubernetes resources limits: memory: "500Mi" requests: memory: "300Mi"
ilum-core spark history server parameters
Name Description Value historyServer.enabledilum-core spark history server flag truehistoryServer.imageilum-core spark history server image ilum/spark-launcher:spark-3.5.1historyServer.addressilum-core spark history server address http://ilum-history-server:9666historyServer.pullPolicyilum-core spark history server image pull policy IfNotPresenthistoryServer.imagePullSecretsilum-core spark history server image pull secrets [] historyServer.parametersilum-core spark history server custom spark parameters spark.history.fs.cleaner.enabled: true spark.history.fs.cleaner.interval: 1d spark.history.fs.cleaner.maxAge: 7d historyServer.resourcesilum-core spark history server pod resources limits: memory: "500Mi" requests: memory: "300Mi" historyServer.service.typeilum-core spark history server service type ClusterIPhistoryServer.service.portilum-core spark history server service port 9666historyServer.service.nodePortilum-core spark history server service nodePort ""historyServer.service.clusterIPilum-core spark history server service clusterIP ""historyServer.service.loadBalancerIPilum-core spark history server service loadbalancerIP ""historyServer.service.annotationsilum-core history server service annotations {}historyServer.ingress.enabledilum-core spark history server ingress flag falsehistoryServer.ingress.versionilum-core spark history server ingress version "v1"historyServer.ingress.classNameilum-core spark history server ingress className ""historyServer.ingress.hostilum-core spark history server ingress host "host"historyServer.ingress.pathilum-core spark history server ingress path "/(.*)"historyServer.ingress.pathTypeilum-core spark history server ingress pathType Prefix historyServer.ingress.annotationsilum-core spark history server annotations nginx.ingress.kubernetes.io/rewrite-target: /$1nginx.ingress.kubernetes.io/proxy-body-size: "600m"nginx.org/client-max-body-size: "600m"historyServer.statusProbe.enabledilum-core spark history server ilum-core healthcheck flag truehistoryServer.statusProbe.imageilum-core spark history server ilum-core healthcheck image curlimages/curl:8.5.0historyServer.nodeSelectorilum-core spark history server nodeSelector historyServer.tolerationsilum-core spark history server tolerations [] historyServer.affinityilum-core spark history server affinity
ilum-core job parameters
Name Description Value job.retain.hoursilum-core spark jobs retention hours limit 168job.prometheus.enabledilum-core spark jobs prometheus enabled flag truejob.healthcheck.enabledilum-core spark jobs healthcheck enabled flag truejob.healthcheck.intervalilum-core spark jobs healthcheck interval in seconds 300job.healthcheck.toleranceilum-core spark jobs healthcheck response time tolerance in seconds 120job.memorysettings.executorsilum-core spark jobs executor count 2job.memorysettings.executorMemoryilum-core spark jobs executor memory allocation 1gjob.memorysettings.driverMemoryilum-core spark jobs driver memory allocation 1gjob.memorysettings.executorCoresilum-core spark jobs executor core count 1job.memorysettings.driverCoresilum-core spark jobs driver core count 1job.memorysettings.dynamicAllocationEnabledilum-core spark jobs dynamic allocation enabled flag falsejob.memorysettings.minExecutorsilum-core spark jobs minimum number of executors 0job.memorysettings.initialExecutorsilum-core spark jobs initial number of executors 0job.memorysettings.maxExecutorsilum-core spark jobs maximum number of executors 20
Name Description Value metastore.enabledilum-core default hive metastore enabled flag falsemetastore.hive.addressilum-core default hive metastore address thrift://ilum-hive-metastore:9083metastore.hive.versionilum-core default hive metastore version 3.1.3
ilum-core auto pausing settings
Name Description Value job.autoPause.enabledilum-core group auto pausing flag truejob.autoPause.idleTimeilum-core auto pausing minimum group idle time in seconds 3600job.autoPause.periodilum-core time between checks of group idleness in seconds 180
Generating RSA Private and Public Key
In order to create 2048-bit RSA keys in an unencrypted Base64 PEM PKCS#8 format for authentication configuration, openssl was used.
Generate private key
openssl genpkey -algorithm RSA \ -pkeyopt rsa_keygen_bits:2048 \ -pkeyopt rsa_keygen_pubexp:65537 | \ openssl pkcs8 -topk8 -nocrypt -outform pem > private-key.p8
The contents of the private key should look like the following:
-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCsRnE83rm6BJya nTyzVqX0SG+D4zBjkyWsOmGG+CoDdgQ6Z8AaocmnjP1SbRykQsQSMf6SeW+fdpH+ ccmzuHe7pZIa2o2Mg8xbk/UszJDaPztwoQbUt/2gHi/rZP8cIVkquzhnN/yxrMls ... -----END PRIVATE KEY-----
In order to use private key as the setting security.jwt.privateKey, remove header and footer from the key.
openssl pkey -pubout -inform pem -outform pem -in private-key.p8 -out public-key.spki
The contents of the public key should look like the following:
-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArEZxPN65ugScmp08s1al 9Ehvg+MwY5MlrDphhvgqA3YEOmfAGqHJp4z9Um0cpELEEjH+knlvn3aR/nHJs7h3 u6WSGtqNjIPMW5P1LMyQ2j87cKEG1Lf9oB4v62T/HCFZKrs4Zzf8sazJbMN3E/mJ ... -----END PUBLIC KEY-----
In order to use public key as the setting security.jwt.publicKey, remove header and footer from the key.