4.6 KiB
aic-kube MaaS Orchestration
Inventory/Design Schema
Would be nice to see this get out of Git-managed flat-files and into an API accessible datastore that allows more fine-grained queries and supports inheritance/composition natively
Requirements
- Use profile inheritance to minimize data repitition
- Future-proof to support configuration items (CIs) we consider static today
- Support composition to allow federated source of truth
Components
bootstrap_seed.yaml
Probably needs renamed, but I see this as being the Formation data that specifies explicit values - hostnames, IP address assignments, VLAN IDs, etc...
bootstrap_hwdefinition.yaml
Looks to be mainly focused on initial OOB control and getting a server into PXE mode. Should be able to leave as-is and adopt existing Apollo logic for IPMI.
bootstrap_profiles.yaml
Currently doesn't exist, but I think it makes sense to separate the data that describes the design (like general profiles) from the data that ties the design to explicit assignments (i.e. Formation data)
Questions/Issues
- Need DNS specs in YAML - where to include it, possibly per network
making it effective when that network is chosen as "primary"
- Can set comma-delimited list of DNS servers per subnet
- Consider YAML pointers and anchors to diminish how much inheritance
has to be calculated in code
- Does not appear to support key subtraction
- No way to merge hashes based on a 'primary' key
- Scott thinks best to keep with managing inheritance in code. Can minimize magic via comments in YAML
- Best way of specifying hardware paths (eth0 may not be consistent across boots)
- PCI bus address
- For NIC lshw should tie a PCI address to a MAC (serial number) and logical name (eth0)
- MaaS API is keyed to logical name
- SCSI bus address
- PCI bus address
- How to specify custom hardware drivers
- OOB config - /etc/maas/drivers.yaml specify the suite of drivers available to MaaS outside what is built into the streams. MaaS will automatically consume a driver when it detects hardware that needs it. This config is not API accessible.
- Expound on storage, at least specifying primary boot drive
Orchestrator Service Fabric
Consider Go over Python considering performance differences, concurrency support and ease of deploying static binaries.
Requirements
- Make interfaces at both ends pluggable
- Support metadata API for node introspection
- Support future addition of network and storage orchestration
Services
Design Consumer
Pluggable service to ingest a inventory/design specification, convert it to a standard internal representaion, and persist it to the Design State API. Initial implementation is the consumer of AIC YAML schema.
Design State API
API for querying and updating the current design specification and persisted orchestration status. CRUD support of CIs that are not bootstrap-related, but can be used by other automation.
Control API
User-approachable API for initiating orchestration actions or accessing other internal APIs
Infrastructure Orchestrator
Handle validation of complete design, ordering and managing downstream API calls for hardware provisioning/bootstrapping
Server Driver
Pluggable provisioner for server bootstrapping. Initial implementation is MaaS client.
Network Driver
Pluggable provisioner for network provisioning. Initial implementation is Noop.
Introspection API
API for bootstrapping nodes to load self data. Possibly pluggable as this is basically an authenticated bridge to the Design State API
Questions
- Should this drive the MaaS configuration or only drive node deployment?
- What do we need commissioning scripts for?
- Firmware updates
- Hardware RAID configs
- Hardware manifest validation (as designed/as built)