Confluent Platform on VMs installs a stable Confluent Platform release on virtual machines you own, instead of on Kubernetes. Streamtime runs Kafka in KRaft mode and adds Schema Registry, Kafka Connect, REST Proxy and Control Center according to the machines in your VM fleet.
When to use Confluent Platform on VMs
No Kubernetes: your organization runs Kafka on virtual machines or bare metal.
Existing Confluent Platform estate: you want Streamtime to install, upgrade and monitor Confluent Platform the way you already run it.
Dedicated hardware: each cluster gets a fleet of its own.
Prerequisites
A VM fleet in Healthy state, with Dedicated tenancy and no other cluster on it. Each VM fleet hosts one Confluent Platform cluster. The fleet’s machines decide which components run where. See Fleet management.
A Confluent Platform license, unless you are running a trial.
Cluster settings
Basic Configuration
Identifier: unique in your organization, lowercase letters, digits and dashes.
Tags: optional key/value labels.
Cloud provider, tenancy and capacity are fixed for this cluster type: it always runs on a VM fleet with Dedicated tenancy, and its size comes from the fleet’s machines, not from Kafka Units.
Fleet Selection (administrators only)
Only VM fleets that are Healthy, Dedicated and empty are listed.
Advanced Configuration (administrators only)
Confluent Package Version: the Confluent Platform release to install. The list shows the stable releases you can choose.
SASL protocol: scram (SASL/SCRAM-SHA-512, the default) or plain (SASL/PLAIN). Clients always connect over TLS.
License: your Confluent Platform license. Leave it blank for a trial.
Custom broker properties and custom controller properties: extra Kafka settings as key/value pairs, applied to every broker or controller.
Before you start
A fleet in Healthy state with room for the cluster (see Fleet management).
For the API: an access token in STREAMTIME_TOKEN and your organization identifier in place of <org>. Replace api.example.com with your Streamtime API address.
packagemainimport("bytes""crypto/rand""encoding/hex""encoding/json""net/http""os")constapi="https://api.example.com/organizations/<org>"// newKey returns a random idempotency key.funcnewKey()string{b:=make([]byte,16)rand.Read(b)returnhex.EncodeToString(b)}// call sends one request with the access token and a JSON body (or none).// An optional idempotency key is sent as the Idempotency-Key header.funccall(method,pathstring,bodyany,idempotencyKey...string)(*http.Response,error){varbufbytes.Bufferifbody!=nil{iferr:=json.NewEncoder(&buf).Encode(body);err!=nil{returnnil,err}}req,err:=http.NewRequest(method,api+path,&buf)iferr!=nil{returnnil,err}req.Header.Set("Authorization","Bearer "+os.Getenv("STREAMTIME_TOKEN"))req.Header.Set("Content-Type","application/json")iflen(idempotencyKey)>0{req.Header.Set("Idempotency-Key",idempotencyKey[0])}returnhttp.DefaultClient.Do(req)}
Create a cluster
In the sidebar, select Clusters, then Create cluster.
Cluster Type: choose Confluent Platform (VM), then select Next.
Basic Configuration: enter an Identifier and optional Tags.
Fleet Selection: choose the VM fleet.
Advanced Configuration: choose the Confluent Package Version and the SASL protocol, and add your license.
Select Deploy.
The cluster appears in the list as Pending, then Provisioning, then Healthy.
Find the versions you can install in the confluent_package_version field of the provider’s settings:
# 1. Save the cluster. The response includes its "generation".
curl -X POST "$API/kafka/"\-H"Authorization: Bearer $STREAMTIME_TOKEN"\-H"Content-Type: application/json"\-d'{
"identifier": "ledger",
"workload": "cpansible",
"cloud_provider": "byovm",
"tenancy_mode": "Dedicated",
"kafka_units": 1,
"fleet": "<vm-fleet>",
"advanced_config": {
"confluent_package_version": "<version>",
"sasl_protocol": "scram",
"license": "<license>"
}
}'# 2. Start provisioning that generation.
curl -X POST "$API/kafka/ledger/reconcile/"\-H"Authorization: Bearer $STREAMTIME_TOKEN"\-H"Content-Type: application/json"\-H"Idempotency-Key: $(uuidgen)"\-d'{"generation": 1}'
fleet and confluent_package_version are required. kafka_units is always 1 for this cluster type. The second request returns 202 with the operation it started; a 409 means the generation is out of date. Poll GET $API/kafka/ledger/ until status is Healthy (or Error).
resp,err:=call("POST","/kafka/",map[string]any{"identifier":"ledger","workload":"cpansible","cloud_provider":"byovm","tenancy_mode":"Dedicated","kafka_units":1,"fleet":"<vm-fleet>","advanced_config":map[string]any{"confluent_package_version":"<version>"},})iferr!=nil{returnerr}deferresp.Body.Close()varcreatedstruct{Generationint`json:"generation"`}iferr:=json.NewDecoder(resp.Body).Decode(&created);err!=nil{returnerr}// Start provisioning that generation.resp,err=call("POST","/kafka/ledger/reconcile/",map[string]any{"generation":created.Generation},newKey())
streamtime kafka get ledger
streamtime kafka status ledger
streamtime kafka credentials ledger
Creating credentials and reading connection settings aren’t available in the CLI yet. Use the UI or API.
Ask, for example: “What is the status of the ledger cluster?” The assistant uses get_cluster_status. MCP doesn’t create credentials.
Change the configuration
A Confluent Platform on VMs cluster takes its size from the VM fleet, so there are no Kafka Units to change. To grow it, add machines to the fleet. You can change the SASL protocol, license and custom broker or controller properties.
Changing these settings isn’t available in the UI yet. Use the API.
# 1. Save the change. The response has the new "generation".
curl -X PATCH "$API/kafka/ledger/"\-H"Authorization: Bearer $STREAMTIME_TOKEN"-H"Content-Type: application/json"\-d'{"advanced_config": {
"confluent_package_version": "<current-version>",
"custom_broker_properties": {"log.retention.hours": "72"}
}}'# 2. Apply that generation.
curl -X POST "$API/kafka/ledger/reconcile/"\-H"Authorization: Bearer $STREAMTIME_TOKEN"-H"Content-Type: application/json"\-H"Idempotency-Key: $(uuidgen)"\-d'{"generation": <generation>}'
advanced_config is replaced as a whole, so send every setting, including the current confluent_package_version. To change the version, use Upgrade the version instead.
resp,err:=call("PATCH","/kafka/ledger/",map[string]any{"advanced_config":map[string]any{"confluent_package_version":"<current-version>","custom_broker_properties":map[string]string{"log.retention.hours":"72"},},})iferr!=nil{returnerr}deferresp.Body.Close()varupdatedstruct{Generationint`json:"generation"`}iferr:=json.NewDecoder(resp.Body).Decode(&updated);err!=nil{returnerr}// Apply that generation.resp,err=call("POST","/kafka/ledger/reconcile/",map[string]any{"generation":updated.Generation},newKey())
The CLI saves the change but can’t apply it yet. Apply it from the API (step 2 in the API tab).
Not available in MCP yet.
Upgrade the version
Streamtime upgrades through every release between the current and the target version, in order.
Open the cluster and select the Manage tab.
Select Upgrade version and choose the new Version, then confirm.
The cluster shows Upgrading, then Healthy.
# Versions you can upgrade to
curl -s"$API/kafka/ledger/packages/update/"-H"Authorization: Bearer $STREAMTIME_TOKEN"# Upgrade to one of them (or send {"strategy": "latest"} for the newest)
curl -X POST "$API/kafka/ledger/packages/update/"\-H"Authorization: Bearer $STREAMTIME_TOKEN"-H"Content-Type: application/json"\-d'{"target_version": "<version>"}'
The first request returns current_version and the versions you can choose. Send either target_version or strategy, not both.
MCP reads topic settings; it doesn’t change them. Ask, for example: “What is the retention of the payments topic on ledger?” (uses get_topic_configuration).
View metrics, logs and alerts
Open the cluster and select the Monitoring tab for throughput, broker health, logs and alerts.
Ask, for example: “Show me errors in the ledger logs from the last hour” or “Are any alerts firing on ledger?” The assistant uses get_cluster_metric, get_cluster_logs and get_cluster_alerts (list_cluster_metrics lists what can be queried).
Delete the cluster
Deleting a cluster removes its brokers and all topic data. It can’t be undone.
In Clusters, find the cluster and select Delete.
Confirm.
The cluster shows Deleting and then leaves the list.
Returns 202 with the delete operation; the cluster shows Deleting while its resources are removed, then GET $API/kafka/ledger/ returns 404. A cluster that was never provisioned is removed at once.