-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathMain.scala
93 lines (83 loc) · 2.63 KB
/
Main.scala
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
import besom.*
import besom.api.{awsx, eks, kubernetes as k8s}
@main def main = Pulumi.run {
val appName = "hello-world"
val appLabels = Map("appClass" -> appName)
val appPort = 80
// Get the default VPC
val vpc = awsx.ec2.Vpc("my-vpc", awsx.ec2.VpcArgs(cidrBlock = Some("10.0.0.0/16")))
// Create an EKS cluster using the default VPC and subnet
val cluster = eks.Cluster(
appName,
eks.ClusterArgs(
vpcId = vpc.vpcId,
subnetIds = vpc.publicSubnetIds,
instanceType = "t2.medium",
desiredCapacity = 2,
minSize = 1,
maxSize = 3,
storageClasses = Some("gp2")
)
)
val defaultProvider = cluster.core.provider
// Create a kubernetes namespace
val namespace = k8s.core.v1.Namespace(
name = appName,
opts = opts(provider = defaultProvider)
)
val namespaceName = namespace.metadata.name
// Create default metadata
val defaultMetadata = k8s.meta.v1.inputs.ObjectMetaArgs(
namespace = namespaceName,
labels = appLabels
)
// Define the "Hello World" deployment.
val deployment = k8s.apps.v1.Deployment(
name = appName,
k8s.apps.v1.DeploymentArgs(
metadata = defaultMetadata,
spec = k8s.apps.v1.inputs.DeploymentSpecArgs(
selector = k8s.meta.v1.inputs.LabelSelectorArgs(matchLabels = appLabels),
replicas = 1,
template = k8s.core.v1.inputs.PodTemplateSpecArgs(
metadata = k8s.meta.v1.inputs.ObjectMetaArgs(labels = appLabels),
spec = k8s.core.v1.inputs.PodSpecArgs(
containers = k8s.core.v1.inputs.ContainerArgs(
name = appName,
image = "nginx:latest",
ports = List(
k8s.core.v1.inputs.ContainerPortArgs(containerPort = 80)
)
) :: Nil
)
)
)
),
opts = opts(provider = defaultProvider)
)
// Define the "Hello World" service.
val service = k8s.core.v1.Service(
name = appName,
k8s.core.v1.ServiceArgs(
spec = k8s.core.v1.inputs.ServiceSpecArgs(
selector = appLabels,
`type` = k8s.core.v1.enums.ServiceSpecType.LoadBalancer,
ports = List(
k8s.core.v1.inputs.ServicePortArgs(
port = appPort,
targetPort = 80
)
)
),
metadata = defaultMetadata
),
opts = opts(provider = defaultProvider, dependsOn = deployment)
)
val serviceHostname =
service.status.loadBalancer.ingress.map(_.flatMap(_.head.hostname).get)
// Export the cluster's kubeconfig and url
Stack(cluster, service).exports(
kubeconfig = cluster.kubeconfig,
url = p"http://$serviceHostname:$appPort"
)
}