Provider Shturval v2 (shturval-capsm)

About the service

ParameterDescription
GUI nameProvider Shturval v2
System name (identifier)shturval-capsm
Cluster AssignmentIntegration with the Shturval v2 platform: deployment and management of clusters via the Cluster API when using Shturval v2 as an infrastructure provider. Installed in the management cluster.
CriticalYes, if the management cluster is deployed with the Shturval v2 provider
Public repository— (component of the Shturval platform)
Dependenciesshturval-capsm-crds, shturval-capi-crds
Namespaceshturval-capsm

For reference: For a list of Shturval* objects, see the section Custom node life cycle resources - Shturval v2.


Contents

  1. Review
  2. Architecture
  3. Service installation
  4. Diagnostics
  5. Lifecycle
  6. Operator parameters
  7. CRD/API reference

1. Review

shturval-manual is a Kubernetes operator that implements the CAPI infrastructure provider role for the Shturval platform. The operator manages bare-metal and SSH nodes: automatically registers physical hosts, monitors their readiness, associates with Cluster API objects and performs initial initialization (bootstrap) of Kubernetes nodes.

Place in the chain of command

Illustration: Place in the chain of command

The place of shturval-capsm in the control chain of the Shturval platform

Key Features

Note: The shturval-capsm provider (Shturval v2 / manual) is designed for the x86_64 architecture. Before deployment, ensure that the target nodes conform to the supported architecture.

CharacteristicsDescription
API Groupinfrastructure.cluster.x-k8s.io/v1beta1
Operator namespaceshturval-capsm
Leader electionincluded; ID 5eeb8da4.cluster.x-k8s.io - safe operation with multiple replicas
MetricsDisabled by default (--metrics-bind-address=0). When enabled, available via HTTPS on port :8443 with RBAC authentication
Health/ReadinessHTTP on port :8081 (/healthz, /readyz)
WebhookMutating webhook for ShturvalCluster on port :9443
Pod SecurityPod Security Standards: restricted

Controllers and webhook

The operator registers four controllers and one mutating webhook:

Controller/componentPurpose
ShturvalProviderCreates and deletes ShturvalHost objects based on spec.hosts; synchronizes credentials and version fields
ShturvalHostPrepares a physical node via SSH: checks availability, installs the shturvald daemon, ensures the uniqueness of the machine-id, binds to ShturvalMachine
ShturvalMachineSelects a ready host, executes the Kubernetes node bootstrap, sets providerID
ShturvalClusterManages the life cycle of a CAPI cluster: sets it to Ready, when removed, waits for all machines to be cleaned
Webhook ShturvalClusterMutating: if spec.controlPlaneEndpoint.port == 0, sets the default to 6443

Operating constraints

ConstraintOperational impact
SSH is supported only on port 22A non-standard SSH port cannot be configured through operator parameters
SSH keys with passphrase are not supportedThe Secret must contain an unencrypted private key

2. Architecture

Illustration: 2. Architecture

Operator architecture shturval-manual

Workload Components

ObjectNameOptions
Deploymentcontroller-manager1 replica, image r.shturval.tech/capsm/capsm
ContainermanagerCPU request: 10m, limit: 500m; RAM request: 64Mi, limit: 128Mi
Liveness testHTTP GET:8081/healthz, delay 15 s, interval 20 s
Readiness testHTTP GET:8081/readyz, delay 5 s, interval 10 s
Metrics ServiceHTTPSwhen enabled — :8443, access via RBAC only (authn/authz)
Webhook serverHTTPS:9443, mutating webhook for ShturvalCluster
Leader electionincludedID 5eeb8da4.cluster.x-k8s.io

Pod Security Settings

Under deploymentThis is in accordance with the Pod Security Standards: restricted policy:

ParameterDescription
runAsNonRoottrue

RBAC

The operator operates on behalf of ServiceAccount controller-manager, which is assigned ClusterRole manager-role through ClusterRoleBinding.

