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

feat: add single project example #261

Merged
merged 59 commits into from
Nov 18, 2024
Merged
Show file tree
Hide file tree
Changes from 22 commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
7b72f01
feat: standalone single proj example
gtsorbo Oct 11, 2024
cad60d3
feat: test steps
gtsorbo Oct 11, 2024
3c3c24d
Fixes cycle dependencies
amandakarina Oct 16, 2024
9dc3334
Adds service identity force creation
amandakarina Oct 17, 2024
258378a
Test two fases single project
amandakarina Oct 18, 2024
dd6db3e
Removes default verify
amandakarina Oct 18, 2024
5359c48
Removes fleet-olly
amandakarina Oct 18, 2024
940dad1
Adds 10m sleep before destroy cluster
amandakarina Oct 21, 2024
aef0777
Enables service agent role
amandakarina Oct 21, 2024
5667f7b
Apply suggestions from code review
amandakarina Oct 24, 2024
836de1d
Adds custom teardown
amandakarina Oct 24, 2024
e7a3dae
Fixes cluster default value for user_ip_request_headers
amandakarina Oct 25, 2024
54ffcc7
Adds hello world deploy
amandakarina Oct 25, 2024
9daeaab
Adds source deployment, change hello world to cymbal-bank
amandakarina Oct 28, 2024
18225b0
Removes authoritative roles
amandakarina Oct 29, 2024
9b45dee
Removes binding to avoid plan diff
amandakarina Oct 29, 2024
6c6391f
Fixes target env
amandakarina Oct 30, 2024
17045e8
Adds roles, fix appinfra test
amandakarina Oct 30, 2024
4547f76
Comment default verify, adds roles/iam.serviceAccountTokenCreator role
amandakarina Oct 31, 2024
e4f4ed8
Adds role to cluster service account
amandakarina Oct 31, 2024
f8f4502
Changes build filter
amandakarina Oct 31, 2024
164db23
Fixes code review issues
amandakarina Oct 31, 2024
a745ab9
Merge branch 'main' into feat/standalone-example
amandakarina Oct 31, 2024
3733395
Adds Artifact Registry role to cluster services accounts on 5-appinfra
amandakarina Oct 31, 2024
b540a5b
Removes cymbal shop to single project deployment test
amandakarina Oct 31, 2024
d2d2989
Fixes golang lint
amandakarina Oct 31, 2024
53d583f
Fixes cymbal shop 5-appinfra
amandakarina Oct 31, 2024
e00c70d
Fixes lint issues
amandakarina Oct 31, 2024
de3ba00
Adds compute sa to project
amandakarina Nov 1, 2024
dd1c194
Keep compute sa
amandakarina Nov 1, 2024
855d3cf
Fixes service account retrieve
amandakarina Nov 1, 2024
58aa2eb
Changes build search
amandakarina Nov 1, 2024
c285201
Adds
amandakarina Nov 4, 2024
49f2cdf
Removes region filter
amandakarina Nov 4, 2024
9139c86
Returns region fitler
amandakarina Nov 4, 2024
b67864f
Adds logs in correct format
amandakarina Nov 4, 2024
362c8a0
Adds service agent role at setup
amandakarina Nov 5, 2024
c6ffb10
Adds e2e tests, move appsource single project test to appsource folder
amandakarina Nov 5, 2024
20ee80f
increase build wait time
amandakarina Nov 6, 2024
fe0b600
Gets target deploy from appinfra output
amandakarina Nov 6, 2024
57b4313
Adds sleep before source deployment
amandakarina Nov 7, 2024
f530e69
Forces devtools update
amandakarina Nov 7, 2024
3bfc22e
Downgrade devtools image due curl issue
amandakarina Nov 7, 2024
c0164c2
Fix target get
amandakarina Nov 7, 2024
fd1d471
Pin image to 1.22, changes build logging when error
amandakarina Nov 8, 2024
d1e0677
Adds service agent roles when creating the project
amandakarina Nov 8, 2024
000bd5e
Adds time between source verify waiting propagation
amandakarina Nov 8, 2024
3852fc9
Merge branch 'main' into feat/standalone-example
amandakarina Nov 13, 2024
ee9ed53
Changes output to map
amandakarina Nov 13, 2024
c78bb37
Changes service account validation
amandakarina Nov 13, 2024
c8d0bd7
Removes folder artifact reader at folder level for cluster services a…
amandakarina Nov 13, 2024
de7ad74
Removes service account re-make map
amandakarina Nov 13, 2024
eeade7a
Fixes services accounts
amandakarina Nov 13, 2024
7c6c28c
Fixes readme lint
amandakarina Nov 13, 2024
7d1dea5
Merge branch 'main' into feat/standalone-example
apeabody Nov 13, 2024
35d83fd
Fix e2d tests
amandakarina Nov 13, 2024
1c9eae7
Adds retry on single project example
amandakarina Nov 14, 2024
bdf93ce
Adds mesh error description
amandakarina Nov 14, 2024
6440099
Adds fleetscope check and dependency before deploy app
amandakarina Nov 14, 2024
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
67 changes: 63 additions & 4 deletions 2-multitenant/modules/env_baseline/main.tf
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ locals {
cluster_project_id = data.google_project.eab_cluster_project.project_id
available_cidr_ranges = var.master_ipv4_cidr_blocks

subnets = { for idx, v in var.cluster_subnetworks : idx => v }

subnets_to_cidr = {
for idx, subnet_key in keys(data.google_compute_subnetwork.default) : subnet_key => local.available_cidr_ranges[idx]
}
Expand Down Expand Up @@ -83,6 +85,7 @@ module "cloud_armor" {
type = "CLOUD_ARMOR"
layer_7_ddos_defense_enable = true
layer_7_ddos_defense_rule_visibility = "STANDARD"
user_ip_request_headers = []

pre_configured_rules = {
"sqli_sensitivity_level_1" = {
Expand All @@ -104,10 +107,50 @@ module "cloud_armor" {

// Retrieve the subnetworks
data "google_compute_subnetwork" "default" {
for_each = { for value in var.cluster_subnetworks : regex(local.subnetworks_re, value)[0] => value }
for_each = local.subnets
self_link = each.value
}

resource "google_project_service_identity" "gke_identity_cluster_project" {
apeabody marked this conversation as resolved.
Show resolved Hide resolved
provider = google-beta
project = local.cluster_project_id
service = "gkehub.googleapis.com"
depends_on = [module.eab_cluster_project]
}

resource "google_project_service_identity" "mcsd_cluster_project" {
provider = google-beta
project = local.cluster_project_id
service = "multiclusterservicediscovery.googleapis.com"
depends_on = [module.eab_cluster_project]
}

resource "google_project_iam_member" "gke_service_agent" {
project = local.cluster_project_id
role = "roles/gkehub.serviceAgent"
member = google_project_service_identity.gke_identity_cluster_project.member
depends_on = [module.eab_cluster_project]
}

resource "google_project_service_identity" "fleet_meshconfig_sa" {
provider = google-beta
project = local.cluster_project_id
service = "meshconfig.googleapis.com"
}

resource "google_project_iam_member" "servicemesh_service_agent" {
project = local.cluster_project_id
role = "roles/meshconfig.serviceAgent"
member = google_project_service_identity.fleet_meshconfig_sa.member
depends_on = [module.eab_cluster_project, google_project_service_identity.fleet_meshconfig_sa]
}

resource "google_project_iam_member" "multiclusterdiscovery_service_agent" {
project = local.cluster_project_id
role = "roles/multiclusterservicediscovery.serviceAgent"
member = google_project_service_identity.mcsd_cluster_project.member
}

module "gke-standard" {
source = "terraform-google-modules/kubernetes-engine/google//modules/beta-private-cluster"
version = "~> 33.0"
Expand All @@ -120,7 +163,7 @@ module "gke-standard" {
region = each.value.region
network_project_id = regex(local.projects_re, each.value.id)[0]
network = regex(local.networks_re, each.value.network)[0]
subnetwork = each.value.name
subnetwork = regex(local.subnetworks_re, local.subnets[each.key])[0]
ip_range_pods = each.value.secondary_ip_range[0].range_name
ip_range_services = each.value.secondary_ip_range[1].range_name
release_channel = var.cluster_release_channel
Expand Down Expand Up @@ -175,13 +218,18 @@ module "gke-standard" {
]

depends_on = [
module.eab_cluster_project
module.eab_cluster_project,
google_project_iam_member.gke_service_agent,
google_project_iam_member.servicemesh_service_agent,
google_project_iam_member.multiclusterdiscovery_service_agent
]

// Private Cluster Configuration
enable_private_nodes = true
enable_private_endpoint = true

fleet_project_grant_service_agent = true

deletion_protection = false # set to true to prevent the module from deleting the cluster on destroy
}

Expand Down Expand Up @@ -218,12 +266,23 @@ module "gke-autopilot" {
}

depends_on = [
module.eab_cluster_project
module.eab_cluster_project,
google_project_iam_member.gke_service_agent,
google_project_iam_member.servicemesh_service_agent,
google_project_iam_member.multiclusterdiscovery_service_agent
]

// Private Cluster Configuration
enable_private_nodes = true
enable_private_endpoint = true

fleet_project_grant_service_agent = true

deletion_protection = false # set to true to prevent the module from deleting the cluster on destroy
}

resource "time_sleep" "wait_service_cleanup" {
depends_on = [module.gke-autopilot.name, module.gke-standard.name]

destroy_duration = "300s"
}
2 changes: 2 additions & 0 deletions 2-multitenant/modules/env_baseline/outputs.tf
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ output "cluster_membership_ids" {
output "cluster_project_id" {
description = "Cluster Project ID"
value = data.google_project.eab_cluster_project.project_id

depends_on = [module.gke-standard, module.gke-autopilot]
}

output "network_project_id" {
Expand Down
8 changes: 4 additions & 4 deletions 3-fleetscope/envs/development/main.tf
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,10 @@ locals {
env = "development"
}

import {
id = "projects/${local.cluster_project_id}/locations/global/features/fleetobservability"
to = module.env.google_gke_hub_feature.fleet-o11y
}
# import {
# id = "projects/${local.cluster_project_id}/locations/global/features/fleetobservability"
# to = module.env.google_gke_hub_feature.fleet-o11y
# }

module "env" {
source = "../../modules/env_baseline"
Expand Down
8 changes: 4 additions & 4 deletions 3-fleetscope/envs/nonproduction/main.tf
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,10 @@ locals {
env = "nonproduction"
}

import {
id = "projects/${local.cluster_project_id}/locations/global/features/fleetobservability"
to = module.env.google_gke_hub_feature.fleet-o11y
}
# import {
# id = "projects/${local.cluster_project_id}/locations/global/features/fleetobservability"
# to = module.env.google_gke_hub_feature.fleet-o11y
# }

module "env" {
source = "../../modules/env_baseline"
Expand Down
8 changes: 4 additions & 4 deletions 3-fleetscope/envs/production/main.tf
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,10 @@ locals {
env = "production"
}

import {
id = "projects/${local.cluster_project_id}/locations/global/features/fleetobservability"
to = module.env.google_gke_hub_feature.fleet-o11y
}
# import {
# id = "projects/${local.cluster_project_id}/locations/global/features/fleetobservability"
# to = module.env.google_gke_hub_feature.fleet-o11y
# }

module "env" {
source = "../../modules/env_baseline"
Expand Down
18 changes: 10 additions & 8 deletions 3-fleetscope/modules/env_baseline/acm.tf
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@
* limitations under the License.
*/

locals {
cluster_membership_ids = { for k, v in var.cluster_membership_ids : k => v }
}

data "google_project" "cluster_project" {
project_id = var.cluster_project_id
}
Expand All @@ -36,13 +40,11 @@ resource "google_project_iam_member" "root_reconciler" {
member = "serviceAccount:${google_service_account.root_reconciler.email}"
}

resource "google_service_account_iam_binding" "workload_identity" {
resource "google_service_account_iam_member" "workload_identity" {
service_account_id = google_service_account.root_reconciler.name
role = "roles/iam.workloadIdentityUser"

members = [
"serviceAccount:${var.cluster_project_id}.svc.id.goog[config-management-system/root-reconciler]",
]
role = "roles/iam.workloadIdentityUser"
member = "serviceAccount:${var.cluster_project_id}.svc.id.goog[config-management-system/root-reconciler]"
}

resource "google_gke_hub_feature" "acm_feature" {
Expand All @@ -52,14 +54,14 @@ resource "google_gke_hub_feature" "acm_feature" {
}

resource "google_gke_hub_feature_membership" "acm_feature_member" {
for_each = toset(var.cluster_membership_ids)
for_each = local.cluster_membership_ids

project = var.cluster_project_id
location = "global"

feature = google_gke_hub_feature.acm_feature.name
membership = regex(local.membership_re, each.key)[2]
membership_location = regex(local.membership_re, each.key)[1]
membership = regex(local.membership_re, each.value)[2]
membership_location = regex(local.membership_re, each.value)[1]

configmanagement {
version = "1.19.0"
Expand Down
6 changes: 3 additions & 3 deletions 3-fleetscope/modules/env_baseline/asm.tf
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,11 @@ resource "google_gke_hub_feature_membership" "mesh_feature_member" {
project = var.fleet_project_id
location = "global"

for_each = toset(var.cluster_membership_ids)
for_each = local.cluster_membership_ids

feature = google_gke_hub_feature.mesh_feature.name
membership = regex(local.membership_re, each.key)[2]
membership_location = regex(local.membership_re, each.key)[1]
membership = regex(local.membership_re, each.value)[2]
membership_location = regex(local.membership_re, each.value)[1]

mesh {
management = "MANAGEMENT_AUTOMATIC"
Expand Down
42 changes: 21 additions & 21 deletions 3-fleetscope/modules/env_baseline/log.tf
Original file line number Diff line number Diff line change
Expand Up @@ -14,28 +14,28 @@
* limitations under the License.
*/

resource "google_gke_hub_feature" "fleet-o11y" {
name = "fleetobservability"
project = var.fleet_project_id
location = "global"
spec {
fleetobservability {
logging_config {
default_config {
mode = "COPY"
}
fleet_scope_logs_config {
mode = "MOVE"
}
}
}
}
# resource "google_gke_hub_feature" "fleet-o11y" {
# name = "fleetobservability"
# project = var.fleet_project_id
# location = "global"
# spec {
# fleetobservability {
# logging_config {
# default_config {
# mode = "COPY"
# }
# fleet_scope_logs_config {
# mode = "MOVE"
# }
# }
# }
# }

depends_on = [
google_gke_hub_feature.mesh_feature,
google_project_iam_member.fleet_logging_viewaccessor
]
}
# depends_on = [
# google_gke_hub_feature.mesh_feature,
# google_project_iam_member.fleet_logging_viewaccessor
# ]
# }

resource "google_project_iam_member" "fleet_logging_viewaccessor" {
for_each = var.namespace_ids
Expand Down
5 changes: 3 additions & 2 deletions 3-fleetscope/modules/env_baseline/main.tf
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,9 @@

locals {
membership_re = "//gkehub.googleapis.com/projects/([^/]*)/locations/([^/]*)/memberships/([^/]*)$"
scope_membership = { for val in setproduct(keys(var.namespace_ids), var.cluster_membership_ids) :
"${val[0]}-${val[1]}" => val }

scope_membership = { for idx, val in setproduct(keys(var.namespace_ids), var.cluster_membership_ids) :
"${val[0]}-${idx}" => val }
}

resource "random_string" "suffix" {
Expand Down
8 changes: 4 additions & 4 deletions 3-fleetscope/modules/env_baseline/mcg.tf
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@ resource "google_gke_hub_feature" "mci" {
}

depends_on = [
google_gke_hub_feature.mcs,
google_gke_hub_feature.fleet-o11y
google_gke_hub_feature.mcs
# google_gke_hub_feature.fleet-o11y
]
}

Expand All @@ -46,8 +46,8 @@ resource "google_project_service_identity" "fleet_mci_sa" {
service = "multiclusteringress.googleapis.com"

depends_on = [
google_gke_hub_feature.mci,
google_gke_hub_feature.fleet-o11y
google_gke_hub_feature.mci
# google_gke_hub_feature.fleet-o11y
]
}

Expand Down
6 changes: 3 additions & 3 deletions 3-fleetscope/modules/env_baseline/policy.tf
Original file line number Diff line number Diff line change
Expand Up @@ -46,13 +46,13 @@ resource "google_gke_hub_feature" "poco_feature" {
}

resource "google_gke_hub_feature_membership" "poco_feature_member" {
for_each = toset(var.cluster_membership_ids)
for_each = local.cluster_membership_ids
location = "global"
project = var.fleet_project_id

feature = google_gke_hub_feature.poco_feature.name
membership = regex(local.membership_re, each.key)[2]
membership_location = regex(local.membership_re, each.key)[1]
membership = regex(local.membership_re, each.value)[2]
membership_location = regex(local.membership_re, each.value)[1]

policycontroller {
policy_controller_hub_config {
Expand Down
1 change: 0 additions & 1 deletion 3-fleetscope/modules/env_baseline/variables.tf
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,6 @@ variable "cluster_membership_ids" {
type = list(string)
}


variable "additional_project_role_identities" {
description = <<-EOF
(Optional) A list of additional identities to assign roles at the project level for the fleet project. Use the following formats for specific Kubernetes identities:
Expand Down
5 changes: 4 additions & 1 deletion 5-appinfra/modules/cicd-pipeline/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
| app\_build\_trigger\_yaml | Path to the Cloud Build YAML file for the application | `string` | n/a | yes |
| buckets\_force\_destroy | When deleting the bucket for storing CICD artifacts, this boolean option will delete all contained objects. If false, Terraform will fail to delete buckets which contain objects. | `bool` | `false` | no |
| ci\_build\_included\_files | (Optional) includedFiles are file glob matches using https://golang.org/pkg/path/filepath/#Match extended with support for **. If any of the files altered in the commit pass the ignoredFiles filter and includedFiles is empty, then as far as this filter is concerned, we should trigger the build. If any of the files altered in the commit pass the ignoredFiles filter and includedFiles is not empty, then we make sure that at least one of those files matches a includedFiles glob. If not, then we do not trigger a build. | `list(string)` | `[]` | no |
| cluster\_services\_accounts | Cluster services accounts to be granted the Artifact Registry reader role. | `map(string)` | `{}` | no |
| env\_cluster\_membership\_ids | Env Cluster Membership IDs | <pre>map(object({<br> cluster_membership_ids = list(string)<br> }))</pre> | n/a | yes |
| project\_id | CI/CD project ID | `string` | n/a | yes |
| region | CI/CD Region (e.g. us-central1) | `string` | n/a | yes |
Expand All @@ -19,7 +20,9 @@

## Outputs

No outputs.
| Name | Description |
|------|-------------|
| clouddeploy\_targets\_names | Cloud deploy targets names. |

<!-- END OF PRE-COMMIT-TERRAFORM DOCS HOOK -->

9 changes: 5 additions & 4 deletions 5-appinfra/modules/cicd-pipeline/artifact-registry.tf
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,11 @@ resource "google_artifact_registry_repository" "container_registry" {
}

resource "google_artifact_registry_repository_iam_member" "member" {
for_each = {
"compute" = "serviceAccount:${data.google_project.project.number}-compute@developer.gserviceaccount.com",
"cloud_deploy" = "serviceAccount:${google_service_account.cloud_deploy.email}",
}
for_each = merge({
cloud_deploy = google_service_account.cloud_deploy.member,
cloud_build_si = google_project_service_identity.cloudbuild_service_identity.member,
compute = data.google_compute_default_service_account.compute_service_identity.member,
}, var.cluster_services_accounts)

project = var.project_id
location = var.region
Expand Down
2 changes: 1 addition & 1 deletion 5-appinfra/modules/cicd-pipeline/cloud-deploy.tf
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ resource "google_clouddeploy_delivery_pipeline" "delivery-pipeline" {
for_each = google_clouddeploy_target.clouddeploy_targets
content {
# TODO: use "production" profile once validated.
profiles = [endswith(stages.value.name, "-development") ? "development" : (endswith(stages.value.name, "-nonproduction") ? "staging" : "production")]
profiles = [endswith(stages.value.anthos_cluster[0].membership, "-development") ? "development" : (endswith(stages.value.name, "-nonproduction") ? "staging" : "production")]
target_id = stages.value.name
}
}
Expand Down
Loading