Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ASM module rewrite improvements #1165

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 21 additions & 2 deletions docs/upgrading_to_v20.0.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,24 @@ release for the Anthos Service Mesh (ASM) module.
### ASM module rewrite

The [ASM submodule](https://github.com/terraform-google-modules/terraform-google-kubernetes-engine/tree/master/modules/asm) has been rewritten to use the `ControlPlaneRevision` API to provision
a managed control plane rather than using an installer script. Due to the drastic difference in implementation the module does not support an upgrade path
from the previous version.
a managed control plane rather than using an installer script. Due to implementation differences, there are migration steps required to safely move from
an installation performed with the old module to using the new module. **NOTE:** these migration steps are best-effort and have not been tested against all possible ASM configurations.

1. Run `terraform state rm module.asm`
2. Update the module version to v20.0
3. Import the system namespace into the new module with `terraform import module.asm.kubernetes_namespace.system istio-system`
4. Run `terraform apply`

There should be two ASM revisions present at this point (in-cluster or managed, depending on whether the previous installation was managed). Now,
we must perform a canary upgrade to move workloads onto the new ASM revision. To do this:

1. Relabel namespaces to use the revision label from the managed revision (`asm-managed`, `asm-managed-stable`, or `asm-managed-rapid`)
2. Rollout workloads in those namespaces to get them onto the new ASM version
3. [Optional] Remove the previous revision with `istioctl x uninstall --revision ...` (if the previous installation was in-cluster)


#### Migrating options

Another difference from the previous module is that the new ASM module does not provide variables for option configuration (e.g. `custom_overlay`, `options`). For the new version these should be managed separately
outside the module. This is because those options were tightly coupled to pulling down an installer which the new module does not do. To use options specified in the previous module with the new module find the corresponding configuration [here](https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages/tree/main/asm/istio/options) and move the
config to the mesh configuration for the managed revision.
14 changes: 8 additions & 6 deletions examples/simple_zonal_with_asm/main.tf
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,12 @@ module "gke" {
}

module "asm" {
source = "../../modules/asm"
project_id = var.project_id
cluster_name = module.gke.name
cluster_location = module.gke.location
multicluster_mode = "connected"
enable_cni = true
source = "../../modules/asm"
project_id = var.project_id
cluster_name = module.gke.name
cluster_location = module.gke.location
multicluster_mode = "connected"
enable_cni = true
enable_fleet_registration = true
enable_mesh_feature = true
}
2 changes: 2 additions & 0 deletions modules/asm/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ To deploy this config:
| cluster\_location | The cluster location for this ASM installation. | `string` | n/a | yes |
| cluster\_name | The unique name to identify the cluster in ASM. | `string` | n/a | yes |
| enable\_cni | Determines whether to enable CNI for this ASM installation. Required to use Managed Data Plane (MDP). | `bool` | `false` | no |
| enable\_fleet\_registration | Determines whether the module enables the mesh feature on the fleet. | `bool` | `false` | no |
| enable\_mesh\_feature | Determines whether the module registers the cluster to the fleet. | `bool` | `false` | no |
| enable\_vpc\_sc | Determines whether to enable VPC-SC for this ASM installation. For more information read https://cloud.google.com/service-mesh/docs/managed/vpc-sc | `bool` | `false` | no |
| fleet\_id | The fleet to use for this ASM installation. | `string` | `""` | no |
| multicluster\_mode | [Preview] Determines whether remote secrets should be autogenerated across fleet cluster. | `string` | `"manual"` | no |
Expand Down
10 changes: 6 additions & 4 deletions examples/simple_zonal_with_asm/hub.tf → modules/asm/hub.tf
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/**
* Copyright 2018 Google LLC
* Copyright 2022 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand All @@ -14,18 +14,20 @@
* limitations under the License.
*/

resource "google_gke_hub_membership" "cluster_membership" {
resource "google_gke_hub_membership" "membership" {
count = var.enable_fleet_registration ? 1 : 0
provider = google-beta
project = var.project_id
membership_id = "gke-asm-membership"
membership_id = "${data.google_container_cluster.asm.name}-membership"
endpoint {
gke_cluster {
resource_link = "//container.googleapis.com/${module.gke.cluster_id}"
resource_link = "//container.googleapis.com/${data.google_container_cluster.asm.id}"
}
}
}

resource "google_gke_hub_feature" "mesh" {
count = var.enable_mesh_feature ? 1 : 0
name = "servicemesh"
project = var.project_id
location = "global"
Expand Down
2 changes: 2 additions & 0 deletions modules/asm/main.tf
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@ resource "kubernetes_config_map" "asm_options" {
data = {
multicluster_mode = var.multicluster_mode
}

depends_on = [google_gke_hub_membership.membership, google_gke_hub_feature.mesh]
}

module "cpr" {
Expand Down
12 changes: 12 additions & 0 deletions modules/asm/variables.tf
Original file line number Diff line number Diff line change
Expand Up @@ -74,3 +74,15 @@ variable "enable_vpc_sc" {
type = bool
default = false
}

variable "enable_fleet_registration" {
description = "Determines whether the module enables the mesh feature on the fleet."
type = bool
default = false
}

variable "enable_mesh_feature" {
description = "Determines whether the module registers the cluster to the fleet."
type = bool
default = false
}
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
end
end

describe command("gcloud container hub memberships describe gke-asm-membership --project=#{project_id} --format=json") do
describe command("gcloud container hub memberships describe #{cluster_name}-membership --project=#{project_id} --format=json") do
its(:exit_status) { should eq 0 }
its(:stderr) { should eq '' }

Expand Down