API GroupResourcesRights
"" (core)secretsget, list, watch, create, update, patch, delete
cluster.x-k8s.ioclusters, machines, machines/statusget, list, watch
infrastructure.cluster.x-k8s.ioshturvalclusters, shturvalhosts, shturvalprovidersget, list, watch, create, update, patch, delete
infrastructure.cluster.x-k8s.ioshturvalmachinesget, list, patch, update, watch
infrastructure.cluster.x-k8s.ioshturvalclusters/finalizers, shturvalhosts/finalizers, shturvalmachines/finalizers, shturvalproviders/finalizerspatch, update
infrastructure.cluster.x-k8s.ioshturvalclusters/status, shturvalhosts/status, shturvalmachines/status, shturvalproviders/statusget, patch, update

Additionally, aggregated roles are provided for each CRD type with the suffixes -admin, -editor, -viewer.

Interaction with external systems

The operator connects via SSH to physical nodes whose addresses are specified in ShturvalProvider.spec.hosts. Kubernetes Secrets are used for authentication, referenced by ShturvalProvider.spec.credentials.secretRef and, optionally, ShturvalHost.spec.credentials.ssh.

A secret of type Opaque with data for connecting via SSH is created in the management cluster in namespace shturval-capsm. The name is formed from the name of the Shturval v2 provider instance with the suffix capsm-v2-provider-secret.

Example Secret:

apiVersion: v1
kind: Secret
metadata:
  name: provider-name-capsm-v2-provider-secret
  namespace: shturval-capsm
type: Opaque
data:
  sshKey: LS0tLS1CRUdJTiBPUEVOU1NIIFBSSVZBVEUgS0VZLS0tLS0KdXNlcnNzaGtleQotLS0tLUVORCBPUEVOU1NIIFBSSVZBVEUgS0VZLS0tLS0=
  sshUser: c2h0dXJ2YWw=
  sshPassword: bXlwYXNzd29yZA==
KeyRequiredDescription
sshUserYesUsername for SSH connection to host
sshKeyYesPrivate SSH key
sshPasswordNoPassword for sudo commands on the host. When installing the management cluster from the console, set it with --ssh-user-password or credentials.SSH.sshUserPassword — see SSH user password for sudo. In the interface — see Shturval v2

The private key must be unencrypted, without passphrase: password protection of the key is not supported.


3. Installing the service

The CAPSM provider is an infrastructure provider Cluster API (infrastructure.cluster.x-k8s.io). In the Shturval platform, the connection and life cycle of such a provider in the management cluster is ensured by cluster-manager; ShturvalServiceConfig (SSC) objects for provider charts are created and maintained as part of the platform configuration, rather than as an arbitrary manual installation of a service chart.

In the production environment, the provider is represented by two SSCs:

  • shturval-capsm — operator’s main chart;
  • shturval-capsm-crds — CRD chart of the provider module.

The CRD chart is allocated to a separate SSC so that the helm.sh/resource-policy: keep annotation protects the CRD from being deleted when the main chart is updated.

For correct operation, the CRD of the main Cluster API (shturval-capi-crds and the associated component shturval-capi) must be available in the management cluster.

Below are the chart names and the correspondence of spec.customvalues to the helm/main/values.yaml file of the main chart - for comparison with the release and configuration via ShturvalServicePatch (SSP). This does not duplicate the full deployment scenario via the cluster-manager UI/API.

If the service was disabled during platform deployment, the provider’s SSCs could receive an absence mode (mode: absent). In order for the provider to be available to work with the Shturval v2 infrastructure, first switch the shturval-capsm-crds mode to auto, then shturval-capsm to auto. You can change the mode in the platform GUI on the Providers page.

In the GUI, this action is performed by the service mode switch. The screenshot shows the selection of the Auto mode for the provider service.

Switching provider service mode

3.1 Customvalues parameters

The structure of the main chart values is described by the spec.customvalues field of the corresponding ShturvalServiceConfig and coincides with helm/main/values.yaml of the shturval-capsm chart. Full list of fields specified through this file:

