ArmoniK

This Terraform module deploys ArmoniK Core components on Kubernetes. It manages the control plane, compute plane, and polling agents with their configurations and dependencies.

The module configures service networking, authentication, monitoring integration, and resource allocation for task processing. It supports deployment on cloud-based (AWS, GCP) and on-premise Kubernetes clusters.

Requirements

Name

Version

terraform

>= 1.0

helm

>= 2.10.1, < 3.0.0

kubernetes

>= 2.21.1

local

>= 2.1.0

random

>= 3.5.1

Providers

Name

Version

helm

>= 2.10.1, < 3.0.0

kubernetes

>= 2.21.1

local

>= 2.1.0

random

>= 3.5.1

Modules

Name

Source

Version

compute_aggregation

../utils/aggregator

n/a

compute_all_aggregation

../utils/aggregator

n/a

control_plane_aggregation

../utils/aggregator

n/a

control_plane_endpoint

../utils/service-ip

n/a

core_aggregation

../utils/aggregator

n/a

ingress

./ingress/

n/a

job_aggregation

../utils/aggregator

n/a

log_aggregation

../utils/aggregator

n/a

metrics_aggregation

../utils/aggregator

n/a

polling_agent_aggregation

../utils/aggregator

n/a

polling_all_aggregation

../utils/aggregator

n/a

worker_aggregation

../utils/aggregator

n/a

worker_all_aggregation

../utils/aggregator

n/a

Resources

Name

Type

helm_release.keda_hpa_compute_plane

resource

helm_release.keda_hpa_control_plane

resource

kubernetes_config_map.authmongo

resource

kubernetes_cron_job_v1.init

resource

kubernetes_cron_job_v1.partitions_in_database

resource

kubernetes_deployment.compute_plane

resource

kubernetes_deployment.control_plane

resource

kubernetes_deployment.metrics_exporter

resource

kubernetes_deployment.pod_deletion_cost

resource

kubernetes_job.authentication_in_database

resource

kubernetes_job.init

resource

kubernetes_job.partitions_in_database

resource

kubernetes_role.pod_deletion_cost

resource

kubernetes_role_binding.pod_deletion_cost

resource

kubernetes_service.control_plane

resource

kubernetes_service_account.pod_deletion_cost

resource

local_file.armonik_config

resource

local_sensitive_file.initial_auth_config

resource

random_string.common_name

resource

kubernetes_config_map.dns

data source

Inputs

Name

Description

Type

Default

Required

admin_gui

Parameters of the admin GUI

object({
name = optional(string, “admin-app”)
image = optional(string, “dockerhubaneo/armonik_admin_app”)
tag = string
port = optional(number, 1080)
limits = optional(map(string))
requests = optional(map(string))
service_type = optional(string, “ClusterIP”)
replicas = optional(number, 1)
image_pull_policy = optional(string, “IfNotPresent”)
image_pull_secrets = optional(string, “”)
node_selector = optional(map(string), {})
})

null

no

authentication

Authentication behavior

object({
name = optional(string)
image = optional(string)
tag = optional(string)
image_pull_policy = optional(string)
image_pull_secrets = optional(string)
node_selector = optional(any)
authentication_datafile = optional(string)
require_authentication = bool
require_authorization = bool
trusted_common_names = optional(set(string), [])
})

n/a

yes

chart_name

Name for chart

string

"keda-hpa"

no

chart_version

Version for chart

string

"0.1.0"

no

charts_repository

Path to the charts repository

string

"../charts"

no

compute_plane

Parameters of the compute plane

map(object({
partition_data = object({
priority = optional(number, 1)
reserved_pods = optional(number, 0)
max_pods = optional(number, 1)
preemption_percentage = optional(number, 0)
parent_partition_ids = optional(set(string), [])
pod_configuration = optional(map(string), {})
})
replicas = number
termination_grace_period_seconds = number
image_pull_secrets = string
node_selector = any
annotations = any
service_account_name = string
socket_type = optional(string, “unixdomainsocket”)
security = optional(object({
user = optional(number, 5000) # keep default user if set to -1
}), {})
polling_agent = object({
image = string
tag = string
image_pull_policy = string
limits = optional(map(string))
requests = optional(map(string))
conf = optional(any, {})
})
worker = list(object({
name = string
image = string
tag = string
image_pull_policy = string
limits = optional(map(string))
requests = optional(map(string))
conf = optional(any, {})
}))
cache_config = object({
memory = bool
size_limit = string # if larger than supported, the max value for the node will be used instead
})
node_cache = optional(object({
path = optional(string)
threshold = optional(number, 0)
}))
readiness_probe = optional(bool, false)
hpa = any
}))

n/a

yes

configurations

Extra configurations for the various components

object({
core = optional(any, [])
control = optional(any, [])
compute = optional(any, [])
worker = optional(any, [])
polling = optional(any, [])
log = optional(any, [])
metrics = optional(any, [])
jobs = optional(any, [])
})

n/a

yes

control_plane

Parameters of the control plane

object({
name = string
service_type = string
replicas = number
image = string
tag = string
image_pull_policy = string
port = number
limits = optional(map(string))
requests = optional(map(string))
image_pull_secrets = string
node_selector = any
annotations = any
hpa = any
default_partition = string
service_account_name = string
})

