If your organization uses Kubernetes or Red Hat OpenShift, OpenNMS makes a Helm chart available to simplify deployment of Horizon and Meridian.
Note that this is one way to approach the solution. We recommend that you study the content of the Helm chart and tune it for your needs.
For more information about deploying in a containerized environment, including requirements and external dependencies, refer to Containerized Deployment in the main product documentation.
If you are not already familiar with Horizon or Meridian, we recommend reviewing our product documentation (Horizon, Meridian) and our Horizon or Meridian websites.
Use the following commands to bring up an instance of Horizon for testing:
helm repo add opennms https://opennms.github.io/helm-charts
helm install monms opennms/horizon --set domain=domain1.com --create-namespace
Helm chart version | Horizon version(s) | Meridian version(s) |
---|---|---|
1.x | Horizon 32.x | Meridian 2023.x |
The chart supports specifying a list of ConfigMaps with core.overlayConfigMaps
that will be copied to the OpenNMS container overlay directory in the init container. This can be used to provide configuration files for OpenNMS. There are two ways to provide content in each ConfigMap:
Provide one or more plain files (text and/or binary) in the ConfigMap and specify the directory where these files will be copied.
Here is a configuration example:
core:
overlayConfigMaps:
- name: "my-etc-files"
path: "etc"
Here is an example of how to create the ConfigMap:
instance=<helm release name> # make sure to set to your Helm release name
configmap=my-etc-files
mkdir etc
date > etc/testing-configmap
kubectl create configmap -n $instance $configmap --from-file=etc
Provide one or more ZIP files in the ConfigMap, and each will be extracted in alphabetical order at the root of the overlay directory.
Here is a configuration example:
core:
overlayConfigMaps:
- name: "my-zip-files"
unzip: true
Here is an example of how to create the ConfigMap:
instance=<helm release name> # make sure to set to your Helm release name
configmap=my-zip-files
mkdir -p zip/etc
dd if=/dev/zero bs=1k count=5000 of=zip/etc/lots-of-zeros # make a 5 MB test file
( cd zip && zip -r -o ../lots-of-zeros.zip . )
kubectl create configmap -n $instance $configmap --from-file=lots-of-zeros.zip
- This mechanism can be used only to add files. When
etc
files are copied into theonms-etc-pvc
PVC, removing a file from the ConfigMap will not cause the file in the PVC to be deleted. In this case, you will need to delete the file manually after updating the ConfigMap to remove the file. You can do this withkubectl exec -n $instance onms-core-0 -- rm etc/testing-configmap
. - ConfigMaps cannot contain recursive directory structures--only files. If you need to put files into multiple directories, each directory will need to be its own ConfigMap.
kubectl create configmap
will silently ignore subdirectories. - ConfigMaps can't be larger than 1 MB (see the note here. If you have more content, you will need to split it across multiple ConfigMaps or compressed into ZIP files.
- Use
kubectl delete configmap -n $instance $configmap
to delete an existing ConfigMap before updating. - After updating a ConfigMap, you will need to restart the pod; for example,
kubectl rollout restart -n $instance statefulset/onms-core
- You can use
kubectl get configmap -n $instance $configmap -o yaml
to view the ConfigMap that is created. - Due to file ownership, some files/directories might not be updatable in the container at runtime. A workaround is to build a modified container that updates permissions with
chmod -R g=u ...
on the affected files/directories. See the OpenNMS core Dockerfile for which directories have been updated to allow writes out of the box.
Key | Type | Default | Description |
---|---|---|---|
core.configuration.affinity | string | nil |
|
core.configuration.alecImage | object | {} |
|
core.configuration.alwaysRollDeployment | bool | true |
|
core.configuration.cortexTssImage | object | {} |
|
core.configuration.database.password | string | "0p3nNM5" |
|
core.configuration.database.poolSize | int | 50 |
|
core.configuration.database.username | string | "opennms" |
|
core.configuration.enableAcls | bool | false |
|
core.configuration.enableAlec | bool | false |
|
core.configuration.enableCortex | bool | false |
|
core.configuration.enableTssDualWrite | bool | false |
|
core.configuration.etcUpdatePolicy | string | "never" |
|
core.configuration.http.adminPassword | string | "admin" |
|
core.configuration.http.restPassword | string | "admin" |
|
core.configuration.http.restUsername | string | "opennms" |
|
core.configuration.nodeSelector | string | nil |
|
core.configuration.ports.karaf.enabled | bool | true |
|
core.configuration.ports.karaf.externalPort | int | 8101 |
|
core.configuration.ports.syslog.enabled | bool | true |
|
core.configuration.ports.syslog.externalPort | int | 10514 |
|
core.configuration.ports.trapd.enabled | bool | true |
|
core.configuration.ports.trapd.externalPort | int | 1162 |
|
core.configuration.rras[0] | string | "RRA:AVERAGE:0.5:1:2016" |
|
core.configuration.rras[1] | string | "RRA:AVERAGE:0.5:12:1488" |
|
core.configuration.rras[2] | string | "RRA:AVERAGE:0.5:288:366" |
|
core.configuration.rras[3] | string | "RRA:MAX:0.5:288:366" |
|
core.configuration.rras[4] | string | "RRA:MIN:0.5:288:366" |
|
core.configuration.storage.etc | string | "1Gi" |
|
core.configuration.storage.mibs | string | nil |
|
core.configuration.storage.rrd | string | "1000Gi" |
|
core.configuration.tolerations | string | nil |
|
core.env | object | {} |
Environment variables to set on the onms container. |
core.image.pullPolicy | string | "IfNotPresent" |
|
core.image.repository | string | "opennms/horizon" |
|
core.image.tag | string | "" |
|
core.initContainers | list | [] |
Experimental: a list of additional init containers |
core.inspector.enabled | bool | false |
|
core.overlayConfigMaps | list | [] |
|
core.postConfigJob.ttlSecondsAfterFinished | int | 300 |
|
core.resources.limits.cpu | string | "2" |
|
core.resources.limits.memory | string | "8Gi" |
|
core.resources.requests.cpu | string | "2" |
|
core.resources.requests.memory | string | "4Gi" |
|
core.terminationGracePeriodSeconds | int | 120 |
|
createNamespace | bool | false |
Whether to create the namespace when releaseNamespace=true. Has no effect otherwise. |
dependencies.clusterRole | bool | true |
|
dependencies.clusterRoleBinding | bool | true |
|
dependencies.cortex.bulkheadMaxWaitDuration | string | "9223372036854775807" |
|
dependencies.cortex.externalTagsCacheSize | int | 1000 |
|
dependencies.cortex.maxConcurrentHttpConnections | int | 100 |
|
dependencies.cortex.metricCacheSize | int | 1000 |
|
dependencies.cortex.organizationId | string | "" |
Specify the X-Scope-OrgID header. This will override the tenant name when multiTenant=true. |
dependencies.cortex.readTimeoutInMs | int | 1000 |
|
dependencies.cortex.readUrl | string | "http://cortex-query-frontend.shared.svc.cluster.local:8080/prometheus/api/v1" |
|
dependencies.cortex.writeTimeoutInMs | int | 1000 |
|
dependencies.cortex.writeUrl | string | "http://cortex-distributor.shared.svc.cluster.local:8080/api/v1/push" |
|
dependencies.elasticsearch.configuration.flows.indexStrategy | string | "daily" |
|
dependencies.elasticsearch.configuration.flows.numShards | int | 1 |
|
dependencies.elasticsearch.configuration.flows.replicationFactor | int | 0 |
|
dependencies.elasticsearch.hostname | string | "" |
|
dependencies.elasticsearch.password | string | "31@st1c" |
|
dependencies.elasticsearch.port | int | 9200 |
|
dependencies.elasticsearch.username | string | "elastic" |
|
dependencies.kafka.configuration.saslMechanism | string | "SCRAM-SHA-512" |
|
dependencies.kafka.configuration.securityProtocol | string | "SASL_SSL" |
|
dependencies.kafka.hostname | string | "" |
|
dependencies.kafka.password | string | "0p3nNM5" |
|
dependencies.kafka.port | int | 9093 |
|
dependencies.kafka.username | string | "opennms" |
|
dependencies.loki.caCert | string | "" |
|
dependencies.loki.hostname | string | "" |
|
dependencies.loki.password | string | "" |
|
dependencies.loki.port | int | 3100 |
|
dependencies.loki.username | string | "" |
|
dependencies.postgresql.caCert | string | "" |
|
dependencies.postgresql.hostname | string | "onms-db.shared.svc" |
|
dependencies.postgresql.password | string | "P0stgr3s" |
|
dependencies.postgresql.port | int | 5432 |
|
dependencies.postgresql.sslfactory | string | "org.postgresql.ssl.LibPQFactory" |
|
dependencies.postgresql.sslmode | string | "require" |
|
dependencies.postgresql.username | string | "postgres" |
|
dependencies.route | bool | true |
|
dependencies.securitycontext.allowPrivilegeEscalation | bool | true |
|
dependencies.securitycontext.allowedCapabilities[0] | string | "NET_BIND_SERVICE" |
|
dependencies.securitycontext.allowedCapabilities[1] | string | "CAP_NET_RAW" |
|
dependencies.securitycontext.securitycontextconstraints.enabled | bool | true |
|
dependencies.securitycontext.securitycontextconstraints.name | string | "opennms-scc" |
|
dependencies.securitycontext.serviceaccount.enabled | bool | true |
|
dependencies.securitycontext.serviceaccount.name | string | "opennms-sa" |
|
dependencies.truststore.content | string | "" |
|
dependencies.truststore.password | string | "0p3nNM5" |
|
domain | string | "example.com" |
|
grafana.configuration.database.image.pullPolicy | string | "IfNotPresent" |
|
grafana.configuration.database.image.repository | string | "postgres" |
|
grafana.configuration.database.image.tag | string | "13" |
|
grafana.configuration.database.password | string | "Gr@f@n@" |
|
grafana.configuration.database.sslmode | string | "require" |
|
grafana.configuration.database.username | string | "grafana" |
|
grafana.configuration.ui.adminPassword | string | "admin" |
|
grafana.image.pullPolicy | string | "IfNotPresent" |
|
grafana.image.repository | string | "opennms/helm" |
|
grafana.image.tag | string | "9.0.10" |
|
grafana.imageRenderer.image.pullPolicy | string | "IfNotPresent" |
|
grafana.imageRenderer.image.repository | string | "grafana/grafana-image-renderer" |
|
grafana.imageRenderer.image.tag | string | "latest" |
|
grafana.imageRenderer.replicaCount | int | 2 |
|
grafana.imageRenderer.resources.limits.cpu | string | "200m" |
|
grafana.imageRenderer.resources.limits.memory | string | "256Mi" |
|
grafana.imageRenderer.resources.requests.cpu | string | "100m" |
|
grafana.imageRenderer.resources.requests.memory | string | "128Mi" |
|
grafana.replicaCount | int | 0 |
|
grafana.resources.limits.cpu | string | "200m" |
|
grafana.resources.limits.memory | string | "1Gi" |
|
grafana.resources.requests.cpu | string | "100m" |
|
grafana.resources.requests.memory | string | "1Gi" |
|
imagePullSecrets | list | [] |
|
ingress.annotations | object | {} |
|
ingress.certManager.clusterIssuer | string | "opennms-issuer" |
|
ingress.className | string | "nginx" |
|
multiTenant | bool | false |
Enable multi-tenant mode. This will use the release name as the per-tenant identifier for the OpenNMS instance ID, databases, Kakfa topics, ElasticSearch indices, and Prometheus organization ID. |
promtail.image.pullPolicy | string | "IfNotPresent" |
|
promtail.image.repository | string | "grafana/promtail" |
|
promtail.image.tag | string | "latest" |
|
promtail.resources.limits.cpu | string | "50m" |
|
promtail.resources.limits.memory | string | "64Mi" |
|
releaseNamespace | bool | false |
Install resource objects into namespace named for the Helm release. See also createNamespace. |
sentinel.configuration.database.poolSize | int | 25 |
|
sentinel.image.pullPolicy | string | "IfNotPresent" |
|
sentinel.image.repository | string | "opennms/sentinel" |
|
sentinel.image.tag | string | "" |
|
sentinel.replicaCount | int | 0 |
|
sentinel.resources.limits.cpu | string | "2" |
|
sentinel.resources.limits.memory | string | "4Gi" |
|
sentinel.resources.requests.cpu | string | "2" |
|
sentinel.resources.requests.memory | string | "2Gi" |
|
sentinel.terminationGracePeriodSeconds | int | 60 |
|
timezone | string | "America/New_York" |
Autogenerated from chart metadata using helm-docs v1.11.3