Recommendation: do not edit the ShturvalServiceConfig object manually to change limits, nodeSelector, operator image, etc.Other release parameters - such an object relates to the platform configuration and can be overwritten during updates. Make all changes to the behavior of the service through ShturvalServicePatch (SSP), which overlays spec.customvalues on top of the base SSC.

FieldTypeDefaultDescription
replicaCountint1Number of Deployment Replicas
image.repositorystringr.shturval.tech/capsm/capsmOperator image repository
image.tagstring—Image tag. If not specified, appVersion from Chart.yaml is used
serviceAccount.createbooltrueCreate ServiceAccount
serviceAccount.namestringcontroller-managerServiceAccount Name
resources.limits.cpustring500mManager container CPU limit
resources.limits.memorystring128MiManager container memory limit
resources.requests.cpustring10mQuery CPU container manager
resources.requests.memorystring64MiManager container memory request

Webhook

By default, webhook ShturvalCluster is enabled. To disable, set the environment variable ENABLE_WEBHOOKS=false in the container manager. Webhook requires a TLS certificate; the path is specified via --webhook-cert-path (see section 6).

Creating ShturvalProvider

ShturvalProvider — global (cluster-scoped) provider configuration object. When creating ShturvalProvider, the controller automatically creates ShturvalHost objects for each address from spec.hosts. The object must exist before clusters and machines are created.

Example of minimum ShturvalProvider:

apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: ShturvalProvider
metadata:
  name: shturval-demo
spec:
  systemRegistry: registry.example.com
  releaseVersion: "2.14"
  licenseToken: "<license token>"
  credentials:
    secretRef:
      name: shturval-demo-provider-secret
      namespace: shturval-capsm
  hosts:
    - address: 192.168.1.10
      labels:
        role: worker
        zone: dc1
    - address: 192.168.1.11
      labels:
        role: master
        zone: dc1
  paused: false

spec.releaseVersion sets the platform version for host bootstrap (downloading stc-<releaseVersion>). For a single host the version is set in spec.hosts[].releaseVersion; if the field is empty, the provider version is used. In the interface this is the Version field of the provider instance or the host. Specify the full version, for example 2.13.1.

After creating ShturvalProvider, the controller creates ShturvalHost with a name equal to the host’s IP address and a label provider_config_name: <provider-name>. spec.systemRegistry and spec.licenseToken are copied from the provider. The host spec.releaseVersion is taken from spec.hosts[].releaseVersion, or from the provider spec.releaseVersion if that field is not set.

It is not recommended to create ShturvalHost manually, bypassing ShturvalProvider, if the hosts are intended to be shared with the provider: the controller may overwrite such objects or fix an ownership conflict.

Where to configure

Services and repositories → Installed services → shturval-capsm → Manage. The service is hosted in the management cluster.

Configuring provider instances in the platform - Shturval v2. General overview - How to work with providers in the platform works.


4. Diagnostics

Operator performance check

CheckCommandExpected result
Operator launchedkubectl get pod -n shturval-capsm -l control-plane=controller-managerSTATUS: Running
Livenesskubectl exec -n shturval-capsm <pod> -- wget -qO- http://localhost:8081/healthzok
readinesskubectl exec -n shturval-capsm <pod> -- wget -qO- http://localhost:8081/readyzok
Metrics availableWhen metrics are enabled: request to :8443/metrics via ServiceAccount with role metrics-readerHTTP 200, contains controller_runtime_reconcile_total
Logskubectl logs -n shturval-capsm -l control-plane=controller-managerLine starting manager at startup

Diagnostics ShturvalHost

kubectl get shturvalhost
kubectl describe shturvalhost <hostname>

Flags in the output of kubectl get shturvalhost:

ColumnDescription
READYFORMACHINEtrue - the host has passed all checks and is ready to bind ShturvalMachine
MACHINEATTACHEDANDCONFIRMEDtrue - the host is bound to ShturvalMachine and the binding is confirmed

