Skip to main content
Version: v3.8.0

Control Plane YAML Specification

potctl deploys Edge Compute Networks (ECNs) from YAML. Control plane resources define the Controller, Router, optional NATS, and optional system Edgelet nodes on the same hosts. Platform train v3.8.0 uses embedded OIDC by default.

KindDeploy targetPrimary doc section
KubernetesControlPlaneKubernetes cluster (operator-managed)Kubernetes Control Plane
ControlPlaneRemote hosts over SSHRemote Control Plane
LocalControlPlaneLocal machine (dev / quick start)Local Control Plane
ControllerAdd a Controller to an existing remote Control PlaneController add-on

See Embedded OIDC Authentication and External OIDC Authentication for auth setup. When NATS is enabled, use NATS Account Rules and NATS User Rules. For TLS and certificates, see Certificates for Router and NATS and Airgap Deployment.

Greenfield release: v3.8.0

Do not copy Keycloak blocks from the v3.7.3 snapshot. v3.8 Control Plane YAML uses auth.mode: embedded or auth.mode: external instead of auth.realm and auth.realmKey.

metadata.controlPlaneType is retired. Use kind: KubernetesControlPlane, kind: ControlPlane, or kind: LocalControlPlane.

Image overrides

Override platform images under spec.images (Kubernetes) or spec.controller.package.image plus spec.systemMicroservices (local and remote). Defaults match the v3.8.0 release train:

ComponentDefault tagYAML key
Controllerv3.8.0spec.images.controller or spec.controller.package.image
Operator3.8.0spec.images.operator (Kubernetes only)
Router3.8.0spec.images.router or spec.systemMicroservices.router
NATS2.14.3spec.images.nats or spec.systemMicroservices.nats
Edgelet (system node)1.0.0spec.systemAgent.package.container.image or package.version

Registry host comes from your build flavor ({{REGISTRY}} in examples). Default Edgelet image: ghcr.io/datasance/edgelet:1.0.0.

Router and NATS on local or remote Control Planes use four architecture keys: amd64, arm64, riscv64, and arm.

Shared spec blocks

These blocks appear on one or more Control Plane kinds. The field availability matrix at the end lists which kind accepts each block.

metadata

FieldRequiredDescription
metadata.nameYesUnique Control Plane name in the potctl namespace. Lowercase alphanumeric; hyphens allowed.
metadata.namespaceNoNamespace for potctl state. Defaults to the active namespace from the CLI flag.

spec.iofogUser

First REST API user created on the Controller after deploy.

FieldRequiredDescription
nameNoGiven name.
surnameNoFamily name.
emailYesLogin email. Deploy fails when empty.
passwordNoREST API password. If set: at least 12 characters, one uppercase letter, one special character. Omit to enter interactively at deploy time (Kubernetes).
accessTokenNoRuntime state. Do not set in deploy YAML.
refreshTokenNoRuntime state. Do not set in deploy YAML.

spec.auth

