add gke cluster code
This commit is contained in:
commit
2598cc76d7
|
@ -0,0 +1,57 @@
|
|||
# These are some examples of commonly ignored file patterns.
|
||||
# You should customize this list as applicable to your project.
|
||||
# Learn more about .gitignore:
|
||||
# https://www.atlassian.com/git/tutorials/saving-changes/gitignore
|
||||
|
||||
# Node artifact files
|
||||
node_modules/
|
||||
dist/
|
||||
|
||||
# Compiled Java class files
|
||||
*.class
|
||||
|
||||
# Compiled Python bytecode
|
||||
*.py[cod]
|
||||
|
||||
# Log files
|
||||
*.log
|
||||
|
||||
# Package files
|
||||
*.jar
|
||||
|
||||
# Maven
|
||||
target/
|
||||
dist/
|
||||
|
||||
# JetBrains IDE
|
||||
.idea/
|
||||
|
||||
# Unit test reports
|
||||
TEST*.xml
|
||||
|
||||
# Generated by MacOS
|
||||
.DS_Store
|
||||
|
||||
# Generated by Windows
|
||||
Thumbs.db
|
||||
|
||||
# Applications
|
||||
*.app
|
||||
*.exe
|
||||
*.war
|
||||
|
||||
# Large media files
|
||||
*.mp4
|
||||
*.tiff
|
||||
*.avi
|
||||
*.flv
|
||||
*.mov
|
||||
*.wmv
|
||||
|
||||
.terraform/
|
||||
.terraform*
|
||||
terraform.*
|
||||
*.tfvars
|
||||
flux-git-auth.yaml
|
||||
|
||||
.idea
|
|
@ -0,0 +1,10 @@
|
|||
repos:
|
||||
- repo: https://github.com/terraform-docs/terraform-docs
|
||||
rev: "v0.16.0"
|
||||
hooks:
|
||||
- id: terraform-docs-go
|
||||
args: ["markdown", "table", "--output-file", "README.md", "."]
|
||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||
rev: v4.4.0
|
||||
hooks:
|
||||
- id: trailing-whitespace
|
|
@ -0,0 +1,81 @@
|
|||
# How to use
|
||||
|
||||
1. Create *.tfvars file with a few variables
|
||||
```
|
||||
project = "gcp-project"
|
||||
region = "europe-west1"
|
||||
environment_name = "demo"
|
||||
```
|
||||
|
||||
2. Create cluster
|
||||
```
|
||||
terraform init
|
||||
terraform apply
|
||||
```
|
||||
|
||||
3. Configure kubeconfig for new cluster
|
||||
```
|
||||
gcloud container clusters get-credentials $(terraform output -raw kubernetes_cluster_name) --region $(terraform output -raw region) --project $(terraform output -raw project)
|
||||
```
|
||||
|
||||
4. Destroy all resources
|
||||
```
|
||||
terraform destroy -target 'kubernetes_namespace.flux-system'
|
||||
terraform destroy -target 'google_container_node_pool.primary_nodes'
|
||||
terraform destroy -target 'google_container_cluster.primary'
|
||||
terraform destroy -target 'google_compute_subnetwork.subnet'
|
||||
terraform destroy -target 'google_compute_network.vpc'
|
||||
terraform destroy -target 'data.google_client_config.primary'
|
||||
```
|
||||
|
||||
|
||||
<!-- BEGIN_TF_DOCS -->
|
||||
## Requirements
|
||||
|
||||
| Name | Version |
|
||||
|------|---------|
|
||||
| <a name="requirement_terraform"></a> [terraform](#requirement\_terraform) | ~>1.4.2 |
|
||||
| <a name="requirement_google"></a> [google](#requirement\_google) | ~>4.62.0 |
|
||||
| <a name="requirement_kubernetes"></a> [kubernetes](#requirement\_kubernetes) | ~>2.19.0 |
|
||||
|
||||
## Providers
|
||||
|
||||
| Name | Version |
|
||||
|------|---------|
|
||||
| <a name="provider_google"></a> [google](#provider\_google) | 4.62.1 |
|
||||
| <a name="provider_kubernetes"></a> [kubernetes](#provider\_kubernetes) | 2.19.0 |
|
||||
|
||||
## Modules
|
||||
|
||||
No modules.
|
||||
|
||||
## Resources
|
||||
|
||||
| Name | Type |
|
||||
|------|------|
|
||||
| [google_compute_network.vpc](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_network) | resource |
|
||||
| [google_compute_subnetwork.subnet](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_subnetwork) | resource |
|
||||
| [google_container_cluster.primary](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/container_cluster) | resource |
|
||||
| [google_container_node_pool.primary_nodes](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/container_node_pool) | resource |
|
||||
| [kubernetes_namespace.flux-system](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/namespace) | resource |
|
||||
| [google_client_config.primary](https://registry.terraform.io/providers/hashicorp/google/latest/docs/data-sources/client_config) | data source |
|
||||
|
||||
## Inputs
|
||||
|
||||
| Name | Description | Type | Default | Required |
|
||||
|------|-------------|------|---------|:--------:|
|
||||
| <a name="input_environment_name"></a> [environment\_name](#input\_environment\_name) | n/a | `string` | `"demo"` | no |
|
||||
| <a name="input_gke_num_nodes"></a> [gke\_num\_nodes](#input\_gke\_num\_nodes) | number of gke nodes | `number` | `1` | no |
|
||||
| <a name="input_project"></a> [project](#input\_project) | Google Project to create resources in | `string` | `"demo"` | no |
|
||||
| <a name="input_region"></a> [region](#input\_region) | The region to host the cluster in | `string` | `"us-central1"` | no |
|
||||
| <a name="input_vpc_host_project"></a> [vpc\_host\_project](#input\_vpc\_host\_project) | Host Project where virtual network exists | `string` | `"demo"` | no |
|
||||
|
||||
## Outputs
|
||||
|
||||
| Name | Description |
|
||||
|------|-------------|
|
||||
| <a name="output_kubernetes_cluster_host"></a> [kubernetes\_cluster\_host](#output\_kubernetes\_cluster\_host) | GKE Cluster Host |
|
||||
| <a name="output_kubernetes_cluster_name"></a> [kubernetes\_cluster\_name](#output\_kubernetes\_cluster\_name) | GKE Cluster Name |
|
||||
| <a name="output_project"></a> [project](#output\_project) | GCloud Project ID |
|
||||
| <a name="output_region"></a> [region](#output\_region) | GCloud Region |
|
||||
<!-- END_TF_DOCS -->
|
|
@ -0,0 +1,5 @@
|
|||
resource "kubernetes_namespace" "flux-system" {
|
||||
metadata {
|
||||
name = "flux-system"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
# GKE cluster
|
||||
resource "google_container_cluster" "primary" {
|
||||
name = "${var.project}-gke"
|
||||
location = var.region
|
||||
|
||||
# We can't create a cluster with no node pool defined, but we want to only use
|
||||
# separately managed node pools. So we create the smallest possible default
|
||||
# node pool and immediately delete it.
|
||||
remove_default_node_pool = true
|
||||
initial_node_count = 1
|
||||
|
||||
network = google_compute_network.vpc.name
|
||||
subnetwork = google_compute_subnetwork.subnet.name
|
||||
}
|
||||
|
||||
# Separately Managed Node Pool
|
||||
resource "google_container_node_pool" "primary_nodes" {
|
||||
name = google_container_cluster.primary.name
|
||||
location = var.region
|
||||
cluster = google_container_cluster.primary.name
|
||||
node_count = var.gke_num_nodes
|
||||
|
||||
node_config {
|
||||
oauth_scopes = [
|
||||
"https://www.googleapis.com/auth/logging.write",
|
||||
"https://www.googleapis.com/auth/monitoring",
|
||||
]
|
||||
|
||||
labels = {
|
||||
env = var.project
|
||||
}
|
||||
|
||||
preemptible = true
|
||||
machine_type = "custom-2-4096" # 1 core too low for Prometheus...
|
||||
tags = ["gke-node", "${var.project}-gke"]
|
||||
metadata = {
|
||||
disable-legacy-endpoints = "true"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
output "region" {
|
||||
value = var.region
|
||||
description = "GCloud Region"
|
||||
}
|
||||
|
||||
output "project" {
|
||||
value = var.project
|
||||
description = "GCloud Project ID"
|
||||
}
|
||||
|
||||
output "kubernetes_cluster_name" {
|
||||
value = google_container_cluster.primary.name
|
||||
description = "GKE Cluster Name"
|
||||
}
|
||||
|
||||
output "kubernetes_cluster_host" {
|
||||
value = google_container_cluster.primary.endpoint
|
||||
description = "GKE Cluster Host"
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
data "google_client_config" "primary" {}
|
||||
|
||||
provider "kubernetes" {
|
||||
host = "https://${google_container_cluster.primary.endpoint}"
|
||||
token = data.google_client_config.primary.access_token
|
||||
cluster_ca_certificate = base64decode(google_container_cluster.primary.master_auth.0.cluster_ca_certificate)
|
||||
}
|
||||
|
||||
provider "helm" {
|
||||
kubernetes {
|
||||
host = "https://${google_container_cluster.primary.endpoint}"
|
||||
token = data.google_client_config.primary.access_token
|
||||
cluster_ca_certificate = base64decode(google_container_cluster.primary.master_auth.0.cluster_ca_certificate)
|
||||
}
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
variable "project" {
|
||||
description = "Google Project to create resources in"
|
||||
type = string
|
||||
default = "demo"
|
||||
}
|
||||
|
||||
variable "vpc_host_project" {
|
||||
description = "Host Project where virtual network exists"
|
||||
type = string
|
||||
default = "demo"
|
||||
}
|
||||
|
||||
variable "environment_name" {
|
||||
type = string
|
||||
default = "demo"
|
||||
}
|
||||
|
||||
variable "region" {
|
||||
type = string
|
||||
description = "The region to host the cluster in"
|
||||
default = "us-central1"
|
||||
}
|
||||
|
||||
variable "gke_num_nodes" {
|
||||
default = 1
|
||||
description = "number of gke nodes"
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
terraform {
|
||||
required_version = "~>1.4.2"
|
||||
|
||||
required_providers {
|
||||
google = {
|
||||
source = "hashicorp/google" # https://github.com/hashicorp/terraform-provider-google
|
||||
version = "~>4.62.0"
|
||||
}
|
||||
kubernetes = {
|
||||
source = "hashicorp/kubernetes" # https://github.com/hashicorp/terraform-provider-kubernetes
|
||||
version = "~>2.19.0"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
provider "google" {
|
||||
project = var.project
|
||||
region = var.region
|
||||
}
|
||||
|
||||
# VPC
|
||||
resource "google_compute_network" "vpc" {
|
||||
name = "${var.project}-vpc"
|
||||
auto_create_subnetworks = "false"
|
||||
}
|
||||
|
||||
# Subnet
|
||||
resource "google_compute_subnetwork" "subnet" {
|
||||
name = "${var.project}-subnet"
|
||||
region = var.region
|
||||
network = google_compute_network.vpc.name
|
||||
ip_cidr_range = "10.10.0.0/24"
|
||||
private_ip_google_access = true
|
||||
}
|
Loading…
Reference in New Issue