Conditions for ShturvalHost

status.readyformachine = true is set when the following are executed simultaneously: CanConnectToTheNode=True, CheckSudo=True, ShturvalNodeConfigIsCorrect=True and at least one of: StcCompleted=True or StdDeployed=True.

ConditionWhat is being checkedAction at False / Unknown
CanConnectToTheNodeSSH connection to host establishedCheck spec.address and the correctness of the SSH key in Secret. Reasons: FailedToGetCredentials, FailedToGetHostManager, FailedToConnect, NetworkError
CheckSudoThe SSH user has sudo accessCheck account permissions on the host. Reason: FailedToCheckSudo
StdDeployedThe shturvald daemon is installed and availableCheck for the presence of a daemon on the node. Reasons: NetworkError, ShturvaldDaemonNotFound
StcDeployedThe stc binary file is uploaded to nodeCheck availabilityhttps://public.<systemRegistry>/stc-<releaseVersion>
StcCompletedThe stc template command successfully completed host preparationCheck the /var/log/stc-template.log log on the node
StcMigrationRequiredSTC migration is required for a free and ready hostCheck STC status on the host and wait until migration completes
MachineIDUniqueThe /etc/machine-id value is unique among all registered hostsThe operator resets machine-id automatically. Reasons: NetworkError, FailedToResetMachineID, MachineIDNeedCheck
ShturvalNodeConfigIsCorrectThe node configuration is correct; host is not occupied by another clusterCheck status.nodeInfo.kubestatus. Reasons: HostOccupied, HostInfoIsNotCorrect
MachineAttachedShturvalMachine is bound to the hostCreate ShturvalMachine with hostSelector corresponding to host labels

Conditions for ShturvalMachine

ConditionWhat is being checkedAction at False
HostAttachedA suitable ShturvalHost was found and the binding was confirmedCheck the availability of free hosts with the required tags. Reasons: NoApplicableHost, HostNotReadyReason, HostMatchWaitingReason, HostNotMatchReason
K8sComponentsInstallationSucceededThe command sudo std node status returns synchedWait for the Kubernetes components to complete synchronization on the node. Reasons: STDGetStatusFailed, NodeStatusReason
ShturvaldRestartBeforeBootstrapFor versions before 2.14: shturvald was restarted and the node returned to synchedWait for synchronization. Reason: ShturvaldRestartedWaitingSyncedReason, ShturvaldRestartFailedReason
K8sNodeBootstrapSucceededBootstrap Kubernetes node via BootstrapWithCloudInit completed successfullyCheck for the presence of a bootstrap secret in CAPI. Reasons: BootstrapNotReadyReason, BootstrapExecutionFailedReason, PreBootstrapExecutionFailedReason
K8sProviderIDSetupproviderID installed on spec.providerID machine and spec.providerID Kubernetes nodeMake sure that the node appears in the cluster with the correct machine-id. The reason for the error is inthe operator’s logs
ReadyThe machine is fully ready for operationCheck conditions HostAttached, K8sComponentsInstallationSucceeded, K8sNodeBootstrapSucceeded, K8sProviderIDSetup

Conditions for ShturvalCluster

ConditionWhat is being checkedAction at False
ShturvalClusterReconciliationReadyCluster API set OwnerReference to cluster; cluster is not pausedCheck the presence of Cluster in CAPI and its status. Reasons: WaitingForClusterOwnerReference, ClusterIsPaused
ShturvalClusterDeletingOn deletion: all ShturvalMachine clusters are deletedWait for the removal of machines to complete. Reasons: WaitingForMachinesDeletion, FailedToListMachinesForDeletion

Common failures