FieldRequiredDescription
modeYesembedded (default quick start) or external (corporate IdP).
insecureAllowHttpNoAllow http:// in controller.publicUrl. Use for local dev only.
insecureAllowBootstrapLogNoLog bootstrap admin credentials once at first boot (embedded).
bootstrap.usernameYes when mode: embeddedFirst OIDC admin username.
bootstrap.passwordYes when mode: embeddedBootstrap admin password in YAML. Same complexity rules as iofogUser.password.
issuerUrlYes when mode: externalFull OIDC issuer URL (for example https://idp.example.com/realms/pot).
client.idYes when mode: externalOAuth client ID for the Controller.
client.secretYes when mode: externalOAuth client secret.
consoleClientNoEdgeOps Console SPA OAuth client ID.
consoleClientEnabledNoRegister and enable the Console OAuth client.
rateLimit.enabledNoEnable OIDC endpoint rate limiting.
rateLimit.maxRequestsPerWindowNoMax requests per window when rate limiting is on.
rateLimit.windowMsNoRate limit window in milliseconds.
sessionStore.typeNoBFF session store: memory or database.
sessionStore.ttlMsNoSession TTL in milliseconds.
sessionStore.secretNoEncryption secret for BFF sessions.
tokenTtl.accessTokenTtlSecondsNoAccess token lifetime.
tokenTtl.refreshTokenTtlSecondsNoRefresh token lifetime.
oidcTtl.interactionTtlSecondsNoOIDC interaction lifetime.
oidcTtl.grantTtlSecondsNoOIDC grant lifetime.
oidcTtl.sessionTtlSecondsNoOIDC session lifetime.
oidcTtl.idTokenTtlSecondsNoID token lifetime.

Embedded mode sets the issuer to {controller.publicUrl}/oidc. See Controller configuration for environment variable names.

spec.database

External MySQL or PostgreSQL. Required when you run more than one Controller replica (Kubernetes) or more than one remote Controller host.

FieldRequiredDescription
providerWhen HApostgres or mysql.
hostWhen provider setDatabase hostname.
portWhen provider setDatabase port.
userWhen provider setDatabase username.
passwordWhen provider setDatabase password.
databaseNameWhen provider setDatabase name.
sslNoEnable TLS to the database.
caNoBase64-encoded CA certificate for database TLS.

Single Controller installs use embedded SQLite on the host (remote/local) or in the pod (Kubernetes with one replica).

spec.events

Controller audit event settings.

FieldDescription
auditEnabledEnable audit logging.
retentionDaysDays to retain audit events.
cleanupIntervalCleanup interval in seconds.
captureIpAddressRecord client IP addresses in audit entries.

spec.controller

Runtime Controller settings applied at deploy time.

FieldK8sRemote / localDescription
publicUrlYesYesPublic Controller URL. Embedded OIDC issuer is {publicUrl}/oidc.
consoleUrlYesYesPublic EdgeOps Console URL for OAuth redirects. potctl backfills from publicUrl when empty.
consolePortYesNoConsole listen port hint for Kubernetes ingress mapping (default cluster binding is port 8008).
trustProxyYesNoHonor X-Forwarded-* when Controller sits behind a reverse proxy.
logLevelYesYesController log level (for example info, debug).
httpsYesYesPrefer HTTPS when resolving endpoints.
pidBaseDirYesYesBase directory for Controller PID files on remote/local hosts.
secretNameYesNoKubernetes TLS secret for the Controller Service when not using ingress TLS.
package.imageVia imagesYesController container image on remote/local hosts.
package.registryNoYesPrivate registry host. Required with username and password when any credential field is set.
package.usernameNoYesRegistry username for private Controller image pulls.
package.passwordNoYesRegistry password.
package.emailNoYesRegistry email (optional).

When both spec.endpoint and controller.publicUrl are set on remote or local Control Planes, they must match.

spec.vault

Optional secret store for the Controller. See Controller configuration.

FieldDescription
enabledEnable vault integration.
providerRequired when enabled: hashicorp, openbao, vault, aws, aws-secrets-manager, azure, azure-key-vault, google, or google-secret-manager.
basePathRequired when enabled. Base path inside the vault.
hashicorp.addressVault server address (HashiCorp / OpenBao / Vault providers).
hashicorp.tokenVault token.
hashicorp.mountSecret engine mount path.
aws.regionAWS region.
aws.accessKeyIdAWS access key ID.
aws.accessKeyAWS secret access key.
azure.urlAzure Key Vault URL.
azure.tenantIdAzure tenant ID.
azure.clientIdAzure client ID.
azure.clientSecretAzure client secret.
google.projectIdGoogle Cloud project ID.
google.credentialsGoogle service account credentials JSON.

TLS and trust (spec.ca, spec.tls, site CAs)

Remote and local Control Planes accept base64-encoded PEM material in YAML. All certificate and key values must be valid base64.

FieldKindsDescription
caAllTrust anchor potctl stores for Controller API verification.
tls.caRemote, localOptional CA for Controller listener TLS.
tls.certRemote, localController TLS certificate (PEM, base64). Must be set together with tls.key.
tls.keyRemote, localController TLS private key (PEM, base64).
routerSiteCA.tlsCert / tlsKeyRemote, localRouter site CA certificate and key.
routerLocalCA.tlsCert / tlsKeyRemote, localRouter local CA certificate and key.
natsSiteCA.tlsCert / tlsKeyRemote, localNATS site CA certificate and key.
natsLocalCA.tlsCert / tlsKeyRemote, localNATS local CA certificate and key.
controllers[].tlsRemotePer-Controller TLS override (same shape as spec.tls).

On Kubernetes, create secrets pot-site-ca and default-router-local-ca in the Control Plane namespace when you bring your own Router or NATS CA. See Certificates for Router and NATS.

spec.systemMicroservices (remote and local)

Per-architecture Router and NATS images deployed as system microservices.

FieldDescription
router.amd64Router image for amd64 hosts.
router.arm64Router image for arm64 hosts.
router.riscv64Router image for riscv64 hosts.
router.armRouter image for 32-bit ARM hosts.
nats.amd64NATS image for amd64 hosts.
nats.arm64NATS image for arm64 hosts.
nats.riscv64NATS image for riscv64 hosts.
nats.armNATS image for 32-bit ARM hosts.

List all four keys when your fleet mixes CPU architectures, especially with airgap: true.

Kubernetes Control Plane

The KubernetesControlPlane kind deploys the Controller, Router, and NATS on a Kubernetes cluster. The operator manages lifecycle, replicas, Services, ingress settings, optional vault, and external database settings.

---
apiVersion: datasance.com/v3
kind: KubernetesControlPlane
metadata:
name: pot
namespace: default
spec:
config: .kube/config
iofogUser:
name: Foo
surname: Bar
password: "TestPassword12!"
replicas:
controller: 2
nats: 2
controller:
publicUrl: https://controller.example.com
trustProxy: true
consolePort: 8080
consoleUrl: https://console.example.com
logLevel: info
https: true
auth:
mode: embedded
insecureAllowHttp: false
insecureAllowBootstrapLog: false
bootstrap:
username: admin
password: "LocalTest12!"
events:
auditEnabled: true
retentionDays: 14
cleanupInterval: 86400
captureIpAddress: true
images:
pullSecret: my-registry-secret
operator: ghcr.io/datasance/operator:3.8.0
controller: ghcr.io/datasance/controller:v3.8.0
router: ghcr.io/datasance/router:3.8.0
nats: ghcr.io/datasance/nats:2.14.3
nats:
enabled: true
jetStream:
storageSize: "10Gi"
memoryStoreSize: "1Gi"
storageClassName: ""
services:
controller:
type: ClusterIP
annotations: {}
externalTrafficPolicy: Cluster
router:
type: ClusterIP
annotations: {}
nats:
type: ClusterIP
annotations: {}
natsServer:
type: ClusterIP
annotations: {}
ingresses:
controller:
annotations: {}
ingressClassName: nginx
host: controller.example.com
secretName: controller-tls
router:
address: router.example.com
messagePort: 5671
interiorPort: 55671
edgePort: 45671
nats:
address: nats.example.com
serverPort: 4222
clusterPort: 6222
leafPort: 7422
mqttPort: 8883
httpPort: 8222
database:
provider: postgres
user: dbuser
host: db.example.com
port: 5432
password: secret
databaseName: iofog
ssl: true
ca: "<base64 CA>"
vault:
enabled: false
provider: hashicorp
basePath: secret/pot
hashicorp:
address: https://vault.example.com
token: "<token>"
mount: secret

Kubernetes-only fields

FieldRequiredDescription
configYesPath to the kubeconfig potctl uses to install operator resources.
replicas.controllerNoController pod count (default 1). Values greater than 1 require database.
replicas.natsNoNATS StatefulSet replicas when NATS is enabled. Must be at least 2 when set. Omit for operator default.
images.pullSecretNoKubernetes imagePullSecret name for private registries.
images.operatorNoOperator image.
images.controllerNoController image.
images.routerNoRouter image.
images.natsNoNATS image.
nats.enabledNoEnable NATS hub (default true when nats block is omitted).
nats.jetStream.storageSizeNoJetStream PVC size (for example 10Gi).
nats.jetStream.memoryStoreSizeNoJetStream memory store size.
nats.jetStream.storageClassNameNoStorageClass for JetStream PVCs. Empty string uses cluster default.
services.controller.typeNoKubernetes Service type (ClusterIP, LoadBalancer, NodePort).
services.controller.annotationsNoService annotations.
services.controller.externalTrafficPolicyNoCluster or Local. Use Cluster on k3s/OrbStack when type is LoadBalancer.
services.router.*NoSame fields as controller Service.
services.nats.*NoService for NATS leaf/advertised endpoints.
services.natsServer.*NoService for NATS server cluster port.
ingresses.controller.hostWhen Controller Service is ClusterIPIngress hostname for the Controller API.
ingresses.controller.secretNameWhen Controller Service is ClusterIPTLS secret for Controller ingress.
ingresses.controller.ingressClassNameNoIngress class (for example nginx).
ingresses.controller.annotationsNoIngress annotations.
ingresses.router.addressWhen Router Service is ClusterIPAdvertised router hostname.
ingresses.router.messagePortWhen Router Service is ClusterIPSkupper messaging port (default 5671).
ingresses.router.interiorPortWhen Router Service is ClusterIPInterior router port (default 55671).
ingresses.router.edgePortWhen Router Service is ClusterIPEdge router port (default 45671).
ingresses.nats.addressNoAdvertised NATS hostname.
ingresses.nats.serverPortNoNATS client port (default 4222).
ingresses.nats.clusterPortNoNATS cluster port (default 6222).
ingresses.nats.leafPortNoNATS leaf port (default 7422).
ingresses.nats.mqttPortNoNATS MQTT port (default 8883).
ingresses.nats.httpPortNoNATS monitoring HTTP port (default 8222).
endpointNoRuntime: Controller URL after deploy. Usually omitted from input YAML.
controllerPodsNoRuntime: operator-managed pod list. Do not set in deploy YAML.
Service type and ingress coupling

When services.controller.type is ClusterIP, you must set ingresses.controller.host and ingresses.controller.secretName.

When services.router.type is ClusterIP, you must set ingresses.router.address, messagePort, interiorPort, and edgePort.

Use LoadBalancer Services (with externalTrafficPolicy: Cluster on lightweight clusters) to skip ingress requirements for dev clusters.

Router and NATS ingress

Ingress settings for Router and NATS configure advertised addresses and ports. They do not always create Kubernetes Ingress objects, depending on your cluster setup.

Router and NATS TLS

Router and NATS deploy with TLS by default. Without your own CA, the operator creates self-signed certificates. See Certificates for Router and NATS.

Kubernetes dev example (LoadBalancer)

For local Kubernetes (k3s, OrbStack), prefer LoadBalancer Services instead of ingress:

---
apiVersion: datasance.com/v3
kind: KubernetesControlPlane
metadata:
name: pot-dev
spec:
config: ~/.kube/config
iofogUser:
controller:
trustProxy: false
https: false
auth:
mode: embedded
insecureAllowHttp: true
bootstrap:
username: admin
password: "LocalTest12!"
images:
controller: ghcr.io/datasance/controller:v3.8.0
router: ghcr.io/datasance/router:3.8.0
nats: ghcr.io/datasance/nats:2.14.3
nats:
enabled: true
services:
controller:
type: LoadBalancer
externalTrafficPolicy: Cluster
router:
type: LoadBalancer
externalTrafficPolicy: Cluster
nats:
type: LoadBalancer
externalTrafficPolicy: Cluster

Remote Control Plane

The ControlPlane kind deploys the Controller (and Router, NATS, and a system Edgelet node) on remote hosts over SSH. Set nats.enabled: true to run NATS alongside each Controller. Set airgap: true for air-gapped installs.

System Edgelet required

Each entry in controllers[] must include a systemAgent block. Deploy validation fails when it is missing. At minimum set systemAgent.config.arch and containerEngine.

---
apiVersion: datasance.com/v3
kind: ControlPlane
metadata:
name: remote
spec:
endpoint: https://controller.example.com
iofogUser:
name: Foo
surname: Bar
password: "TestPassword12!"
controller:
publicUrl: https://controller.example.com
consoleUrl: https://console.example.com
logLevel: info
package:
image: ghcr.io/datasance/controller:v3.8.0
auth:
mode: embedded
insecureAllowHttp: false
bootstrap:
username: admin
password: "RemoteTest12!"
systemMicroservices:
router:
amd64: ghcr.io/datasance/router:3.8.0
arm64: ghcr.io/datasance/router:3.8.0
riscv64: ghcr.io/datasance/router:3.8.0
arm: ghcr.io/datasance/router:3.8.0
nats:
amd64: ghcr.io/datasance/nats:2.14.3
arm64: ghcr.io/datasance/nats:2.14.3
riscv64: ghcr.io/datasance/nats:2.14.3
arm: ghcr.io/datasance/nats:2.14.3
nats:
enabled: true
events:
auditEnabled: true
retentionDays: 14
cleanupInterval: 86400
captureIpAddress: true
database:
provider: postgres
user: dbuser
host: db.example.com
port: 5432
password: secret
databaseName: iofog
controllers:
- name: remote-1
host: 10.0.128.192
ssh:
user: foo
keyFile: ~/.ssh/id_rsa
port: 22
systemAgent:
package:
container:
image: ghcr.io/datasance/edgelet:1.0.0
config:
arch: amd64
host: 10.0.128.192
containerEngine: edgelet
containerEngineUrl: unix:///run/edgelet/containerd.sock
deploymentType: native
- name: remote-2
host: 10.0.128.193
ssh:
user: foo
keyFile: ~/.ssh/id_rsa
port: 22
systemAgent:
package:
container:
image: ghcr.io/datasance/edgelet:1.0.0
config:
arch: amd64
host: 10.0.128.193
containerEngine: edgelet
deploymentType: native

Remote-only fields

FieldRequiredDescription
endpointNoLoad-balancer or shared front-end URL. Must match controller.publicUrl when both are set.
airgapNoPull images on the operator machine and transfer over SSH. Requires systemAgent.config.arch on each controller. See Airgap Deployment.
nats.enabledNoDeploy NATS hub microservice on each Controller host.
controllersYesList of Controller hosts (at least one).
controllers[].nameYesUnique lowercase alphanumeric name per Controller.
controllers[].hostYesSSH target hostname or IP.
controllers[].ssh.userYesSSH username.
controllers[].ssh.keyFileYesPath to SSH private key on the operator machine.
controllers[].ssh.portNoSSH port (default 22).
controllers[].systemAgentYesSystem Edgelet node on the Controller host. See System Edgelet on Control Plane hosts.
controllers[].tlsNoPer-host TLS material (same shape as spec.tls).
controllers[].endpointNoRuntime: resolved Controller URL for this host.
controllers[].createdNoRuntime: deploy timestamp.

When controllers has more than one entry, database with a non-empty provider is required.

Single remote Controller

For one Controller host, omit database and list a single entry under controllers:

---
apiVersion: datasance.com/v3
kind: ControlPlane
metadata:
name: remote-single
spec:
endpoint: https://controller.example.com
iofogUser:
controller:
publicUrl: https://controller.example.com
consoleUrl: https://console.example.com
package:
image: ghcr.io/datasance/controller:v3.8.0
auth:
mode: embedded
bootstrap:
username: admin
password: "RemoteTest12!"
controllers:
- name: remote-1
host: 10.0.128.192
ssh:
user: foo
keyFile: ~/.ssh/id_rsa
systemAgent:
config:
arch: amd64
containerEngine: edgelet
host: 10.0.128.192

Local Control Plane

The LocalControlPlane kind deploys the Controller with a system Edgelet node on the same machine. Use it for quick starts and development. Set nats.enabled: true to enable NATS.

System Edgelet required

spec.systemAgent is required. Set systemAgent.config.arch at minimum.

---
apiVersion: datasance.com/v3
kind: LocalControlPlane
metadata:
name: buffalo
namespace: default
spec:
endpoint: http://127.0.0.1:51121
iofogUser:
name: Foo
surname: Bar
password: "TestPassword12!"
controller:
publicUrl: http://127.0.0.1:51121
consoleUrl: http://127.0.0.1:8008
logLevel: info
package:
image: ghcr.io/datasance/controller:v3.8.0
auth:
mode: embedded
insecureAllowHttp: true
bootstrap:
username: admin
password: "LocalTest12!"
systemMicroservices:
router:
amd64: ghcr.io/datasance/router:3.8.0
arm64: ghcr.io/datasance/router:3.8.0
riscv64: ghcr.io/datasance/router:3.8.0
arm: ghcr.io/datasance/router:3.8.0
nats:
amd64: ghcr.io/datasance/nats:2.14.3
arm64: ghcr.io/datasance/nats:2.14.3
riscv64: ghcr.io/datasance/nats:2.14.3
arm: ghcr.io/datasance/nats:2.14.3
nats:
enabled: true
events:
auditEnabled: true
retentionDays: 14
systemAgent:
package:
container:
image: ghcr.io/datasance/edgelet:1.0.0
config:
arch: amd64
containerEngine: edgelet
containerEngineUrl: unix:///run/edgelet/containerd.sock
deploymentType: native

Local-only fields

FieldRequiredDescription
airgapNoAir-gapped local install. Pair with pinned images under controller.package and systemMicroservices.
systemAgentYesSystem Edgelet node co-deployed with the Controller.
controllersNoOptional list of local Controller records (runtime). Most installs omit this block.
auth.insecureAllowHttpNoAllow http:// URLs for local development.

Shared remote/local fields (endpoint, ca, tls, site CA blocks, vault, database, nats.enabled) use the same shapes as the shared spec blocks.

Controller add-on

Add another Controller to an existing remote Control Plane with the Controller kind. The namespace must already contain a full ControlPlane deploy with auth.mode and spec.controller populated.

---
apiVersion: datasance.com/v3
kind: Controller
metadata:
name: alpaca
namespace: default
spec:
host: 30.40.50.5
ssh:
user: foo
keyFile: ~/.ssh/id_rsa
port: 22
systemAgent:
package:
container:
image: ghcr.io/datasance/edgelet:1.0.0
config:
arch: amd64
host: 30.40.50.5
containerEngine: edgelet
deploymentType: native
FieldDescription
metadata.nameUnique Controller name. Lowercase alphanumeric; hyphens allowed. Must not duplicate an existing controller name or host in the namespace.
hostRemote host potctl reaches over SSH.
ssh.userSSH username.
ssh.keyFilePath to the private SSH key.
ssh.portSSH port (default 22).
systemAgentRequired. System Edgelet on the new Controller host (same shape as controllers[].systemAgent).
tlsOptional per-Controller TLS override.
endpointRuntime: resolved URL after deploy.
createdRuntime: deploy timestamp.
External database for HA

You cannot add a second Controller when the stored Control Plane uses SQLite (no database.provider). Configure database on the original ControlPlane YAML before scaling out.

Deploy with potctl connect -f controller.yaml or include the resource in a multi-document file. If the namespace has no prior Control Plane metadata, deploy the full ControlPlane YAML first.

System Edgelet on Control Plane hosts

Remote and local Control Planes deploy a system Edgelet node on the Controller host. The YAML shape matches standalone Agent deploy specs under systemAgent (or controllers[].systemAgent on remote).

Package fields

FieldDescription
package.versionEdgelet binary release tag for native installs.
package.container.imageEdgelet container image (default train: ghcr.io/datasance/edgelet:1.0.0).
package.container.registryRegistry host for air-gapped or private pulls.
package.container.usernameRegistry username.
package.container.passwordRegistry password.
package.wasm.<handler>.urlDownload URL for a Wasm shim bundle.
package.wasm.<handler>.pathLocal path to a Wasm shim bundle on the operator machine.
package.wasm.<handler>.sha256Optional SHA-256 digest (64 hex characters).

Allowed Wasm handlers include spin and edgelet-wasmtime. Wasm packages are not supported when containerEngine is podman.

Script fields

Optional custom install scripts use the same shape as Agent installation scripts: scripts.dir, scripts.deps, scripts.install, and scripts.uninstall.

Config fields

Runtime Edgelet settings live under systemAgent.config. They use the same fields as Agent / AgentConfig documented in Configuration fields.

System node router and NATS modes

On Control Plane hosts, when you set router or NATS mode explicitly:

  • routerConfig.routerMode must be interior (not edge).
  • natsConfig.natsMode must be server (not leaf).

Omit these fields to accept operator defaults for system nodes.

External OIDC example

---
apiVersion: datasance.com/v3
kind: ControlPlane
metadata:
name: remote-oidc
spec:
iofogUser:
controller:
publicUrl: https://controller.example.com
consoleUrl: https://console.example.com
package:
image: ghcr.io/datasance/controller:v3.8.0
auth:
mode: external
issuerUrl: https://idp.example.com/realms/pot
client:
id: pot-controller
secret: "<client-secret>"
consoleClient: pot-console
consoleClientEnabled: true
controllers:
- name: remote-1
host: 10.0.0.10
ssh:
user: admin
keyFile: ~/.ssh/id_rsa
systemAgent:
config:
arch: amd64
containerEngine: edgelet
host: 10.0.0.10

Edge Compute Network

Define an entire ECN in one YAML file by listing multiple resources separated by ---. The example below shows a remote Control Plane with two Controllers and two Edgelet nodes.

---
apiVersion: datasance.com/v3
kind: ControlPlane
metadata:
name: buffalo
namespace: default
spec:
iofogUser:
name: John
surname: Doe
password: "TestPassword12!"
controller:
publicUrl: https://controller.example.com:51121
consoleUrl: https://console.example.com:8008
package:
image: ghcr.io/datasance/controller:v3.8.0
auth:
mode: embedded
bootstrap:
username: admin
password: "LocalTest12!"
database:
provider: postgres
user: dbuser
host: db.example.com
port: 5432
password: secret
databaseName: iofog
controllers:
- name: alpaca-1
host: 30.40.50.3
ssh:
user: john
keyFile: ~/.ssh/id_rsa
systemAgent:
config:
arch: amd64
host: 30.40.50.3
containerEngine: edgelet
- name: alpaca-2
host: 30.40.50.4
ssh:
user: john
keyFile: ~/.ssh/id_rsa
systemAgent:
config:
arch: amd64
host: 30.40.50.4
containerEngine: edgelet
---
apiVersion: datasance.com/v3
kind: Agent
metadata:
name: hippo-1
namespace: default
spec:
host: 30.40.50.6
ssh:
user: john
keyFile: ~/.ssh/id_rsa
config:
arch: amd64
containerEngine: edgelet
---
apiVersion: datasance.com/v3
kind: Agent
metadata:
name: hippo-2
namespace: default
spec:
host: 30.40.50.7
ssh:
user: john
keyFile: ~/.ssh/id_rsa
config:
arch: amd64
containerEngine: edgelet

Field availability by kind

Field / blockK8sRemoteLocalController add-on
config (kubeconfig)Yes
replicasYes
imagesYes
services / ingressesYes
nats.jetStreamYes
controller.consolePort / trustProxy / secretNameYes
endpointRuntimeYesYes
airgapYesYes
systemMicroservicesYesYes
routerSiteCA / natsSiteCA / site CA blocksYesYes
tls (spec level)YesYesPer-controller
controllers[]YesOptionalN/A (this kind)
systemAgent (spec level)Yes
systemAgent (per controller)YesYes
Shared: iofogUser, auth, database, events, controller, vault, ca, nats.enabledYesYesYesInherits from stored CP
Group 3See anything wrong with the document? Help us improve it!