-
Notifications
You must be signed in to change notification settings - Fork 0
/
massdriver.yaml
231 lines (226 loc) · 8.52 KB
/
massdriver.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
schema: draft-07
name: gcp-gke-cluster
description: "GKE is a managed Kubernetes service in GCP that implements the full Kubernetes API, 4-way autoscaling, release channels and multi-cluster support."
source_url: github.com/massdriver-cloud/gcp-gke-cluster
access: public
type: infrastructure
steps:
- path: src
provisioner: terraform
- path: core-services
provisioner: terraform
- path: custom-resources
provisioner: terraform
params:
examples:
- __name: Development
node_groups:
- name: small-pool
machine_type: e2-standard-2
min_size: 1
max_size: 5
- __name: Production
node_groups:
- name: big-pool-general
machine_type: e2-standard-16
min_size: 1
max_size: 20
- __name: Wizard
cluster_networking:
cluster_ipv4_cidr_block: /16
services_ipv4_cidr_block: /20
master_ipv4_cidr_block: "172.16.0.0/28"
node_groups:
- name: wizard
min_size: 1
max_size: 5
is_spot: false
machine_type: e2-small
core_services:
enable_ingress: true
required:
- cluster_networking
- node_groups
- core_services
properties:
cluster_networking:
type: object
title: Cluster Networking
description: "Configure the network configuration of the cluster"
required:
- cluster_ipv4_cidr_block
- services_ipv4_cidr_block
- master_ipv4_cidr_block
properties:
cluster_ipv4_cidr_block:
type: string
pattern: ^(?:(?:[0-9]{1,3}\.){3}[0-9]{1,3})?(?:\/(?:[0-9]|[1-2][0-9]|3[0-2]))?$
message:
pattern: Must be a valid CIDR block (10.100.0.0/16) or a netmask (/16)
title: Pods IPv4 CIDR Block
default: "/16"
description: "CIDR block to use for kubernetes pods. Set to /netmask (e.g. /16) to have a range chosen with a specific netmask. Set to a CIDR notation (e.g. 10.96.0.0/14) from the RFC-1918 private networks (e.g. 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16) to pick a specific range to use."
$md.immutable: true
services_ipv4_cidr_block:
type: string
pattern: ^(?:(?:[0-9]{1,3}\.){3}[0-9]{1,3})?(?:\/(?:[0-9]|[1-2][0-9]|3[0-2]))?$
message:
pattern: Must be a valid CIDR block (10.100.0.0/20) or a netmask (/20)
title: Services IPv4 CIDR Block
default: "/20"
description: "CIDR block to use for kubernetes services. Set to /netmask (e.g. /20) to have a range chosen with a specific netmask. Set to a CIDR notation (e.g. 10.96.0.0/14) from the RFC-1918 private networks (e.g. 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16) to pick a specific range to use."
$md.immutable: true
master_ipv4_cidr_block:
$ref: https://raw.githubusercontent.com/massdriver-cloud/artifact-definitions/main/definitions/types/cidr.json
title: Cluster IPv4 CIDR Block
default: "172.16.0.0/28"
description: "CIDR block to use for kubernetes control plane. The mask for this must be exactly /28. Must be from the RFC-1918 private networks (e.g. 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16), and should not conflict with other ranges in use. It is recommended to use consecutive /28 blocks from the 172.16.0.0/16 range for all your GKE clusters (172.16.0.0/28 for the first cluster, 172.16.0.16/28 for the second, etc.)."
$md.immutable: true
node_groups:
type: array
title: Node Groups
description: Node groups to provision
minItems: 1
items:
type: object
title: Node Group
description: Definition of a node group
required:
- name
- machine_type
- min_size
- max_size
- is_spot
properties:
name:
type: string
title: Node Group Name
description: The name of the node group
# https://cloud.google.com/compute/docs/naming-resources#resource-name-format
pattern: ^[a-z]([-a-z0-9]*[a-z0-9])?$
message:
pattern: Must be a valid name. Must start with a lowercase letter, and can only contain lowercase letters, numbers, and hyphens. Must end with a number or a letter.
minLength: 1
maxLength: 40
min_size:
type: number
title: Minimum Size
description: Minimum number of instances in the node group
default: 1
max_size:
type: number
title: Maximum Size
description: Maximum number of instances in the node group
default: 10
is_spot:
type: boolean
title: Use Spot Instances
description: Spot instances are more affordable, but can be preempted at any time.
default: false
machine_type:
type: string
title: Machine type
description: Machine type to use in the node group
default: e2-standard-2
oneOf:
- title: 'Shared-core: 2 vCPUs 2GB Memory'
const: e2-small
- title: 'Shared-core: 2 vCPUs 4GB Memory'
const: e2-medium
- title: 'General: 2 vCPUs 8GB Memory'
const: e2-standard-2
- title: 'General: 4 vCPUs 16GB Memory'
const: e2-standard-4
- title: 'General: 8 vCPUs 32GB Memory'
const: e2-standard-8
- title: 'General: 16 vCPUs 64GB Memory'
const: e2-standard-16
- title: 'General: 32 vCPUs 64GB Memory'
const: e2-standard-32
- title: 'Memory: 2 vCPUs 16GB Memory'
const: e2-highmem-2
- title: 'Memory: 4 vCPUs 32GB Memory'
const: e2-highmem-4
- title: 'Memory: 8 vCPUs 64GB Memory'
const: e2-highmem-8
- title: 'Memory: 16 vCPUs 128GB Memory'
const: e2-highmem-16
- title: 'CPU: 2 vCPUs 2GB Memory'
const: e2-highcpu-2
- title: 'CPU: 4 vCPUs 4GB Memory'
const: e2-highcpu-4
- title: 'CPU: 8 vCPUs 8GB Memory'
const: e2-highcpu-8
- title: 'CPU: 16 vCPUs 16GB Memory'
const: e2-highcpu-16
- title: 'CPU: 32 vCPUs 32GB Memory'
const: e2-highcpu-32
# TODO: move machine types to the backend
- title: 'GPU: 1 GPU 40GB Memory - NVIDIA A100 40GB'
const: a2-highgpu-1g
- title: 'GPU: 16 GPUs 640GB Memory - NVIDIA A100 40GB'
const: a2-megagpu-16g
- title: 'GPU: 1 GPU 80GB Memory - NVIDIA A100 80GB'
const: a2-ultragpu-1g
- title: 'GPU: 1 GPU 24GB Memory - NVIDIA L4'
const: g2-standard-4
- title: 'GPU: 2 GPU 48GB Memory - NVIDIA L4'
const: g2-standard-24
core_services:
type: object
title: Core Services
description: Configure core services in Kubernetes for Massdriver to manage
required: []
properties:
enable_ingress:
type: boolean
title: Enable Ingress
description: Enabling this will create an nginx ingress controller in the cluster, allowing internet traffic to flow into web accessible services within the cluster
default: false
cloud_dns_managed_zones:
type: array
title: Cloud DNS Managed Zones
description: Select any Cloud DNS Managed Zones associated with this cluster to allow the cluster to automatically manage DNS records and SSL certificates
default: []
items:
type: string
title: Managed Zone
connections:
required:
- gcp_authentication
- subnetwork
properties:
gcp_authentication:
$ref: massdriver/gcp-service-account
subnetwork:
$ref: massdriver/gcp-subnetwork
artifacts:
required:
- kubernetes_cluster
properties:
kubernetes_cluster:
$ref: massdriver/kubernetes-cluster
ui:
items:
ui:order:
- cluster_networking
- node_groups
- core_services
- "*"
node_groups:
items:
ui:order:
- name
- machine_type
- min_size
- max_size
- is_spot
- "*"
core_services:
ui:order:
- enable_ingress
- cloud_dns_managed_zones
cloud_dns_managed_zones:
items:
ui:field: dnsZonesDropdown
cloud: gcp