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 | "" |
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
externalNodePort: 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" |
|
externalNodePort |
boolean |
true |
Use Node Port Type for externally facing Sequencer service | "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\/-_]*$ |
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:
retentionDuration: 10080
maxLogSize: 5
Key | Type | Required | Description | Default | Validation |
---|---|---|---|---|---|
retentionDuration |
integer |
false |
Log retention in minutes | ||
maxLogSize |
string |
false |
Maximum log size | ^([+-]?[0-9.]+)([eEinukmgtpKMGTP]*[-+]?[0-9]*)$ |
|
maxDiskUsagePercent |
integer |
false |
Max disk utilization |
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
The spec.elements.sm
and spec.elements.dap
services allow you to define the location and size of the rt logs PVC
for storing Sequencer logs. This is key to ensure your services have enough disk space depending on your ingestion profile.
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
useAnnotations: false
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 |
|
useAnnotations |
boolean |
false |
Where Metrics has been enabled, and ServiceMonitor disabled, annotations may be applied to the Pod to allow Metrics scraping | ||
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.serviceAccount
The serviceAccount
field allow the user to define a service account name to be used.
k8sPolicy:
serviceAccount: "my-svc-acc"
This may be a new service account name, or the name of a preexisting service account.
If preexisting, the create
field of serviceAccountConfigure should be set to false
k8sPolicy.serviceAccountConfigure
The serviceAccountConfigure
field allows the user to override defaults for a components Service Account.
k8sPolicy:
serviceAccountConfigure:
create: false
automountServiceAccountToken: false
By default the KXI Operator will create a service account for each component.
This configuration allows for the creation to be disabled, and the automatic mounting of a service account token to also be disabled. See here for additional information.
Key | Type | Required | Description |
---|---|---|---|
create |
boolean |
false |
Create a service account for component |
automountServiceAccountToken |
boolean |
false |
Mount the service account token to the container |
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.affinity
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.tolerations
The tolerations
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 |
k8sPolicy.podSecurityContext
The podSecurityContext
field allows for the Pod Level Security Context to be configured for the element pods.
k8sPolicy:
podSecurityContext:
runAsUser: 1000
runAsNonRoot: true
fsGroup: 1000
It holds pod-level security attributes and common container settings. Some fields are also present in container.securityContext. Field values of securityContext take precedence over field values of PodSecurityContext.
k8sPolicy.securityContext
The securityContext
allows for Container Level Security Context to be configured.
k8sPolicy:
securityContext:
runAsUser: 1000
runAsNonRoot: true
fsGroup: 1000
readOnlyRootFilesystem: true
allowPrivilegeEscalation: false
It holds security configuration that will be applied to a container. Some fields are present in both SecurityContext and podSecurityContext. When both are set, the values in securityContext
take precedence.