Skip to content

Commit bb99134

Browse files
docs(verda): add Verda provider page
New providers/verda.md with secret format, credentials howto, locations and instance type queries, GPU notes, three manifest examples (single-location, GPU pool, autoscaling). README, mkdocs nav and api-reference updated to include the new provider.
1 parent 612af74 commit bb99134

4 files changed

Lines changed: 277 additions & 1 deletion

File tree

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ Before you begin, please make sure you have the following prerequisites installe
101101
| [Exoscale](https://docs.claudie.io/latest/input-manifest/providers/exoscale/) | :heavy_check_mark: | :heavy_check_mark: | N/A | :heavy_check_mark: |
102102
| [Hetzner](https://docs.claudie.io/latest/input-manifest/providers/hetzner/) | :heavy_check_mark: | :heavy_check_mark: | N/A | :heavy_check_mark: |
103103
| [CloudRift](https://docs.claudie.io/latest/input-manifest/providers/cloudrift/) | :heavy_check_mark: | N/A | N/A | :heavy_check_mark: |
104+
| [Verda](https://docs.claudie.io/latest/input-manifest/providers/verda/) | :heavy_check_mark: | N/A | N/A | :heavy_check_mark: |
104105
| [Cloudflare](https://docs.claudie.io/latest/input-manifest/providers/cloudflare/) | N/A | :heavy_check_mark: |:heavy_check_mark: | N/A |
105106
| [OVH Cloud](https://docs.claudie.io/latest/input-manifest/providers/openstack/) | :heavy_check_mark: | N/A | N/A | :heavy_check_mark: |
106107
| [Openstack](https://docs.claudie.io/latest/input-manifest/providers/openstack/) | :heavy_check_mark: | N/A | N/A | :heavy_check_mark: |

docs/input-manifest/api-reference.md

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ needs to be defined.
4949
| `gcp` | [GCP](#gcp) provider type |
5050
| `hetzner` | [Hetzner](#hetzner) provider type |
5151
| `oci` | [OCI](#oci) provider type |
52+
| `verda` | [Verda](#verda) provider type |
5253

5354
- `secretRef` [SecretRef](#secretref)
5455

@@ -226,6 +227,28 @@ To find out how to configure Azure provider and service account, follow the inst
226227
- `tag`: Optional. If set when the git repository is downloaded, the commit hash from the tag version is used.
227228
- `path`: specifies the path for a specific provider within the `repository` where the source template files are located.
228229

230+
### Verda
231+
232+
The fields that need to be included in a Kubernetes Secret resource to utilize the Verda Cloud provider.
233+
To find out how to configure Verda provider and API credentials, follow the instructions [here](./providers/verda.md).
234+
235+
- `clientid`
236+
237+
OAuth2 Client ID issued by the Verda console under **Keys > Cloud API Credentials**.
238+
239+
- `clientsecret`
240+
241+
OAuth2 Client Secret paired with the `clientid` above. Shown only once at creation time in the Verda console.
242+
243+
- `baseurl` *(optional)*
244+
245+
Override the Verda Cloud API base URL. Defaults to `https://api.verda.com/v1`.
246+
247+
- `templates`
248+
- `repository`: specifies the location from where the external template are to be acquired. Must be a publicly available git repository.
249+
- `tag`: Optional. If set when the git repository is downloaded, the commit hash from the tag version is used.
250+
- `path`: specifies the path for a specific provider within the `repository` where the source template files are located.
251+
229252
## Nodepools
230253

231254
Collection of static and dynamic nodepool specification, to be referenced in the `kubernetes` or `loadBalancer` clusters.
@@ -311,7 +334,7 @@ Dynamic nodepools are defined for cloud provider machines that Claudie is expect
311334

312335
## Provider Spec
313336

314-
Provider spec is an additional specification built on top of the data from any of the provider instance. Here are provider configuration examples for each individual provider: [aws](providers/aws.md), [azure](providers/azure.md), [cloudrift](providers/cloudrift.md), [exoscale](providers/exoscale.md), [gcp](providers/gcp.md), [cloudflare](providers/cloudflare.md), [hetzner](providers/hetzner.md) and [oci](providers/oci.md).
337+
Provider spec is an additional specification built on top of the data from any of the provider instance. Here are provider configuration examples for each individual provider: [aws](providers/aws.md), [azure](providers/azure.md), [cloudrift](providers/cloudrift.md), [exoscale](providers/exoscale.md), [gcp](providers/gcp.md), [cloudflare](providers/cloudflare.md), [hetzner](providers/hetzner.md), [oci](providers/oci.md) and [verda](providers/verda.md).
315338

316339
- `name`
317340

Lines changed: 251 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,251 @@
1+
# Verda Cloud
2+
[Verda Cloud](https://verda.com/) is a Helsinki-based GPU/compute provider. The Verda provider in Claudie requires OAuth2 client credentials (`clientid` + `clientsecret`) in the Kubernetes Secret. An optional `baseurl` can override the default API endpoint.
3+
4+
## Compute example
5+
```yaml
6+
apiVersion: v1
7+
kind: Secret
8+
metadata:
9+
name: verda-secret
10+
data:
11+
clientid: <base64-encoded-client-id>
12+
clientsecret: <base64-encoded-client-secret>
13+
baseurl: <base64-encoded-base-url> # optional, defaults to https://api.verda.com/v1
14+
type: Opaque
15+
```
16+
17+
!!! note "No DNS support"
18+
Verda Cloud does not provide DNS resources. If you need load balancer DNS records for Verda clusters, use a separate DNS provider (e.g., Cloudflare, AWS Route53, GCP Cloud DNS).
19+
20+
!!! warning "Choose a non-Docker Ubuntu image"
21+
Verda offers Ubuntu images both with and without Docker pre-installed (e.g., `ubuntu-24.04-cuda-12.8-open-docker` vs `ubuntu-24.04-cuda-12.8-open`). Claudie uses KubeOne for cluster bootstrap, which installs and pins its own version of `containerd.io`. Pre-installed Docker on the image conflicts with this and causes apt-get to refuse the downgrade. **Always pick a Verda image without the `-docker` suffix.** Use `ubuntu-24.04` for non-GPU nodes and `ubuntu-24.04-cuda-12.8-open` (or similar) for GPU nodes.
22+
23+
## Create Verda API credentials
24+
25+
Generate OAuth2 client credentials from the [Verda console](https://console.verda.com/) under **Keys > Cloud API Credentials**. You receive a `client_id` and a `client_secret` (the secret is shown only once at creation time).
26+
27+
The provider uses the OAuth2 client-credentials grant flow with scope `cloud-api-v1`. Claudie's Verda template embeds the credentials at apply time (the OpenTofu `verda` provider handles token exchange internally).
28+
29+
## Available locations and instance types
30+
31+
Locations and instance types can change. Query the live catalog with the credentials you just created:
32+
33+
```bash
34+
# Get an OAuth bearer token
35+
TOKEN=$(curl -sS -X POST https://api.verda.com/v1/oauth2/token \
36+
-d grant_type=client_credentials \
37+
-d "client_id=<your-client-id>" \
38+
-d "client_secret=<your-client-secret>" \
39+
-d scope=cloud-api-v1 | jq -r .access_token)
40+
41+
# List instance types (CPU, RAM, GPU per type)
42+
curl -sS https://api.verda.com/v1/instance-types \
43+
-H "Authorization: Bearer $TOKEN" -H "user-agent: " | jq
44+
45+
# List locations
46+
curl -sS https://api.verda.com/v1/locations \
47+
-H "Authorization: Bearer $TOKEN" -H "user-agent: " | jq
48+
49+
# List images
50+
curl -sS https://api.verda.com/v1/images \
51+
-H "Authorization: Bearer $TOKEN" -H "user-agent: " | jq
52+
53+
# Live availability per instance type and location
54+
curl -sS https://api.verda.com/v1/instance-availability \
55+
-H "Authorization: Bearer $TOKEN" -H "user-agent: " | jq
56+
```
57+
58+
Common values at the time of writing:
59+
60+
| Field | Examples |
61+
|---|---|
62+
| `region` | `FIN-01`, `FIN-02`, `FIN-03` (all in Helsinki) |
63+
| `serverType` | `CPU.4V.16G` (CPU only), `1B200.30V` (1× B200 GPU) |
64+
| `image` | `ubuntu-24.04`, `ubuntu-24.04-cuda-12.8-open`, `ubuntu-22.04-cuda-13.0-open` |
65+
66+
!!! warning "Storage quota and trash"
67+
Verda's deleted volumes go to a per-account trash bin and continue to count toward your storage quota until permanently purged. If a Claudie apply fails after creating volumes, those volumes accumulate in the trash. Purge them with `DELETE /v1/volumes/<id>` and JSON body `{"is_permanent": true}` (HTTP 202 returned). See `samuelstolicny/claudie-config` Verda integration notes for a copy-paste purge one-liner.
68+
69+
## GPU instances
70+
Verda specializes in GPU compute (A100, H100, B200, etc.). GPU instances are selected by setting the `serverType` to a GPU instance type (e.g., `1B200.30V` for 1× B200 with 30 vCPU). No additional `machineSpec` configuration is needed — the GPU is included in the instance type. Use the `*-cuda-*-open` (no Docker) image variants for GPU nodes; CUDA drivers are baked in.
71+
72+
## Custom SSH port
73+
74+
Like all Claudie-managed nodes, Verda VMs listen for SSH on **port 22522**. The cloud-init script reconfigures `sshd_config` and the `ssh.socket` listener accordingly during node provisioning.
75+
76+
## Input manifest examples
77+
78+
### Create a secret for Verda provider
79+
The secret for a Verda provider must include the following mandatory fields: `clientid`, `clientsecret`. The `baseurl` field is optional.
80+
81+
```bash
82+
kubectl create secret generic verda-secret-1 \
83+
--namespace=<your-namespace> \
84+
--from-literal=clientid='<your-client-id>' \
85+
--from-literal=clientsecret='<your-client-secret>'
86+
```
87+
88+
### Single-provider, single-location cluster example
89+
90+
```yaml
91+
apiVersion: claudie.io/v1beta1
92+
kind: InputManifest
93+
metadata:
94+
name: verda-example-manifest
95+
labels:
96+
app.kubernetes.io/part-of: claudie
97+
spec:
98+
providers:
99+
- name: verda-1
100+
providerType: verda
101+
templates:
102+
repository: "https://github.com/berops/claudie-config"
103+
tag: v0.11.0
104+
path: "templates/terraformer/verda"
105+
secretRef:
106+
name: verda-secret-1
107+
namespace: <your-namespace>
108+
109+
nodePools:
110+
dynamic:
111+
- name: control-verda
112+
providerSpec:
113+
# Name of the provider instance.
114+
name: verda-1
115+
# Location of the nodepool.
116+
region: FIN-01
117+
count: 1
118+
# Instance type name.
119+
serverType: CPU.4V.16G
120+
# OS image name (use a non-Docker variant).
121+
image: "ubuntu-24.04"
122+
123+
- name: compute-verda
124+
providerSpec:
125+
name: verda-1
126+
region: FIN-01
127+
count: 2
128+
serverType: CPU.4V.16G
129+
image: "ubuntu-24.04"
130+
storageDiskSize: 50
131+
132+
kubernetes:
133+
clusters:
134+
- name: verda-cluster
135+
version: "1.34.0"
136+
network: 192.168.2.0/24
137+
pools:
138+
control:
139+
- control-verda
140+
compute:
141+
- compute-verda
142+
```
143+
144+
### GPU compute pool example
145+
146+
```yaml
147+
apiVersion: claudie.io/v1beta1
148+
kind: InputManifest
149+
metadata:
150+
name: verda-gpu-manifest
151+
labels:
152+
app.kubernetes.io/part-of: claudie
153+
spec:
154+
providers:
155+
- name: verda-1
156+
providerType: verda
157+
templates:
158+
repository: "https://github.com/berops/claudie-config"
159+
tag: v0.11.0
160+
path: "templates/terraformer/verda"
161+
secretRef:
162+
name: verda-secret-1
163+
namespace: <your-namespace>
164+
165+
nodePools:
166+
dynamic:
167+
- name: control-verda
168+
providerSpec:
169+
name: verda-1
170+
region: FIN-01
171+
count: 1
172+
serverType: CPU.4V.16G
173+
image: "ubuntu-24.04"
174+
175+
- name: gpu-verda
176+
providerSpec:
177+
name: verda-1
178+
region: FIN-01
179+
count: 1
180+
# GPU instance type, e.g. 1× B200.
181+
serverType: 1B200.30V
182+
# CUDA image without Docker (KubeOne installs its own containerd).
183+
image: "ubuntu-24.04-cuda-12.8-open"
184+
storageDiskSize: 100
185+
186+
kubernetes:
187+
clusters:
188+
- name: verda-gpu-cluster
189+
version: "1.34.0"
190+
network: 192.168.2.0/24
191+
pools:
192+
control:
193+
- control-verda
194+
compute:
195+
- gpu-verda
196+
```
197+
198+
### Autoscaling cluster example
199+
200+
```yaml
201+
apiVersion: claudie.io/v1beta1
202+
kind: InputManifest
203+
metadata:
204+
name: verda-autoscale-manifest
205+
labels:
206+
app.kubernetes.io/part-of: claudie
207+
spec:
208+
providers:
209+
- name: verda-1
210+
providerType: verda
211+
templates:
212+
repository: "https://github.com/berops/claudie-config"
213+
tag: v0.11.0
214+
path: "templates/terraformer/verda"
215+
secretRef:
216+
name: verda-secret-1
217+
namespace: <your-namespace>
218+
219+
nodePools:
220+
dynamic:
221+
- name: control-verda
222+
providerSpec:
223+
name: verda-1
224+
region: FIN-01
225+
count: 1
226+
serverType: CPU.4V.16G
227+
image: "ubuntu-24.04"
228+
229+
- name: gpu-verda
230+
providerSpec:
231+
name: verda-1
232+
region: FIN-01
233+
# Autoscaler configuration (mutually exclusive with count).
234+
autoscaler:
235+
min: 0
236+
max: 3
237+
serverType: 1B200.30V
238+
image: "ubuntu-24.04-cuda-12.8-open"
239+
storageDiskSize: 100
240+
241+
kubernetes:
242+
clusters:
243+
- name: verda-cluster
244+
version: "1.34.0"
245+
network: 192.168.2.0/24
246+
pools:
247+
control:
248+
- control-verda
249+
compute:
250+
- gpu-verda
251+
```

mkdocs.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ nav:
108108
- Hetzner: input-manifest/providers/hetzner.md
109109
- OCI: input-manifest/providers/oci.md
110110
- Openstack: input-manifest/providers/openstack.md
111+
- Verda: input-manifest/providers/verda.md
111112
- On Premise: input-manifest/providers/on-prem.md
112113
- External templates: input-manifest/external-templates.md
113114
- API reference: input-manifest/api-reference.md

0 commit comments

Comments
 (0)