SymptomProbable CauseAction
CanConnectToTheNode=False, reason FailedToConnectInvalid IP or SSH port not availableCheck spec.address and network availability of the node
CanConnectToTheNode=False, reason FailedToGetCredentialsSecret with SSH key not foundEnsure that Secret from spec.credentials.ssh exists in the specified namespace
StdDeployed=False, reason ShturvaldDaemonNotFoundshturvald was manually removed from the nodeReinstall shturvald on node
ShturvalNodeConfigIsCorrect=False, reason HostOccupiedThe node is part of another Kubernetes clusterRemove a node from the cluster or use another host
MachineIDUnique=False, reason MachineIDNeedCheckDuplicate machine-id (VM cloning)Expect: operator will automatically reset machine-id
HostAttached=False, reason NoApplicableHostThere are no available hosts with the required tagsAdd hosts to ShturvalProvider.spec.hosts with the required tags
K8sComponentsInstallationSucceeded=False, reason NodeStatusReasonsudo std node status returned syncFailed or syncInProgressFor syncFailed — check shturvald logs on the node; for syncInProgress - wait for completion
ShturvalMachine.status.ready remains falseOne of the conditions is not metSequentially eliminate all conditions with the status False

View node information

After successfully passing all checks, the operator fills in status.nodeInfo with ShturvalHost:

kubectl get shturvalhost <hostname> -o jsonpath='{.status.nodeInfo}' | python -m json.tool

5. Life cycle

ShturvalProvider controller

The controller fully manages the life cycle of ShturvalHost objects based on spec.hosts.

Host creation: when adding an address to spec.hosts, the controller creates ShturvalHost with a name equal to the IP address, assigns it labels from spec.hosts[].labels, label provider_config_name: <provider-name>, SSH credentials and version fields (systemRegistry, releaseVersion, licenseToken). Sets the OwnerReference of the provider to the host.

Host update: when labels change in spec.hosts[].labels the controller synchronizes them in ShturvalHost. Labels from the system list (architecture, memory, cpu_cores, ethernet_interface, operating_system, root_volume_size, hostname, provider_config_name) are not affected by synchronization. systemRegistry and licenseToken are always synchronized. releaseVersion is updated only while the host is not bound to a machine. If the host has spec.hosts[].releaseVersion set, changing the provider version does not change it. Labels are not updated while the host is bound to the machine (MachineAttached=True).

Host Removal: When an address is removed from spec.hosts, the controller triggers the removal of the corresponding ShturvalHost. Waits for finalizers to finish cleaning up.

Deleting a provider: A provider can only be deleted if none of its hosts are bound to the cluster (no MachineAttached=True). When deleting, the operator removes the shturval/<provider-name> finalizer from the Secret with the credentials.

Host Credentials: If spec.hosts[].credentials is set to individual host credentials, they are used instead of the global spec.credentials.

ShturvalHost controller

The controller prepares the physical node to join the Kubernetes cluster.

Illustration: ShturvalHost controller

Life cycle of ShturvalHost

Finalizer

When a new ShturvalHost is first encountered, the controller adds the shturvalhost.infrastructure.cluster.x-k8s.io finalizer and ends the iteration with requeue after 1 second.

Preparing a new host

  1. SSH connection — establishes a connection using spec.address. If there is a network error - CanConnectToTheNode=False, requeue 1 s.
  2. Check sudo (one time, until CheckSudo is not True) - if there is an error CheckSudo=False.
  3. Deployment of the shturvald daemon (one time, until StdDeployed or StcCompleted is not True) - call EnsureSTDDeployed().
  4. Receiving information about the node - metadata is requested via shturvald (architecture, hostname, memory, CPU, machine-id, Kubernetes status). If the daemon is manually removed, StdDeployed is reset.
  5. Busy check - if the Kubernetes service is active on the node or kubeconfig is present, ShturvalNodeConfigIsCorrect=False (HostOccupied) is set.
  6. Uniqueness of machine-id - the operator maintains an in-memory map of machine-id (initialized at startup for all existing hosts). If there is a duplicate, ResetMachineID() is called and the iteration is restarted.
  7. Result - when all steps are completed, ShturvalNodeConfigIsCorrect=True and MachineIDUnique=True are set; status.readyformachine becomes true.

