Remote ControlPlane fields
Reference for remote kind: ControlPlane. Deploy flow is on Remote. Several hosts are on Multi-controller HA.
apiVersion: datasance.com/v3 # required, string
kind: ControlPlane # required, string
metadata:
name: remote-cp # required, string
namespace: my-ecn # no, string
spec:
endpoint: https://controller.example.com:51121 # recommended, string. Must match controller.publicUrl when both are set
ca: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0t # no, string. Base64 PEM. CLI trust
iofogUser:
password: "ChangeMe!12345" # no, string
controller:
publicUrl: https://controller.example.com:51121 # no, string
trustProxy: false # no, bool
consoleUrl: https://controller.example.com:8008 # no, string
consolePort: 8008 # no, int, default 8008
logLevel: info # no, string
pidBaseDir: /home/runner # no, string
package:
image: ghcr.io/datasance/controller:3.9.0 # no, string. Default controller:3.9.0 on the flavor registry
registry: registry.example.com # no, string. Set with username and password
username: pull-user # no, string
password: pull-token # no, string
auth: # required, object. Keep the fields for one mode
mode: embedded # required, embedded or external
insecureAllowHttp: false # no, bool
insecureAllowBootstrapLog: false # no, bool
bootstrap:
username: bootstrap-user # required if embedded, string
password: "ChangeMe!12345" # required if embedded, string
issuerUrl: https://idp.example.com # required if external, string. Remove when mode is embedded
client:
id: cli # required if external, string
secret: client-secret # required if external, string
rateLimit:
enabled: false # no, bool
maxRequestsPerWindow: 100 # no, int
windowMs: 60000 # no, int
sessionStore:
type: memory # no, string
ttlMs: 3600000 # no, int
secret: session-secret # no, string
tokenTtl:
accessTokenTtlSeconds: 3600 # no, int
refreshTokenTtlSeconds: 86400 # no, int
oidcTtl:
interactionTtlSeconds: 600 # no, int
grantTtlSeconds: 600 # no, int
sessionTtlSeconds: 3600 # no, int
idTokenTtlSeconds: 3600 # no, int
database: # required when there are several controllers
provider: postgres # string. postgres or mysql
host: db.example.com # string
port: 5432 # int
user: pot # string
password: db-password # string
databaseName: pot # string
ssl: false # no, bool
ca: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0t # no, string. Base64 PEM
routerSiteCA: # no, object
tlsCert: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0t # string. Base64 PEM
tlsKey: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQ # string. Base64 PEM
routerLocalCA:
tlsCert: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0t # string
tlsKey: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQ # string
natsSiteCA:
tlsCert: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0t # string
tlsKey: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQ # string
natsLocalCA:
tlsCert: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0t # string
tlsKey: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQ # string
tls: # no, object. cert and key are set together
ca: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0t # string. Base64 PEM
cert: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0t # string. Base64 PEM
key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQ # string. Base64 PEM
systemMicroservices: # no, object. Keys amd64, arm64, arm, riscv64
router:
amd64: ghcr.io/datasance/router:3.9.0
arm64: ghcr.io/datasance/router:3.9.0
arm: ghcr.io/datasance/router:3.9.0
riscv64: ghcr.io/datasance/router:3.9.0
nats:
amd64: ghcr.io/datasance/nats:2.15.0
arm64: ghcr.io/datasance/nats:2.15.0
arm: ghcr.io/datasance/nats:2.15.0
riscv64: ghcr.io/datasance/nats:2.15.0
nats:
enabled: true # no, bool
events:
auditEnabled: false # no, bool
retentionDays: 30 # no, int
cleanupInterval: 3600 # no, int. Seconds
captureIpAddress: false # no, bool
vault: # no, object. Keep the provider block that matches provider
enabled: false # no, bool
provider: hashicorp # no, string
basePath: secret/data/ecn # no, string. Stored as written
hashicorp:
address: https://vault.example.com # string
token: vault-token # string
mount: secret # string
aws:
region: us-east-1 # string
accessKeyId: <access-key-id> # string
accessKey: <secret-access-key> # string
azure:
url: https://example.vault.azure.net # string
tenantId: <tenant-id> # string
clientId: <client-id> # string
clientSecret: <client-secret> # string
google:
projectId: <project-id> # string
credentials: "<service-account-json>" # string
airgap: false # no, bool
controllers: # required, list. At least one
- name: ctrl-1 # required, string. DNS-like lowercase alphanumeric
host: 10.0.0.10 # required, string
ssh:
user: ubuntu # required, string
keyFile: ~/.ssh/id_rsa # required, string
port: 22 # no, int, default 22
systemAgent: {} # required, object. {} is allowed
tls: # no, object. Overrides global spec.tls for this host
ca: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0t # string
cert: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0t # string
key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQ # string
airgap: false # no, bool
- name: ctrl-2 # required, string
host: 10.0.0.11 # required, string
ssh:
user: ubuntu # required, string
keyFile: ~/.ssh/id_rsa # required, string
port: 22 # no, int, default 22
systemAgent: # required, object
config:
arch: amd64 # required when config is set, string. Required for airgap
host: 10.0.0.11 # no, string
deploymentType: native # no, string. native or container
package: {} # no, object
scripts: {} # no, object
airgap: false # no, bool
Not deployed
These fields come back from describe. Leave them out of the file you pass to deploy.
controllers:
- endpoint: https://10.0.0.10:51121 # filled after deploy. Not part of the first deploy file
At parse time, a document kind RemoteController maps to Controller for add-on deploys only.
metadata.controlPlaneType is rejected. Use kind: ControlPlane.
Global spec fields
spec.endpoint
| Type | Required | Notes |
|---|---|---|
| string (URL) | Recommended | CLI API wait target. Must match controller.publicUrl when both are set. |
spec.ca
Base64 PEM. CLI trust for the Controller API. Not sent to Edgelet. See Securing a remote control plane.
spec.iofogUser
| Field | Required |
|---|---|
email | Yes |
password | No. Complexity rules apply when set. The CLI may prompt. |
spec.controller
Same controller block as local: publicUrl, trustProxy, consoleUrl, consolePort, logLevel, pidBaseDir, and package for the image and a private registry.
The stored control plane must include this block before a Controller add-on is allowed.
| Field | Notes |
|---|---|
publicUrl | Public URL embedded for Edgelet |
trustProxy | |
consoleUrl | EdgeOps Console URL |
consolePort | Default 8008 |
logLevel | |
pidBaseDir | |
package.image | Controller image. Default for this train is controller:3.9.0 on the flavor registry. See Default image pins. |
package.registry | Registry hostname for a private pull |
package.username | Required together with registry and password |
package.password | |
package.email | Optional |
When any of registry, username, or password is set, all three are required.