Assembly Custom Resource
The Assembly CRD is used to define a scalable collection of data capture components and how they should coordinate amongst themselves.
Defining your own custom resource of kind: Assembly
Top level of the CR details the apiVersion of the CR and the kind.
Assembly name is set within metadata
apiVersion: insights.kx.com/v1
kind: Assembly
metadata:
name: market-data
labels:
env: dev
labels allows additional custom labels to be set on all resources created from this assembly file.
Validation on the CR fields is carried out on the apply of the CR.
kubectl apply -f marketdata.yaml
On successfully applying your Assembly, it can be seen by calling a get on the assemblies resource.
kubectl get assemblies
NAME DESCRIPTION READY STATUS AGE
market-data A KXI Assembly True 24m
All resources under your Assembly can be seen by using the shared label insights.kx.com/app=<APP NAME>
Where APP_NAME will be your Assembly name
kubectl get sts,pods,svc -l insights.kx.com/app=market-data
NAME READY AGE
statefulset.apps/market-data-dap-hdb 3/3 100s
statefulset.apps/market-data-dap-idb 3/3 110s
statefulset.apps/market-data-dap-rdb 3/3 109s
statefulset.apps/market-data-sm 1/1 111s
statefulset.apps/rt-market-data-north 1/1 117s
statefulset.apps/rt-market-data-south 1/1 117s
NAME READY STATUS RESTARTS AGE
pod/market-data-dap-hdb-0 2/2 Running 0 103s
pod/market-data-dap-hdb-1 2/2 Running 0 60s
pod/market-data-dap-hdb-2 2/2 Running 0 43s
pod/market-data-dap-idb-0 2/2 Running 0 113s
pod/market-data-dap-idb-1 2/2 Running 0 70s
pod/market-data-dap-idb-2 2/2 Running 0 51s
pod/market-data-dap-rdb-0 2/2 Running 0 112s
pod/market-data-dap-rdb-1 2/2 Running 0 53s
pod/market-data-dap-rdb-2 2/2 Running 0 22s
pod/market-data-sm-0 5/5 Running 0 114s
pod/rt-market-data-north-0 1/1 Running 0 2m
pod/rt-market-data-south-0 1/1 Running 0 2m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/market-data-dap-hdb ClusterIP 10.0.33.80 <none> 8080/TCP,5080/TCP 108s
service/market-data-dap-idb ClusterIP 10.0.35.111 <none> 8080/TCP,5080/TCP 117s
service/market-data-dap-rdb ClusterIP 10.0.32.127 <none> 8080/TCP,5080/TCP 117s
service/market-data-sm ClusterIP 10.0.34.170 <none> 8080/TCP,10001/TCP 2m3s
service/rt-market-data-north-0 ClusterIP 10.0.34.180 <none> 8080/TCP,5001/TCP,5002/TCP 2m9s
service/rt-market-data-south-0 ClusterIP 10.0.35.187 <none> 8080/TCP,5001/TCP,5002/TCP 2m4s
Assembly Configuration
Assembly components and resources are configured under the spec key of the Assembly CR.
Some fields are required and will alert you if missing when applying your Assembly.
Optional fields are defaulted by the Operator, but may be overridden as part of your Assembly.
spec:
description: "My Sample Assembly"
attach: true
env:
- name: CUSTOM_ENV_VAR
value: "customValue"
- name: ANOTHER_ENV_VAR
value: 123
spec.description
The description key is an optional string field, allowing you to give a brief description of your Assembly.
This field is used populate the description of the assembly config file read by each of the components.
| Key | Type | Required | Description | Default | Validation |
|---|---|---|---|---|---|
description |
string |
false |
Assembly description | "A KXI Assembly" |
Any string |
spec.env
The optional env key allows for Environment Variables to be set for all components within the Assembly.
Custom Environment Variables are listed below the key and will be appended to existing Environment Variables for each of the components created by the Assembly.
| Key | Type | Required | Description |
|---|---|---|---|
env |
list |
false |
List of Environment Variables |
Expected structure for each item:
- name: ENV_NAME
value: "A value"
spec.volumes
The optional volumes key allows for standard Kubernetes definitions of volumes to be applied to the Assembly.
Existing volumes may be added from outside of the Assembly CR.
| Key | Type | Required | Description |
|---|---|---|---|
volumes |
list |
false |
List of Kubernetes volumes |
spec.attach
The optional attach is a boolean field.
With this field set to true it allows users to attach to a container.
Sets the tty and stdin to true on each of the containers created by the Assembly.
| Key | Type | Required | Description | Default |
|---|---|---|---|---|
attach |
boolean |
false |
Enable tty and stdin |
false |
spec.tables
The tables key is an optional map field, allowing you to define each of the schema used within the Assembly.
Under they key tables each schema can be defined under its own key, representing the schema name.
spec:
...
tables:
trace:
description: Manufacturing trace data
type: partitioned
blockSize: 10000
prtnCol: updateTS
sortColsOrd: [sensorID]
sortColsDisk: [sensorID]
columns:
- name: sensorID
description: Sensor Identifier
type: int
attrMem: grouped
attrDisk: parted
attrOrd: parted
- name: readTS
description: Reading timestamp
type: timestamp
- name: captureTS
description: Capture timestamp
type: timestamp
- name: valFloat
description: Sensor value
type: float
- name: qual
description: Reading quality
type: byte
- name: alarm
description: Enumerated alarm flag
type: byte
- name: updateTS
description: Ingestion timestamp
type: timestamp
Top level schema keys
| Key | Type | Required | Description | Default | Validation |
|---|---|---|---|---|---|
description |
string |
false |
Description of table | "KXI Assembly Schema" |
Any string |
type |
string |
true |
Type of table | splayed or partitioned |
|
columns |
list |
true |
Columns of table | ||
prtnCol |
string |
true |
A timestamp column name used for data partitioning |
^[a-zA-Z0-9]+[a-zA-Z0-9_-]*[a-zA-Z0-9]+$ |
|
updTsCol |
string |
false |
A timestamp column name used for data latency monitoring |
^[a-zA-Z0-9]+[a-zA-Z0-9_-]*[a-zA-Z0-9]+$ |
|
blockSize |
integer |
false |
Number of rows to keep in-memory before write to disk | ||
primaryKeys |
[]string |
false |
Names of primary key columns | ^[a-zA-Z0-9]+[a-zA-Z0-9_-]*[a-zA-Z0-9]+$ |
|
sortColsMem |
[]string |
false |
Names of columns to sort on when stored in memory | ^[a-zA-Z0-9]+[a-zA-Z0-9_-]*[a-zA-Z0-9]+$ |
|
sortColsDisk |
[]string |
false |
Names of columns to sort on when stored on disk | ^[a-zA-Z0-9]+[a-zA-Z0-9_-]*[a-zA-Z0-9]+$ |
|
sortColsOrd |
[]string |
false |
Names of columns to sort on when stored on disk with an ordinal partition scheme | ^[a-zA-Z0-9]+[a-zA-Z0-9_-]*[a-zA-Z0-9]+$ |
spec.tables.columns
Under the columns key, columns within the schema are listed, detailing names and types.
| Key | Type | Required | Description | Default | Validation |
|---|---|---|---|---|---|
description |
string |
false |
Description of column | "KXI Assembly Schema Column" |
Any string |
name |
string |
true |
Name of column | ^[a-zA-Z0-9]+[a-zA-Z0-9_-]*[a-zA-Z0-9]+$ |
|
type |
string |
true |
Type of column | See below | |
attrMem |
string |
false |
Column attribute when stored in memory | sorted grouped parted or unique |
|
attrDisk |
string |
false |
Column attribute when stored on disk | sorted grouped parted or unique |
|
attrOrd |
string |
false |
Column attribute when stored on disk with an ordinal partition scheme | sorted grouped parted or unique |
|
anymap |
boolean |
false |
Allow mapped lists to nest within other mapped lists as described here |
The list of supported column type values is:
boolean guid byte short int long real float char symbol timestamp month date datetime timespan minute second time
booleans guids bytes shorts ints longs reals floats string symbols timestamps months dates datetimes timespans minutes seconds times
or leave blank for a mixed type.
spec.labels
The labels key is an optional map field, these provide a generic machine-readable representation of the purview of a given Assembly
spec:
...
labels:
type: basic
assetClass: tick
| Key | Type | Required | Description |
|---|---|---|---|
labels |
map |
false |
Key value pairs for Assembly file |
This field is used populate the labels field of the assembly file read by each of the components.
spec.mounts
The mounts key is an optional map field, allowing you to define mounts to be applied to Assembly.
If a mount is seen to have a valid file path, file:/// prefix, then a PVC will be created.
Under they key mounts each mount can be defined under its own key, representing the mount name.
spec:
mounts:
rdb:
type: stream
baseURI: none
partition: none
idb:
type: local
baseURI: file:///data/db/idb
partition: ordinal
volume:
storageClass: "rook-cephfs"
size: "20Gi"
accessModes:
- ReadWriteMany
hdb:
type: local
baseURI: file:///data/db/hdb
partition: date
dependency:
- idb
volume:
storageClass: "rook-cephfs"
size: "20Gi"
accessModes:
- ReadWriteMany
| Key | Type | Required | Description | Default | Validation |
|---|---|---|---|---|---|
type |
string |
true |
Mount type | stream local or object |
|
description |
string |
false |
A string describing the purpose of this mount | "KXI Assembly Mount" |
Any string |
baseURI |
string |
true |
URI representing where that data can be mounted by other services | Value of none or Filepath with prefix of either file:/// gs:// or ms:// |
|
partition |
string |
true |
Partitioning scheme for this mount | none ordinal date month year |
|
dependency |
[]string |
false |
If mounted to container, any additional mounts required would be taken from here | ||
volume |
object |
false |
Specifications for K8s PVC. See Mount Volumes |
dependency
Where a mount contains historical data, a dependency of the related intra-day data mount should be specified. This a requirement as of the intra-day mount being the source of the sym file.
spec.mounts.volume
Under each declared mount you are able to configure the necessary Persistent Volume
A pre-existing PVC may be mounted to the Assembly by using the claimName field.
Alternatively, populating the additional fields will create a new volume for you Assembly.
spec:
mounts:
...
data:
type: local
baseURI: file:///data/db/data
partition: date
volume:
claimName: data-db-rook-cephfs
hdb:
type: local
baseURI: file:///data/db/hdb
partition: date
dependency:
- idb
volume:
storageClass: "rook-cephfs"
size: "20Gi"
accessModes:
- ReadWriteMany
| Key | Type | Required | Description | Default |
|---|---|---|---|---|
claimName |
string |
false |
Pre-existing PVC claim name | |
storageClass |
string |
false |
K8s Storage Class | rook-cephfs |
size |
string |
false |
K8s Storage size request | "20Gi" |
accessModes |
[]string |
false |
Requested k8s access modes for PVC | ReadWriteOnce |
spec.bus
The bus key is an optional map field, allowing you to define buses to be applied to Assembly.
The operator will populate bus configuration from a subset of the configuration set under the spec.elements.sequencer field.
The bus field provides information about whatever EMS-like system (or systems) is available to elements within this Assembly for communication.
spec:
...
bus:
north:
protocol: rt
description: north Sequencer
topic: basic-assembly-north
topicPrefix: rt-
nodes:
- rt-basic-assembly-north-0:5001
| Key | Type | Required | Description | Default | Validation |
|---|---|---|---|---|---|
protocol |
string |
true |
String indicating the protocol of the messaging system | custom kraftmq aeron or rt |
|
description |
string |
false |
A string describing the purpose of this Bus | "Assembly communication bus" |
Any string |
topic |
string |
false |
A string indicating the subset of messages in this stream that consumers are interested in | ^[a-z0-9]+[a-z0-9-]*[a-z0-9]+$ |
|
topicPrefix |
string |
false |
Prefix to apply to Service name for Sequencer. Prefix followed by a required "-" | ^[a-z0-9]+[a-z0-9-]*[a-z0-9]+-+$ |
|
nodes |
[]string |
false |
A list of one or more connection strings to machines/services which can be used for subscribing to | ||
credentials |
string |
false |
An environment variable indicating where elements should look for credentials related to this bus, if any are needed | Any string | |
uri |
string |
false |
A URI describing an endpoint/connection string with which to make requests to a bus | Any string |
spec.elements
The elements key is a map field, allowing you to define each of the components to be deployed as part of the Assembly.
spec:
...
elements:
....
| Key | Type | Required | Description |
|---|---|---|---|
elements |
map |
true |
Map of component specifications within Assembly |
spec.elements.dap
The dap field under elements allows you to optionally define DA instances within the Assembly.
The operator may be supplied image and port configuration details during installation, but these can be overridden within your Assembly CR.
spec:
...
elements:
dap:
instances:
idb:
size: 3
mountName: idb
hdb:
size: 3
mountName: hdb
rdb:
size: 3
tableLoad: empty
mountName: rdb
source: south
| Key | Type | Required | Description | Default | Validation |
|---|---|---|---|---|---|
instances |
map |
false |
Map containing specifications on individual DA instances. |
spec.elements.dap.instances
Under they key instances each DA instance can be defined under its own key, representing the instance name.
The operator will have defaults set for dap at install time, these cover target ports and image details.
spec:
...
elements:
dap:
instances:
idb:
size: 3
mountName: idb
| Key | Type | Required | Description | Default | Validation |
|---|---|---|---|---|---|
size |
integer |
false |
Size of the StatefulSet to be deployed | 3 |
Minimum 1 |
image |
object |
false |
Image details for container. See Container Image | ||
env |
list |
false |
List of Environment Variables | ||
args |
[]string |
false |
Command line args to be passed to container | ||
mountName |
string |
false |
Name of mount as defined in spec.mounts | ^[a-z0-9]+[a-z0-9-]*[a-z0-9]+$ |
|
source |
string |
false |
Sequencer Bus to subscribe to as defined in spec.bus | ^[a-z0-9]+[a-z0-9-]*[a-z0-9]+$ |
|
config |
map |
false |
Key-Value pair string map, allowing additional entries to the instance's assembly file | ||
rtLogVolume |
object |
false |
RT Logs volume. See RT Logs Volume | ||
volumeMounts |
list |
false |
List of standard Kubernetes Volume Mount definitions. Volume must be present in spec.volumes | ||
customFile |
string |
false |
Path to additional file for DAP to load. May be full path or use mount name. e.g /full/path/file.q or $volumemount/file.q |
^(\/\|\$[a-z0-9]([-a-z0-9]*[a-z0-9[])?)[a-zA-z0-9-_.\/]*.q[_]?$ |
|
k8sPolicy |
object |
false |
Kubernetes Pod configurations. See k8sPolicy |
spec.elements.sm
The sm field under elements allows you to optionally define a Storage Manager instance within the Assembly.
The operator will have defaults set for sm at install time, these cover target ports and image details.
sm:
size: 1
source: south
tiers:
- name: streaming
mount: rdb
- name: interval
mount: idb
schedule:
freq: 00:10:00
snap: 00:00:00
- name: recent
mount: hdb
schedule:
freq: 1D00:00:00
snap: 01:35:00
retain:
time: 3 Months
| Key | Type | Required | Description | Default | Validation |
|---|---|---|---|---|---|
image |
object |
false |
Image details for container. See Container Image | ||
env |
list |
false |
List of Environment Variables | ||
args |
[]string |
false |
Command line args to be passed to SM container | ||
eoi |
object |
false |
SM EOI container details, see SM Sub Containers for details | ||
eod |
object |
false |
SM EOD container details, see SM Sub Containers for details | ||
dbm |
object |
false |
SM DBM container details, see SM Sub Containers for details | ||
source |
string |
true |
Either a URI pointed at a static data source or the name of an entry in bus from which to obtain streaming data | ^[a-z0-9]+[a-z0-9-]*[a-z0-9]+$ |
|
enforceSchema |
boolean |
false |
Enforce table schemas when persisting (with performance penalty; intended for debugging) | ||
chunkSize |
integer |
false |
Chunk size employed by SM when writing tables | Minimum 0 | |
sortLimitGB |
integer |
false |
Memory limit when sorting splayed tables or partitions on disk, in GB | Minimum 0 | |
waitTm |
integer |
false |
Time between connection attempts in milliseconds | Minimum 0 | |
eodPeachLevel |
string |
false |
Level at which EOD peaches to parallelise HDB table processing | part or table |
|
disableREST |
boolean |
false |
Disables REST interface - only qIPC will be supported | ||
config |
map |
false |
Key-Value pair string map, allowing additional entries to the instance's assembly file | ||
rtLogVolume |
object |
false |
RT Logs volume. See RT Logs Volume | ||
tiers |
list |
true |
A list of storage tiers. See SM Tiers | ||
volumeMounts |
list |
false |
List of standard Kubernetes Volume Mount definitions. Volume must be present in spec.volumes | ||
k8sPolicy |
object |
false |
Kubernetes Pod configurations. See k8sPolicy |
spec.elements.sm.container
The Storage Manager element is a multi container StatefulSet. sm being the main container, configured at the top level within the SM element.
The additional sub containers of eoi, eod and dbm may be configured within a sub container object.
sm:
...
eoi:
args:
eod:
args:
...
| Key | Type | Required | Description |
|---|---|---|---|
image |
object |
false |
Image details for container. See Container Image |
port |
integer |
false |
Integer representing port of container |
args |
[]string |
false |
Command line args to be passed to EOI container |
env |
list |
false |
List of Environment Variables |
volumeMounts |
list |
false |
List of standard Kubernetes Volume Mount definitions. Volume must be present in spec.volumes |
resources |
object |
false |
Set a container resource limits and requests. See k8sPolicy.resources for details on the resources key. |
spec.elements.sm.tiers
The Storage Manager element requires that tiers are configured.
Tiers describe the locality, segmentation format, and rollover configuration of each storage tier.
The tiers object is a list, with multiple entries defined.
sm:
...
tiers:
- name: streaming
mount: rdb
- name: interval
mount: idb
schedule:
freq: 00:10:00
snap: 00:00:00
- name: recent
mount: hdb
schedule:
freq: 1D00:00:00
snap: 01:35:00
retain:
time: 3 Months
| Key | Type | Required | Description | Validation |
|---|---|---|---|---|
name |
string |
true |
A string used to refer to a particular tier | ^[a-z0-9]+[a-z0-9-]*[a-z0-9]+$ |
description |
string |
false |
A string describing the purpose of this tier | Any string |
store |
string |
false |
A URI describing where this tier will physically store data | Value of realtime or Filepath with prefix of either file:/// gs:// or ms:// |
mount |
string |
true |
The name of a corresponding mounts entry | ^[a-z0-9]+[a-z0-9-]*[a-z0-9]+$ |
schedule |
object |
false |
Policy for when rollovers should be considered. See Tier Schedule | |
retain |
object |
false |
Policy for how much data should be stored in this tier before it is rolled over into the next tier. See Tier Retain | |
compression |
object |
false |
Policy for compression of data, if any. See Tier Compression |
spec.elements.sm.tiers.schedule
A tiers schedule object defines a tiers rollover policy.
Rollover can take place at a set frequency and/or at snapshot intervals.
sm:
...
tiers:
- name: streaming
store: realtime
- name: interval
mount: idb
schedule:
freq: 00:10:00
snap: 00:00:00
| Key | Type | Required | Description | Validation |
|---|---|---|---|---|
freq |
string |
false |
A timespan, in Q notation. How often should this tier roll data over into the next tier - e.g. 00:00:00 or 0D00:00:00 format | ^([0-9]*D)?([0-1]?[0-9]\|2[0-3]):[0-5][0-9]:[0-5][0-9]$ |
snap |
string |
false |
A time, in Q notation. At what whole multiples of time should rollovers be scheduled - e.g. 00:00:00 or 0D00:00:00 format | ^([0-9]*D)?([0-1]?[0-9]\|2[0-3]):[0-5][0-9]:[0-5][0-9]$ |
spec.elements.sm.tiers.retain
A tiers retain object defines a tiers policy on data retention, before being rolled over into another tier.
sm:
...
tiers:
- name: recent
mount: hdb
retain:
time: 3 Months
| Key | Type | Required | Description | Validation |
|---|---|---|---|---|
time |
string |
false |
A timespan consisting of a number followed by a unit, e.g. 2 Years. Rollover occurs for data which has been stored for this length of time | ^[1-9]+[0-9]* ?(Years\|Months\|Weeks\|Days\|Hours\|Minutes)$ |
size |
string |
false |
A size in byte units consisting of a number followed by a unit {EB,TB,GB,MB,KB}, e.g. 2 TB. Rollover occurs for data which would exceed this permitted capacity | ^[1-9]+[0-9]* ?(EB\|TB\|GB\|MB\|KB)$ |
sizePct |
integer |
false |
A size as percentage of total storage of corresponding mount, specified as a number from 1 to 100 | 1 - 100 |
rows |
integer |
false |
Rollover occurs for data beyond this number of rows | Minimum 1 |
spec.elements.sm.tiers.compression
A tiers compression object defines a tiers policy on data compression. The compression policy currently applies only to tiers associated with a mount of type:local and partition:date
sm:
...
tiers:
- name: recent
mount: hdb
compression:
algorithm: gzip
level: 9
block: 1000
| Key | Type | Required | Description | Validation |
|---|---|---|---|---|
algorithm |
string |
false |
A compression algorithm | none, qipc, gzip, snappy or lz4hc |
block |
integer |
false |
Block size | |
level |
integer |
false |
Compression level |
spec.elements.sequencer
The sequencer field under elements allows you to optionally define multiple Sequencer instances within the Assembly.
The operator will have defaults set for sequencer at install time, these cover target ports and image details.
Under they key sequencer each Sequencer instance can be defined under its own key, representing the instance name.
spec:
...
elements:
...
sequencer:
north:
size: 3
external: true
protocol: "rt"
topicConfig:
subTopic: "data"
| Key | Type | Required | Description | Default | Validation |
|---|---|---|---|---|---|
size |
integer |
false |
Size of the StatefulSet to be deployed | 3 |
Limited to 3 |
external |
boolean |
true |
External facing Sequencer, setting true enables External IP | "false" |
|
image |
object |
false |
Image details for container. See Container Image | ||
env |
list |
false |
List of Environment Variables | ||
args |
[]string |
false |
Command line args to be passed to container | ||
topicConfig |
object |
false |
Sequencer Topic Configurations See Sequencer Topics Config | ||
volume |
object |
false |
RT Sequencer directory paths. See RT Volume | ||
topicConfigDir |
string |
false |
Location of RT 'pull' directory | "/config/topics/" |
^[\/]+[a-zA-Z0-9\/-_]*$ |
sideCarOverrides |
object |
false |
Override Enabling Side Car for Sequencer instance | ||
sideCarOverrides.metrics |
boolean |
false |
Enable metrics for Sequencer | ||
sideCarOverrides.discovery |
boolean |
false |
Enable discovery for Sequencer | ||
volumeMounts |
list |
false |
List of standard Kubernetes Volume Mount definitions. Volume must be present in spec.volumes | ||
k8sPolicy |
object |
false |
Kubernetes Pod configurations. See k8sPolicy | ||
archiver |
object |
false |
Sequencer Archiver. See Sequencer Archiver |
spec.elements.sequencer.topicConfig
The topicConfig object allows the topic configuration to be set for a Sequencer.
This is the topic subscribed to by the sequencer and published.
spec:
...
elements:
...
sequencer:
south:
external: false
subTopic: "north"
north:
external: true
topicConfig:
subTopic: "data"
topic: "north"
| Key | Type | Required | Description | Default | Validation |
|---|---|---|---|---|---|
topicPrefix |
string |
false |
Prefix to apply to Service name for Sequencer. Prefix followed by a required "-" | "rt-" |
^[a-z0-9]+[a-z0-9-]*[a-z0-9]+-+$ |
subTopic |
string |
false |
Topic for Sequencer to subscribe to | ^[a-z0-9]+[a-z0-9-]*[a-z0-9]+$ |
|
topic |
string |
false |
Topic for generated by Sequencer | ^[a-z0-9]+[a-z0-9-]*[a-z0-9]+$ |
|
externalTopicPrefix |
string |
false |
Prefix to apply to Service name for Sequencer.Prefix followed by a required "-" | ^[a-z0-9]+[a-z0-9-]*[a-z0-9]+-+$ |
spec.elements.sequencer.volume
The volume object allows you to configure the Sequencers RT log volume. This is the volume container the sequencer logs for state, subscribing and publishing topics.
spec:
...
elements:
...
sequencer:
south:
volume:
mountPath: "/s/"
subPaths:
in: "in"
out: "out"
cp: "state"
size: "20Gi"
| Key | Type | Required | Description | Default | Validation |
|---|---|---|---|---|---|
mountPath |
string |
false |
Mount location of volume | "/s/" |
^[\/]+[a-zA-Z0-9\/-_]*$ |
accessModes |
[]string |
false |
Requested k8s access modes for PVC | ||
storageClass |
string |
false |
K8s Storage Class | ||
size |
string |
false |
K8s Storage size request | "20Gi" |
|
subPaths |
object |
false |
Sub directories under Mount location | ||
subPaths.in |
string |
false |
Location of RT 'in' sub directory | "in" |
^[a-zA-Z0-9-_]+$ |
subPaths.out |
string |
false |
Location of RT 'out' sub directory | "out" |
^[a-zA-Z0-9-_]+$ |
subPaths.cp |
string |
false |
Location of RT 'cp' sub directory | "state" |
^[a-zA-Z0-9-_]+$ |
spec.elements.sequencer.archiver
Each Sequencer has the option to enable and Archiver deployment. This Archiver deployment is used for clearing the Sequencers log file, based on log size or age.
spec:
...
elements:
...
sequencer:
south:
archiver:
enabled: true
retentionDuration: 10080
maxLogSize: 5
| Key | Type | Required | Description | Default | Validation |
|---|---|---|---|---|---|
enabled |
boolean |
false |
Enable Sequencer Archiver | ||
size |
integer |
false |
Sequencer Archiver deployment replica count | 1 |
|
image |
object |
false |
Image details for container. See Container Image | ||
env |
list |
false |
List of Environment Variables | ||
retentionDuration |
integer |
false |
Log retention in minutes | ||
maxLogSize |
string |
false |
Maximum log size | ^([+-]?[0-9.]+)([eEinukmgtpKMGTP]*[-+]?[0-9]*)$ |
|
inDir |
string |
false |
Archiver 'in' directory | "/s/in" |
|
inDirSize |
string |
false |
emptyDir size for Archiver | "20Gi" |
^([+-]?[0-9.]+)([eEinumkKMGTP]*[-+]?[0-9]*)$ |
port |
integer |
false |
Integer representing port of container | 0-65536 |
spec.elements.sp
The sp field under elements allows you to optionally define Stream Processor pipelines within the Assembly.
The operator will have defaults set for sp at install time, these cover target ports and image details.
spec:
...
elements:
...
sp:
description: Processor of streams
pipelines:
sdtransform:
type: spec
protectedExecution: false
source: north
destination: south
minWorkers: 1
maxWorkers: 1
workerThreads: 4
spec: |-
sensor: ([]sensorID:`g#"i"$();extSensorID:`$();name:`$();typ:"x"$();createTS:"p"$();updateTS:"p"$());
trace: ([]sensorID:`g#"i"$();readTS:"p"$();captureTS:"p"$();valFloat:"f"$();qual:"h"$();alarm:"x"$();updateTS:"p"$());
.enum.alarm:``NORMAL`HIGH!(::;0x01;0x02)
.enum.qual:``GOOD!(::;0x01)
// Incoming event format
// list(symbol;dict)
// Transformations:
// - format into table
// - scale values
// - translate timestamps
// - set alarm based off values
// - sort by sensorID and readTS
traceMapFn:{
rawData:x 1;
svals:rawData[`val]*rawData`scaling;
rts:rawData[`ts]+rawData`timeOffset;
(`trace;
`sensorID`readTS xasc flip cols[trace]!(rawData`id;rts;rawData`ts;svals;.enum.qual`GOOD;
?[5000f<svals;.enum.alarm`HIGH;.enum.alarm`NORMAL];.z.p)
)
}
logLatency:{
if[count l:.qsp.get[`latencyCacher; ::];log.info("Approximate ingress ems latency, %N";l)];
}
.tm.add[`latency;(`logLatency;::);10000;0];
.qsp.run
.qsp.read.fromRT[]
.qsp.map[{[op;md;data] .qsp.set[op;md;.z.p-data 2];data}; .qsp.use`name`state!(`latencyCacher; ())]
.qsp.filter[{`trace=x 0}]
.qsp.map[traceMapFn]
.qsp.write.toRT[]
| Key | Type | Required | Description | Default | Validation |
|---|---|---|---|---|---|
description |
string |
false |
SP Workers description | "SP Pipelines" |
Any string |
pipelines |
map |
false |
Map of SP Pipelines |
spec.elements.sp.pipelines
Under they key pipelines each Pipeline can be defined under its own key, representing the pipeline name.
| Key | Type | Required | Description | Validation |
|---|---|---|---|---|
type |
string |
false | Set Pipeline type | graph or spec |
group |
string |
false | Groups a pipeline into a set of replicas that have a matching group id | ^[a-z0-9]+[a-z0-9-]*[a-z0-9]+$ |
env |
list |
false |
List of Environment Variables | |
protectedExecution |
boolean |
false |
Enable Protected Execution | |
secrets |
[]string |
false |
Pre-configured Kubernetes secrets to inject into pipeline | ^[a-z0-9]+[a-z0-9-]*[a-z0-9]+$ |
configMaps |
[]string |
false |
Pre-configured Kubernetes config maps to inject into pipeline | ^[a-z0-9]+[a-z0-9-]*[a-z0-9]+$ |
imagePullSecrets |
[]string |
false |
Pre-configured Kubernetes imagePullSecrets to inject into pipeline | ^[a-z0-9]+[a-z0-9-]*[a-z0-9]+$ |
base |
string |
false |
Sets the pipeline worker image to one of the prebuilt workers depending on language and functionality. Supported platforms are q, machine learning + q or Python. | q, q-ml, py or py-ml |
controllerImage |
object |
false |
Override the default Controller Image. See Container Image | |
workerImage |
object |
false |
Override the default Worker Image. See Container Image | |
minWorkers |
integer |
false |
Minimum worker instances | Minimum 1 |
maxWorkers |
integer |
false |
Maximum worker instances | Minimum 1 |
workerThreads |
integer |
false |
Worker thread count | Minimum 1 |
spec |
string |
true |
Pipeline spec | |
source |
string |
false |
Sequencer Bus to subscribe to | ^[a-z0-9]+[a-z0-9-]*[a-z0-9]+$ |
destination |
string |
false |
Sequencer Bus to publish to | ^[a-z0-9]+[a-z0-9-]*[a-z0-9]+$ |
persistence |
object |
false |
Persistence configuration for controller and worker containers, See SP Persistence | |
config |
map |
false |
Key-Value pair string map, allowing additional entries to the instance's assembly file | |
controllerK8sPolicy |
object |
false |
Kubernetes Pod configurations. See k8sPolicy | |
workerK8sPolicy |
object |
false |
Kubernetes Pod configurations. See k8sPolicy |
spec.elements.sp.pipelines.persistence
The SP persistence object allows you to define checkpoints for both the controller and worker within a pipeline.
A PVC may be defined as well as the frequency of each checkpoint.
spec:
...
elements:
...
sp:
description: Processor of streams
pipelines:
sdtransform:
persistence:
controller:
disabled: false
checkpointFreq: 1000
size: "100Gi"
class: ""
worker:
disabled: true
| Key | Type | Required | Description | Validation |
|---|---|---|---|---|
controller |
object |
false |
Persistence configuration for controller container | |
controller.disabled |
boolean |
false |
Disable persistence for controller | |
controller.checkpointFreq |
integer |
false |
Checkpoint frequency in milliseconds | |
controller.size |
string |
false |
Volume size for checkpoint | ^([+-]?[0-9.]+)([eEinumkKMGTP]*[-+]?[0-9]*)$ |
controller.class |
string |
false |
Requested volume Storage class | |
worker |
object |
false |
Persistence configuration for worker container | |
worker.disabled |
boolean |
false |
Disable persistence for worker | |
worker.checkpointFreq |
integer |
false |
Checkpoint frequency in milliseconds | |
worker.size |
string |
false |
Volume size for checkpoint | ^([+-]?[0-9.]+)([eEinumkKMGTP]*[-+]?[0-9]*)$ |
worker.class |
string |
false |
Requested volume Storage class |
Advanced Configurations
Defaults supplied by the operator during installation may be overridden within your Assembly CR definition.
Element Container
Each element will have a least one image field.
Some elements will have the option to define multiple images, in relation their deployment.
Each of those image fields share the same structure.
spec:
...
image:
repo: "image.repo.custom.com/"
component: "component"
tag: "1.2.3"
| Key | Type | Required | Description |
|---|---|---|---|
repo |
string |
false |
Image repository |
component |
string |
false |
Image component name |
tag |
string |
false |
Image tag |
RT Logs Volume
Each element that subscribes or published to the Sequencer create a PVC for storing Sequencer logs.
spec:
...
rtLogVolume:
mountPath: "/logs/rt/"
persistLogs: true
size: "20Gi"
| Key | Type | Required | Description | Default | Validation |
|---|---|---|---|---|---|
persistLogs |
boolean |
false |
Create PVC for RT Logs | true |
|
mountPath |
string |
false |
Mount location of volume | "/logs/rt/" |
^[\/]+[a-zA-Z0-9\/-_]*$ |
accessModes |
[]string |
false |
Requested k8s access modes for PVC | ReadWriteOnce |
|
storageClass |
string |
false |
K8s Storage Class | ||
size |
string |
false |
K8s Storage size request | "20Gi" |
spec.sandbox
The operator may deploy Assemblies as sandboxes.
The sandbox key is an optional boolean field. It tells the Operator to deploy Assembly as Sandbox, setting mounts to Read Only and prevents PVCs from being created.
spec:
sandbox: true
| Key | Type | Required | Description |
|---|---|---|---|
sandbox |
boolean |
false |
Deploy Assembly as a sandbox |
spec.imagePullSecrets
The operator may be supplied imagePullSecrets during installation.
The optional list field imagePullSecrets allows additional secrets to be supplied for this Assembly.
spec:
imagePullSecrets:
- name: image-secret-cred
| Key | Type | Required | Description |
|---|---|---|---|
imagePullSecrets |
list |
false |
List of image pull secrets |
spec.imagePullPolicy
The optional string field imagePullPolicy allows the image pull policy to be set for all Assembly components. Kubernetes by default will apply IfNotPresent.
spec:
imagePullPolicy: "Always"
| Key | Type | Required | Description |
|---|---|---|---|
imagePullPolicy |
string |
false |
Image pull policy to apply to all components |
spec.podSecurityContext
Under the spec key of the CR, you define the podSecurityContext for your Assembly.
spec:
podSecurityContext:
fsGroup: 1000
runAsUser: 1000
The podSecurityContext key is optional. When provided it allows the user to set fsGroup key and runAsUser key for their Assembly.
| Key | Type | Required | Description |
|---|---|---|---|
podSecurityContext |
object |
false |
Pod Security |
podSecurityContext.fsGroup |
integer |
false |
Any files within Assembly will be owned by this user ID |
podSecurityContext.runAsUser |
integer |
false |
Any Containers in the Assembly, all processes run with this user ID |
Defaults or set values will be applied to all resources created from the Assembly.
spec.license
The operator may be supplied license details for the KX On Demand License during installation.
The optional license key allows custom license details to be applied to the Assembly. These will be used for each of the components created from the Assembly.
spec:
license:
lic_user: "User Name"
lic_email: "u.name@custom.com"
lic_secret: "my-kx-secret"
lic_type: "onDemand"
kxAcct: "insights.kx-acc-svc:5000"
| Key | Type | Required | Description |
|---|---|---|---|
license |
object |
false |
KX License details |
license.lic_user |
string |
false |
License owner name |
license.lic_email |
string |
false |
License owner e-mail address |
license.lic_secret |
string |
false |
Name of pre-existing secret containing KX License |
license.lic_type |
string |
false |
Name of pre-existing secret containing KX License |
license.kxAcct |
string |
false |
KX Account aggregator service endpoint |
spec.qlog
The operator may be supplied qlog configuration during installation.
Custom configuration for qlog may be set within the Assembly.
Qlog configuration is applied to all containers created by the Assembly.
spec:
...
qlog:
directory: "/opt/kx/config"
formatMode: "text"
endpoints:
- "fd://stdout"
routings:
ALL: "INFO"
Each default can be overridden by setting the relevant key under qlog
| Key | Type | Required | Description | Default | Validation |
|---|---|---|---|---|---|
directory |
string |
false |
Directory path to mount qlog config | "/opt/kx/config" |
^[\/]+[a-zA-Z0-9\/-_]*$ |
endpoints |
[]string |
false |
List of endpoints (can provide multiple) | {"fd://stdout"} |
|
formatMode |
string |
false |
QLog logging format | "json" |
text or json |
routings |
map |
false |
ALL is the default routing, can also use ALL as a wildcard for all levels |
{"":"INFO"} |
spec.sideCar
The operator may be supplied sideCar configuration during installation.
Custom configuration for sideCar may be set within the Assembly.
Sidecar configuration is applied to all containers created from the Assembly.
spec:
...
sideCar:
image:
repo: "image.repo.custom.com/"
component: "kxi-sidecar"
tag: "0.9.0"
port: 8080
frequencySecs: 5
configDir: "/opt/app/config/"
| Key | Type | Required | Description | Default | Validation |
|---|---|---|---|---|---|
image |
object |
false |
Image details for Side Car container | ||
image.repo |
string |
false |
Image repository | ||
image.component |
string |
false |
Image component name | ||
image.tag |
string |
false |
Side Car image tag | ||
port |
integer |
false |
Side Car container port | "8080" |
|
frequencySecs |
integer |
false |
Frequency of connection attempt from Side Car to main container | 5 |
|
configDir |
string |
false |
Mount location of Side Car configuration map | "/opt/kx/sideCarConfig/" |
spec.discovery
The operator may be supplied discovery configuration during installation.
Custom configuration for discovery may be set within the Assembly.
Discovery configuration is applied to all containers created from the Assembly.
spec:
...
discovery:
enabled: true
registry: "kxi-discovery-service:8761"
heartbeatSecs: 30
leaseExpirySecs: 90
callTimeoutSecs: 10
maxPeriodRetrySecs: 30
refreshServicesSecs: 60
| Key | Type | Required | Description | Default | Validation |
|---|---|---|---|---|---|
enabled |
boolean |
false |
Enable Discovery on each of the Assembly components | ||
callTimeoutSecs |
integer |
false |
Time until a REST request to Discovery Service is considered timed out in seconds | 10 |
|
heartbeatSecs |
integer |
false |
Rate at which the heartbeat request to the Discovery service is made in seconds | 30 |
|
leaseExpirySecs |
integer |
false |
Defines the period of time the Discovery service will wait before after a failed heartbeat before evicting the application | 90 |
|
maxPeriodRetrySecs |
integer |
false |
Maximum period of time in seconds between REST request retires to Discovery Service | 30 |
|
refreshServicesSecs |
integer |
false |
Time in seconds between Services refresh from Discovery Service | 60 |
|
registry |
string |
false |
Discovery Service URL |
spec.metrics
The operator may be supplied metrics configuration during installation.
Custom configuration for metrics may be set within the Assembly.
Metrics configuration is applied to all containers created from the Assembly.
spec:
...
metrics:
enabled: true
frequency: 5
handler:
po: true
pc: true
wo: true
wc: true
pg: true
ps: true
ws: true
ph: true
pp: true
ts: true
serviceMonitor:
enabled: true
interval: "10s"
path: "/metrics"
release: kx-prom
| Key | Type | Required | Description | Default | Validation |
|---|---|---|---|---|---|
enabled |
boolean |
false |
Enable metrics on each of the Assembly components | ||
frequency |
integer |
false |
Frequency in seconds that Side Car will scrape metrics from main container | 5 |
|
handler |
map |
false |
Enable or disable capture of .z. handler metrics |
||
handler.po |
boolean |
false |
Enable metrics collection of the .z.po handler | true |
|
handler.pc |
boolean |
false |
Enable metrics collection of the .z.pc handler | true |
|
handler.wo |
boolean |
false |
Enable metrics collection of the .z.wo handler | true |
|
handler.wc |
boolean |
false |
Enable metrics collection of the .z.wc handler | true |
|
handler.pg |
boolean |
false |
Enable metrics collection of the .z.pg handler | true |
|
handler.ps |
boolean |
false |
Enable metrics collection of the .z.ps handler | true |
|
handler.ws |
boolean |
false |
Enable metrics collection of the .z.ws handler | true |
|
handler.ph |
boolean |
false |
Enable metrics collection of the .z.ph handler | true |
|
handler.pp |
boolean |
false |
Enable metrics collection of the .z.pp handler | true |
|
handler.ts |
boolean |
false |
Enable metrics collection of the .z.ts handler | true |
|
serviceMonitor |
map |
false |
Service monitor details for Assembly | ||
serviceMonitor.enabled |
boolean |
false |
Enable the Service Monitor resource for the Assembly components | ||
serviceMonitor.interval |
string |
false |
Service monitor scrape interval | "10s" |
^((([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?\|0)$ |
serviceMonitor.path |
string |
false |
Service monitor target metics endpoint | "/metrics" |
^[\/]+[a-zA-Z0-9-_]*[a-zA-Z0-9]+$ |
serviceMonitor.release |
string |
false |
Existing prometheus release name | ^[a-zA-Z0-9]+[a-zA-Z0-9-]*[a-zA-Z0-9]+$ |
spec.resourceAnnotation
The optional object field resourceAnnotation allows annotations to be defined for each of the Assembly resources.
Any resource generated by this Assembly will have these annotations defined.
spec:
resourceAnnotation:
simple.annotation: value
k8sPolicy
Each element defined within the Assembly has a k8sPolicy object. This object allows additional kubernetes configurations to be applied to the StatefulSets created by the Assembly CR.
spec:
...
elements:
dap:
instances:
idb:
k8sPolicy: {}
hdb:
k8sPolicy: {}
sm:
k8sPolicy: {}
sequencer:
north:
k8sPolicy: {}
south:
k8sPolicy: {}
Within the k8sPolicy the instances ServiceAccount and PodSecurityContext can be defined.
Additional advanced configuration can be set.
k8sPolicy.resources
The resources field allows the user to define container resources.
k8sPolicy:
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
Resource configuration allows limits and requests to be set for containers.
The kubernetes scheduler will attempt to place pod on a node with sufficient resources to meet a request and will enforce limits on a pod.
Resource Limits
When a process in the container tries to consume more than the allowed amount of memory, the system kernel terminates the process that attempted the allocation, with an out of memory (OOM) error
| Key | Type | Required | Description |
|---|---|---|---|
resources |
object |
false |
Parent object to define requests and limits |
resources.requests |
object |
false |
Requested resources for Pod container |
resources.requests.memory |
string |
false |
Requested container memory in bytes. You can express memory as a plain integer or as a fixed-point number. See here for more details |
resources.requests.cpu |
string |
false |
Requested container cpu in units of Kubernetes CPUs. |
resources.limits |
object |
false |
Enforce resource limits on a Pod's container |
resources.limits.memory |
string |
false |
Enforced maximum memory in bytes. You can express memory as a plain integer or as a fixed-point number. See here for more details |
resources.limits.cpu |
string |
false |
Enforced cpu usage limit in units of Kubernetes CPUs. |
k8sPolicy.nodeSelector
The nodeSelector field allows the user to define nodeSelector configuration for Pods.
k8sPolicy:
nodeSelector:
disktype: ssd
It specifies a map of key-value pairs. For the pod to be eligible to run on a node, the node must have each of the indicated key-value pairs as labels (it can have additional labels as well). The most common usage is one key-value pair.
| Key | Type | Required | Description |
|---|---|---|---|
nodeSelector |
object |
false |
Map of key-value pairs |
k8sPolicy.podAffinity
The affinity field allows the user to define Affinity and anti-affinity configuration for Pods.
k8sPolicy:
affinity:
nodeAffinity:
...
podAffinity:
...
podAntiAffinity:
Pod affinity allows for more control over pod scheduling. Where nodeSelector may be used for simple scheduling, podAffinity allows for greater range of constraints.
There are currently two types of Node affinity, called requiredDuringSchedulingIgnoredDuringExecution and preferredDuringSchedulingIgnoredDuringExecution
requiredDuringSchedulingIgnoredDuringExecution will only schedule pods on nodes matching criteria, preferredDuringSchedulingIgnoredDuringExecution will attempt to schedule but on failure will run on non-matching nodes.
Inter-pod affinity and anti-affinity allow you to constrain which nodes your pod is eligible to be scheduled based on labels on pods that are already running on the node rather than based on labels on nodes.
The rules are of the form "this pod should (or, in the case of anti-affinity, should not) run in an X if that X is already running one or more pods that meet rule Y". Y is expressed as a LabelSelector with an optional associated list of namespaces
As with nodeAffinity there are two types of pod affinity and anti-affinity, called requiredDuringSchedulingIgnoredDuringExecution and preferredDuringSchedulingIgnoredDuringExecution
| Key | Type | Required | Description |
|---|---|---|---|
affinity.nodeAffinity |
object |
false |
Node Affinity is a set of conditions for a node to meet for Pod scheduling on a node |
affinity.podAffinity |
object |
false |
Pod Affinity is a set of conditions for additional Pods to be met for Pod scheduling on a node |
affinity.podAntiAffinity |
object |
false |
Pod Anti-affinity is a set of conditions for additional Pods to be met for Pod scheduling on a node |
k8sPolicy.podTolerations
The podTolerations field allows the user to define Tolerations configuration for Pods.
k8sPolicy:
tolerations:
- key: "example-key"
operator: "Exists"
effect: "NoSchedule"
Nodes may be tainted, as means to prevent certain pods from being scheduled on that node. a taint is a key-value pair, several taints are pre-existing and set by Kubernetes.
Tolerations are applied to pods, and allow (but do not require) the pods to schedule onto nodes with matching taints.
| Key | Type | Required | Description |
|---|---|---|---|
tolerations |
object |
false |
Pod node taint tolerations |
k8sPolicy.terminationGracePeriodSeconds
The terminationGracePeriodSeconds field allows the user to define terminationGracePeriodSeconds configuration for Pods.
k8sPolicy:
terminationGracePeriodSeconds: 60
This sets the length of time in seconds the container will be allowed to shutdown before the pod if killed.
| Key | Type | Required | Description | Default |
|---|---|---|---|---|
terminationGracePeriodSeconds |
integer |
false |
Kubernetes Pod configurations | 30 |