Ready condition IsReadyForMachine

The host is considered ready to bind a machine (readyformachine=true) when simultaneously executing:

  • CanConnectToTheNode=True
  • StcCompleted=True OR StdDeployed=True

Linking a car

When readyformachine=true, the controller looks for ShturvalMachine with status.selectedhost == host.name. From the found candidates, one is selected by priority:

priority = 10 × len(matchExpressions) + 1 × len(matchLabels)

If the priority is the same, the machine with the lexicographically smaller name is selected. Machines in Deleting state are skipped. After selection, status.linkedmachine and MachineAttached=True are set.

Binding consistency

While the host is bound (machineAttachedAndConfirmed=true), each iteration checks that ShturvalMachine of status.linkedmachine exists and that the machine is not removed. If there is a mismatch, the binding is reset.

Triggers reconcile

EventDescription
Change ShturvalHostStandard trigger
Change status.selectedhost from ShturvalMachineThe operator queues the reconcile of the corresponding host

Removal

With deletionTimestamp != nil, the controller detaches the linked machine, cleans host service state, and removes finalizer shturvalhost.infrastructure.cluster.x-k8s.io.

ShturvalMachine controller

The controller selects a host and bootstraps the Kubernetes node.

Host selection: if status.selectedhost is empty, the controller looks for a free (not busy) ShturvalHost by the label provider_config_name (taken from the spec.providerConfigName machine or from ShturvalCluster.spec.providerConfigName). Additionally, spec.hostSelector is applied. If the host is found but not ready (readyformachine=false) - wait. If the host is ready, but has not confirmed the choice, wait for confirmation from ShturvalHost.

Checking the installation status of components: The sudo std node status command is executed. If the status is synched, it goes to bootstrap. At syncInProgress orwaitingRebootApprove - wait (requeue in 1 minute). When syncFailed - an error is recorded, reconcile stops.

Bootstrap (version ≥ 2.14): Called node.PreBootstrapWithCloudInit(). If shturvald requires a restart, restart and requeue. Then node.BootstrapWithCloudInit() with data from the bootstrap CAPI secret.

Bootstrap (version < 2.14): removes /etc/std/nci.json, restarts shturvald, waits for synched, then executes BootstrapWithCloudInit.

Setting providerID: After a successful bootstrap, the controller connects to the target cluster, finds a Kubernetes node with a matching machine-id and sets spec.providerID in the format shturval://xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.

Delete: If deletionTimestamp is present, the controller calls node.Reset() on the node to clean it up. If IgnoreResetError=true - reset errors are ignored and deletion continues. After successful cleaning, the finalizer is removed.

Reconcile trigger: ShturvalHost status change (update or delete) queues all related machines.

ShturvalCluster controller

reconcileNormal: adds the finalizer shturvalcluster.infrastructure.cluster.x-k8s.io, sets status.ready=true and condition ShturvalClusterReconciliationReady=True. If the CAPI cluster has paused the cluster, it sets Ready=false.

reconcileDelete: expects to delete all ShturvalMachine labeled cluster.x-k8s.io/cluster-name: <cluster name>. While the machines exist - requeue every 5 seconds. After removing all the machines, the finalizer is removed.


6. Operator parameters

Parameters are set through container launch arguments manager. To change, use the customization mechanism via cluster-manager or ShturvalServicePatch.

ParameterTypeDefaultDescription
--leader-electboolfalseEnable leader election. Recommended for production
--health-probe-bind-addressstring:8081Address liveness/readiness samples
--metrics-bind-addressstring0Metrics address (:8443 - HTTPS, :8080 - HTTP, 0 - disable)
--metrics-securebooltrueEnable HTTPS for metrics with authn/authz via RBAC
--enable-http2boolfalseEnable HTTP/2 (disabled due to CVE-2023-44487 and CVE-2023-39325)
--condition-message-max-lengthint32768Maximum length of text in condition message fields before truncation
--metrics-cert-pathstring""Path to the directory with the TLS metrics certificate
--metrics-cert-namestringtls.crtMetrics Certificate File Name
--metrics-cert-keystringtls.keyMetrics Certificate Key File Name
--webhook-cert-pathstring""Path to the directory with the TLS certificate webhook
--webhook-cert-namestringtls.crtwebhook certificate file name
--webhook-cert-keystringtls.keyWebhook certificate key file name

