MIG and ILB modules (#61)
* preliminary net-ilb module, untested * outputs * fix basic mistakes, add initial test * test variable defaults on all resources * README stub * net-ilb module fixes and example * compute-vm module fixes * fix test * remove mig from compute vm module * split out mig from compute-vm (untested) * split out mig from compute-vm (untested) * fix mig versions * small fixes and examples for mig module * Update README.md * Update README.md * switch mig to using a single variable for both region and zone
This commit is contained in:
committed by
GitHub
parent
5088ed61ff
commit
be3c461cf9
188
modules/compute-mig/README.md
Normal file
188
modules/compute-mig/README.md
Normal file
@@ -0,0 +1,188 @@
|
||||
# GCE Managed Instance Group module
|
||||
|
||||
This module allows creating a managed instance group supporting one or more application versions via instance templates. A health check and an autoscaler can also be optionally created.
|
||||
|
||||
This module can be coupled with the [`compute-vm`](../compute-vm) module which can manage instance templates, and the [`net-ilb`](../net-ilb) module to assign the MIG to a backend wired to an Internal Load Balancer. The first use case is shown in the examples below.
|
||||
|
||||
## Examples
|
||||
|
||||
This example shows how to manage a simple MIG that leverages the `compute-vm` module to manage the underlying instance template. The following sub-examples will only show how to enable specific features of this module, and won't replicate the combined setup.
|
||||
|
||||
```hcl
|
||||
module "cos-nginx" {
|
||||
source = "./modules/cloud-config-container/nginx"
|
||||
}
|
||||
|
||||
module "nginx-template" {
|
||||
source = "./modules/compute-vm"
|
||||
project_id = "my-project"
|
||||
region = "europe-west1"
|
||||
zone = "europe-west1-b"
|
||||
name = "ilb-test"
|
||||
network_interfaces = [{
|
||||
network = local.network_self_link,
|
||||
subnetwork = local.subnetwork_self_link,
|
||||
nat = false,
|
||||
addresses = null
|
||||
}]
|
||||
boot_disk = {
|
||||
image = "projects/cos-cloud/global/images/family/cos-stable"
|
||||
type = "pd-ssd"
|
||||
size = 10
|
||||
}
|
||||
tags = ["http-server", "ssh"]
|
||||
use_instance_template = true
|
||||
metadata = {
|
||||
user-data = module.cos-nginx.cloud_config
|
||||
}
|
||||
}
|
||||
|
||||
module "nginx-mig" {
|
||||
source = "./modules/compute-mig"
|
||||
project_id = "my-project"
|
||||
location = "europe-west1-b"
|
||||
name = "mig-test"
|
||||
target_size = 2
|
||||
default_version = {
|
||||
instance_template = module.nginx-template.template.self_link
|
||||
name = "default"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Multiple versions
|
||||
|
||||
If multiple versions are desired, use more `compute-vm` instances for the additional templates used in each version (not shown here), and reference them like this:
|
||||
|
||||
```hcl
|
||||
module "nginx-mig" {
|
||||
source = "./modules/compute-mig"
|
||||
project_id = "my-project"
|
||||
location = "europe-west1-b"
|
||||
name = "mig-test"
|
||||
target_size = 3
|
||||
default_version = {
|
||||
instance_template = module.nginx-template-default.template.self_link
|
||||
name = "default"
|
||||
}
|
||||
versions = {
|
||||
canary = {
|
||||
instance_template = module.nginx-template-default.template.self_link
|
||||
target_type = "fixed"
|
||||
target_size = 1
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Health check and autohealing policies
|
||||
|
||||
Autohealing policies can use an externally defined health check, or have this module auto-create one:
|
||||
|
||||
```hcl
|
||||
module "nginx-mig" {
|
||||
source = "./modules/compute-mig"
|
||||
project_id = "my-project"
|
||||
location = "europe-west1-b"
|
||||
name = "mig-test"
|
||||
target_size = 3
|
||||
default_version = {
|
||||
instance_template = module.nginx-template-default.template.self_link
|
||||
name = "default"
|
||||
}
|
||||
auto_healing_policies = {
|
||||
health_check = module.nginx-mig.health_check.self_link
|
||||
initial_delay_sec = 30
|
||||
}
|
||||
health_check_config = {
|
||||
type = "http"
|
||||
check = { port = 80 }
|
||||
config = {}
|
||||
logging = true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Autoscaling
|
||||
|
||||
The module can create and manage an autoscaler associated with the MIG. When using autoscaling do not set the `target_size` variable or set it to `null`. Here we show a CPU utilization autoscaler, the other available modes are load balancing utilization and custom metric, like the underlying autoscaler resource.
|
||||
|
||||
```hcl
|
||||
module "nginx-mig" {
|
||||
source = "./modules/compute-mig"
|
||||
project_id = "my-project"
|
||||
location = "europe-west1-b"
|
||||
name = "mig-test"
|
||||
target_size = 3
|
||||
default_version = {
|
||||
instance_template = module.nginx-template-default.template.self_link
|
||||
name = "default"
|
||||
}
|
||||
autoscaler_config = {
|
||||
max_replicas = 3
|
||||
min_replicas = 1
|
||||
cooldown_period = 30
|
||||
cpu_utilization_target = 0.65
|
||||
load_balancing_utilization_target = null
|
||||
metric = null
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Update policy
|
||||
|
||||
```hcl
|
||||
module "nginx-mig" {
|
||||
source = "./modules/compute-mig"
|
||||
project_id = "my-project"
|
||||
location = "europe-west1-b"
|
||||
name = "mig-test"
|
||||
target_size = 3
|
||||
default_version = {
|
||||
instance_template = module.nginx-template-default.template.self_link
|
||||
name = "default"
|
||||
}
|
||||
update_policy = {
|
||||
type = "PROACTIVE"
|
||||
minimal_action = "REPLACE"
|
||||
min_ready_sec = 30
|
||||
max_surge_type = "fixed"
|
||||
max_surge = 1
|
||||
max_unavailable_type = null
|
||||
max_unavailable = null
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
<!-- BEGIN TFDOC -->
|
||||
## Variables
|
||||
|
||||
| name | description | type | required | default |
|
||||
|---|---|:---: |:---:|:---:|
|
||||
| default_version | Default application version template. Additional versions can be specified via the `versions` variable. | <code title="object({ instance_template = string name = string })">object({...})</code> | ✓ | |
|
||||
| location | Compute zone, or region if `regional` is set to true. | <code title="">string</code> | ✓ | |
|
||||
| name | Managed group name. | <code title="">string</code> | ✓ | |
|
||||
| project_id | Project id. | <code title="">string</code> | ✓ | |
|
||||
| *auto_healing_policies* | Auto-healing policies for this group. | <code title="object({ health_check = string initial_delay_sec = number })">object({...})</code> | | <code title="">null</code> |
|
||||
| *autoscaler_config* | Optional autoscaler configuration. Only one of 'cpu_utilization_target' 'load_balancing_utilization_target' or 'metric' can be not null. | <code title="object({ max_replicas = number min_replicas = number cooldown_period = number cpu_utilization_target = number load_balancing_utilization_target = number metric = object({ name = string single_instance_assignment = number target = number type = string # GAUGE, DELTA_PER_SECOND, DELTA_PER_MINUTE filter = string }) })">object({...})</code> | | <code title="">null</code> |
|
||||
| *health_check_config* | Optional auto-created helth check configuration, use the output self-link to set it in the auto healing policy. Refer to examples for usage. | <code title="object({ type = string # http https tcp ssl http2 check = map(any) # actual health check block attributes config = map(number) # interval, thresholds, timeout logging = bool })">object({...})</code> | | <code title="">null</code> |
|
||||
| *named_ports* | Named ports. | <code title="map(number)">map(number)</code> | | <code title="">null</code> |
|
||||
| *regional* | Use regional instance group. When set, `location` should be set to the region. | <code title="">bool</code> | | <code title="">false</code> |
|
||||
| *target_pools* | Optional list of URLs for target pools to which new instances in the group are added. | <code title="list(string)">list(string)</code> | | <code title="">[]</code> |
|
||||
| *target_size* | Group target size, leave null when using an autoscaler. | <code title="">number</code> | | <code title="">null</code> |
|
||||
| *update_policy* | Update policy. Type can be 'OPPORTUNISTIC' or 'PROACTIVE', action 'REPLACE' or 'restart', surge type 'fixed' or 'percent'. | <code title="object({ type = string # OPPORTUNISTIC | PROACTIVE minimal_action = string # REPLACE | RESTART min_ready_sec = number max_surge_type = string # fixed | percent max_surge = number max_unavailable_type = string max_unavailable = number })">object({...})</code> | | <code title="">null</code> |
|
||||
| *versions* | Additional application versions, target_type is either 'fixed' or 'percent'. | <code title="map(object({ instance_template = string target_type = string # fixed | percent target_size = number }))">map(object({...}))</code> | | <code title="">null</code> |
|
||||
| *wait_for_instances* | Wait for all instances to be created/updated before returning. | <code title="">bool</code> | | <code title="">null</code> |
|
||||
|
||||
## Outputs
|
||||
|
||||
| name | description | sensitive |
|
||||
|---|---|:---:|
|
||||
| autoscaler | Auto-created autoscaler resource. | |
|
||||
| group_manager | Instance group resource. | |
|
||||
| health_check | Auto-created health-check resource. | |
|
||||
<!-- END TFDOC -->
|
||||
|
||||
## TODO
|
||||
|
||||
- [ ] add support for instance groups
|
||||
Reference in New Issue
Block a user