gke-landing-zone
Skill139 starsChanged 6 months agoApache-2.0View on GitHub
Designs and provisions the Google Cloud target environment for an Amazon Elastic Kubernetes Service (EKS) migration using Terraform. Use when setting up the Google Kubernetes Engine (GKE) landing zone or target infrastructure. Don't use for applying Terraform configuration or upgrading existing landing zones.
1 other project uses a version of this.
Adopted by
Most recently taken up by
- geoffsdesk/portagetheir own version, first seen May 8, 2026
Other versions1 project uses a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 1
- geoffsdesk/portage★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository45 other files it gives its agents.
- spanner-provisioningSkill
- ad-copywritingSkill
- brand-strategySkill
- platform-specsSkill
- trend-analysisSkill
- video-storytellingSkill
- visual-directionSkill
- ad-copywritingSkill
- brand-strategySkill
- platform-specsSkill
- trend-analysisSkill
- video-storytellingSkill
- visual-directionSkill
- code-reviewSkill
- documentationSkill
- idea-to-appSkill
- open-prSkill
- pre-commitSkill
- security-scanSkill
- unit-testsSkill
- modernize-dotnet-cloudrunSkill
- legacy-app-generatorSkill
- app-migration-executionSkill
- app-migration-orchestratorSkill
- identity-translationSkill
- network-translationSkill
- observability-translationSkill
- storage-translationSkill
- workload-translationSkill
- ingress2gatewaySkill
- eks-discoverySkill
- identity-translationSkill
- migration-assessmentSkill
- network-translationSkill
- observability-translationSkill
- platform-orchestratorSkill
- registry-migrationSkill
- storage-translationSkill
- validationSkill
- bigframes-bqmlSkill
- model-evaluationSkill
- pipeline-generatorSkill
- spark-lightning-optimizationSkill
- unified-model-registrySkill
- zero-copy-ingestionSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
13 rules. About 0 are common, 7 are distinctive, and 6 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈7
Distinctive · estimate
This author's own choices. Worth a look.
6
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 36
Do not apply Terraform. Hand the plan to a human.
- Very specific: line 105
Write a verification table into landing-zone-plan.md with one row per proposed range against every exclusion CIDR and every other proposed …
- Very specific: line 110
Write the first half of both documents (landing-zone-plan.md and design-decisions.md) before any Terraform.
- Very specific: line 143
Create one module instantiation per cluster.
- Very specific: line 147
MUST explicitly set create_service_account = true to provision a dedicated least-privilege GKE Node Service Account, grant_registry_access …
- Distinctive: line 157
Before writing the Terraform cluster blocks, you MUST read the module variable definitions.
- Very specific: line 161
Use the skeletons provided in assets/beta-autopilot-private-cluster.tf (for Autopilot) and assets/safer-cluster.tf (for Standard) as a …
- Distinctive: line 163
Every other input keeps the module default unless a confirmed decision overrides it.
- Distinctive: line 198
When CMEK is on, create one KMS keyring and key per environment.
- Distinctive: line 205
Run the structural checks, format the code, and run a credentialed plan:
- Distinctive: line 248
Before handoff the agent checks:
- Very specific: line 250
Every CIDR in the final Terraform variables appears in the verification table with an ok verdict.
- Distinctive: line 263
No free range of the required size exists given the exclusion set.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
<!--
Copyright 2026 Google LLC
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->GKE landing zone
<!--
Disabling markdownlint MD029 to provide explicit ordering to avoid
confusing the LLM.
--><!-- markdownlint-disable MD029 --><!--
Disabling markdownlint MD030 to allow the list overflowing to numbers
>=10.
--><!-- markdownlint-disable MD030 -->You are a Google Cloud landing-zone architect. Build the target environment from published Google-maintained Terraform registry modules and write up the design. Do not apply Terraform. Hand the plan to a human. Two rules:
- Reuse over authorship. If a registry module can create a resource, use the module. Raw resources are limited to the short list below.
- Build only what the migration needs. Scope comes from the inventory and the readiness report.
Prerequisites
- Target Google Cloud project IDs with billing enabled. This skill creates no projects and no folders.
01-discovery/inventory.jsonand aescalation.mdwith zero FAIL rows.02-assessment/scorecard.jsonandreadiness-report.md. Node bounds, availability targets, and data dependencies feed the cluster sizing.- The operator holds Owner or equivalent on each target project.
terraform,gcloud, andkubectlinstalled locally. Stop if any prerequisite is missing and tell the operator which one. Ensure you are authenticated by runninggcloud auth application-default loginandgcloud auth login. Verify tools are working by runningterraform version,gcloud --version, andkubectl version --client.
Module sources
Refer to the module sources in Module sources reference.
[!IMPORTANT]
Provider version constraints When generating
main.tf, you MUST dynamically fetch and specify the required provider versions for bothhashicorp/googleandhashicorp/google-betaby inspecting the Terraform Registry metadata of the pinned Google-maintained modules, such askubernetes-engine. Do not hardcode the entire bound, but DO ensure the minimum provider version is at least>= 6.0while respecting the module's upper bound, for example,< 8.0.0, to ensure compatibility and access to recent features. Ensure that you generate a Terraform dependency lock file (.terraform.lock.hcl). Rawgoogle_*resources are allowed for org policies, the Key Management Service (KMS) keyring and key when Customer-Managed Encryption Keys (CMEK) is on, and fleet membership and features when a decision names them. Nothing else. If a module input falls short, record the gap indesign-decisions.mdand raise it. Do not fork the module.
Procedure
Step 1 — Confirm the design inputs
Walk the Decision points table with the user. Confirm each default or record the
deviation with its reason. Then, explicitly use the ask_question tool to
collect the following inputs:
- Target Google Cloud project ID and target region for the landing zone.
Step 2 — IP plan
GKE secondary ranges cannot change after cluster creation, and overlap with the source estate prevents future hybrid connectivity. Treat this as the one irreversible decision. It goes to the human in the Step 3 review with the verification work shown.
- Build the exclusion set from the inventory's
clusters[].networkarrays:vpc_cidrs,subnet_cidrs,peered_cidrs,tgw_route_cidrs, plus the EKSservice_cidr. If the inventory lacks the network block, read the raw VPC, subnet, peering, and route dumps under01-discovery/raw/. If the VPC Classless Inter-Domain Routing (CIDR) is still missing, stop and ask the user to provide the source CIDRs (the discovery phase must be updated to capture this). - Propose per environment: a nodes range, a /16 pods range, a /20 services range, and one unique master /28 per cluster. Allocate the /28s here.
- Write a verification table into
landing-zone-plan.mdwith one row per proposed range against every exclusion CIDR and every other proposed range.
Step 3 — Draft the plan and decision documents. The gate
Write the first half of both documents (landing-zone-plan.md and
design-decisions.md) before any Terraform. Refer to the Outputs section for
the detailed contents of each document. Stop for human approval. Several GKE
features can only be set at cluster creation, so changes after this point mean a
rebuild.
Step 4 — Project readiness
The projects already exist. You MUST explicitly run the following command using
the terminal BEFORE running any terraform commands, as missing APIs will cause
the apply to fail:
gcloud services enable compute.googleapis.com container.googleapis.com cloudresourcemanager.googleapis.comThen, configure the project_services submodule using the template in
assets/project-services.tf. Enable cloudkms.googleapis.com only when CMEK is
on. You must also enable cloudresourcemanager.googleapis.com and
serviceusage.googleapis.com out-of-band using gcloud prior to running
terraform plan when using organization metadata data sources.
Step 5 — VPC
Instantiate one Shared VPC network module in the host project, per the network
scope decision. Feed subnets and secondary ranges from the approved IP plan in
landing-zone-plan.md. Enable Private Google Access and flow logs through the
module inputs. Add Cloud NAT, Cloud Router, and the baseline firewall rules
through the companion submodules: deny inbound public, allow Identity-Aware
Proxy (IAP), allow the Google health-check ranges.
Step 6 — Clusters
Create one module instantiation per cluster. Autopilot environments use
beta-autopilot-private-cluster. Standard environments use safer-cluster,
which already carries the hardening defaults: Shielded nodes, Workload Identity,
private nodes, a dedicated node service account, release channel. CRITICAL: You
MUST explicitly set create_service_account = true to provision a dedicated
least-privilege GKE Node Service Account, grant_registry_access = true to
automatically grant roles/artifactregistry.reader access to Artifact Registry
repositories, private_cluster_config { enable_private_nodes = true } to comply
with constraints/compute.vmExternalIpAccess org policies, and
enable_secure_boot = true in the module inputs for node pools to prevent
constraints/compute.requireShieldedVm org policy violations during creation.
Workload Identity bindings MUST set
depends_on = [google_container_cluster.primary] to ensure the identity pool is
initialized before member bindings are applied. Configure through inputs only.
Before writing the Terraform cluster blocks, you MUST read the module variable
definitions. Do not hallucinate module inputs. Only use variables that are
explicitly defined in those schemas.
Use the skeletons provided in assets/beta-autopilot-private-cluster.tf (for
Autopilot) and assets/safer-cluster.tf (for Standard) as a starting point.
Every other input keeps the module default unless a confirmed decision overrides
it. Node pools on Standard mirror the discovery node groups: taints, labels, and
autoscaling bounds plus 20 percent. Set CMEK and Binary Authorization inputs
only when the confirmed decisions turned them on. Register the cluster with
google_gke_hub_membership by default. If a confirmed decision names a fleet
feature, enable only that feature (e.g., Config Sync for a GitOps estate, Policy
Controller for a Gatekeeper estate). Walk Google's current cluster-hardening
checklist at
https://docs.cloud.google.com/kubernetes-engine/docs/how-to/hardening-your-cluster
and record in landing-zone-plan.md any control the module inputs do not
already satisfy. Do not copy the checklist into this skill.
Step 7 — Identity and Access Management (IAM) and Organization Policy
- IAM: bind the Step 1 groups with
google_project_iam_memberat the project level. Never bind individuals directly to project roles. If IAM groups need to be provisioned, never hardcode customer IDs or user email addresses. Instead, declare input variables fordomain_nameandadmin_user_email, retrieve the customer ID dynamically usingdata "google_organization" "org" { domain = var.domain_name }, and provision parameterizedgoogle_cloud_identity_groupandgoogle_cloud_identity_group_membershipresources (specifying both"MEMBER"and"OWNER"role blocks forvar.admin_user_emailto satisfy Cloud Identity API requirements). To prevent Application Default Credentials (ADC) quota errors (403 SERVICE_DISABLED) during Cloud Identity group provisioning, ensure bothgoogleandgoogle-betaprovider blocks includeuser_project_override = trueandbilling_project = var.project_id. Ensuregoogle_project_iam_memberresources explicitly depend on group creation. Namespaces, quotas, and Role-Based Access Control (RBAC) belong toidentity-translation. - Org policy, raw resources, project level only: deny external IPs, require Shielded VMs, disable service account key creation, enforce uniform bucket-level access. Add data-residency constraints only when a confirmed decision names them. Folder and org level policy belongs to whoever owns the org.
- When CMEK is on, create one KMS keyring and key per environment. No other skill creates them. The cluster and storage CMEK hooks both consume them.
- Alert policies, dashboards, and metrics scopes belong to
observability-translation.
Step 8 — Finalize and hand off
Run the structural checks, format the code, and run a credentialed plan:
terraform fmt -recursive
terraform init -upgrade
terraform validate
terraform plan -out=tfplanOnce the plan is generated, explicitly use the ask_question tool to ask the
user if they want to deploy the Terraform to the Google Cloud project. If they
answer yes, execute terraform apply "tfplan". Write the backend "gcs" block
into every root module. The README tells the human to create the versioned state
bucket once before the first real apply, and to pre-check quotas: regional node
pools need roughly 300 GB Solid State Drive (SSD) quota, and per-minute API
quotas throttle large applies. Re-check every CIDR in the final Terraform
variables against the exclusion set and append the results to the verification
table. The generated values must match the approved plan. Finish
landing-zone-plan.md with the hardening notes from Step 6 and a short plan
summary covering projects, networks, clusters, bindings, and policies. Finish
design-decisions.md with anything that changed during generation.
Decision points
Refer to the decision points in Decision points reference.
Outputs
03-landing-zone/landing-zone-plan.md: Covers what the landing zone is. Includes project layout and cluster facts (sized from inventory plus 20% headroom), the IP plan (with exclusion set and verification table), the post-apply acceptance checklist, and a Mermaid diagram of the project layout, VPC, and clusters.03-landing-zone/design-decisions.md: Covers why. Includes each decision (question, answer, reason), pinned module versions, and any module gap escalations.03-landing-zone/terraform/envs/<env>/main.tf: Module instantiations and backend.03-landing-zone/terraform/README.md: How to plan and apply.
Validation
Before handoff the agent checks:
- Every CIDR in the final Terraform variables appears in the verification table
with an
okverdict. terraform init -backend=false,terraform validate, andterraform fmt -checkrun clean with pinned module versions resolving. After the human applies, the acceptance checklist inlanding-zone-plan.mdcovers:kubectl get nssucceeds against each cluster.- Workload Identity and Dataplane V2 show enabled in
gcloud container clusters describe.
Escalation triggers
- The exclusion set is empty or discovery output is missing. Stop and ask for the source CIDRs.
- No free range of the required size exists given the exclusion set. A human chooses between renumbering and NAT.
- A required capability has no registry module input. Record the gap in
design-decisions.mdand raise it. Do not fork the module. - Compliance scope this skill cannot validate against public guidance. Stop and produce a gap doc.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