Environment Variables

VariableDefaultDescription
ENABLE_WEBHOOKS"" (enabled)Set false to disable mutating webhook ShturvalCluster

7. CRD/API reference

All resources belong to the API group infrastructure.cluster.x-k8s.io, version v1beta1.


ShturvalHost

A cluster-scoped object representing a physical SSH node. Created and managed by the ShturvalProvider controller.

Short name: smh
Scope: Cluster
Finalizer: shturvalhost.infrastructure.cluster.x-k8s.io

spec

FieldTypeRequiredDescription
spec.addressstringYesIP address or hostname for SSH connection
spec.credentialsobjectNoIndividual SSH host credentials. If not specified, used from ShturvalProvider
spec.credentials.ssh.namestringNoSecret name with SSH key
spec.credentials.ssh.namespacestringNoNamespace Secret with SSH key
spec.pausedboolNoSuspend host processing. Default false
spec.systemRegistrystringNoAddress of the system image registry. Filled by controller ShturvalProvider from ShturvalProvider.spec.systemRegistry
spec.releaseVersionstringNoShturval platform version. Taken from ShturvalProvider.spec.hosts[].releaseVersion or, if that field is empty, from ShturvalProvider.spec.releaseVersion
spec.licenseTokenstringNoLicensed token. Filled by controller ShturvalProvider from ShturvalProvider.spec.licenseToken
spec.providerIDstringNoDeprecated as of version 28. Not used, will be removed

status

FieldTypeDescription
status.statusstringText host status
status.readyformachinebooltrue - the host is ready to bind ShturvalMachine
status.machineAttachedAndConfirmedbooltrue - the host is bound to ShturvalMachine and the binding is confirmed
status.linkedmachine.namestringLinked name ShturvalMachine
status.linkedmachine.namespacestringNamespace bound ShturvalMachine
status.conditionsarrayHost Conditions (see section 4)
status.nodeInfo.nodetypestringNode type: master or worker
status.nodeInfo.archstringProcessor architecture
status.nodeInfo.hostnamestringHostname
status.nodeInfo.memoryintAmount of RAM in MB
status.nodeInfo.cpucoresintNumber of CPU cores
status.nodeInfo.rootvolumesizeintRoot volume size in MB
status.nodeInfo.ethinterfacestringPrimary network interface name
status.nodeInfo.operatingsystemstringOS name
status.nodeInfo.osreleasestringOS Version
status.nodeInfo.kernelversionstringKernel version
status.nodeInfo.machineidstringValue /etc/machine-id
status.nodeInfo.kubestatus.service_runningboolIs the Kubernetes service running
status.nodeInfo.kubestatus.config_presentboolIs kubeconfig present
status.nodeInfo.kubestatus.cluster_namestringOwner cluster name (if busy)
status.nodeInfo.kubestatus.api_addrstringOwner’s cluster API server address
status.nodeInfo.disksarrayInformation about node disks
status.nodeInfo.portsarrayInformation about node network ports

ShturvalProvider

Cluster-scoped provider global configuration object: list of hosts, image registry, Helm version, license, default SSH credentials. Is the source of truth for everyone ShturvalHost.

Short name: smp
Scope: Cluster
Finalizer: shturvalprovider.infrastructure.cluster.x-k8s.io

spec

