Infrastructure as Code: Provisioning EKS Node Groups on AWS with Pulumi and Go
Provisioning Kubernetes clusters in the cloud has never been more efficient, thanks to the rise of Infrastructure as Code (IaC) tools. Pulumi stands out by enabling developers to use familiar programming languages such as Go, Python, TypeScript, and .NET. This guide will walk you through provisioning Amazon EKS node groups using Pulumi with the Go programming language.
Why Pulumi + Go for EKS?
While traditional tools like Terraform use declarative syntax, Pulumi allows you to express your infrastructure using general-purpose languages. Go, in particular, offers performance, type safety, and fast compilation, making it a compelling choice for infrastructure engineers who prefer statically typed languages.
Key advantages:
Use loops, conditionals, and packages in Go
Seamlessly integrate with CI/CD.
Easier infrastructure testing and reuse
Prerequisites
Before you begin:
Install Go
Install Pulumi CLI
Have an AWS account configured with CLI access.
Install kubectl and AWS CLI.
Pulumi project initialized with Go template.
Step-by-Step Guide to Provision EKS Node Groups
1. Initialize the Pulumi Project
pulumi new aws-go
This sets up a Pulumi project using Go and AWS.
2. Define EKS Cluster in Go
In main.go, start by creating the EKS cluster:
eksCluster, err := eks.NewCluster(ctx, "my-eks-cluster", &eks.ClusterArgs{
RoleArn: pulumi.String("arn:aws:iam::123456789012:role/EKSClusterRole"),
})
Ensure you’ve pre-created the EKS cluster IAM role and attached necessary policies.
3. Provision Node Group
_, err = eks.NewNodeGroup(ctx, "my-node-group", &eks.NodeGroupArgs{
ClusterName: eksCluster.Name,
NodeRoleArn: pulumi.String("arn:aws:iam::123456789012:role/EKSNodeGroupRole"),
SubnetIds: pulumi.ToStringArray(subnetIds),
ScalingConfig: &eks.NodeGroupScalingConfigArgs{
DesiredSize: pulumi.Int(2),
MinSize: pulumi.Int(1),
MaxSize: pulumi.Int(3),
},
InstanceTypes: pulumi.StringArray{
pulumi.String("t3.medium"),
},
})
This creates a managed node group attached to your cluster.
4. Export the Kubeconfig
ctx.Export("kubeconfig", eksCluster.Kubeconfig)
You can then use the exported kubeconfig to interact with your cluster using kubectl.
Security Best Practices
Use least privilege IAM roles for your node groups and cluster
Isolate node groups in private subnets.
Enable logging and audit trails in EKS.
Rotate credentials and use environment variables for secrets.
Observability and Scaling
Integrate Amazon CloudWatch with EKS for monitoring
Use Cluster Autoscaler to scale node groups automatically.
Consider Fargate for running serverless pods alongside your node groups.

Comments
Post a Comment