n/a

yes

environment_description

Description of the environment deployed

any

null

no

fluent_bit

the fluent-bit module output

object({
configmaps = object({
envvars = string
config = string
})
container_name = string
image = string
is_daemonset = bool
tag = string

windows_configmaps = object({
envvars = string
config = string
})
windows_container_name = string
windows_image = string
windows_is_daemonset = bool
windows_tag = string
})

null

no

grafana

the grafana module output

object({
host = string
port = string
url = string
})

null

no

ingress

Parameters of the ingress controller

object({
name = optional(string, “ingress”)
service_type = optional(string, “LoadBalancer”)
replicas = optional(number, 1)
image = optional(string, “nginxinc/nginx-unprivileged”)
tag = optional(string)
image_pull_policy = optional(string, “IfNotPresent”)
http_port = optional(number, 5000)
grpc_port = optional(number, 5001)
limits = optional(map(string))
requests = optional(map(string))
image_pull_secrets = optional(string, “”)
node_selector = optional(map(string))
annotations = optional(map(string))
tls = optional(bool, false)
mtls = optional(bool, false)
generate_client_cert = optional(bool, false)
custom_client_ca_file = optional(string, “”)
langs = optional(set(string), [“en”])
cors_allowed_host = optional(string, “*”)
cors_allowed_headers = optional(set(string), []) # Will be added to the default cors headers.
cors_allowed_methods = optional(set(string), [“GET”, “POST”, “OPTIONS”])
cors_preflight_max_age = optional(number, 1728000)
})

n/a

yes

init

Parameters of the init job

object({
name = optional(string, “init”)
image = string
tag = string
image_pull_policy = string
image_pull_secrets = string
node_selector = map(string)
annotations = map(string)
populate = optional(object({
partitions = optional(bool, true)
authentication = optional(bool, true)
}), {})
})

null

no

job_partitions_in_database

LEGACY: Job to insert partitions IDs in the database

object({
name = string
image = string
tag = string
image_pull_policy = string
image_pull_secrets = string
node_selector = any
annotations = any
})

null

no

keda_chart_name

Name of the Keda Helm chart

string

"keda"

no

load_balancer

Parameters of the Load Balancer deployment

object({
image = optional(string, “dockerhubaneo/armonik_load_balancer”)
tag = optional(string)
image_pull_policy = optional(string, “IfNotPresent”)
limits = optional(map(string))
requests = optional(map(string))
image_pull_secrets = optional(string, “”)
replicas = optional(number, 1)
node_selector = optional(map(string), {})
annotations = optional(map(string), {})
service = optional(object({
type = optional(string, “HeadLess”)
annotations = optional(map(string), {})
}))
labels = optional(map(string), {
app = “armonik”,
service = “load-balancer”
})
conf = optional(object({
listen_ip = optional(string)
listen_port = optional(number, 8081)
refresh_delay_seconds = optional(number)
sqlite_db_path = optional(string)
session_cache_size = optional(number)
result_cache_size = optional(number)
task_cache_size = optional(number)
log_format = optional(string)
}), {})
extra_env = optional(map(string))
})

null

no

logging_level

Logging level in ArmoniK

string

n/a

yes

metrics

the metrics exporter module output

object({
host = string
name = string
namespace = string
port = string
url = string
})

null

no

metrics_exporter

Parameters of Metrics exporter

object({
image = string
tag = string
image_pull_policy = optional(string, “IfNotPresent”)
image_pull_secrets = optional(string, “”)
node_selector = optional(any, {})
name = optional(string, “metrics-exporter”)
label_app = optional(string, “armonik”)
label_service = optional(string, “metrics-exporter”)
port_name = optional(string, “metrics”)
port = optional(number, 9419)
target_port = optional(number, 1080)
})

n/a

yes

metrics_server_chart_name

Name of the metrics-server Helm chart

string

"metrics-server"

no

namespace

Namespace of ArmoniK resources

string

n/a

yes

pod_deletion_cost

value

object({
image = string
tag = string
image_pull_policy = optional(string, “IfNotPresent”)
image_pull_secrets = optional(string, “”)
node_selector = optional(any, {})
annotations = optional(any, {})
name = optional(string, “pdc-update”)
label_app = optional(string, “armonik”)
prometheus_url = optional(string)
metrics_name = optional(string)
period = optional(number)
ignore_younger_than = optional(number)
concurrency = optional(number)
granularity = optional(number)
extra_conf = optional(map(string), {})
limits = optional(map(string))
requests = optional(map(string))
})

null

no

prometheus

the prometheus module output

object({
host = string
port = string
url = string
})

null

no

seq

the seq module output

object({
host = string
port = string
url = string
web_url = string
})

null

no

shared_storage_settings

the shared-storage configuration information

object({
file_storage_type = optional(string)
service_url = optional(string)
console_url = optional(string)
access_key_id = optional(string)
secret_access_key = optional(string)
name = optional(string)
must_force_path_style = optional(string)
host_path = optional(string)
file_server_ip = optional(string)
})

null

no

static

json files to be served statically by the ingress

any

{}

no

Outputs

Name

Description

armonik_config_file

Path to the generated ArmoniK configuration file

endpoint_urls

List of URL endpoints for: control-plane, Seq, Grafana and Admin GUI