FieldTypeRequiredDescription
spec.hostsarrayNoList of hosts managed by this provider
spec.hosts[].addressstringYesHost IP address or FQDN (validated against IPv4 or FQDN template)
spec.hosts[].labelsmap[string]stringNoHost tags for use on spec.hostSelector machines
spec.hosts[].releaseVersionstringNoPlatform version for this host. If not set, the provider spec.releaseVersion is used
spec.hosts[].credentials.ssh.namestringNoIndividual Secret name for the host
spec.hosts[].credentials.ssh.namespacestringNoNamespace of individual Secret
spec.systemRegistrystringNoSystem image registry address
spec.releaseVersionstringNoPlatform version Shturval (used with bootstrap)
spec.licenseTokenstringNoPlatform license token
spec.credentials.secretRef.namestringYesSecret name with global SSH credentials
spec.credentials.secretRef.namespacestringYesNamespace Secret with global SSH credentials
spec.pausedboolNoPause provider processing

status

FieldTypeDescription
status.hostsmap[string]objectHost status map by address
status.hosts[address].readyboolHost Readiness
status.hosts[address].conditionsarrayHost Conditions (type HostCreated)

ShturvalCluster

Namespaced Kubernetes cluster object in terms of the Cluster API.

Short name: smc
Scope: Namespace
Finalizer: shturvalcluster.infrastructure.cluster.x-k8s.io

spec

FieldTypeRequiredDescription
spec.controlPlaneEndpoint.hoststringYesHostname or IP of the cluster API server
spec.controlPlaneEndpoint.portint32YesAPI server port. If 0 - webhook automatically sets 6443
spec.secureboolYesEnable strict security settings
spec.deployKeepAliveboolYesExpand the KeepAlive component
spec.ingressstringYesDNS record for Ingress controller
spec.providerConfigNamestringYesThe name is ShturvalProvider for this cluster. Used when searching for hosts if ShturvalMachine.spec.providerConfigName is not set

status

| Field | Type | Description | |——|—–|———|| status.ready | bool | Cluster readiness | | status.conditions | array | Cluster Conditions (ShturvalClusterReconciliationReady, ShturvalClusterDeleting) | | status.failureDomains | array ([]FailureDomain) | Fault domains |


ShturvalMachine

A Namespaced object representing a cluster node in terms of the Cluster API.

Short name: smm
Scope: Namespace
Finalizer: shturvalmachine.infrastructure.cluster.x-k8s.io

spec

FieldTypeRequiredDescription
spec.nodeTypestringNoNode type (eg master, worker)
spec.hostSelectorobjectNoLabel selector for selecting ShturvalHost
spec.hostSelector.matchLabelsmap[string]stringNoConditions for exact match of labels
spec.hostSelector.matchExpressionsarrayNoExtended terms. Take precedence over matchLabels when selecting a host candidate
spec.providerConfigNamestringNoName ShturvalProvider to search for hosts. If not specified, taken from ShturvalCluster.spec.providerConfigName
spec.providerIDstringNoUnique node ID in the format shturval://<machine-id>. Filled in automatically after bootstrap
spec.hostNamestringNoDeprecated as of version 28. Will be removed

status

FieldTypeDescription
status.readyboolNode readiness for operation
status.addressstringIPv4 address of the main interface
status.selectedhoststringName of the selected ShturvalHost (requires confirmation from the host)
status.infoobjectNode information (same as ShturvalHost.status.nodeInfo)
status.initialization.provisioned*booltrue - node infrastructure is completely ready (part of the Cluster API contract)
status.failureReasonstringTerminal error code requiring manual intervention
status.failureMessagestringDescription of the terminal error
status.conditionsarrayConditions of the node (see section 4)

ShturvalMachineTemplate

Namespaced template for ShturvalMachine. Used by CAPI to automatically create ShturvalMachine objects within MachineDeployment or MachineSet.

Short name: smt
Scope: Namespace

spec

FieldTypeRequiredDescription
spec.template.metadataobjectNoLabels and annotations applied to generated ShturvalMachine
spec.template.specobjectYesSpecification of created ShturvalMachine. Fields are identical to ShturvalMachine.spec