Spencer Smith
8 years ago
5 changed files with 232 additions and 0 deletions
Split View
Diff Options
-
2contrib/terraform/aws/.gitignore
-
143contrib/terraform/aws/00-create-infrastructure.tf
-
37contrib/terraform/aws/01-create-inventory.tf
-
28contrib/terraform/aws/README.md
-
22contrib/terraform/aws/terraform.tfvars
@ -0,0 +1,2 @@ |
|||
*.tfstate* |
|||
inventory |
@ -0,0 +1,143 @@ |
|||
variable "deploymentName" { |
|||
type = "string" |
|||
description = "The desired name of your deployment." |
|||
} |
|||
|
|||
variable "numControllers"{ |
|||
type = "string" |
|||
description = "Desired # of controllers." |
|||
} |
|||
|
|||
variable "numEtcd" { |
|||
type = "string" |
|||
description = "Desired # of etcd nodes. Should be an odd number." |
|||
} |
|||
|
|||
variable "numNodes" { |
|||
type = "string" |
|||
description = "Desired # of nodes." |
|||
} |
|||
|
|||
variable "volSizeController" { |
|||
type = "string" |
|||
description = "Volume size for the controllers (GB)." |
|||
} |
|||
|
|||
variable "volSizeEtcd" { |
|||
type = "string" |
|||
description = "Volume size for etcd (GB)." |
|||
} |
|||
|
|||
variable "volSizeNodes" { |
|||
type = "string" |
|||
description = "Volume size for nodes (GB)." |
|||
} |
|||
|
|||
variable "subnet" { |
|||
type = "string" |
|||
description = "The subnet in which to put your cluster." |
|||
} |
|||
|
|||
variable "securityGroups" { |
|||
type = "string" |
|||
description = "The sec. groups in which to put your cluster." |
|||
} |
|||
|
|||
variable "ami"{ |
|||
type = "string" |
|||
description = "AMI to use for all VMs in cluster." |
|||
} |
|||
|
|||
variable "SSHKey" { |
|||
type = "string" |
|||
description = "SSH key to use for VMs." |
|||
} |
|||
|
|||
variable "master_instance_type" { |
|||
type = "string" |
|||
description = "Size of VM to use for masters." |
|||
} |
|||
|
|||
variable "etcd_instance_type" { |
|||
type = "string" |
|||
description = "Size of VM to use for etcd." |
|||
} |
|||
|
|||
variable "node_instance_type" { |
|||
type = "string" |
|||
description = "Size of VM to use for nodes." |
|||
} |
|||
|
|||
variable "terminate_protect" { |
|||
type = "string" |
|||
default = "false" |
|||
} |
|||
|
|||
variable "awsRegion" { |
|||
type = "string" |
|||
} |
|||
|
|||
provider "aws" { |
|||
region = "${var.awsRegion}" |
|||
} |
|||
|
|||
resource "aws_instance" "master" { |
|||
count = "${var.numControllers}" |
|||
ami = "${var.ami}" |
|||
instance_type = "${var.master_instance_type}" |
|||
subnet_id = "${var.subnet}" |
|||
vpc_security_group_ids = ["${var.securityGroups}"] |
|||
key_name = "${var.SSHKey}" |
|||
disable_api_termination = "${var.terminate_protect}" |
|||
root_block_device { |
|||
volume_size = "${var.volSizeController}" |
|||
} |
|||
tags { |
|||
Name = "${var.deploymentName}-master-${count.index + 1}" |
|||
} |
|||
} |
|||
|
|||
resource "aws_instance" "etcd" { |
|||
count = "${var.numEtcd}" |
|||
ami = "${var.ami}" |
|||
instance_type = "${var.etcd_instance_type}" |
|||
subnet_id = "${var.subnet}" |
|||
vpc_security_group_ids = ["${var.securityGroups}"] |
|||
key_name = "${var.SSHKey}" |
|||
disable_api_termination = "${var.terminate_protect}" |
|||
root_block_device { |
|||
volume_size = "${var.volSizeEtcd}" |
|||
} |
|||
tags { |
|||
Name = "${var.deploymentName}-etcd-${count.index + 1}" |
|||
} |
|||
} |
|||
|
|||
|
|||
resource "aws_instance" "minion" { |
|||
count = "${var.numNodes}" |
|||
ami = "${var.ami}" |
|||
instance_type = "${var.node_instance_type}" |
|||
subnet_id = "${var.subnet}" |
|||
vpc_security_group_ids = ["${var.securityGroups}"] |
|||
key_name = "${var.SSHKey}" |
|||
disable_api_termination = "${var.terminate_protect}" |
|||
root_block_device { |
|||
volume_size = "${var.volSizeNodes}" |
|||
} |
|||
tags { |
|||
Name = "${var.deploymentName}-minion-${count.index + 1}" |
|||
} |
|||
} |
|||
|
|||
output "master-ip" { |
|||
value = "${join(", ", aws_instance.master.*.private_ip)}" |
|||
} |
|||
|
|||
output "etcd-ip" { |
|||
value = "${join(", ", aws_instance.etcd.*.private_ip)}" |
|||
} |
|||
|
|||
output "minion-ip" { |
|||
value = "${join(", ", aws_instance.minion.*.private_ip)}" |
|||
} |
@ -0,0 +1,37 @@ |
|||
variable "SSHUser" { |
|||
type = "string" |
|||
description = "SSH User for VMs." |
|||
} |
|||
|
|||
resource "null_resource" "ansible-provision" { |
|||
|
|||
depends_on = ["aws_instance.master","aws_instance.etcd","aws_instance.minion"] |
|||
|
|||
##Create Master Inventory |
|||
provisioner "local-exec" { |
|||
command = "echo \"[kube-master]\" > inventory" |
|||
} |
|||
provisioner "local-exec" { |
|||
command = "echo \"${join("\n",formatlist("%s ansible_ssh_user=%s", aws_instance.master.*.private_ip, var.SSHUser))}\" >> inventory" |
|||
} |
|||
|
|||
##Create ETCD Inventory |
|||
provisioner "local-exec" { |
|||
command = "echo \"\n[etcd]\" >> inventory" |
|||
} |
|||
provisioner "local-exec" { |
|||
command = "echo \"${join("\n",formatlist("%s ansible_ssh_user=%s", aws_instance.etcd.*.private_ip, var.SSHUser))}\" >> inventory" |
|||
} |
|||
|
|||
##Create Nodes Inventory |
|||
provisioner "local-exec" { |
|||
command = "echo \"\n[kube-node]\" >> inventory" |
|||
} |
|||
provisioner "local-exec" { |
|||
command = "echo \"${join("\n",formatlist("%s ansible_ssh_user=%s", aws_instance.minion.*.private_ip, var.SSHUser))}\" >> inventory" |
|||
} |
|||
|
|||
provisioner "local-exec" { |
|||
command = "echo \"\n[k8s-cluster:children]\nkube-node\nkube-master\netcd\" >> inventory" |
|||
} |
|||
} |
@ -0,0 +1,28 @@ |
|||
## Kubernetes on AWS with Terraform |
|||
|
|||
**Overview:** |
|||
|
|||
- This will create nodes in a VPC inside of AWS |
|||
|
|||
- A dynamic number of masters, etcd, and nodes can be created |
|||
|
|||
- These scripts currently expect Private IP connectivity with the nodes that are created. This means that you may need a tunnel to your VPC or to run these scripts from a VM inside the VPC. Will be looking into how to work around this later. |
|||
|
|||
**How to Use:** |
|||
|
|||
- Export the variables for your Amazon credentials: |
|||
|
|||
``` |
|||
export AWS_ACCESS_KEY_ID="xxx" |
|||
export AWS_SECRET_ACCESS_KEY="yyy" |
|||
``` |
|||
|
|||
- Update contrib/terraform/aws/terraform.tfvars with your data |
|||
|
|||
- Run with `terraform apply` |
|||
|
|||
- Once the infrastructure is created, you can run the kubespray playbooks and supply contrib/terraform/aws/inventory with the `-i` flag. |
|||
|
|||
**Future Work:** |
|||
|
|||
- Update the inventory creation file to be something a little more reasonable. It's just a local-exec from Terraform now, using terraform.py or something may make sense in the future. |
@ -0,0 +1,22 @@ |
|||
deploymentName="test-kube-deploy" |
|||
|
|||
numControllers="2" |
|||
numEtcd="3" |
|||
numNodes="2" |
|||
|
|||
volSizeController="20" |
|||
volSizeEtcd="20" |
|||
volSizeNodes="20" |
|||
|
|||
awsRegion="us-west-2" |
|||
subnet="subnet-xxxxx" |
|||
ami="ami-32a85152" |
|||
securityGroups="sg-xxxxx" |
|||
SSHUser="core" |
|||
SSHKey="my-key" |
|||
|
|||
master_instance_type="m3.xlarge" |
|||
etcd_instance_type="m3.xlarge" |
|||
node_instance_type="m3.xlarge" |
|||
|
|||
terminate_protect="false" |
Write
Preview
Loading…
Cancel
Save