<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>GCP on dantas.io</title><link>https://dantas.io/categories/gcp/</link><description>Recent content in GCP on dantas.io</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Tue, 14 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://dantas.io/categories/gcp/index.xml" rel="self" type="application/rss+xml"/><item><title>GKE, Cloud Run, or Firebase? The Executive Playbook for Choosing Your GCP Compute Platform</title><link>https://dantas.io/p/gcp-compute-platforms-gke-cloud-run-firebase-executive-guide/</link><pubDate>Tue, 14 Apr 2026 00:00:00 +0000</pubDate><guid>https://dantas.io/p/gcp-compute-platforms-gke-cloud-run-firebase-executive-guide/</guid><description>&lt;img src="https://dantas.io/" alt="Featured image of post GKE, Cloud Run, or Firebase? The Executive Playbook for Choosing Your GCP Compute Platform" /&gt;&lt;h1 id="gke-cloud-run-or-firebase-the-executive-playbook-for-choosing-your-gcp-compute-platform"&gt;GKE, Cloud Run, or Firebase? The Executive Playbook for Choosing Your GCP Compute Platform
&lt;/h1&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;The right cloud platform is not the most powerful one — it is the one that aligns with your business velocity, your team&amp;rsquo;s capabilities, and your risk appetite.&lt;/strong&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="the-cloud-native-promise-speed-without-chaos"&gt;The Cloud-Native Promise: Speed Without Chaos
&lt;/h2&gt;&lt;p&gt;Every technology leader building on Google Cloud Platform (GCP) eventually faces the same dilemma: &lt;strong&gt;which compute platform do we actually commit to?&lt;/strong&gt; The stakes are real. The wrong choice can drain engineering budgets, delay market launches, and create architectural debt that takes years to unwind.&lt;/p&gt;
&lt;p&gt;The term &lt;em&gt;cloud-native&lt;/em&gt; has become a boardroom staple, but its business promise is specific: &lt;strong&gt;ship faster, scale on demand, and pay only for what you consume&lt;/strong&gt;. GCP delivers on this promise through three flagship platforms — &lt;strong&gt;Firebase&lt;/strong&gt;, &lt;strong&gt;Cloud Run&lt;/strong&gt;, and &lt;strong&gt;Google Kubernetes Engine (GKE)&lt;/strong&gt; — each designed for a fundamentally different business context.&lt;/p&gt;
&lt;p&gt;This article cuts through the technical complexity. No jargon, no acronyms your team uses in standups but no one explains in the boardroom. Just a clear, opinionated framework to help executive leaders match the right platform to their actual business needs.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="firebase-the-rapid-accelerator"&gt;Firebase: The Rapid Accelerator
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Best for: Startups, MVPs, Mobile &amp;amp; Web Applications&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If your primary business objective is &lt;strong&gt;getting to market before the competition&lt;/strong&gt;, Firebase is the most powerful accelerator in Google&amp;rsquo;s arsenal. It is, at its core, a fully managed application development platform — meaning Google handles virtually every layer of infrastructure so your engineering team can focus exclusively on the product experience.&lt;/p&gt;
&lt;p&gt;Firebase removes the need to separately provision databases, authentication systems, file storage, and hosting. These capabilities come bundled, pre-integrated, and ready to use from day one. For a founding team racing to validate a product hypothesis, or an established enterprise launching a new digital product line, this translates directly into &lt;strong&gt;weeks or months saved&lt;/strong&gt; before the first user even signs in.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key business advantages:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Extreme Time-to-Market:&lt;/strong&gt; Engineering teams can ship a fully functional, production-grade mobile or web application in days rather than months.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Minimal Operational Overhead:&lt;/strong&gt; No infrastructure team required at launch. Google manages availability, security patching, and global distribution automatically.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Predictable Entry Cost:&lt;/strong&gt; The free tier is genuinely generous, making it a near-zero-risk platform for new product bets.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;The trade-off executives must acknowledge:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Firebase operates within an opinionated, proprietary ecosystem. As product complexity scales — particularly when business logic becomes intricate, data volumes grow, or regulatory requirements intensify — teams can encounter &lt;strong&gt;architectural ceilings&lt;/strong&gt; that are expensive and time-consuming to break through. Migrating away from Firebase&amp;rsquo;s data model at scale is a non-trivial engineering effort. Additionally, costs can escalate unexpectedly once usage patterns exceed initial assumptions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The leadership question:&lt;/strong&gt; Is the goal to prove a concept and acquire users, or to build a long-term, deeply customized system of record? Firebase excels decisively at the former.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="cloud-run-the-sweet-spot"&gt;Cloud Run: The Sweet Spot
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Best for: Modern APIs, Microservices, Internal Tools, and Event-Driven Workloads&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cloud Run is GCP&amp;rsquo;s answer to a question most engineering organizations eventually ask: &lt;em&gt;&amp;ldquo;Can we get the operational simplicity of a managed platform without locking our architecture into a proprietary ecosystem?&amp;rdquo;&lt;/em&gt; The answer is yes — and Cloud Run&amp;rsquo;s commercial impact has been substantial precisely because it delivers on that promise.&lt;/p&gt;
&lt;p&gt;The business model is straightforward: you package your application as a container (a self-contained, portable unit of software), and Google Cloud handles everything else — scaling, load balancing, security, and availability. Critically, &lt;strong&gt;Cloud Run scales to zero&lt;/strong&gt;. When no users are making requests, the platform runs nothing and charges nothing. When demand surges — a viral marketing campaign, a batch processing spike, a seasonal peak — it scales in seconds without any manual intervention.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key business advantages:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pay-Per-Use Economics:&lt;/strong&gt; You are billed only for the exact milliseconds your application is actively processing requests. Idle infrastructure is a cost that disappears entirely.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zero Infrastructure Management:&lt;/strong&gt; No servers, no virtual machines, no patching cycles. Your engineering team invests its time in product capabilities, not operations.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Architectural Freedom:&lt;/strong&gt; Cloud Run runs standard, portable containers. Switching cloud providers or adapting the architecture in the future is far less disruptive than with proprietary platforms.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rapid Deployment Velocity:&lt;/strong&gt; Teams can go from code commit to production deployment in minutes, enabling aggressive iteration cycles.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;The trade-off executives must acknowledge:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cloud Run is purpose-built for &lt;strong&gt;stateless workloads&lt;/strong&gt; — applications that do not maintain session or memory state between individual requests. Systems that require persistent in-memory processing, long-running background operations, or highly stateful workflows require architectural adaptation before they can benefit from Cloud Run. This is typically a solvable engineering problem, but it is a real investment that must be factored into modernization plans.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The leadership question:&lt;/strong&gt; Are your teams building new services, APIs, or modernizing existing applications that can operate in a request-response model? Cloud Run delivers the strongest return on operational investment in this space.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="google-kubernetes-engine-gke-the-heavyweight"&gt;Google Kubernetes Engine (GKE): The Heavyweight
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Best for: Enterprise-Scale Systems, Legacy Modernization, Multi-Cloud Architectures&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;GKE is Google&amp;rsquo;s managed platform for Kubernetes — the open-source infrastructure orchestration system that powers some of the world&amp;rsquo;s largest digital businesses, including those of Spotify, Airbnb, and The New York Times (Google Cloud, 2024). Understanding GKE does not require understanding Kubernetes at a technical level. What matters at the executive level is this: &lt;strong&gt;GKE gives your organization maximum control, maximum portability, and maximum scale&lt;/strong&gt; — at the cost of maximum complexity.&lt;/p&gt;
&lt;p&gt;Unlike Firebase or Cloud Run, GKE gives your engineering teams precise control over every dimension of the infrastructure — compute resources, networking topology, security boundaries, deployment strategies, and hardware selection. For organizations running complex, multi-service architectures at enterprise scale, this control is not a luxury; it is a necessity.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key business advantages:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No Vendor Lock-In:&lt;/strong&gt; Kubernetes is an open standard. Applications built on GKE can be migrated to AWS, Azure, or on-premises data centers with significantly less friction than proprietary platforms.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unlimited Customization:&lt;/strong&gt; Regulatory requirements, specialized hardware needs (GPUs for AI workloads), multi-region data residency constraints, and complex networking topologies are all addressable within GKE.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enterprise Ecosystem Integration:&lt;/strong&gt; GKE integrates natively with the full spectrum of enterprise tooling — observability platforms, CI/CD pipelines, security scanners, and compliance frameworks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Workload Consolidation:&lt;/strong&gt; Organizations can run hundreds of distinct services on a shared, efficiently utilized platform, improving hardware utilization and reducing per-service overhead.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;The trade-off executives must acknowledge:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;GKE demands a dedicated, senior &lt;strong&gt;Platform Engineering or DevOps capability&lt;/strong&gt;. The operational complexity of Kubernetes is well-documented. Organizations that underinvest in this team — or attempt to adopt GKE without it — routinely experience cost overruns, reliability incidents, and delayed delivery cycles. According to the Cloud Native Computing Foundation (2023), Kubernetes adoption challenges consistently center on organizational skills gaps, not the technology itself.&lt;/p&gt;
&lt;p&gt;Selecting GKE without the human capital to operate it is one of the most common and costly mistakes in enterprise cloud strategy.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The leadership question:&lt;/strong&gt; Does your organization have — or have a credible plan to build — a mature Platform Engineering team? If yes, GKE is an extraordinary long-term investment. If no, starting with Cloud Run and evolving toward GKE as the team matures is a far safer path.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="executive-summary-matrix"&gt;Executive Summary Matrix
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Dimension&lt;/th&gt;
 &lt;th&gt;Firebase&lt;/th&gt;
 &lt;th&gt;Cloud Run&lt;/th&gt;
 &lt;th&gt;GKE&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Best For&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Startups, MVPs, mobile/web apps&lt;/td&gt;
 &lt;td&gt;APIs, microservices, event-driven workloads&lt;/td&gt;
 &lt;td&gt;Enterprise systems, legacy modernization, multi-cloud&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Time-to-Market&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;⚡ Fastest&lt;/td&gt;
 &lt;td&gt;🚀 Fast&lt;/td&gt;
 &lt;td&gt;🐢 Slower (setup investment)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Total Cost of Ownership&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Low initially; can escalate at scale&lt;/td&gt;
 &lt;td&gt;Lowest operational cost; pay-per-use&lt;/td&gt;
 &lt;td&gt;High; requires dedicated engineering team&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Scalability&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;High, within platform constraints&lt;/td&gt;
 &lt;td&gt;High, automatically managed&lt;/td&gt;
 &lt;td&gt;Unlimited; fully configurable&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Vendor Lock-In Risk&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;High (proprietary ecosystem)&lt;/td&gt;
 &lt;td&gt;Low-Medium (portable containers)&lt;/td&gt;
 &lt;td&gt;Very Low (open standard)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Operational Complexity&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Very Low&lt;/td&gt;
 &lt;td&gt;Low&lt;/td&gt;
 &lt;td&gt;Very High&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Key Business Value&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Speed to first user&lt;/td&gt;
 &lt;td&gt;Efficiency and developer velocity&lt;/td&gt;
 &lt;td&gt;Control, compliance, and portability&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Biggest Trade-Off&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Architectural ceiling at scale&lt;/td&gt;
 &lt;td&gt;Requires stateless application design&lt;/td&gt;
 &lt;td&gt;Demands a mature Platform Engineering team&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="conclusion-strategy-first-technology-second"&gt;Conclusion: Strategy First, Technology Second
&lt;/h2&gt;&lt;p&gt;The most consequential mistake technology leaders make when choosing a cloud compute platform is leading with technology. The right question is never &lt;em&gt;&amp;ldquo;Which platform is the most advanced?&amp;rdquo;&lt;/em&gt; — it is always &lt;em&gt;&amp;ldquo;Which platform best serves our current business stage, team capabilities, and strategic roadmap?&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A growth-stage startup validating product-market fit should not be building on GKE. A regulated financial institution with complex data sovereignty requirements and 200 microservices should not be anchored to Firebase. And a mid-market SaaS company looking to accelerate delivery without hiring a platform engineering team has a strong argument for Cloud Run as its primary compute layer.&lt;/p&gt;
&lt;p&gt;In most enterprise environments, the answer is not a single platform but a &lt;strong&gt;deliberate combination&lt;/strong&gt;: Firebase for consumer-facing speed, Cloud Run for internal APIs and event-driven workflows, and GKE for the core platform that demands full control. The sophistication lies in knowing which workload belongs where — and being disciplined enough to enforce that boundary over time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The cloud-native advantage is not just technical. It is organizational.&lt;/strong&gt; The platforms are ready. The question is whether your engineering strategy, team structure, and investment roadmap are aligned to capture the value they offer.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;img src="https://dantas.io/p/gcp-compute-platforms-gke-cloud-run-firebase-executive-guide/infograph.png"
	width="2752"
	height="1536"
	loading="lazy"
	
		alt="Generated by Notebook LM"
	
 
	
		class="gallery-image" 
		data-flex-grow="179"
		data-flex-basis="430px"
	
&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;div class="video-wrapper"&gt;
 &lt;iframe loading="lazy" 
 src="https://www.youtube.com/embed/vzlZyngColI" 
 allowfullscreen 
 title="YouTube Video"
 &gt;
 &lt;/iframe&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;div class="video-wrapper"&gt;
 &lt;iframe loading="lazy" 
 src="https://www.youtube.com/embed/RZj-Ea6Zx1M" 
 allowfullscreen 
 title="YouTube Video"
 &gt;
 &lt;/iframe&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;iframe width="100%" height="166" scrolling="no" frameborder="no" allow="autoplay"
 src="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/2302439384&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true"&gt;
&lt;/iframe&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;💬 Which platform is your organization betting on — or are you running a hybrid of all three? I&amp;rsquo;d be interested in hearing how other engineering leaders are navigating this decision. Connect with me on &lt;a class="link" href="https://www.linkedin.com/in/ronaldodantas/" target="_blank" rel="noopener"
 &gt;LinkedIn&lt;/a&gt; and let&amp;rsquo;s exchange notes.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This article is part of the &lt;strong&gt;&lt;a class="link" href="https://dantas.io" target="_blank" rel="noopener"
 &gt;dantas.io&lt;/a&gt;&lt;/strong&gt; tech blog — a space for senior engineering and cloud architecture content aimed at practitioners and technology leaders.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="references"&gt;References
&lt;/h2&gt;&lt;p&gt;Cloud Native Computing Foundation. (2023). &lt;em&gt;CNCF annual survey 2023&lt;/em&gt;. &lt;a class="link" href="https://www.cncf.io/reports/cncf-annual-survey-2023/" target="_blank" rel="noopener"
 &gt;https://www.cncf.io/reports/cncf-annual-survey-2023/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Gartner. (2024). &lt;em&gt;Magic quadrant for cloud database management systems&lt;/em&gt;. Gartner Research. &lt;a class="link" href="https://www.gartner.com/en/documents/cloud-database-management" target="_blank" rel="noopener"
 &gt;https://www.gartner.com/en/documents/cloud-database-management&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Google Cloud. (2024a). &lt;em&gt;Cloud Run documentation: Overview&lt;/em&gt;. Google LLC. &lt;a class="link" href="https://cloud.google.com/run/docs/overview/what-is-cloud-run" target="_blank" rel="noopener"
 &gt;https://cloud.google.com/run/docs/overview/what-is-cloud-run&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Google Cloud. (2024b). &lt;em&gt;Firebase documentation: Choose a database&lt;/em&gt;. Google LLC. &lt;a class="link" href="https://firebase.google.com/docs/database/rtdb-vs-firestore" target="_blank" rel="noopener"
 &gt;https://firebase.google.com/docs/database/rtdb-vs-firestore&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Google Cloud. (2024c). &lt;em&gt;Google Kubernetes Engine documentation: GKE overview&lt;/em&gt;. Google LLC. &lt;a class="link" href="https://cloud.google.com/kubernetes-engine/docs/concepts/kubernetes-engine-overview" target="_blank" rel="noopener"
 &gt;https://cloud.google.com/kubernetes-engine/docs/concepts/kubernetes-engine-overview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Google Cloud. (2024d). &lt;em&gt;Google Cloud customer case studies&lt;/em&gt;. Google LLC. &lt;a class="link" href="https://cloud.google.com/customers" target="_blank" rel="noopener"
 &gt;https://cloud.google.com/customers&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Kubernetes. (2024). &lt;em&gt;Production-grade container orchestration&lt;/em&gt;. Cloud Native Computing Foundation. &lt;a class="link" href="https://kubernetes.io/" target="_blank" rel="noopener"
 &gt;https://kubernetes.io/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ligus, S. (2022). &lt;em&gt;Real-time analytics: Techniques to analyze and visualize streaming data&lt;/em&gt; (1st ed.). O&amp;rsquo;Reilly Media.&lt;/p&gt;
&lt;p&gt;McKinsey &amp;amp; Company. (2023). &lt;em&gt;Rewired: The McKinsey guide to outcompeting in the age of digital and AI&lt;/em&gt;. McKinsey Digital. &lt;a class="link" href="https://www.mckinsey.com/capabilities/mckinsey-digital/our-insights" target="_blank" rel="noopener"
 &gt;https://www.mckinsey.com/capabilities/mckinsey-digital/our-insights&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Wiggins, A. (2012). &lt;em&gt;The twelve-factor app&lt;/em&gt;. Heroku. &lt;a class="link" href="https://12factor.net/" target="_blank" rel="noopener"
 &gt;https://12factor.net/&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Architectural Blueprint - Enterprise Data Center Interconnection with Google Cloud via Cisco Catalyst 8000V</title><link>https://dantas.io/p/architectural-blueprint-enterprise-data-center-interconnection-with-google-cloud-via-cisco-catalyst-8000v/</link><pubDate>Mon, 13 Apr 2026 00:00:00 +0000</pubDate><guid>https://dantas.io/p/architectural-blueprint-enterprise-data-center-interconnection-with-google-cloud-via-cisco-catalyst-8000v/</guid><description>&lt;img src="https://dantas.io/" alt="Featured image of post Architectural Blueprint - Enterprise Data Center Interconnection with Google Cloud via Cisco Catalyst 8000V" /&gt;&lt;h1 id="architectural-blueprint-enterprise-data-center-interconnection-with-google-cloud-via-cisco-catalyst-8000v"&gt;Architectural Blueprint: Enterprise Data Center Interconnection with Google Cloud via Cisco Catalyst 8000V
&lt;/h1&gt;&lt;p&gt;&lt;strong&gt;Audience:&lt;/strong&gt; Principal Network Architects, Cloud Platform Engineers, CTO/CIO Office&lt;br&gt;
&lt;strong&gt;Version:&lt;/strong&gt; 1.0&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="business-context"&gt;Business Context
&lt;/h2&gt;&lt;p&gt;The enterprise hybrid cloud is not a transitional state; it is the permanent operating model for any organization carrying more than a decade of accumulated infrastructure investment. The notion that workloads will cleanly &amp;ldquo;lift and shift&amp;rdquo; into a public cloud provider has been empirically refuted by migration programs at scale. Gartner (2023) projected that through 2027, more than 50% of enterprises will use industry cloud platforms to accelerate their business initiatives, yet the on-premises footprint — particularly for latency-sensitive transaction processing, regulated data residency workloads, and legacy mainframe-adjacent applications — will persist indefinitely. The architectural challenge, therefore, is not elimination of the data center but the construction of a high-fidelity, operationally unified network fabric that spans both domains.&lt;/p&gt;
&lt;p&gt;For enterprises that have standardized on Cisco&amp;rsquo;s routing and SD-WAN ecosystem — whether classic IOS-XE DMVPN fabrics or the Viptela-based SD-WAN architecture (Cisco Systems, 2023a) — the imperative is clear: extend the existing control plane and policy framework into Google Cloud Platform (GCP) without forking the operational model into two disconnected toolchains. The Cisco Catalyst 8000V Edge Software (C8000V), running as a compute-optimized virtual machine instance on GCP Compute Engine, serves as the architectural bridge that preserves investment in EIGRP/OSPF/BGP routing policy, Cisco SD-WAN overlay orchestration via vManage, and advanced traffic engineering capabilities (NBAR2, PBR, application-aware routing) while integrating natively with GCP&amp;rsquo;s Software-Defined Network control plane through the Network Connectivity Center (NCC) (Google Cloud, 2024a).&lt;/p&gt;
&lt;p&gt;The business case is not theoretical. Organizations operating Cisco SD-WAN fabrics with 200+ branch sites face a concrete problem: cloud-destined traffic from those branches is backhauled through the data center, traversing an increasingly congested WAN link, only to egress through a single internet breakout point toward GCP. Deploying C8000V instances as SD-WAN edge nodes inside GCP VPCs enables direct branch-to-cloud connectivity via the SD-WAN overlay, eliminating the backhaul penalty entirely and reducing end-to-end application latency by 40–60% for SaaS and cloud-native workloads (Cisco Systems, 2023b).&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="problem-statement-the-layer-2-illusion"&gt;Problem Statement: The Layer 2 Illusion
&lt;/h2&gt;&lt;p&gt;Before any architecture can be selected, a fundamental misconception must be confronted head-on: &lt;strong&gt;you cannot stretch a Layer 2 broadcast domain into a native GCP VPC.&lt;/strong&gt; This is not a limitation that can be engineered around with creative VLAN tagging or OTV. It is a hard constraint imposed by the physics of GCP&amp;rsquo;s network architecture.&lt;/p&gt;
&lt;h3 id="why-layer-2-extension-fails-on-gcp"&gt;Why Layer 2 Extension Fails on GCP
&lt;/h3&gt;&lt;p&gt;Google Cloud&amp;rsquo;s VPC network is a &lt;strong&gt;pure Layer 3 Software-Defined Network&lt;/strong&gt; built on the Andromeda virtualization stack (Dalton et al., 2018). Andromeda operates as a distributed network virtualization layer that programs forwarding rules directly into the hypervisor&amp;rsquo;s virtual switch. Every VM&amp;rsquo;s vNIC is connected to a virtual switch that performs L3 forwarding — there is no learning of MAC addresses, no flooding, no Spanning Tree Protocol participation. The implications are absolute:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;802.1Q VLAN tags are silently stripped.&lt;/strong&gt; A VM transmitting a tagged frame will have the tag removed by the Andromeda dataplane before the packet reaches the VPC fabric. There is no configuration knob to change this behavior (Google Cloud, 2024b).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BUM traffic (Broadcast, Unknown Unicast, Multicast) is dropped.&lt;/strong&gt; ARP requests do not flood; instead, Andromeda intercepts ARP and responds with a proxy ARP mechanism backed by the VPC&amp;rsquo;s metadata-driven IP-to-MAC mapping. Gratuitous ARP, which many legacy clustering solutions (e.g., Windows NLB, F5 LTM active-standby failover) depend on for VIP migration, does not propagate (Google Cloud, 2024b).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multicast is unsupported at the VPC layer.&lt;/strong&gt; OSPF adjacencies using 224.0.0.5/6, EIGRP hellos on 224.0.0.10, VRRP, and HSRP — all of which rely on IP multicast — cannot form natively between GCP VMs using standard multicast group addresses. Routing protocol adjacencies must use &lt;strong&gt;unicast&lt;/strong&gt; peering (Google Cloud, 2024b).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This means that technologies designed to stretch L2 domains — VXLAN with flood-and-learn, OTV, LISP in L2 mode — are architecturally incompatible with native GCP VPC networking. Any design that assumes L2 adjacency between on-premises hosts and GCP VMs is building on a false premise.&lt;/p&gt;
&lt;h3 id="the-only-exception-gcve"&gt;The Only Exception: GCVE
&lt;/h3&gt;&lt;p&gt;The sole environment within Google Cloud that provides genuine Layer 2 semantics is &lt;strong&gt;Google Cloud VMware Engine (GCVE)&lt;/strong&gt;, which runs VMware NSX-T on bare-metal nodes, creating an isolated L2/L3 overlay network outside the Andromeda fabric. This is a valid option (discussed in Section 3, Option C), but it carries a fundamentally different cost and operational model.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="architecture-options"&gt;Architecture Options
&lt;/h2&gt;&lt;p&gt;Three architecturally sound approaches exist for establishing hybrid connectivity between on-premises Cisco-centric data centers and GCP workloads. Each occupies a different position on the spectrum of cloud-native alignment versus operational continuity with existing network toolchains.&lt;/p&gt;
&lt;h3 id="option-a-native-gcp-ha-vpn-with-cloud-router-bgp"&gt;Option A: Native GCP HA VPN with Cloud Router BGP
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Architecture:&lt;/strong&gt; Two GCP HA VPN gateways, each with two interfaces, establishing four IPsec tunnels to on-premises VPN concentrators (e.g., Cisco ASA, Cisco ISR/CSR). Dynamic routing is provided via eBGP sessions between the on-premises router and GCP Cloud Router, which programs learned routes into the VPC via the Andromeda control plane (Google Cloud, 2024c).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What you gain:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fully managed VPN infrastructure; no VM lifecycle management.&lt;/li&gt;
&lt;li&gt;99.99% SLA when configured with the prescribed four-tunnel HA topology.&lt;/li&gt;
&lt;li&gt;Route exchange via Cloud Router&amp;rsquo;s native eBGP implementation (ASN 16550 or custom).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;What you lose:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No visibility into tunnel-level telemetry beyond basic GCP metrics (no NBAR2, no per-application flow analysis).&lt;/li&gt;
&lt;li&gt;No advanced traffic engineering: no PBR, no DMVPN spoke-to-spoke direct tunnels, no application-aware routing.&lt;/li&gt;
&lt;li&gt;BGP is the only supported routing protocol. Enterprises running pure EIGRP fabrics must either redistribute (introducing administrative distance conflicts and potential routing loops) or re-architect their on-premises control plane.&lt;/li&gt;
&lt;li&gt;Maximum of 3 Gbps per tunnel, with an aggregate cap per HA VPN gateway (Google Cloud, 2024c).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="option-b-cisco-catalyst-8000v--layer-3-greipsec-overlay"&gt;Option B: Cisco Catalyst 8000V — Layer 3 GRE/IPsec Overlay
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Architecture:&lt;/strong&gt; One or more C8000V instances deployed as Compute Engine VMs within a dedicated &amp;ldquo;transit&amp;rdquo; VPC. The C8000V establishes GRE-over-IPsec tunnels (or native IPsec with VTI) back to on-premises Cisco routers or SD-WAN edge devices. The C8000V runs a full IOS-XE routing stack, participating in the enterprise&amp;rsquo;s existing IGP/EGP domain. Routes learned from on-premises are injected into the GCP VPC via NCC Router Appliance peering with Cloud Router over eBGP (Google Cloud, 2024a; Cisco Systems, 2024).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What you gain:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Full IOS-XE feature set: DMVPN (NHRP + mGRE + IPsec), EIGRP, OSPF, MP-BGP with VRF-Lite, PBR, IP SLA, NBAR2/AVC for application visibility, BFD for sub-second failover detection.&lt;/li&gt;
&lt;li&gt;SD-WAN overlay integration: the C8000V can register as a vEdge/cEdge node in vManage, extending the SD-WAN fabric into GCP with centralized policy orchestration, application-aware routing, and SLA-based path selection across multiple WAN transports (Cisco Systems, 2023a).&lt;/li&gt;
&lt;li&gt;Unified operational model: the same NOC team, the same monitoring toolchain (ThousandEyes, vManage, DNA Center), the same change management procedures.&lt;/li&gt;
&lt;li&gt;VRF segmentation within GCP: multiple routing tables on a single C8000V, mapped to different VPCs via multiple vNICs, enabling multi-tenancy without deploying separate appliance instances per tenant.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;What you lose:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VM lifecycle management: patching IOS-XE, right-sizing the Compute Engine instance (minimum &lt;code&gt;n2-standard-4&lt;/code&gt; for production throughput; &lt;code&gt;n2-standard-8&lt;/code&gt; recommended for &amp;gt;2 Gbps encrypted throughput), monitoring CPU/memory utilization.&lt;/li&gt;
&lt;li&gt;Throughput ceiling bounded by the VM&amp;rsquo;s vNIC bandwidth cap (up to 32 Gbps on &lt;code&gt;n2-standard-32&lt;/code&gt;, but IPsec encryption overhead reduces effective throughput by 30–50% depending on packet size and cipher suite) (Google Cloud, 2024d).&lt;/li&gt;
&lt;li&gt;Complexity of the NCC integration (detailed in Section 5).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="option-c-google-cloud-vmware-engine-gcve-with-vmware-hcx"&gt;Option C: Google Cloud VMware Engine (GCVE) with VMware HCX
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Architecture:&lt;/strong&gt; A GCVE private cloud deployed in a GCP region, running vSphere/vSAN/NSX-T on dedicated bare-metal nodes. VMware HCX provides L2 extension (Network Extension), vMotion (live migration), and bulk migration (HCX Replication Assisted vMotion) between on-premises vSphere and GCVE. The NSX-T overlay provides full L2/L3 network virtualization with microsegmentation (Google Cloud, 2024e).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What you gain:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;True Layer 2 extension: VLAN-backed port groups on-premises can be stretched to GCVE segments, preserving IP addresses, MAC addresses, and broadcast domain membership.&lt;/li&gt;
&lt;li&gt;Workload mobility without re-IP: VMs can vMotion between on-premises and cloud with zero downtime and no IP address change.&lt;/li&gt;
&lt;li&gt;NSX-T distributed firewall for east-west microsegmentation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;What you lose:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cost:&lt;/strong&gt; GCVE private clouds require a minimum three-node cluster of bare-metal hosts. The entry-level configuration (3x &lt;code&gt;ve1-standard-72&lt;/code&gt; nodes) carries a committed monthly spend that dwarfs the cost of a pair of C8000V instances by an order of magnitude.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Operational divergence:&lt;/strong&gt; GCVE introduces a parallel network control plane (NSX-T) alongside the existing Cisco fabric, creating a bifurcated operational model that requires NSX-T expertise that most Cisco-centric teams do not possess.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Blast radius:&lt;/strong&gt; L2 extension via HCX Network Extension carries the risk of broadcast storm propagation from on-premises into the GCVE segment. A misbehaving NIC in the on-premises VLAN can saturate the HCX tunnel and degrade GCVE workloads.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="trade-off-analysis"&gt;Trade-Off Analysis
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Dimension&lt;/th&gt;
 &lt;th&gt;Option A: GCP HA VPN&lt;/th&gt;
 &lt;th&gt;Option B: C8000V (GRE/IPsec)&lt;/th&gt;
 &lt;th&gt;Option C: GCVE + HCX&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Latency (overlay overhead)&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Low (native IPsec, no GRE header)&lt;/td&gt;
 &lt;td&gt;Medium (GRE + IPsec adds 58–62 bytes per packet; TCP MSS clamping required)&lt;/td&gt;
 &lt;td&gt;Low-Medium (HCX WAN optimization reduces effective latency for bulk transfers)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Throughput ceiling&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;3 Gbps/tunnel; limited aggregate&lt;/td&gt;
 &lt;td&gt;VM-bound; 4–10 Gbps realistic with &lt;code&gt;n2-standard-8&lt;/code&gt; and AES-NI&lt;/td&gt;
 &lt;td&gt;Dedicated bare-metal; 25 Gbps per host NIC&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Monthly cost (production HA)&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;~$150–300/month (tunnels + egress)&lt;/td&gt;
 &lt;td&gt;~$800–2,000/month (2x C8000V VMs + BYOL/paygo licensing + egress)&lt;/td&gt;
 &lt;td&gt;~$15,000–40,000+/month (3-node minimum GCVE cluster)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Operational complexity&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Low (managed service)&lt;/td&gt;
 &lt;td&gt;Medium-High (IOS-XE lifecycle, NCC integration, HA design)&lt;/td&gt;
 &lt;td&gt;High (vSphere + NSX-T + HCX operational burden)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Control plane richness&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;BGP only&lt;/td&gt;
 &lt;td&gt;Full IOS-XE: EIGRP, OSPF, MP-BGP, DMVPN, PBR, NBAR2, SD-WAN&lt;/td&gt;
 &lt;td&gt;NSX-T + BGP (Cloud Router peering via GCVE edge)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Unified Cisco management&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;No (GCP-native console only)&lt;/td&gt;
 &lt;td&gt;Yes (vManage, DNA Center, ThousandEyes)&lt;/td&gt;
 &lt;td&gt;No (VMware vCenter/NSX Manager)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;L2 extension capability&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;No&lt;/td&gt;
 &lt;td&gt;No (L3 only; by design)&lt;/td&gt;
 &lt;td&gt;Yes (HCX Network Extension)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Multi-tenancy / VRF&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Limited (one Cloud Router per VPC)&lt;/td&gt;
 &lt;td&gt;Yes (VRF-Lite with per-VRF subinterfaces)&lt;/td&gt;
 &lt;td&gt;Yes (NSX-T T1 gateways per tenant)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The trade-off matrix reveals a clear pattern: &lt;strong&gt;Option B occupies the optimal position for Cisco-centric enterprises that need advanced traffic engineering, unified management, and cost efficiency without the L2 extension requirement.&lt;/strong&gt; Option A is appropriate for organizations with simple BGP-based routing needs and no investment in Cisco SD-WAN. Option C is justified only when L2 extension and vMotion-based workload mobility are non-negotiable requirements — a scenario that typically applies to the first 12–18 months of a migration program before applications are re-platformed.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="final-recommendation-option-b--cisco-catalyst-8000v-with-ncc-integration"&gt;Final Recommendation: Option B — Cisco Catalyst 8000V with NCC Integration
&lt;/h2&gt;&lt;p&gt;For enterprises operating Cisco routing and SD-WAN infrastructure, the C8000V deployed on GCP Compute Engine, integrated with the Network Connectivity Center (NCC), is the architecturally sound and operationally pragmatic choice.&lt;/p&gt;
&lt;h3 id="data-plane-architecture"&gt;Data Plane Architecture
&lt;/h3&gt;&lt;p&gt;The data plane consists of &lt;strong&gt;GRE tunnels encapsulated within IPsec transport mode&lt;/strong&gt; (or, preferably, IPsec tunnel mode with VTI interfaces for simplified QoS and routing configuration). The encapsulation stack, from outer to inner:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="n"&gt;Outer&lt;/span&gt; &lt;span class="ne"&gt;IP&lt;/span&gt; &lt;span class="n"&gt;Header&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="n"&gt;ESP&lt;/span&gt; &lt;span class="n"&gt;Header&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="n"&gt;GRE&lt;/span&gt; &lt;span class="n"&gt;Header&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="n"&gt;Inner&lt;/span&gt; &lt;span class="ne"&gt;IP&lt;/span&gt; &lt;span class="n"&gt;Header&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="n"&gt;Payload&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This encapsulation adds 66–70 bytes of overhead per packet. For a standard 1500-byte MTU on the GCP VPC (configurable up to 8896 bytes for intra-VPC traffic), the effective Maximum Segment Size (MSS) for TCP traffic traversing the tunnel must be clamped:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ip tcp adjust-mss 1360
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;On the Tunnel interface:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;interface Tunnel100
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ip mtu 1400
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ip tcp adjust-mss 1360
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; tunnel source GigabitEthernet1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; tunnel destination &amp;lt;on-prem-peer-public-ip&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; tunnel mode ipsec ipv4
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; tunnel protection ipsec profile IPSEC_PROFILE
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;For SD-WAN overlay integration, the C8000V registers with vManage as a cEdge device, and the IPsec tunnels to on-premises WAN edge nodes are established and orchestrated via the SD-WAN control plane (vBond, vSmart). This eliminates the need for manual tunnel configuration and enables centralized policy-driven path selection (Cisco Systems, 2023a).&lt;/p&gt;
&lt;h3 id="control-plane-architecture--the-ncc-imperative"&gt;Control Plane Architecture — The NCC Imperative
&lt;/h3&gt;&lt;p&gt;Here is the critical integration point that separates a functional deployment from a production-grade architecture: &lt;strong&gt;routes learned by the C8000V from on-premises must be programmatically injected into the GCP VPC routing table.&lt;/strong&gt; The C8000V, as a user-space VM, has no native mechanism to program Andromeda&amp;rsquo;s forwarding tables. Static routes in the GCP console pointing to the C8000V&amp;rsquo;s vNIC are fragile, non-scalable, and operationally unacceptable for any environment with more than a handful of prefixes.&lt;/p&gt;
&lt;p&gt;The solution is the &lt;strong&gt;Network Connectivity Center (NCC) Router Appliance&lt;/strong&gt; integration (Google Cloud, 2024a):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Register the C8000V as an NCC Router Appliance spoke.&lt;/strong&gt; This is performed via the GCP Console or &lt;code&gt;gcloud&lt;/code&gt; CLI, associating the C8000V&amp;rsquo;s Compute Engine instance and its internal vNIC IP with an NCC Hub.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Establish eBGP peering between the C8000V and the Cloud Router.&lt;/strong&gt; The Cloud Router, which is the NCC Hub&amp;rsquo;s route reflector and Andromeda control plane ingestion point, peers with the C8000V over an internal eBGP session. The Cloud Router uses ASN 16550 (or a custom private ASN), and the C8000V uses its own private ASN.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;router bgp 65001
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; bgp router-id 10.10.1.2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; bgp log-neighbor-changes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; neighbor 10.10.1.1 remote-as 65002
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; neighbor 10.10.1.1 description GCP-CLOUD-ROUTER
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; !
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; address-family ipv4 unicast
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; network 172.16.0.0 mask 255.255.0.0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; neighbor 10.10.1.1 activate
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; exit-address-family
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cloud Router propagates learned routes into the VPC.&lt;/strong&gt; Once the Cloud Router receives prefixes from the C8000V via eBGP, it programs those routes as &lt;strong&gt;dynamic custom routes&lt;/strong&gt; in the VPC routing table via the Andromeda control plane. These routes are then visible to all VMs in the VPC (or in peered VPCs if custom route export is enabled) (Google Cloud, 2024a).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Bidirectional route exchange.&lt;/strong&gt; The Cloud Router also advertises the VPC&amp;rsquo;s subnet routes back to the C8000V, which then redistributes them into the on-premises IGP (EIGRP, OSPF) or SD-WAN overlay.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Critical NCC constraint:&lt;/strong&gt; the eBGP session between the C8000V and Cloud Router must use &lt;strong&gt;link-local or RFC 1918 addresses on the same subnet.&lt;/strong&gt; The C8000V&amp;rsquo;s internal vNIC IP and the Cloud Router&amp;rsquo;s peering IP must be in the same VPC subnet. Additionally, the Cloud Router must have the &lt;code&gt;--set-peer-ip-address&lt;/code&gt; configured for each BGP peer corresponding to the C8000V&amp;rsquo;s internal IP (Google Cloud, 2024a).&lt;/p&gt;
&lt;h3 id="topology-summary"&gt;Topology Summary
&lt;/h3&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;---
config:
 layout: dagre
 theme: base
 themeVariables:
 lineColor: "#555555"
 edgeLabelBackground: "#ffffff"
 tertiaryTextColor: "#333333"
title: C8000V + NCC Hybrid Connectivity — Production HA Topology
---
graph TB
 subgraph ON_PREM["🏢 On-Premises Data Center"]
 CORE["Core Router&lt;br/&gt;(Nexus / ASR)"]
 SDWAN["SD-WAN Edge - cEdge&lt;br/&gt;or VPN Headend"]
 CORE &lt;--&gt;|"EIGRP / OSPF / BGP"| SDWAN
 end

 SDWAN &lt;--&gt;|"IPsec + GRE Tunnels&lt;br/&gt;or SD-WAN Overlay"| C8A
 SDWAN &lt;--&gt;|"IPsec + GRE Tunnels&lt;br/&gt;or SD-WAN Overlay"| C8B

 subgraph GCP["☁️ Google Cloud Platform"]

 subgraph TVPC["Transit VPC"]
 C8A["C8000V-a&lt;br/&gt;Zone-a&lt;br/&gt;ASN 65001"]
 C8B["C8000V-b&lt;br/&gt;Zone-b&lt;br/&gt;ASN 65001"]
 CR["Cloud Router&lt;br/&gt;NCC Hub&lt;br/&gt;ASN 65002"]
 ILB["Internal Passthrough NLB&lt;br/&gt;next-hop for on-prem&lt;br/&gt;routes"]
 ROUTES["VPC Route Table&lt;br/&gt;dynamic custom routes"]

 C8A &lt;--&gt;|"eBGP peer"| CR
 C8B &lt;--&gt;|"eBGP peer"| CR
 C8A --- ILB
 C8B --- ILB
 CR --&gt;|"Injects routes into&lt;br/&gt;Andromeda SDN"| ROUTES
 end

 subgraph WVPC["Workload VPC"]
 APPS["App VMs · GKE&lt;br/&gt;Cloud SQL · GCS"]
 end

 ROUTES --&gt;|"VPC Peering&lt;br/&gt;custom route export"| APPS
 end

 style ON_PREM fill:#f1f3f4,stroke:#e94560,color:#333
 style GCP fill:#f9fafb,stroke:#16213e,color:#333
 style TVPC fill:#e1f5fe,stroke:#1b1b2f,color:#333
 style WVPC fill:#e8f5e9,stroke:#0f4c75,color:#333
 style C8A fill:#ffcdd2,stroke:#333,color:#333
 style C8B fill:#ffcdd2,stroke:#333,color:#333
 style CR fill:#b3e5fc,stroke:#333,color:#333
 style ILB fill:#ffe0b2,stroke:#333,color:#333
 style CORE fill:#e0e0e0,stroke:#333,color:#333
 style SDWAN fill:#e0e0e0,stroke:#333,color:#333
 style APPS fill:#b2dfdb,stroke:#333,color:#333
 style ROUTES fill:#bbdefb,stroke:#333,color:#333&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="risks-and-mitigations"&gt;Risks and Mitigations
&lt;/h2&gt;&lt;h3 id="risk-1-single-point-of-failure"&gt;Risk 1: Single Point of Failure
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Scenario:&lt;/strong&gt; A single C8000V instance in one GCP zone represents an unacceptable SPOF. Zone-level maintenance events, live migration failures, or IOS-XE process crashes will sever hybrid connectivity.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mitigation:&lt;/strong&gt; Deploy &lt;strong&gt;two C8000V instances in separate GCP zones&lt;/strong&gt; (e.g., &lt;code&gt;us-central1-a&lt;/code&gt; and &lt;code&gt;us-central1-b&lt;/code&gt;) within the same transit VPC. Both instances peer with the Cloud Router via eBGP, advertising the same on-premises prefixes. Traffic from the workload VPC toward on-premises destinations is directed to the C8000V pair via a &lt;strong&gt;GCP Internal Passthrough Network Load Balancer (ILB)&lt;/strong&gt; configured as the next-hop for on-premises routes.&lt;/p&gt;
&lt;p&gt;The ILB performs health checking (TCP or HTTP probe against the C8000V management interface or a custom health endpoint) and removes a failed instance from the forwarding pool within seconds. On the C8000V side, BFD (Bidirectional Forwarding Detection) with sub-second timers ensures rapid eBGP session teardown, causing the Cloud Router to withdraw routes from the failed instance and converge on the surviving peer (Google Cloud, 2024f).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;IOS-XE BFD configuration for fast eBGP failover:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;router bgp 65001
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; neighbor 10.10.1.1 fall-over bfd
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;!
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;interface GigabitEthernet1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; bfd interval 300 min_rx 300 multiplier 3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="risk-2-mtu--fragmentation-induced-performance-degradation"&gt;Risk 2: MTU / Fragmentation-Induced Performance Degradation
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Scenario:&lt;/strong&gt; GRE + IPsec encapsulation reduces the effective MTU. Applications sending 1500-byte frames will trigger IP fragmentation at the C8000V, causing packet reordering, increased latency, and throughput collapse — particularly devastating for high-throughput database replication (e.g., Oracle Data Guard, SQL Server Always On) and NFS/SMB file transfers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mitigation:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;TCP MSS clamping&lt;/strong&gt; on all tunnel interfaces: &lt;code&gt;ip tcp adjust-mss 1360&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Path MTU Discovery (PMTUD):&lt;/strong&gt; Ensure ICMP &amp;ldquo;Fragmentation Needed&amp;rdquo; (Type 3, Code 4) messages are not blocked by any firewall in the path. This is a common failure mode in enterprises with overly aggressive ICMP filtering.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tunnel MTU configuration:&lt;/strong&gt; Set &lt;code&gt;ip mtu 1400&lt;/code&gt; on tunnel interfaces.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GCP VPC MTU:&lt;/strong&gt; Consider configuring the VPC MTU to 1460 (GCP default) or higher if using Jumbo Frames for intra-VPC traffic, but always account for the encapsulation overhead on the tunnel path (Google Cloud, 2024b).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DF-bit handling:&lt;/strong&gt; On the C8000V, configure &lt;code&gt;tunnel path-mtu-discovery&lt;/code&gt; to enable dynamic MTU negotiation for GRE tunnels.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="risk-3-crypto-performance-bottleneck"&gt;Risk 3: Crypto Performance Bottleneck
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Scenario:&lt;/strong&gt; IPsec encryption/decryption is CPU-intensive. Under-provisioned C8000V instances will hit CPU saturation at moderate throughput levels, causing packet drops and tunnel instability.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mitigation:&lt;/strong&gt; Deploy C8000V on &lt;code&gt;n2-standard-8&lt;/code&gt; or larger instance types that expose AES-NI hardware acceleration to the guest OS. IOS-XE automatically leverages AES-NI when available, providing 5–10x improvement in IPsec throughput compared to software-only crypto. Validate with &lt;code&gt;show crypto engine accelerator statistics&lt;/code&gt; (Cisco Systems, 2024). Monitor CPU utilization via &lt;code&gt;show processes cpu sorted&lt;/code&gt; and GCP Cloud Monitoring; establish alerting thresholds at 70% sustained utilization.&lt;/p&gt;
&lt;h3 id="risk-4-route-table-explosion-and-cloud-router-limits"&gt;Risk 4: Route Table Explosion and Cloud Router Limits
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Scenario:&lt;/strong&gt; Large enterprise networks may advertise thousands of prefixes from on-premises. Cloud Router has documented limits on the number of learned routes per BGP session and per VPC (Google Cloud, 2024c).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mitigation:&lt;/strong&gt; Implement aggressive route summarization on the C8000V before advertising to Cloud Router. Use &lt;code&gt;aggregate-address&lt;/code&gt; in BGP to summarize /24s and /25s into /16 or /8 supernets where topologically appropriate. Monitor Cloud Router route counts via &lt;code&gt;gcloud compute routers get-status&lt;/code&gt; and set alerting on approach to documented limits.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="real-world-constraints-and-organizational-considerations"&gt;Real-World Constraints and Organizational Considerations
&lt;/h2&gt;&lt;h3 id="legacy-technical-debt-the-re-ip-problem"&gt;Legacy Technical Debt: The Re-IP Problem
&lt;/h3&gt;&lt;p&gt;The single most common blocker to hybrid cloud network modernization is not a technology limitation — it is &lt;strong&gt;hardcoded IP addresses embedded in application configurations, database connection strings, firewall rules, load balancer VIPs, and DNS records that have not been updated in years.&lt;/strong&gt; Changing an application&amp;rsquo;s IP address in a legacy enterprise is not a network task; it is a cross-functional program requiring application owner sign-off, change advisory board approval, regression testing, and often a maintenance window.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pragmatic approach:&lt;/strong&gt; Do not attempt to re-IP applications as part of the initial hybrid connectivity deployment. Instead, design the C8000V overlay to preserve existing IP addressing by advertising the on-premises subnets into GCP with their original CIDR blocks. Cloud-resident applications that need to reach on-premises services will route through the C8000V tunnel transparently. Re-IP efforts should be a separate, application-driven workstream with its own timeline and governance.&lt;/p&gt;
&lt;h3 id="organizational-silos-network-engineers-vs-cloud-platform-engineers"&gt;Organizational Silos: Network Engineers vs. Cloud Platform Engineers
&lt;/h3&gt;&lt;p&gt;In most enterprises, the team that manages Cisco routers and SD-WAN infrastructure is not the same team that manages GCP projects, IAM policies, and Terraform modules. The C8000V deployment sits squarely at the intersection of these two domains, and ownership ambiguity will cause operational failures.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Recommendation:&lt;/strong&gt; Establish a &lt;strong&gt;Hybrid Network Ops&lt;/strong&gt; function — either as a dedicated team or a formal RACI matrix — with clear ownership boundaries:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Network team&lt;/strong&gt; owns: IOS-XE configuration, IPsec/GRE tunnel health, routing policy, SD-WAN orchestration, C8000V OS patching.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloud platform team&lt;/strong&gt; owns: GCP Compute Engine instance lifecycle, VPC network design, Cloud Router / NCC configuration, ILB health checks, IAM permissions, GCP firewall rules.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shared responsibility:&lt;/strong&gt; Capacity planning, throughput monitoring, incident response for connectivity failures.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="infrastructure-as-code"&gt;Infrastructure as Code
&lt;/h3&gt;&lt;p&gt;The C8000V deployment, NCC configuration, Cloud Router peering, VPC setup, and firewall rules must be codified in &lt;strong&gt;Terraform&lt;/strong&gt; (or Pulumi/OpenTofu). Manual console-click deployments are categorically unacceptable for production hybrid connectivity infrastructure. The Terraform Google provider supports NCC Hub/Spoke resources (&lt;code&gt;google_network_connectivity_hub&lt;/code&gt;, &lt;code&gt;google_network_connectivity_spoke&lt;/code&gt;), and the C8000V&amp;rsquo;s IOS-XE configuration can be bootstrapped via Compute Engine metadata startup scripts or day-2 managed via Cisco NSO / Ansible (HashiCorp, 2024).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;A fully deployable reference implementation of this architecture is available as an open-source Terraform module:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;&amp;gt; &lt;/span&gt;&lt;span class="ge"&gt;📦 **[terraform-c8000v-gcp](https://github.com/ronaldonascimentodantas/terraform-c8000v-gcp)** 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;&amp;gt; &lt;/span&gt;&lt;span class="ge"&gt;Production-grade Terraform modules for C8000V deployment on GCP with NCC integration, HA ILB, GitHub Actions CI, and Checkov security validation.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;The module follows this structure:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── modules/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── transit-vpc/ # VPC, subnets, firewall, peering
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── c8000v/ # Compute instances + bootstrap
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── ncc/ # NCC Hub, spokes, Cloud Router, BGP
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── ilb/ # Internal LB + health checks
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── environments/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── dev/ # Dev tfvars + backend
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── prod/ # Prod tfvars + backend
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── scripts/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── c8000v_bootstrap.tpl # IOS-XE day-0 config template
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── docs/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── architecture.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── main.tf # Root module composition
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── variables.tf # Root input variables
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── outputs.tf # Root outputs
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── versions.tf # Provider + Terraform constraints
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── backend.tf # GCS remote state
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── .github/workflows/ci.yml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="licensing"&gt;Licensing
&lt;/h3&gt;&lt;p&gt;The C8000V on GCP supports two licensing models: &lt;strong&gt;BYOL (Bring Your Own License)&lt;/strong&gt; via Cisco Smart Licensing and &lt;strong&gt;PAYG (Pay-As-You-Go)&lt;/strong&gt; via the GCP Marketplace listing. For enterprises with existing Cisco Enterprise Agreements (EA), BYOL is almost always more cost-effective. Ensure the Smart Licensing satellite or direct cloud connectivity is available from the C8000V&amp;rsquo;s management interface; a licensing failure will restrict the C8000V to a throughput-limited &amp;ldquo;evaluation&amp;rdquo; mode after 90 days (Cisco Systems, 2024).&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;div class="video-wrapper"&gt;
 &lt;iframe loading="lazy" 
 src="https://www.youtube.com/embed/qkcS6vwk_bA" 
 allowfullscreen 
 title="YouTube Video"
 &gt;
 &lt;/iframe&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;div class="video-wrapper"&gt;
 &lt;iframe loading="lazy" 
 src="https://www.youtube.com/embed/uewa9qOoEPU" 
 allowfullscreen 
 title="YouTube Video"
 &gt;
 &lt;/iframe&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;iframe width="100%" height="166" scrolling="no" frameborder="no" allow="autoplay"
 src="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/2302176284&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true"&gt;
&lt;/iframe&gt;
&lt;hr&gt;
&lt;p&gt;&lt;img src="https://dantas.io/p/architectural-blueprint-enterprise-data-center-interconnection-with-google-cloud-via-cisco-catalyst-8000v/enterprise-datacenter-interconnect-google-cloud-cisco-c8000v-banner-conclusion.png"
	width="2752"
	height="1536"
	loading="lazy"
	
		alt="Generated by Notebook LM"
	
 
	
		class="gallery-image" 
		data-flex-grow="179"
		data-flex-basis="430px"
	
&gt;&lt;/p&gt;
&lt;p&gt;The C8000V with GCP Network Connectivity Center suits enterprises already invested in Cisco routing and SD-WAN, enabling hybrid cloud connectivity without splitting operational governance. Key benefits include eliminating branch-to-cloud backhaul, 40–60% latency reduction, and unified visibility through vManage, DNA Center, and ThousandEyes — all while working within GCP&amp;rsquo;s Layer 3 (Andromeda) constraints without the cost of GCVE or limitations of native HA VPN.
Successful production deployment hinges on redundancy (dual instances with ILB failover), AES-NI crypto acceleration, proper MTU/MSS handling, and route aggregation discipline. Operational success also depends on Terraform-based infrastructure-as-code, clear RACI boundaries between network and cloud teams, and pragmatic management of technical debt like hardcoded IPs.&lt;/p&gt;
&lt;blockquote class="alert alert-tip"&gt;
 &lt;div class="alert-header"&gt;
 &lt;span class="alert-icon"&gt;💡&lt;/span&gt;
 &lt;span class="alert-title"&gt;Tip&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="alert-body"&gt;
 &lt;p&gt;The hybrid cloud operating model is permanent. The network architecture must reflect that permanence.&lt;/p&gt;
 &lt;/div&gt;
 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="references"&gt;References
&lt;/h2&gt;&lt;p&gt;Cisco Systems. (2023a). &lt;em&gt;Cisco SD-WAN design guide&lt;/em&gt;. Cisco Validated Design. &lt;a class="link" href="https://www.cisco.com/c/en/us/td/docs/solutions/CVD/SDWAN/cisco-sdwan-design-guide.html" target="_blank" rel="noopener"
 &gt;https://www.cisco.com/c/en/us/td/docs/solutions/CVD/SDWAN/cisco-sdwan-design-guide.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Cisco Systems. (2023b). &lt;em&gt;Cisco SD-WAN cloud onramp for IaaS architecture guide&lt;/em&gt;. &lt;a class="link" href="https://www.cisco.com/c/en/us/td/docs/routers/sdwan/configuration/cloudonramp/ios-xe-17/cloud-onramp-book-xe/cloud-onramp-iaas.html" target="_blank" rel="noopener"
 &gt;https://www.cisco.com/c/en/us/td/docs/routers/sdwan/configuration/cloudonramp/ios-xe-17/cloud-onramp-book-xe/cloud-onramp-iaas.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Cisco Systems. (2024). &lt;em&gt;Cisco Catalyst 8000V Edge Software deployment guide for Google Cloud Platform&lt;/em&gt;. &lt;a class="link" href="https://www.cisco.com/c/en/us/td/docs/routers/C8000V/Configuration/c8000v-installation-configuration-guide.html" target="_blank" rel="noopener"
 &gt;https://www.cisco.com/c/en/us/td/docs/routers/C8000V/Configuration/c8000v-installation-configuration-guide.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Dalton, M., Schultz, D., Agarwal, A., Arbel, Y., Bhatia, A., Gupta, S., Kumar, R., Li, H., McMullen, B., Patil, R., Poutievski, L., &amp;amp; Vahdat, A. (2018). Andromeda: Performance, isolation, and velocity at scale in cloud network virtualization. &lt;em&gt;Proceedings of the 15th USENIX Symposium on Networked Systems Design and Implementation (NSDI &amp;lsquo;18)&lt;/em&gt;, 373–387. &lt;a class="link" href="https://www.usenix.org/conference/nsdi18/presentation/dalton" target="_blank" rel="noopener"
 &gt;https://www.usenix.org/conference/nsdi18/presentation/dalton&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Gartner. (2023). &lt;em&gt;Top strategic technology trends for 2024&lt;/em&gt;. Gartner, Inc. &lt;a class="link" href="https://www.gartner.com/en/articles/gartner-top-10-strategic-technology-trends-for-2024" target="_blank" rel="noopener"
 &gt;https://www.gartner.com/en/articles/gartner-top-10-strategic-technology-trends-for-2024&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Google Cloud. (2024a). &lt;em&gt;Network Connectivity Center overview&lt;/em&gt;. Google Cloud Documentation. &lt;a class="link" href="https://cloud.google.com/network-connectivity/docs/network-connectivity-center/concepts/overview" target="_blank" rel="noopener"
 &gt;https://cloud.google.com/network-connectivity/docs/network-connectivity-center/concepts/overview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Google Cloud. (2024b). &lt;em&gt;VPC network overview&lt;/em&gt;. Google Cloud Documentation. &lt;a class="link" href="https://cloud.google.com/vpc/docs/vpc" target="_blank" rel="noopener"
 &gt;https://cloud.google.com/vpc/docs/vpc&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Google Cloud. (2024c). &lt;em&gt;Cloud VPN overview and quotas&lt;/em&gt;. Google Cloud Documentation. &lt;a class="link" href="https://cloud.google.com/network-connectivity/docs/vpn/concepts/overview" target="_blank" rel="noopener"
 &gt;https://cloud.google.com/network-connectivity/docs/vpn/concepts/overview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Google Cloud. (2024d). &lt;em&gt;Compute Engine machine types and network bandwidth&lt;/em&gt;. Google Cloud Documentation. &lt;a class="link" href="https://cloud.google.com/compute/docs/machine-types" target="_blank" rel="noopener"
 &gt;https://cloud.google.com/compute/docs/machine-types&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Google Cloud. (2024e). &lt;em&gt;Google Cloud VMware Engine overview&lt;/em&gt;. Google Cloud Documentation. &lt;a class="link" href="https://cloud.google.com/vmware-engine/docs/overview" target="_blank" rel="noopener"
 &gt;https://cloud.google.com/vmware-engine/docs/overview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Google Cloud. (2024f). &lt;em&gt;Internal passthrough Network Load Balancer overview&lt;/em&gt;. Google Cloud Documentation. &lt;a class="link" href="https://cloud.google.com/load-balancing/docs/internal" target="_blank" rel="noopener"
 &gt;https://cloud.google.com/load-balancing/docs/internal&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;HashiCorp. (2024). &lt;em&gt;Google Cloud provider: Network Connectivity Center resources&lt;/em&gt;. Terraform Registry. &lt;a class="link" href="https://registry.terraform.io/providers/hashicorp/google/latest/docs" target="_blank" rel="noopener"
 &gt;https://registry.terraform.io/providers/hashicorp/google/latest/docs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Dantas, R. N. (2024). &lt;em&gt;terraform-c8000v-gcp: Production Terraform modules for Cisco C8000V hybrid connectivity on Google Cloud Platform&lt;/em&gt; [Open-source software]. GitHub. &lt;a class="link" href="https://github.com/ronaldonascimentodantas/terraform-c8000v-gcp" target="_blank" rel="noopener"
 &gt;https://github.com/ronaldonascimentodantas/terraform-c8000v-gcp&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Getting started with GKE Complete Guide</title><link>https://dantas.io/p/getting-started-with-gke-complete-guide/</link><pubDate>Mon, 13 Apr 2026 00:00:00 +0000</pubDate><guid>https://dantas.io/p/getting-started-with-gke-complete-guide/</guid><description>&lt;img src="https://dantas.io/" alt="Featured image of post Getting started with GKE Complete Guide" /&gt;&lt;h1 id="getting-started-with-google-kubernetes-engine-gke"&gt;Getting Started with Google Kubernetes Engine (GKE)
&lt;/h1&gt;&lt;p&gt;A Complete Guide for Cloud Native Beginners and Tech Leads&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="introduction-to-google-kubernetes-engine-gke"&gt;Introduction to Google Kubernetes Engine (GKE)
&lt;/h2&gt;&lt;h3 id="what-is-gke"&gt;What Is GKE?
&lt;/h3&gt;&lt;p&gt;Google Kubernetes Engine (GKE) is a managed Kubernetes service offered by Google Cloud Platform that handles the provisioning, maintenance, and lifecycle of Kubernetes clusters. Rather than manually installing and operating Kubernetes control plane components — the API server, etcd, the scheduler, and the controller manager — GKE abstracts that burden away so that teams can focus on deploying and scaling their applications (Google Cloud, 2024a).&lt;/p&gt;
&lt;p&gt;Kubernetes itself originated at Google, evolving from an internal system called Borg that managed containerized workloads across Google&amp;rsquo;s global infrastructure for over a decade (Burns et al., 2016). GKE inherits this lineage directly: it runs on the same infrastructure that powers Google Search, YouTube, and Gmail, giving users access to a battle-tested orchestration platform without the operational cost of running it themselves.&lt;/p&gt;
&lt;h3 id="key-features"&gt;Key Features
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Autopilot and Standard Modes.&lt;/strong&gt; GKE offers two modes of operation. In Autopilot mode, Google manages the entire node infrastructure, including provisioning, scaling, security hardening, and OS upgrades. You pay only for the CPU, memory, and storage your pods actually request. In Standard mode, you retain full control over node pools, machine types, autoscaling policies, and scheduling configuration (Google Cloud, 2024b). For beginners, Autopilot is the recommended starting point; for teams with specific hardware, GPU, or compliance requirements, Standard provides the necessary control surface.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Node Pools and Autoscaling.&lt;/strong&gt; A node pool is a group of virtual machines within a cluster that share the same configuration — machine type, disk size, labels, and taints. GKE supports multiple node pools per cluster, enabling workload isolation (for example, a general-purpose pool for web services alongside a high-memory pool for caching layers). The Cluster Autoscaler automatically adjusts the number of nodes based on pending pod resource requests, scaling from zero to thousands of nodes (Google Cloud, 2024c).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Security.&lt;/strong&gt; GKE provides multiple layers of defense: Shielded GKE Nodes with Secure Boot and vTPM, Workload Identity for pod-level IAM authentication (eliminating the need for exported service account keys), Binary Authorization for image provenance enforcement, and network policies for east-west traffic segmentation. Autopilot clusters come with these security features pre-configured and enforced by default (Google Cloud, 2024d).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Integrated Observability.&lt;/strong&gt; Every GKE cluster integrates natively with Google Cloud&amp;rsquo;s operations suite. Cloud Logging collects container stdout/stderr and system logs automatically. Cloud Monitoring provides pre-built dashboards for cluster, node, pod, and container metrics. Google Cloud Managed Service for Prometheus enables custom metrics collection using the Prometheus data model without operating a Prometheus server (Google Cloud, 2024e).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Networking.&lt;/strong&gt; GKE uses VPC-native networking by default, assigning pod IP addresses from a secondary range within the VPC subnet. This eliminates NAT overhead, makes pods directly routable within the VPC, and integrates seamlessly with Cloud Load Balancing, Cloud Armor (WAF/DDoS), and Cloud CDN.&lt;/p&gt;
&lt;h3 id="when-and-why-teams-choose-gke"&gt;When and Why Teams Choose GKE
&lt;/h3&gt;&lt;p&gt;GKE is a strong fit when teams need to run containerized microservices at scale and want the operational overhead of Kubernetes management handled by the cloud provider. Common scenarios include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Microservices architectures&lt;/strong&gt; that benefit from Kubernetes-native service discovery, rolling deployments, and horizontal pod autoscaling.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CI/CD pipelines&lt;/strong&gt; that deploy multiple times per day and need rapid, declarative rollouts with automatic rollback capability.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hybrid or multi-cloud strategies&lt;/strong&gt; leveraging GKE Enterprise (formerly Anthos) to manage clusters across GCP, on-premises, and other clouds through a unified control plane.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Machine learning workloads&lt;/strong&gt; requiring GPU/TPU node pools with per-job autoscaling, managed by Kubernetes Job and CronJob primitives.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If the workload is a single stateless container with no orchestration complexity, Cloud Run (Google&amp;rsquo;s serverless container platform) may be a simpler choice. GKE becomes the right tool when your system involves multiple services, stateful components, custom scheduling requirements, or when your team has invested in the Kubernetes ecosystem of tooling — Helm, Kustomize, ArgoCD, Istio.&lt;/p&gt;
&lt;h3 id="the-role-of-kubernetes-in-cloud-native-architecture"&gt;The Role of Kubernetes in Cloud Native Architecture
&lt;/h3&gt;&lt;p&gt;The Cloud Native Computing Foundation (CNCF) defines cloud native technologies as those that enable organizations to build and run scalable applications in modern, dynamic environments such as public clouds, private clouds, and hybrid configurations (CNCF, 2018). Kubernetes sits at the center of this ecosystem as the de facto container orchestration standard. It provides the foundational primitives — Pods, Deployments, Services, ConfigMaps, Secrets, Ingress — upon which higher-level abstractions (service meshes, GitOps controllers, serverless frameworks) are built. Choosing a managed Kubernetes service like GKE means adopting this ecosystem without bearing the operational cost of the platform itself.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="installing-required-tools"&gt;Installing Required Tools
&lt;/h2&gt;&lt;p&gt;Before creating a GKE cluster, three tools must be installed on your workstation: the Google Cloud CLI (&lt;code&gt;gcloud&lt;/code&gt;), Docker, and &lt;code&gt;kubectl&lt;/code&gt;. This section covers installation across &lt;strong&gt;WSL2 (Windows Subsystem for Linux)&lt;/strong&gt;, &lt;strong&gt;RPM-based distributions&lt;/strong&gt; (RHEL, CentOS, Fedora), and &lt;strong&gt;DEB-based distributions&lt;/strong&gt; (Ubuntu, Debian).&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; WSL2 runs a full Linux kernel and uses the Ubuntu/Debian package manager by default. Unless otherwise noted, the DEB-based instructions apply directly to WSL2.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id="google-cloud-cli-gcloud"&gt;Google Cloud CLI (&lt;code&gt;gcloud&lt;/code&gt;)
&lt;/h3&gt;&lt;p&gt;The &lt;code&gt;gcloud&lt;/code&gt; CLI is the primary tool for interacting with Google Cloud from the terminal. It wraps the same REST APIs that power the Cloud Console, making every operation scriptable and repeatable (Google Cloud, 2026a).&lt;/p&gt;
&lt;h4 id="installation"&gt;Installation
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;DEB-based (Ubuntu, Debian, WSL2):&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Install required packages&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo apt-get install -y &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; apt-transport-https &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ca-certificates &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gnupg &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; curl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Add the Google Cloud GPG key&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl https://packages.cloud.google.com/apt/doc/apt-key.gpg &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo gpg --dearmor -o /usr/share/keyrings/cloud.google.gpg
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Add the gcloud CLI package source&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;deb [signed-by=/usr/share/keyrings/cloud.google.gpg] \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; https://packages.cloud.google.com/apt cloud-sdk main&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee /etc/apt/sources.list.d/google-cloud-sdk.list
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Install the gcloud CLI&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo apt-get install -y google-cloud-cli
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;RPM-based (RHEL, CentOS, Fedora):&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Add the Google Cloud repository&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo tee /etc/yum.repos.d/google-cloud-sdk.repo &lt;span class="s"&gt;&amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;[google-cloud-cli]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;name=Google Cloud CLI
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;baseurl=https://packages.cloud.google.com/yum/repos/cloud-sdk-el9-x86_64
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;enabled=1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;gpgcheck=1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;repo_gpgcheck=0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;gpgkey=https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Install the gcloud CLI&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo dnf install -y google-cloud-cli
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="initialization-and-authentication"&gt;Initialization and Authentication
&lt;/h4&gt;&lt;p&gt;After installation, initialize &lt;code&gt;gcloud&lt;/code&gt; to authenticate and set a default project:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Interactive initialization — opens a browser for OAuth login&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gcloud init
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Authenticate (if not already done during init)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gcloud auth login
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Set Application Default Credentials (used by client libraries and Terraform)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gcloud auth application-default login
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Verify your configuration&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gcloud config list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="enable-required-apis"&gt;Enable Required APIs
&lt;/h4&gt;&lt;p&gt;GKE requires several APIs to be enabled in your project:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Set your project&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gcloud config &lt;span class="nb"&gt;set&lt;/span&gt; project YOUR_PROJECT_ID
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Enable the required APIs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gcloud services &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; container.googleapis.com &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; compute.googleapis.com &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; iam.googleapis.com &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; logging.googleapis.com &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; monitoring.googleapis.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="docker-cli"&gt;Docker CLI
&lt;/h3&gt;&lt;p&gt;Docker is needed to build and test container images locally before pushing them to a registry. On GKE, the container runtime is containerd (managed by Google), but Docker remains the standard tool for local development.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DEB-based (Ubuntu, Debian, WSL2):&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Remove any old Docker packages&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get remove -y docker docker-engine docker.io containerd runc 2&amp;gt;/dev/null
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Add Docker&amp;#39;s official GPG key and repository&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo install -m &lt;span class="m"&gt;0755&lt;/span&gt; -d /etc/apt/keyrings
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -fsSL https://download.docker.com/linux/ubuntu/gpg &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;deb [arch=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;dpkg --print-architecture&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; signed-by=/etc/apt/keyrings/docker.gpg] \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; https://download.docker.com/linux/ubuntu \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;. /etc/os-release &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$VERSION_CODENAME&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; stable&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Install Docker Engine&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo apt-get install -y &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Add your user to the docker group (avoids needing sudo)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo usermod -aG docker &lt;span class="nv"&gt;$USER&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;newgrp docker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;RPM-based (RHEL, CentOS, Fedora):&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Add Docker repository&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo dnf config-manager --add-repo &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; https://download.docker.com/linux/centos/docker-ce.repo
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Install Docker Engine&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo dnf install -y docker-ce docker-ce-cli containerd.io &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; docker-buildx-plugin docker-compose-plugin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Start and enable Docker&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl start docker
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; docker
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Add your user to the docker group&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo usermod -aG docker &lt;span class="nv"&gt;$USER&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;newgrp docker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Verify Docker is working:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker --version
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run --rm hello-world
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;You should see a message confirming Docker can pull images and run containers.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="kubernetes-cli-kubectl"&gt;Kubernetes CLI (&lt;code&gt;kubectl&lt;/code&gt;)
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;kubectl&lt;/code&gt; is the command-line interface for communicating with the Kubernetes API server. It reads cluster connection details from a kubeconfig file (typically &lt;code&gt;~/.kube/config&lt;/code&gt;) and translates your commands into API requests.&lt;/p&gt;
&lt;h4 id="installation-1"&gt;Installation
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Option A — Install via gcloud (recommended for GKE users):&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Install kubectl as a gcloud component&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gcloud components install kubectl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# CRITICAL: Install the GKE authentication plugin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gcloud components install gke-gcloud-auth-plugin
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Option B — Install via native package manager:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DEB-based:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# kubectl is included in the google-cloud-cli package; alternatively:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get install -y kubectl
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;RPM-based:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Add the Kubernetes repository&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &lt;span class="s"&gt;&amp;lt;&amp;lt;&amp;#39;EOF&amp;#39; | sudo tee /etc/yum.repos.d/kubernetes.repo
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;[kubernetes]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;name=Kubernetes
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;baseurl=https://pkgs.k8s.io/core:/stable:/v1.31/rpm/
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;enabled=1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;gpgcheck=1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;gpgkey=https://pkgs.k8s.io/core:/stable:/v1.31/rpm/repodata/repomd.xml.key
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo dnf install -y kubectl
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="version-check-and-cluster-connection"&gt;Version Check and Cluster Connection
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Verify kubectl version&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl version --client
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# After creating a GKE cluster (covered in Section 3), connect kubectl:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gcloud container clusters get-credentials CLUSTER_NAME &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --region REGION &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --project YOUR_PROJECT_ID
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Verify connection&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl cluster-info
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The &lt;code&gt;get-credentials&lt;/code&gt; command writes the cluster&amp;rsquo;s API endpoint, CA certificate, and authentication configuration into your &lt;code&gt;~/.kube/config&lt;/code&gt; file. From that point forward, all &lt;code&gt;kubectl&lt;/code&gt; commands target the GKE cluster.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="creating-a-gke-cluster-using-google-cloud-cli"&gt;Creating a GKE Cluster Using Google Cloud CLI
&lt;/h2&gt;&lt;p&gt;This section walks through creating a production-ready GKE Standard cluster, verifying its health, and confirming it is ready for workloads.&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;Why Standard mode for this guide?&lt;/strong&gt; Standard mode exposes the full set of Kubernetes and GKE configuration options, which is valuable for learning. Once you are comfortable with the concepts, Autopilot is the recommended mode for most production workloads — it requires fewer flags and manages node infrastructure automatically.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="create-a-regional-cluster"&gt;Create a Regional Cluster
&lt;/h3&gt;&lt;p&gt;A regional cluster distributes the control plane and nodes across three zones within a region, providing higher availability than a single-zone cluster. This is the recommended topology for any workload that requires uptime (Google Cloud, 2024f).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Define variables for reuse&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;PROJECT_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;your-project-id&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;REGION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;us-central1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;CLUSTER_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;gke-lab-cluster&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;NETWORK&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;default&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Create the cluster&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gcloud container clusters create &lt;span class="nv"&gt;$CLUSTER_NAME&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --project&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PROJECT_ID&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --region&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$REGION&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --network&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$NETWORK&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --num-nodes&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --machine-type&lt;span class="o"&gt;=&lt;/span&gt;e2-medium &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --disk-type&lt;span class="o"&gt;=&lt;/span&gt;pd-standard &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --disk-size&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;50&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --enable-ip-alias &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --enable-autorepair &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --enable-autoupgrade &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --enable-autoscaling &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --min-nodes&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --max-nodes&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --logging&lt;span class="o"&gt;=&lt;/span&gt;SYSTEM,WORKLOAD &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --monitoring&lt;span class="o"&gt;=&lt;/span&gt;SYSTEM,POD,DEPLOYMENT &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --workload-pool&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PROJECT_ID&lt;/span&gt;.svc.id.goog &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --release-channel&lt;span class="o"&gt;=&lt;/span&gt;regular &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --labels&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;env&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;lab,team&lt;span class="o"&gt;=&lt;/span&gt;platform
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Flag Breakdown:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Flag&lt;/th&gt;
 &lt;th&gt;Purpose&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--region&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Creates a regional cluster (3 zones) instead of zonal&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--num-nodes=1&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;1 node &lt;strong&gt;per zone&lt;/strong&gt; — so 3 nodes total for a regional cluster&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--machine-type=e2-medium&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;2 vCPU, 4 GB RAM — suitable for lab and lightweight workloads&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--enable-ip-alias&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;VPC-native networking; pods get routable IPs from a VPC secondary range&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--enable-autorepair&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;GKE automatically recreates unhealthy nodes&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--enable-autoupgrade&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;GKE automatically upgrades node versions within the release channel&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--enable-autoscaling&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Cluster Autoscaler enabled with min/max boundaries&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--workload-pool&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Enables Workload Identity for pod-level IAM authentication&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--release-channel=regular&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Balances stability with feature availability&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--logging&lt;/code&gt; / &lt;code&gt;--monitoring&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Enables Cloud Logging and Cloud Monitoring components&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="monitor-cluster-creation"&gt;Monitor Cluster Creation
&lt;/h3&gt;&lt;p&gt;Cluster creation takes 5–10 minutes. You can monitor progress with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Watch the operation status&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gcloud container operations list &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --region&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$REGION&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --filter&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;targetLink~&lt;/span&gt;&lt;span class="nv"&gt;$CLUSTER_NAME&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --format&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;table(name, operationType, status, startTime)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Or describe a specific operation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gcloud container operations describe OPERATION_ID --region&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$REGION&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="retrieve-cluster-credentials"&gt;Retrieve Cluster Credentials
&lt;/h3&gt;&lt;p&gt;Once the cluster is ready, connect &lt;code&gt;kubectl&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gcloud container clusters get-credentials &lt;span class="nv"&gt;$CLUSTER_NAME&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --region&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$REGION&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --project&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PROJECT_ID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="validate-cluster-health"&gt;Validate Cluster Health
&lt;/h3&gt;&lt;p&gt;Run the following checks to confirm the cluster is operational:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1. Cluster info — confirms API server is reachable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl cluster-info
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2. Node status — all nodes should be &amp;#34;Ready&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get nodes -o wide
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 3. System pods — all pods in kube-system should be &amp;#34;Running&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get pods -n kube-system
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 4. Component status (deprecated but still useful for quick checks)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get componentstatuses 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Component statuses not available on newer GKE versions&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 5. Verify the cluster can schedule workloads&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl run health-check --image&lt;span class="o"&gt;=&lt;/span&gt;busybox --restart&lt;span class="o"&gt;=&lt;/span&gt;Never &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --command -- &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Cluster is ready&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl logs health-check
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl delete pod health-check
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Expected output for node check:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NAME STATUS ROLES AGE VERSION
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gke-gke-lab-cluster-default-pool-xxxx-0001 Ready &amp;lt;none&amp;gt; 5m v1.31.x-gke.xxxx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gke-gke-lab-cluster-default-pool-xxxx-0002 Ready &amp;lt;none&amp;gt; 5m v1.31.x-gke.xxxx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gke-gke-lab-cluster-default-pool-xxxx-0003 Ready &amp;lt;none&amp;gt; 5m v1.31.x-gke.xxxx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;All three nodes should show &lt;code&gt;STATUS: Ready&lt;/code&gt;. If any node shows &lt;code&gt;NotReady&lt;/code&gt;, wait a few minutes — the node may still be bootstrapping.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="deploying-a-simple-web-application"&gt;Deploying a Simple Web Application
&lt;/h2&gt;&lt;p&gt;With the cluster healthy, let&amp;rsquo;s deploy a containerized web application. We will use Nginx as a minimal example — it is a well-known, lightweight web server that demonstrates the core Kubernetes deployment primitives without requiring you to build a custom container image.&lt;/p&gt;
&lt;h3 id="create-the-deployment-manifest"&gt;Create the Deployment Manifest
&lt;/h3&gt;&lt;p&gt;A &lt;strong&gt;Deployment&lt;/strong&gt; declares the desired state: which container image to run, how many replicas, and what resources each replica should consume.&lt;/p&gt;
&lt;p&gt;Create a file named &lt;code&gt;nginx-deployment.yaml&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# nginx-deployment.yaml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;apps/v1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Deployment&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;nginx-web&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;nginx-web&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;replicas&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;matchLabels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;nginx-web&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;strategy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;RollingUpdate&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;rollingUpdate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;maxSurge&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;maxUnavailable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;nginx-web&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;containers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;nginx&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;nginx:1.27-alpine&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;containerPort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;80&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;TCP&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;cpu&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;100m&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;128Mi&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;limits&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;cpu&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;250m&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;256Mi&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;livenessProbe&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;httpGet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;80&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;initialDelaySeconds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;periodSeconds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;readinessProbe&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;httpGet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;80&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;initialDelaySeconds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;periodSeconds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Key details:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;replicas: 3&lt;/code&gt; — runs three identical pods spread across the cluster&amp;rsquo;s nodes.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;resources.requests&lt;/code&gt; — tells the scheduler how much CPU and memory each pod needs. The Cluster Autoscaler uses these values to decide whether to add nodes.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;resources.limits&lt;/code&gt; — hard ceiling; if a container exceeds its memory limit, Kubernetes kills and restarts it.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;livenessProbe&lt;/code&gt; — checks if the container is alive. If it fails, Kubernetes restarts the container.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;readinessProbe&lt;/code&gt; — checks if the container is ready to receive traffic. Pods that fail readiness are removed from the Service&amp;rsquo;s endpoint list.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RollingUpdate&lt;/code&gt; strategy with &lt;code&gt;maxUnavailable: 0&lt;/code&gt; — ensures zero downtime during deployments.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="create-the-service-manifest"&gt;Create the Service Manifest
&lt;/h3&gt;&lt;p&gt;A &lt;strong&gt;Service&lt;/strong&gt; provides a stable network endpoint for the pods. A &lt;code&gt;LoadBalancer&lt;/code&gt; type Service provisions a Google Cloud Network Load Balancer with a public IP address.&lt;/p&gt;
&lt;p&gt;Create a file named &lt;code&gt;nginx-service.yaml&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# nginx-service.yaml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;v1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Service&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;nginx-web-svc&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;nginx-web&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;LoadBalancer&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;nginx-web&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;http&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;TCP&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;80&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;targetPort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;80&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="apply-the-manifests"&gt;Apply the Manifests
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Apply the Deployment&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl apply -f nginx-deployment.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Apply the Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl apply -f nginx-service.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="monitor-the-deployment"&gt;Monitor the Deployment
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Watch pods come up&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get pods -l &lt;span class="nv"&gt;app&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;nginx-web -w
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Check deployment rollout status&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl rollout status deployment/nginx-web
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# View detailed deployment info&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl describe deployment nginx-web
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="get-the-external-ip"&gt;Get the External IP
&lt;/h3&gt;&lt;p&gt;The LoadBalancer provisioning takes 1–3 minutes. Watch for the &lt;code&gt;EXTERNAL-IP&lt;/code&gt; to transition from &lt;code&gt;&amp;lt;pending&amp;gt;&lt;/code&gt; to a public IP:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Watch the service for the external IP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get svc nginx-web-svc -w
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Once the IP appears, save it&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;EXTERNAL_IP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;kubectl get svc nginx-web-svc &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -o &lt;span class="nv"&gt;jsonpath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;{.status.loadBalancer.ingress[0].ip}&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Application URL: http://&lt;/span&gt;&lt;span class="nv"&gt;$EXTERNAL_IP&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="test-the-application"&gt;Test the Application
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Test via curl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl http://&lt;span class="nv"&gt;$EXTERNAL_IP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# You should see the default Nginx welcome page HTML:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# &amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# &amp;lt;html&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# &amp;lt;head&amp;gt;&amp;lt;title&amp;gt;Welcome to nginx!&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Open &lt;code&gt;http://&amp;lt;EXTERNAL_IP&amp;gt;&lt;/code&gt; in a browser — you should see the &amp;ldquo;Welcome to nginx!&amp;rdquo; page.&lt;/p&gt;
&lt;h3 id="view-logs"&gt;View Logs
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Logs from all pods in the deployment&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl logs -l &lt;span class="nv"&gt;app&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;nginx-web --all-containers&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Follow logs in real time (streams new entries as they arrive)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl logs -l &lt;span class="nv"&gt;app&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;nginx-web -f
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Logs from a specific pod&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl logs nginx-web-xxxxxxx-xxxxx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="clean-up"&gt;Clean Up
&lt;/h3&gt;&lt;p&gt;When finished experimenting:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl delete -f nginx-service.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl delete -f nginx-deployment.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="creating-the-same-gke-cluster-using-terraform"&gt;Creating the Same GKE Cluster Using Terraform
&lt;/h2&gt;&lt;p&gt;Terraform enables you to define your GKE cluster as code — versioned, reviewed, and reproducible. This section provides a minimal Terraform project that creates the same cluster built in Section 3.&lt;/p&gt;
&lt;h3 id="project-structure"&gt;Project Structure
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;gke&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;terraform&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tf&lt;/span&gt; &lt;span class="c1"&gt;# Cluster and node pool resources&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;variables&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tf&lt;/span&gt; &lt;span class="c1"&gt;# Input variables&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;outputs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tf&lt;/span&gt; &lt;span class="c1"&gt;# Output values&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;versions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tf&lt;/span&gt; &lt;span class="c1"&gt;# Provider and Terraform constraints&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="n"&gt;terraform&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tfvars&lt;/span&gt; &lt;span class="c1"&gt;# Variable values (do not commit secrets)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="versionstf"&gt;&lt;code&gt;versions.tf&lt;/code&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;terraform&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; required_version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt; &amp;#34;&amp;gt;&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;required_providers&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; google&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; source&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hashicorp/google&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt; &amp;#34;&amp;gt;&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;7&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;provider&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;google&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; project&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;project_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; region&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;region&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="variablestf"&gt;&lt;code&gt;variables.tf&lt;/code&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;variable&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;project_id&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;GCP project ID.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;variable&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;region&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;GCP region for the cluster.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; default&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;us-central1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;variable&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;cluster_name&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Name of the GKE cluster.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; default&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;gke-lab-cluster&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;variable&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;machine_type&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Machine type for cluster nodes.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; default&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;e2-medium&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;variable&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;min_nodes&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Minimum number of nodes per zone.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;number&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; default&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;variable&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;max_nodes&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Maximum number of nodes per zone.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;number&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; default&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="maintf"&gt;&lt;code&gt;main.tf&lt;/code&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;span class="lnt"&gt;61
&lt;/span&gt;&lt;span class="lnt"&gt;62
&lt;/span&gt;&lt;span class="lnt"&gt;63
&lt;/span&gt;&lt;span class="lnt"&gt;64
&lt;/span&gt;&lt;span class="lnt"&gt;65
&lt;/span&gt;&lt;span class="lnt"&gt;66
&lt;/span&gt;&lt;span class="lnt"&gt;67
&lt;/span&gt;&lt;span class="lnt"&gt;68
&lt;/span&gt;&lt;span class="lnt"&gt;69
&lt;/span&gt;&lt;span class="lnt"&gt;70
&lt;/span&gt;&lt;span class="lnt"&gt;71
&lt;/span&gt;&lt;span class="lnt"&gt;72
&lt;/span&gt;&lt;span class="lnt"&gt;73
&lt;/span&gt;&lt;span class="lnt"&gt;74
&lt;/span&gt;&lt;span class="lnt"&gt;75
&lt;/span&gt;&lt;span class="lnt"&gt;76
&lt;/span&gt;&lt;span class="lnt"&gt;77
&lt;/span&gt;&lt;span class="lnt"&gt;78
&lt;/span&gt;&lt;span class="lnt"&gt;79
&lt;/span&gt;&lt;span class="lnt"&gt;80
&lt;/span&gt;&lt;span class="lnt"&gt;81
&lt;/span&gt;&lt;span class="lnt"&gt;82
&lt;/span&gt;&lt;span class="lnt"&gt;83
&lt;/span&gt;&lt;span class="lnt"&gt;84
&lt;/span&gt;&lt;span class="lnt"&gt;85
&lt;/span&gt;&lt;span class="lnt"&gt;86
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# -----------------------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# GKE Cluster
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# -----------------------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;google_container_cluster&amp;#34; &amp;#34;primary&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;cluster_name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; location&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;region&lt;/span&gt;&lt;span class="c1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt; # We manage the default node pool separately for flexibility
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; remove_default_node_pool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; initial_node_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="c1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt; # Networking
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; networking_mode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;VPC_NATIVE&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;ip_allocation_policy&lt;/span&gt; {}&lt;span class="c1"&gt; # Use default secondary ranges
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt; # Workload Identity
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;workload_identity_config&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; workload_pool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${var.project_id}.svc.id.goog&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }&lt;span class="c1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt; # Release channel
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;release_channel&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; channel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;REGULAR&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }&lt;span class="c1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt; # Logging and Monitoring
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;logging_config&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; enable_components&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;SYSTEM_COMPONENTS&amp;#34;, &amp;#34;WORKLOADS&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;monitoring_config&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; enable_components&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;SYSTEM_COMPONENTS&amp;#34;, &amp;#34;POD&amp;#34;, &amp;#34;DEPLOYMENT&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;managed_prometheus&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; enabled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }&lt;span class="c1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt; # Resource labels
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; resource_labels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; env&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;lab&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; team&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;platform&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&lt;span class="c1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# -----------------------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Separately Managed Node Pool
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# -----------------------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;google_container_node_pool&amp;#34; &amp;#34;primary_nodes&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${var.cluster_name}-node-pool&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; location&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;region&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; cluster&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;google_container_cluster&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;primary&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;name&lt;/span&gt;&lt;span class="c1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt; # Autoscaling configuration
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;autoscaling&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; min_node_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;min_nodes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; max_node_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;max_nodes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }&lt;span class="c1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt; # Node configuration
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;node_config&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; machine_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;machine_type&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; disk_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;pd-standard&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; disk_size_gb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;50&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; oauth_scopes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;https://www.googleapis.com/auth/cloud-platform&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; labels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; env&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;lab&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }&lt;span class="c1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt; # Workload Identity at the node level
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;workload_metadata_config&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; mode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;GKE_METADATA&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;management&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; auto_repair&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; auto_upgrade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="outputstf"&gt;&lt;code&gt;outputs.tf&lt;/code&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;output&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;cluster_name&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Name of the GKE cluster.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;google_container_cluster&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;primary&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;output&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;cluster_endpoint&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;GKE cluster API server endpoint.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;google_container_cluster&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;primary&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;endpoint&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; sensitive&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;output&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;cluster_location&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Location (region) of the cluster.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;google_container_cluster&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;primary&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;location&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;output&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;get_credentials_command&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Command to configure kubectl for this cluster.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;gcloud container clusters get-credentials ${google_container_cluster.primary.name} --region ${google_container_cluster.primary.location} --project ${var.project_id}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="terraformtfvars"&gt;&lt;code&gt;terraform.tfvars&lt;/code&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;project_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;your-project-id&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;region&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;us-central1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cluster_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;gke-lab-cluster&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;machine_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;e2-medium&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;min_nodes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;max_nodes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="commands-to-initialize-plan-and-apply"&gt;Commands to Initialize, Plan, and Apply
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; gke-terraform/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Initialize Terraform — downloads the Google provider&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;terraform init
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Preview the changes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;terraform plan
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Apply the configuration — creates the cluster&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;terraform apply
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# When prompted, type &amp;#34;yes&amp;#34; to confirm&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="retrieve-cluster-credentials-after-terraform-provisioning"&gt;Retrieve Cluster Credentials After Terraform Provisioning
&lt;/h3&gt;&lt;p&gt;After &lt;code&gt;terraform apply&lt;/code&gt; completes, use the output to connect &lt;code&gt;kubectl&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Option A: Use the output command directly&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;$(&lt;/span&gt;terraform output -raw get_credentials_command&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Option B: Manual command using output values&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gcloud container clusters get-credentials &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;$(&lt;/span&gt;terraform output -raw cluster_name&lt;span class="k"&gt;)&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --region &lt;span class="k"&gt;$(&lt;/span&gt;terraform output -raw cluster_location&lt;span class="k"&gt;)&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --project your-project-id
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Verify&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get nodes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="tear-down"&gt;Tear Down
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Destroy all Terraform-managed resources&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;terraform destroy
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="advantages-of-using-gke-for-this-deployment"&gt;Advantages of Using GKE for This Deployment
&lt;/h2&gt;&lt;h3 id="operational-simplicity"&gt;Operational Simplicity
&lt;/h3&gt;&lt;p&gt;GKE removes the heaviest operational burden from Kubernetes adoption: running and securing the control plane. The API server, etcd, scheduler, and controller manager are managed, patched, and scaled by Google — with a financially backed 99.95% SLA for regional clusters (Google Cloud, 2024f). Your team can direct its engineering effort toward application delivery rather than cluster babysitting.&lt;/p&gt;
&lt;h3 id="automatic-upgrades-and-repair"&gt;Automatic Upgrades and Repair
&lt;/h3&gt;&lt;p&gt;With release channels, GKE automatically upgrades both the control plane and nodes to tested Kubernetes versions. Node auto-repair monitors node health via periodic checks; if a node fails its health check, GKE drains it, deletes it, and provisions a fresh replacement — without human intervention (Google Cloud, 2024c). This self-healing behavior is difficult and time-consuming to replicate on self-managed Kubernetes.&lt;/p&gt;
&lt;h3 id="deep-gcp-ecosystem-integration"&gt;Deep GCP Ecosystem Integration
&lt;/h3&gt;&lt;p&gt;GKE is not an isolated service. It integrates directly with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cloud Load Balancing&lt;/strong&gt; — exposing Services as &lt;code&gt;LoadBalancer&lt;/code&gt; type automatically provisions L4/L7 load balancers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloud IAM + Workload Identity&lt;/strong&gt; — pods authenticate to Google Cloud APIs with per-service-account credentials, eliminating the antipattern of mounting JSON keys as Kubernetes Secrets.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Artifact Registry&lt;/strong&gt; — private container image storage with vulnerability scanning.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloud Build&lt;/strong&gt; — serverless CI/CD that builds images and deploys to GKE through declarative pipelines.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Secret Manager&lt;/strong&gt; — external secret storage that can be synced into Kubernetes Secrets using the Secrets Store CSI Driver.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="built-in-observability"&gt;Built-in Observability
&lt;/h3&gt;&lt;p&gt;Every cluster created in this guide ships with Cloud Logging and Cloud Monitoring enabled. Container logs are collected and indexed without deploying a Fluentd/Fluentbit DaemonSet. Metrics are scraped and stored without managing a Prometheus/Grafana stack. For teams graduating from virtual machines to containers, this eliminates the &amp;ldquo;observability gap&amp;rdquo; that often accompanies Kubernetes adoption.&lt;/p&gt;
&lt;h3 id="scalability-and-reliability"&gt;Scalability and Reliability
&lt;/h3&gt;&lt;p&gt;The Cluster Autoscaler, combined with Horizontal Pod Autoscaler (HPA) and Vertical Pod Autoscaler (VPA), creates a multi-layer scaling system. Pods scale based on CPU, memory, or custom metrics; the cluster provisions additional nodes when pending pods cannot be scheduled. Regional clusters distribute workloads across three availability zones. This architecture handles everything from steady-state API traffic to spike-driven event processing.&lt;/p&gt;
&lt;h3 id="enterprise-grade-security"&gt;Enterprise-Grade Security
&lt;/h3&gt;&lt;p&gt;GKE&amp;rsquo;s defense-in-depth posture includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Shielded Nodes&lt;/strong&gt; — Secure Boot ensures only verified software runs on the node&amp;rsquo;s boot chain.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Binary Authorization&lt;/strong&gt; — enforce that only signed, trusted container images can be deployed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Network Policies&lt;/strong&gt; — define which pods can communicate with which, enforced by the Dataplane V2 (Cilium-based eBPF implementation).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GKE Security Posture Dashboard&lt;/strong&gt; — scans workloads against CIS Kubernetes Benchmarks and flags misconfigurations.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For organizations subject to compliance frameworks (SOC 2, ISO 27001, HIPAA, PCI DSS), GKE provides the controls and audit trails required to meet these standards (Google Cloud, 2024d).&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Google Kubernetes Engine democratizes Kubernetes adoption by removing the operational complexity of running a container orchestration platform. This guide has walked you through the essentials: understanding what GKE is and when to use it, installing the required tools (&lt;code&gt;gcloud&lt;/code&gt;, Docker, &lt;code&gt;kubectl&lt;/code&gt;), provisioning a production-ready regional cluster via both the CLI and Terraform, and deploying a containerized application end-to-end.&lt;/p&gt;
&lt;p&gt;The journey from local containerization to managed Kubernetes need not be daunting. By leveraging GKE&amp;rsquo;s automation—Autopilot or Standard mode, automatic upgrades, node repair, integrated observability—you sidestep the pitfalls that derail many Kubernetes projects: control plane availability, security patching, and observability instrumentation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Next steps:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Deploy a real workload.&lt;/strong&gt; Replace the Nginx example with one of your microservices. Refine resource requests and limits based on observed behavior.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Explore Autopilot.&lt;/strong&gt; Once comfortable with Standard mode concepts, Autopilot removes node management entirely, reducing configuration surface area.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Implement GitOps.&lt;/strong&gt; Adopt ArgoCD or Flux to make your cluster state declarative and version-controlled—the foundation of repeatable, auditable deployments.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deepen observability.&lt;/strong&gt; Layer in custom metrics, distributed tracing (Cloud Trace), and profiling (Cloud Profiler) to understand application behavior under load.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Adopt service mesh (optional).&lt;/strong&gt; Istio or Anthos Service Mesh provide traffic management, security policies, and observability, valuable as your system grows.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The cloud-native ecosystem is vast, but GKE is a solid, opinionated entry point that scales from a single developer&amp;rsquo;s lab cluster to enterprise workloads serving millions of users. Start small, iterate, and grow your confidence with each deployment.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Graphic: GKE Deciphered: A Beginners Journey to Managed Kubernetes&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://dantas.io/p/getting-started-with-gke-complete-guide/GKE-beginner-conclusion.png"
	width="2752"
	height="1536"
	loading="lazy"
	
		alt="Generated by Google Gemini NotebookLM"
	
 
	
		class="gallery-image" 
		data-flex-grow="179"
		data-flex-basis="430px"
	
&gt;&lt;/p&gt;
&lt;p&gt;This visual roadmap illustrates the two-phase progression from setup to production deployment. Phase 1 covers the essential trinity of tools—gcloud CLI, Docker, and kubectl—along with two GKE operational modes: Autopilot (fully managed infrastructure, pay per pod resources) and Standard (full configuration control, pay per VM instances). Phase 2 depicts deployment workflows, including YAML manifest authoring, declarative application deployment with replicas and stable network endpoints via Services, integrated cloud logging and monitoring, and automated self-healing and scaling driven by traffic demand. The diagram reinforces that GKE abstracts Kubernetes cluster management, enabling teams to focus on application delivery rather than platform operations.&lt;/p&gt;
&lt;hr&gt;
&lt;div class="video-wrapper"&gt;
 &lt;iframe loading="lazy" 
 src="https://www.youtube.com/embed/TBQ1WVQ33n0" 
 allowfullscreen 
 title="YouTube Video"
 &gt;
 &lt;/iframe&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;div class="video-wrapper"&gt;
 &lt;iframe loading="lazy" 
 src="https://www.youtube.com/embed/hWEah3HfmKQ" 
 allowfullscreen 
 title="YouTube Video"
 &gt;
 &lt;/iframe&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;iframe width="100%" height="166" scrolling="no" frameborder="no" allow="autoplay"
 src="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/2302480241&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true"&gt;
&lt;/iframe&gt;
&lt;hr&gt;
&lt;h2 id="references"&gt;References
&lt;/h2&gt;&lt;p&gt;Burns, B., Grant, B., Oppenheimer, D., Brewer, E., &amp;amp; Wilkes, J. (2016). Borg, Omega, and Kubernetes: Lessons learned from three container-management systems over a decade. &lt;em&gt;ACM Queue, 14&lt;/em&gt;(1), 70–93. &lt;a class="link" href="https://queue.acm.org/detail.cfm?id=2898444" target="_blank" rel="noopener"
 &gt;https://queue.acm.org/detail.cfm?id=2898444&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Cloud Native Computing Foundation. (2018). &lt;em&gt;CNCF cloud native definition v1.0&lt;/em&gt;. &lt;a class="link" href="https://github.com/cncf/toc/blob/main/DEFINITION.md" target="_blank" rel="noopener"
 &gt;https://github.com/cncf/toc/blob/main/DEFINITION.md&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Google Cloud. (2024a). &lt;em&gt;GKE overview&lt;/em&gt;. Google Cloud Documentation. &lt;a class="link" href="https://cloud.google.com/kubernetes-engine/docs/concepts/kubernetes-engine-overview" target="_blank" rel="noopener"
 &gt;https://cloud.google.com/kubernetes-engine/docs/concepts/kubernetes-engine-overview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Google Cloud. (2024b). &lt;em&gt;About GKE modes of operation&lt;/em&gt;. Google Cloud Documentation. &lt;a class="link" href="https://cloud.google.com/kubernetes-engine/docs/concepts/choose-cluster-mode" target="_blank" rel="noopener"
 &gt;https://cloud.google.com/kubernetes-engine/docs/concepts/choose-cluster-mode&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Google Cloud. (2024c). &lt;em&gt;Cluster autoscaler overview&lt;/em&gt;. Google Cloud Documentation. &lt;a class="link" href="https://cloud.google.com/kubernetes-engine/docs/concepts/cluster-autoscaler" target="_blank" rel="noopener"
 &gt;https://cloud.google.com/kubernetes-engine/docs/concepts/cluster-autoscaler&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Google Cloud. (2024d). &lt;em&gt;GKE security overview&lt;/em&gt;. Google Cloud Documentation. &lt;a class="link" href="https://cloud.google.com/kubernetes-engine/docs/concepts/security-overview" target="_blank" rel="noopener"
 &gt;https://cloud.google.com/kubernetes-engine/docs/concepts/security-overview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Google Cloud. (2024e). &lt;em&gt;GKE observability overview&lt;/em&gt;. Google Cloud Documentation. &lt;a class="link" href="https://cloud.google.com/kubernetes-engine/docs/concepts/observability" target="_blank" rel="noopener"
 &gt;https://cloud.google.com/kubernetes-engine/docs/concepts/observability&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Google Cloud. (2024f). &lt;em&gt;Regional clusters&lt;/em&gt;. Google Cloud Documentation. &lt;a class="link" href="https://cloud.google.com/kubernetes-engine/docs/concepts/regional-clusters" target="_blank" rel="noopener"
 &gt;https://cloud.google.com/kubernetes-engine/docs/concepts/regional-clusters&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Google Cloud. (2026a). &lt;em&gt;Install the Google Cloud CLI&lt;/em&gt;. Google Cloud Documentation. &lt;a class="link" href="https://cloud.google.com/sdk/docs/install-sdk" target="_blank" rel="noopener"
 &gt;https://cloud.google.com/sdk/docs/install-sdk&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;HashiCorp. (2024). &lt;em&gt;Google provider: google_container_cluster&lt;/em&gt;. Terraform Registry. &lt;a class="link" href="https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/container_cluster" target="_blank" rel="noopener"
 &gt;https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/container_cluster&lt;/a&gt;&lt;/p&gt;</description></item><item><title>GKE is the choice for Kubernetes Deployment</title><link>https://dantas.io/p/gke-is-the-choice-for-kubernetes-deployment/</link><pubDate>Mon, 13 Apr 2026 00:00:00 +0000</pubDate><guid>https://dantas.io/p/gke-is-the-choice-for-kubernetes-deployment/</guid><description>&lt;img src="https://dantas.io/" alt="Featured image of post GKE is the choice for Kubernetes Deployment" /&gt;&lt;h1 id="why-gke-is-the-most-advanced-managed-kubernetes-platform--a-technical-deep-dive"&gt;Why GKE Is the Most Advanced Managed Kubernetes Platform — A Technical Deep Dive
&lt;/h1&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;Audience:&lt;/strong&gt; CTOs, CIOs, IT Architects, and Senior Engineering Leaders&lt;br&gt;
&lt;strong&gt;Format:&lt;/strong&gt; Evidence-based comparative analysis | APA 7th Edition references&lt;br&gt;
&lt;strong&gt;Platforms compared:&lt;/strong&gt; GKE · Azure AKS · AWS EKS · Oracle OKE · Cloud Run · Firebase&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="executive-summary"&gt;Executive Summary
&lt;/h2&gt;&lt;p&gt;Google Kubernetes Engine (GKE) is the most architecturally mature, operationally reliable, and feature-complete managed Kubernetes platform in the enterprise cloud market. This is not a vendor claim — it is a structural reality rooted in a foundational truth: &lt;strong&gt;Google invented Kubernetes.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The platform&amp;rsquo;s lineage traces directly to Google&amp;rsquo;s internal container orchestration systems, Borg and Omega, which managed billions of containers across Google&amp;rsquo;s global infrastructure for more than a decade before Kubernetes was open-sourced in 2014 (Burns et al., 2016).&lt;/p&gt;
&lt;p&gt;This article delivers an evidence-based comparison of GKE against its primary managed Kubernetes competitors — &lt;strong&gt;Microsoft Azure AKS&lt;/strong&gt;, &lt;strong&gt;AWS EKS&lt;/strong&gt;, and &lt;strong&gt;Oracle OKE&lt;/strong&gt; — across six critical dimensions. It also clarifies how GKE integrates strategically with &lt;strong&gt;Cloud Run&lt;/strong&gt; and &lt;strong&gt;Firebase&lt;/strong&gt; to form a comprehensive, unified cloud-native ecosystem.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-the-origin-of-kubernetes-googles-decade-of-containerization"&gt;1. The Origin of Kubernetes: Google&amp;rsquo;s Decade of Containerization
&lt;/h2&gt;&lt;h3 id="11-from-borg-and-omega-to-open-source"&gt;1.1 From Borg and Omega to Open Source
&lt;/h3&gt;&lt;p&gt;To fully appreciate GKE&amp;rsquo;s architectural advantages, you need to understand the engineering context from which Kubernetes emerged.&lt;/p&gt;
&lt;p&gt;Google&amp;rsquo;s container orchestration journey began internally in the early 2000s with &lt;strong&gt;Borg&lt;/strong&gt; — a large-scale cluster management system that managed hundreds of thousands of jobs across Google&amp;rsquo;s global data centers (Verma et al., 2015). Borg was not a prototype; it was the operational backbone powering Google Search, Gmail, and YouTube at planetary scale.&lt;/p&gt;
&lt;p&gt;Following Borg, Google developed &lt;strong&gt;Omega&lt;/strong&gt; — a more flexible, composable cluster management system that introduced optimistic concurrency control and a shared-state scheduler architecture (Schwarzkopf et al., 2013). Omega served as the intellectual bridge between Borg&amp;rsquo;s deterministic scheduling model and the declarative, extensible API model that would define Kubernetes.&lt;/p&gt;
&lt;p&gt;In 2013, Google engineers — including Joe Beda, Brendan Burns, and Craig McLuckin — began designing Kubernetes as an open-source synthesis of the lessons learned from Borg and Omega. It was publicly announced in June 2014 and donated to the &lt;strong&gt;Cloud Native Computing Foundation (CNCF)&lt;/strong&gt; in 2016 (CNCF, 2016; Google, 2014).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Borg (early 2000s)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── Omega (~2011)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── Kubernetes (2014, open-sourced)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── GKE (2014, GA — concurrent with K8s launch)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="12-engineering-heritage-as-a-competitive-moat"&gt;1.2 Engineering Heritage as a Competitive Moat
&lt;/h3&gt;&lt;p&gt;When Google launched GKE in 2014 — concurrent with Kubernetes&amp;rsquo; public debut — the engineering team brought more than a decade of institutional knowledge in running containerized workloads at hyperscale.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Platform&lt;/th&gt;
 &lt;th&gt;Launch Year&lt;/th&gt;
 &lt;th&gt;Head Start vs. GKE&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;GKE&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;2014&lt;/td&gt;
 &lt;td&gt;—&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Azure AKS&lt;/td&gt;
 &lt;td&gt;2017&lt;/td&gt;
 &lt;td&gt;−3 years&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;AWS EKS&lt;/td&gt;
 &lt;td&gt;2018&lt;/td&gt;
 &lt;td&gt;−4 years&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Oracle OKE&lt;/td&gt;
 &lt;td&gt;2020&lt;/td&gt;
 &lt;td&gt;−6 years&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;This foundational advantage manifests concretely in GKE&amp;rsquo;s architecture: its control plane reliability, node auto-repair mechanisms, approach to workload identity, and autoscaling intelligence all reflect patterns proven over years of operating containers at Google scale. Competing platforms are fundamentally &lt;strong&gt;adopters&lt;/strong&gt; of a framework that Google conceived, incubated, and continues to lead.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="2-gke-vs-aks-vs-eks-vs-oke-comparative-analysis"&gt;2. GKE vs. AKS vs. EKS vs. OKE: Comparative Analysis
&lt;/h2&gt;&lt;h3 id="summary-table"&gt;Summary Table
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Dimension&lt;/th&gt;
 &lt;th&gt;GKE&lt;/th&gt;
 &lt;th&gt;AKS&lt;/th&gt;
 &lt;th&gt;EKS&lt;/th&gt;
 &lt;th&gt;OKE&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Maturity&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;10+ yrs Borg/Omega lineage; Autopilot mode; SRE-embedded automation&lt;/td&gt;
 &lt;td&gt;Launched 2017; strong Azure integration; manual node config required&lt;/td&gt;
 &lt;td&gt;Launched 2018; mature but relies on manual node group tuning&lt;/td&gt;
 &lt;td&gt;Launched 2020; primarily Oracle-workload focused&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Autoscaling&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;HPA + VPA + Cluster Autoscaler; fully automatic in Autopilot&lt;/td&gt;
 &lt;td&gt;HPA/VPA available; Cluster Autoscaler functional; manual node pool config&lt;/td&gt;
 &lt;td&gt;HPA/VPA + Karpenter; complex configuration&lt;/td&gt;
 &lt;td&gt;Basic HPA/VPA; limited cluster-level intelligence&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Workload Identity, Binary Authorization, Shielded Nodes, GKE Sandbox (gVisor) — all native&lt;/td&gt;
 &lt;td&gt;Defender for Containers add-on; image signing via ACR&lt;/td&gt;
 &lt;td&gt;GuardDuty add-on; IAM Roles for Service Accounts&lt;/td&gt;
 &lt;td&gt;OCI IAM integration; limited sandbox options&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Networking&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Google private backbone (&amp;lt;35ms globally); Container-Native LB; Gateway API native&lt;/td&gt;
 &lt;td&gt;Azure CNI; regional load balancing; latency varies by region&lt;/td&gt;
 &lt;td&gt;VPC-CNI; ALB/NLB integration; region-constrained&lt;/td&gt;
 &lt;td&gt;OCI VCN; limited global network consistency&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Control Plane SLA&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;99.95%; zero-downtime upgrades with configurable disruption budgets&lt;/td&gt;
 &lt;td&gt;99.95%; upgrade windows require explicit planning&lt;/td&gt;
 &lt;td&gt;99.95%; control plane visibility limited&lt;/td&gt;
 &lt;td&gt;99.95%; less documentation on upgrade automation&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Upstream K8s&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Leads 11 SIGs; features land in GKE first&lt;/td&gt;
 &lt;td&gt;Contributes to select SIGs; typically 1–2 releases behind&lt;/td&gt;
 &lt;td&gt;Growing contributions; historically conservative posture&lt;/td&gt;
 &lt;td&gt;Minimal upstream contributions&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;em&gt;Sources: Google (2023a); Microsoft (2023); AWS (2023); Oracle (2023); CNCF (2023)&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="21-maturity-and-operational-excellence"&gt;2.1 Maturity and Operational Excellence
&lt;/h3&gt;&lt;p&gt;GKE&amp;rsquo;s &lt;strong&gt;Autopilot mode&lt;/strong&gt;, introduced in 2021, represents a paradigm shift in managed Kubernetes operations. Unlike standard node-based provisioning models offered by AKS, EKS, and OKE, GKE Autopilot abstracts node management entirely — Google assumes full responsibility for node provisioning, configuration, scaling, security hardening, and bin-packing efficiency (Google, 2023a).&lt;/p&gt;
&lt;p&gt;This is not merely a convenience feature. It is the culmination of Google&amp;rsquo;s &lt;strong&gt;SRE philosophy&lt;/strong&gt; applied to Kubernetes cluster operations.&lt;/p&gt;
&lt;p&gt;AKS and EKS both offer node pool management that reduces some overhead, but they fundamentally require platform teams to make decisions about instance types, disk configurations, and scaling policies. This operational surface area creates risk and demands sustained engineering investment. OKE, while capable, is primarily optimized for Oracle Cloud workloads and lacks the breadth of automation present in GKE (Oracle, 2023).&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="22-scalability-and-autoscaling-architecture"&gt;2.2 Scalability and Autoscaling Architecture
&lt;/h3&gt;&lt;p&gt;GKE implements a &lt;strong&gt;multi-dimensional autoscaling framework&lt;/strong&gt; that simultaneously coordinates three mechanisms:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;HPA (Horizontal Pod Autoscaler)&lt;/strong&gt; — pod-level scaling based on CPU, memory, or custom metrics&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VPA (Vertical Pod Autoscaler)&lt;/strong&gt; — right-sizing resource requests and limits&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cluster Autoscaler&lt;/strong&gt; — node-level provisioning in response to pending pod scheduling pressure&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In Autopilot mode, all three are managed automatically (Google, 2023b).&lt;/p&gt;
&lt;p&gt;AWS EKS has partially addressed this gap through &lt;strong&gt;Karpenter&lt;/strong&gt; — an open-source node provisioner offering faster scaling and more flexible instance selection (AWS, 2023). However, Karpenter requires explicit deployment and configuration by platform teams, whereas GKE&amp;rsquo;s equivalent is native and policy-enforced. AKS offers functional autoscaling but lacks the tight integration between its node and pod scaling layers that GKE&amp;rsquo;s control plane provides natively.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="23-security-architecture"&gt;2.3 Security Architecture
&lt;/h3&gt;&lt;p&gt;GKE&amp;rsquo;s security model is distinguished by the &lt;strong&gt;depth and nativity&lt;/strong&gt; of its controls:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Control&lt;/th&gt;
 &lt;th&gt;GKE&lt;/th&gt;
 &lt;th&gt;AKS&lt;/th&gt;
 &lt;th&gt;EKS&lt;/th&gt;
 &lt;th&gt;OKE&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Pod Identity (no static credentials)&lt;/td&gt;
 &lt;td&gt;✅ Workload Identity (native)&lt;/td&gt;
 &lt;td&gt;⚠️ Managed Identity (add-on)&lt;/td&gt;
 &lt;td&gt;⚠️ IRSA (manual config)&lt;/td&gt;
 &lt;td&gt;⚠️ OCI IAM (manual config)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Image attestation at deploy time&lt;/td&gt;
 &lt;td&gt;✅ Binary Authorization (native)&lt;/td&gt;
 &lt;td&gt;⚠️ Azure Policy (add-on)&lt;/td&gt;
 &lt;td&gt;⚠️ ECR signing (optional)&lt;/td&gt;
 &lt;td&gt;❌ Limited&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Trusted boot / verified firmware&lt;/td&gt;
 &lt;td&gt;✅ Shielded GKE Nodes (native)&lt;/td&gt;
 &lt;td&gt;⚠️ Trusted Launch (optional)&lt;/td&gt;
 &lt;td&gt;❌ Not available&lt;/td&gt;
 &lt;td&gt;❌ Not available&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Kernel-level sandbox&lt;/td&gt;
 &lt;td&gt;✅ GKE Sandbox / gVisor (native)&lt;/td&gt;
 &lt;td&gt;❌ Not available natively&lt;/td&gt;
 &lt;td&gt;❌ Not available natively&lt;/td&gt;
 &lt;td&gt;❌ Not available&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Workload Identity&lt;/strong&gt; provides cryptographically verifiable pod identities mapped to Google Cloud IAM service accounts, eliminating static credential mounting — a common vulnerability vector in competing platforms (Google, 2023c).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Binary Authorization&lt;/strong&gt; enforces a deploy-time policy requiring container images to be attested and signed by trusted authorities before scheduling, providing supply chain security at the control plane level.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GKE Sandbox&lt;/strong&gt;, powered by gVisor, introduces an additional isolation layer between container workloads and the host kernel — a capability with no native equivalent in AKS, EKS, or OKE (Google, 2020).&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="24-networking-and-global-reliability"&gt;2.4 Networking and Global Reliability
&lt;/h3&gt;&lt;p&gt;GKE benefits from Google&amp;rsquo;s &lt;strong&gt;private global fiber network&lt;/strong&gt; — the same infrastructure that powers Google Search, YouTube, and Google Workspace — offering sub-35ms latency between major metropolitan regions worldwide (Google, 2023d). This is not shared public internet routing; Google&amp;rsquo;s backbone carries traffic over dedicated interconnects between Points of Presence (PoPs).&lt;/p&gt;
&lt;p&gt;Key networking differentiators:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Container-Native Load Balancing&lt;/strong&gt; routes traffic directly to pod IP addresses, bypassing node-level proxy hops, reducing latency and improving distribution accuracy&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gateway API&lt;/strong&gt; is natively supported with advanced traffic management (header-based routing, traffic weighting, cross-namespace policies) — requiring manual third-party ingress controllers in AKS/EKS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Anycast routing&lt;/strong&gt; ensures global traffic is served from the nearest healthy endpoint without manual DNS or failover configuration&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="25-automation-and-operational-simplicity"&gt;2.5 Automation and Operational Simplicity
&lt;/h3&gt;&lt;p&gt;GKE Autopilot enforces &lt;strong&gt;Pod Security Standards&lt;/strong&gt; by default — including restrictions on host networking, privileged containers, and host path mounts — that must be manually configured in competitor platforms.&lt;/p&gt;
&lt;p&gt;Automated node upgrades use a &lt;strong&gt;surge upgrade strategy&lt;/strong&gt; that maintains cluster capacity during the upgrade cycle, with configurable disruption budgets that respect &lt;code&gt;PodDisruptionPolicies&lt;/code&gt; (Google, 2023a).&lt;/p&gt;
&lt;p&gt;AKS and EKS offer maintenance windows for upgrades but require explicit enrollment and configuration. Node drain and cordon operations during upgrades are not as transparently automated, and organizations frequently encounter upgrade-related disruptions in production when manual node group configurations are suboptimal (Microsoft, 2023; AWS, 2023).&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="26-ecosystem-leadership-and-upstream-kubernetes-alignment"&gt;2.6 Ecosystem Leadership and Upstream Kubernetes Alignment
&lt;/h3&gt;&lt;p&gt;Google&amp;rsquo;s contribution to the upstream Kubernetes project is unmatched among cloud providers.&lt;/p&gt;
&lt;p&gt;As of 2023, Googlers &lt;strong&gt;lead or co-lead 11 of the 30 active Kubernetes SIGs&lt;/strong&gt; — including the critical SIG-Architecture, SIG-Node, and SIG-Network working groups that define the platform&amp;rsquo;s core primitives (CNCF, 2023).&lt;/p&gt;
&lt;p&gt;This leadership translates into a measurable first-mover advantage: features that enter alpha or beta in upstream Kubernetes typically become available in GKE before AKS or EKS implement them. Notable examples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Native &lt;strong&gt;Kubernetes Gateway API&lt;/strong&gt; integration&lt;/li&gt;
&lt;li&gt;Early support for &lt;strong&gt;Ephemeral Containers&lt;/strong&gt; for live debugging&lt;/li&gt;
&lt;li&gt;Adoption of &lt;strong&gt;Structured Logging&lt;/strong&gt; prior to competitor implementations&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Microsoft has increased upstream contributions, primarily through Cluster API (CAPI) and Windows node support. AWS has historically maintained a more conservative upstream posture, prioritizing stability over feature velocity (CNCF, 2023).&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="3-gke-cloud-run-and-firebase-a-unified-cloud-native-ecosystem"&gt;3. GKE, Cloud Run, and Firebase: A Unified Cloud-Native Ecosystem
&lt;/h2&gt;&lt;p&gt;Google Cloud&amp;rsquo;s managed compute portfolio is designed around a principle of &lt;strong&gt;progressive abstraction&lt;/strong&gt;: choose the level of control appropriate to your workload requirements.&lt;/p&gt;
&lt;h3 id="platform-selection-framework"&gt;Platform Selection Framework
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Decision Criterion&lt;/th&gt;
 &lt;th&gt;GKE&lt;/th&gt;
 &lt;th&gt;Cloud Run&lt;/th&gt;
 &lt;th&gt;Firebase&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Use case complexity&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Complex microservices, stateful workloads, multi-tenant&lt;/td&gt;
 &lt;td&gt;Stateless services, event-driven, APIs&lt;/td&gt;
 &lt;td&gt;Mobile/web apps, real-time data, auth&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Operational model&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Full K8s control (or Autopilot)&lt;/td&gt;
 &lt;td&gt;Fully managed, no cluster management&lt;/td&gt;
 &lt;td&gt;Fully managed, no-ops backend&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Scaling model&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;HPA + VPA + Cluster Autoscaler&lt;/td&gt;
 &lt;td&gt;Scale to zero, automatic&lt;/td&gt;
 &lt;td&gt;Firebase-managed, automatic&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Hybrid/Multi-Cloud&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;✅ Yes — via Anthos/Fleet&lt;/td&gt;
 &lt;td&gt;⚠️ Limited (Cloud Run for Anthos)&lt;/td&gt;
 &lt;td&gt;❌ No&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;State management&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Stateful with PersistentVolumes&lt;/td&gt;
 &lt;td&gt;Stateless only&lt;/td&gt;
 &lt;td&gt;Firestore (document DB)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Primary audience&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Platform/SRE teams, enterprise architects&lt;/td&gt;
 &lt;td&gt;Backend developers, DevOps&lt;/td&gt;
 &lt;td&gt;Frontend/mobile developers&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Kubernetes required&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;✅ Yes&lt;/td&gt;
 &lt;td&gt;❌ No (Knative-based)&lt;/td&gt;
 &lt;td&gt;❌ No&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;em&gt;Sources: Google (2023a, 2023e, 2023f)&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="31-gke--full-orchestration-control"&gt;3.1 GKE — Full Orchestration Control
&lt;/h3&gt;&lt;p&gt;GKE is the appropriate choice for organizations managing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Complex microservices architectures&lt;/li&gt;
&lt;li&gt;Stateful distributed systems&lt;/li&gt;
&lt;li&gt;Hybrid cloud deployments&lt;/li&gt;
&lt;li&gt;Workloads requiring fine-grained control over scheduling, networking, and security policies&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It supports the full Kubernetes API, including CRDs, Admission Webhooks, and the complete ecosystem of CNCF-graduated tooling — Prometheus, Argo CD, Istio, Crossplane, and more.&lt;/p&gt;
&lt;p&gt;GKE integrates with &lt;strong&gt;Anthos&lt;/strong&gt; — Google&amp;rsquo;s multi-cloud and hybrid management platform — enabling consistent policy enforcement, workload management, and configuration synchronization across on-premises infrastructure and competing cloud providers (Google, 2022). This positions GKE as the strategic control plane for enterprises pursuing cloud-agnostic or multi-cloud architecture.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="32-cloud-run--serverless-container-simplicity"&gt;3.2 Cloud Run — Serverless Container Simplicity
&lt;/h3&gt;&lt;p&gt;Cloud Run is Google&amp;rsquo;s fully managed serverless container platform, built on &lt;strong&gt;Knative&lt;/strong&gt; — the open-source framework that Google co-developed with IBM and SAP (Google, 2023e).&lt;/p&gt;
&lt;p&gt;Designed for developers who require container portability without cluster management overhead, Cloud Run:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Automatically provisions infrastructure&lt;/li&gt;
&lt;li&gt;Scales to zero when idle; scales horizontally on traffic spikes&lt;/li&gt;
&lt;li&gt;Uses a per-request billing model that eliminates idle compute costs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It is ideally suited for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Stateless HTTP services&lt;/li&gt;
&lt;li&gt;Event-driven processing triggered by Pub/Sub or Cloud Scheduler&lt;/li&gt;
&lt;li&gt;API backends requiring rapid iteration cycles&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cloud Run for Anthos&lt;/strong&gt; enables serverless workloads to execute within existing GKE clusters, sharing network policies, service mesh, and node infrastructure — a hybrid model that preserves operational consistency while offering developer-friendly deployment abstractions (Google, 2023e).&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="33-firebase--serverless-backend-for-frontend-applications"&gt;3.3 Firebase — Serverless Backend for Frontend Applications
&lt;/h3&gt;&lt;p&gt;Firebase is Google&amp;rsquo;s application development platform optimized for mobile and web frontends requiring real-time data synchronization, user authentication, serverless function execution, and static site hosting (Google, 2023f).&lt;/p&gt;
&lt;p&gt;Its constituent services — Firestore, Firebase Authentication, Cloud Functions for Firebase, Firebase Hosting, and Firebase App Distribution — are integrated through a cohesive SDK that significantly reduces time-to-market for consumer-facing applications.&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; Firebase is &lt;strong&gt;not&lt;/strong&gt; a containerized or Kubernetes-adjacent platform. It is a backend-as-a-service (BaaS) targeted at application developers, not infrastructure engineers. It is not appropriate for complex microservices, containerized workloads, or enterprise systems requiring granular infrastructure control.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id="34-decision-summary"&gt;3.4 Decision Summary
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Is&lt;/span&gt; &lt;span class="n"&gt;your&lt;/span&gt; &lt;span class="n"&gt;workload&lt;/span&gt; &lt;span class="n"&gt;complex&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stateful&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;requiring&lt;/span&gt; &lt;span class="n"&gt;full&lt;/span&gt; &lt;span class="n"&gt;K8s&lt;/span&gt; &lt;span class="n"&gt;control&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="n"&gt;Yes&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="n"&gt;GKE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Is&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="n"&gt;stateless&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;driven&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;needing&lt;/span&gt; &lt;span class="n"&gt;scale&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;zero&lt;/span&gt; &lt;span class="n"&gt;simplicity&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="n"&gt;Yes&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="n"&gt;Cloud&lt;/span&gt; &lt;span class="n"&gt;Run&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Is&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;mobile&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;web&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="n"&gt;needing&lt;/span&gt; &lt;span class="n"&gt;real&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;rapid&lt;/span&gt; &lt;span class="n"&gt;development&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="n"&gt;Yes&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="n"&gt;Firebase&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Need&lt;/span&gt; &lt;span class="n"&gt;serverless&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;Kubernetes&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;same&lt;/span&gt; &lt;span class="n"&gt;cluster&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="n"&gt;Cloud&lt;/span&gt; &lt;span class="n"&gt;Run&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;Anthos&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GKE&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;Cloud&lt;/span&gt; &lt;span class="n"&gt;Run&lt;/span&gt; &lt;span class="n"&gt;hybrid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="4-strategic-conclusion-why-leading-organizations-choose-gke"&gt;4. Strategic Conclusion: Why Leading Organizations Choose GKE
&lt;/h2&gt;&lt;p&gt;The convergence of foundational heritage, engineering leadership, operational automation, and ecosystem depth places GKE in a category of its own. The strategic rationale distills into five pillars:&lt;/p&gt;
&lt;h3 id="41-inventorship-and-architectural-authority"&gt;4.1 Inventorship and Architectural Authority
&lt;/h3&gt;&lt;p&gt;Google invented Kubernetes and continues to drive its architectural evolution through sustained leadership of the CNCF&amp;rsquo;s SIG structure. This inventorship translates into a measurable technical advantage: GKE receives new Kubernetes capabilities earlier, with higher upstream alignment and lower deviation from the Kubernetes API specification than any competing managed platform (CNCF, 2023; Burns et al., 2016).&lt;/p&gt;
&lt;p&gt;For organizations investing in Kubernetes as a long-term infrastructure foundation, alignment with the platform&amp;rsquo;s inventor reduces future migration risk and maximizes the value of engineering skills investments.&lt;/p&gt;
&lt;h3 id="42-automation-that-eliminates-operational-toil"&gt;4.2 Automation That Eliminates Operational Toil
&lt;/h3&gt;&lt;p&gt;GKE Autopilot&amp;rsquo;s fully managed node lifecycle — encompassing provisioning, auto-repair, bin-packing optimization, and policy enforcement — directly reduces the operational toil that consumes platform engineering capacity in AKS and EKS environments.&lt;/p&gt;
&lt;p&gt;Google&amp;rsquo;s SRE literature defines toil as &lt;em&gt;&amp;ldquo;manual, repetitive, tactical work with no enduring value&amp;rdquo;&lt;/em&gt; (Beyer et al., 2016). GKE&amp;rsquo;s automation model operationalizes SRE principles at the platform level, allowing platform teams to redirect capacity from cluster maintenance toward value-generating application delivery.&lt;/p&gt;
&lt;h3 id="43-security-depth-without-third-party-dependency"&gt;4.3 Security Depth Without Third-Party Dependency
&lt;/h3&gt;&lt;p&gt;GKE&amp;rsquo;s native security architecture — Workload Identity, Binary Authorization, Shielded Nodes, and GKE Sandbox — provides a defense-in-depth posture that does not depend on optional add-on services or third-party integrations (Google, 2023c).&lt;/p&gt;
&lt;p&gt;This reduces the security operations surface, simplifies compliance attestation, and ensures that security controls are enforced uniformly across all workloads by the platform itself. For regulated industries — financial services, healthcare, government — this native security posture is a significant risk reduction factor.&lt;/p&gt;
&lt;h3 id="44-global-network-performance-as-infrastructure"&gt;4.4 Global Network Performance as Infrastructure
&lt;/h3&gt;&lt;p&gt;The performance advantages conferred by Google&amp;rsquo;s private global network are not configurable options or premium service tiers — they are &lt;strong&gt;structural properties&lt;/strong&gt; of GKE&amp;rsquo;s networking architecture. Container-Native Load Balancing, global Anycast routing, and low-latency interconnects between Google&amp;rsquo;s PoPs are inherent characteristics of any GKE deployment (Google, 2023d).&lt;/p&gt;
&lt;p&gt;For globally distributed applications with latency-sensitive transactional workloads, this network architecture represents a durable competitive advantage over regionally constrained alternatives.&lt;/p&gt;
&lt;h3 id="45-ecosystem-coherence-across-compute-abstractions"&gt;4.5 Ecosystem Coherence Across Compute Abstractions
&lt;/h3&gt;&lt;p&gt;GKE&amp;rsquo;s integration with Cloud Run and Firebase within the Google Cloud ecosystem enables organizations to adopt the right compute abstraction for each workload type without fragmenting their operational tooling, identity model, network security posture, or observability stack.&lt;/p&gt;
&lt;p&gt;Google Cloud&amp;rsquo;s unified IAM model, Cloud Monitoring, Cloud Logging, and Security Command Center apply consistently across GKE, Cloud Run, and Firebase deployments — a level of ecosystem coherence that is difficult to achieve when mixing managed Kubernetes from one vendor with serverless from another (Google, 2023a, 2023e, 2023f).&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="final-verdict"&gt;Final Verdict
&lt;/h2&gt;&lt;p&gt;GKE is not simply a Kubernetes service — it is &lt;strong&gt;the platform that Kubernetes was built to become.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://dantas.io/p/gke-is-the-choice-for-kubernetes-deployment/GK3-Superior.png"
	width="2752"
	height="1536"
	loading="lazy"
	
		alt="GKE superiority infographic comparing Google Kubernetes Engine with competitors. Timeline shows GKE launched in 2014 with 3-4 year head start over AWS EKS (2018) and Azure AKS (2017). Four colored sections highlight key advantages: Autopilot Mode eliminates manual node management through automated provisioning, scaling, and security; Native Defense-in-Depth includes GKE Sandbox and Binary Authorization built-in, while competitors require add-ons and manual configs; Global Private Fiber delivers sub-35ms latency via Google private backbone direct path, contrasting with competitors using public internet. Tone is assertive and technical, emphasizing Google’s foundational leadership in Kubernetes architecture and operational superiority over competing cloud providers."
	
 
	
		class="gallery-image" 
		data-flex-grow="179"
		data-flex-basis="430px"
	
&gt;&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Advantage&lt;/th&gt;
 &lt;th&gt;GKE Lead&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Kubernetes origin &amp;amp; SIG leadership&lt;/td&gt;
 &lt;td&gt;Structural — not replicable&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Autopilot / zero node management&lt;/td&gt;
 &lt;td&gt;3–4 year design advantage&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Native security stack&lt;/td&gt;
 &lt;td&gt;No equivalent in AKS/EKS/OKE&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Google private network backbone&lt;/td&gt;
 &lt;td&gt;Infrastructure-level, not configurable&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Ecosystem (GKE + Cloud Run + Firebase)&lt;/td&gt;
 &lt;td&gt;Unified IAM, logging, observability&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;For enterprise leaders evaluating managed Kubernetes platforms, the evidence is clear: &lt;strong&gt;GKE reduces operational overhead, accelerates modernization initiatives, and provides the most defensible long-term foundation for cloud-native architecture.&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;img src="https://dantas.io/p/gke-is-the-choice-for-kubernetes-deployment/GK3-Superior-2.png"
	width="2752"
	height="1536"
	loading="lazy"
	
		alt="GKE superiority infographic"
	
 
	
		class="gallery-image" 
		data-flex-grow="179"
		data-flex-basis="430px"
	
&gt;&lt;/p&gt;
&lt;h2 id="youtube"&gt;Youtube
&lt;/h2&gt;&lt;div class="video-wrapper"&gt;
 &lt;iframe loading="lazy" 
 src="https://www.youtube.com/embed/Tl-FYUOAa48" 
 allowfullscreen 
 title="YouTube Video"
 &gt;
 &lt;/iframe&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;div class="video-wrapper"&gt;
 &lt;iframe loading="lazy" 
 src="https://www.youtube.com/embed/heMmuIadYRg" 
 allowfullscreen 
 title="YouTube Video"
 &gt;
 &lt;/iframe&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;h2 id="references"&gt;References
&lt;/h2&gt;&lt;p&gt;Amazon Web Services. (2018). &lt;em&gt;Amazon Elastic Kubernetes Service (EKS)&lt;/em&gt;. &lt;a class="link" href="https://aws.amazon.com/eks/" target="_blank" rel="noopener"
 &gt;https://aws.amazon.com/eks/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Amazon Web Services. (2023). &lt;em&gt;Amazon EKS documentation&lt;/em&gt;. &lt;a class="link" href="https://docs.aws.amazon.com/eks/" target="_blank" rel="noopener"
 &gt;https://docs.aws.amazon.com/eks/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Beyer, B., Jones, C., Petoff, J., &amp;amp; Murphy, N. R. (2016). &lt;em&gt;Site reliability engineering: How Google runs production systems&lt;/em&gt;. O&amp;rsquo;Reilly Media.&lt;/p&gt;
&lt;p&gt;Burns, B., Grant, B., Oppenheimer, D., Brewer, E., &amp;amp; Wilkes, J. (2016). Borg, Omega, and Kubernetes. &lt;em&gt;ACM Queue&lt;/em&gt;, &lt;em&gt;14&lt;/em&gt;(1), 70–93. &lt;a class="link" href="https://doi.org/10.1145/2898442.2898444" target="_blank" rel="noopener"
 &gt;https://doi.org/10.1145/2898442.2898444&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Cloud Native Computing Foundation. (2016). &lt;em&gt;CNCF charter&lt;/em&gt;. &lt;a class="link" href="https://github.com/cncf/foundation/blob/main/charter.md" target="_blank" rel="noopener"
 &gt;https://github.com/cncf/foundation/blob/main/charter.md&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Cloud Native Computing Foundation. (2023). &lt;em&gt;Kubernetes contributor statistics&lt;/em&gt;. &lt;a class="link" href="https://k8s.devstats.cncf.io/" target="_blank" rel="noopener"
 &gt;https://k8s.devstats.cncf.io/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Google. (2014). &lt;em&gt;Google open sources Kubernetes&lt;/em&gt;. &lt;a class="link" href="https://opensource.googleblog.com/2014/06/an-update-on-container-support-on-google-cloud-platform.html" target="_blank" rel="noopener"
 &gt;https://opensource.googleblog.com/2014/06/an-update-on-container-support-on-google-cloud-platform.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Google. (2020). &lt;em&gt;GKE sandbox with gVisor&lt;/em&gt;. &lt;a class="link" href="https://cloud.google.com/kubernetes-engine/docs/concepts/sandbox-pods" target="_blank" rel="noopener"
 &gt;https://cloud.google.com/kubernetes-engine/docs/concepts/sandbox-pods&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Google. (2022). &lt;em&gt;Anthos overview&lt;/em&gt;. &lt;a class="link" href="https://cloud.google.com/anthos/docs/concepts/overview" target="_blank" rel="noopener"
 &gt;https://cloud.google.com/anthos/docs/concepts/overview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Google. (2023a). &lt;em&gt;GKE Autopilot overview&lt;/em&gt;. &lt;a class="link" href="https://cloud.google.com/kubernetes-engine/docs/concepts/autopilot-overview" target="_blank" rel="noopener"
 &gt;https://cloud.google.com/kubernetes-engine/docs/concepts/autopilot-overview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Google. (2023b). &lt;em&gt;Cluster autoscaler and VPA in GKE&lt;/em&gt;. &lt;a class="link" href="https://cloud.google.com/kubernetes-engine/docs/concepts/cluster-autoscaler" target="_blank" rel="noopener"
 &gt;https://cloud.google.com/kubernetes-engine/docs/concepts/cluster-autoscaler&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Google. (2023c). &lt;em&gt;GKE security overview&lt;/em&gt;. &lt;a class="link" href="https://cloud.google.com/kubernetes-engine/docs/concepts/security-overview" target="_blank" rel="noopener"
 &gt;https://cloud.google.com/kubernetes-engine/docs/concepts/security-overview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Google. (2023d). &lt;em&gt;GKE networking overview&lt;/em&gt;. &lt;a class="link" href="https://cloud.google.com/kubernetes-engine/docs/concepts/network-overview" target="_blank" rel="noopener"
 &gt;https://cloud.google.com/kubernetes-engine/docs/concepts/network-overview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Google. (2023e). &lt;em&gt;Cloud Run documentation&lt;/em&gt;. &lt;a class="link" href="https://cloud.google.com/run/docs" target="_blank" rel="noopener"
 &gt;https://cloud.google.com/run/docs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Google. (2023f). &lt;em&gt;Firebase documentation&lt;/em&gt;. &lt;a class="link" href="https://firebase.google.com/docs" target="_blank" rel="noopener"
 &gt;https://firebase.google.com/docs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Microsoft Azure. (2017). &lt;em&gt;Azure Kubernetes Service (AKS)&lt;/em&gt;. &lt;a class="link" href="https://azure.microsoft.com/en-us/products/kubernetes-service" target="_blank" rel="noopener"
 &gt;https://azure.microsoft.com/en-us/products/kubernetes-service&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Microsoft. (2023). &lt;em&gt;AKS documentation&lt;/em&gt;. &lt;a class="link" href="https://learn.microsoft.com/en-us/azure/aks/" target="_blank" rel="noopener"
 &gt;https://learn.microsoft.com/en-us/azure/aks/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Oracle. (2023). &lt;em&gt;Oracle Container Engine for Kubernetes (OKE) documentation&lt;/em&gt;. &lt;a class="link" href="https://docs.oracle.com/en-us/iaas/Content/ContEng/home.htm" target="_blank" rel="noopener"
 &gt;https://docs.oracle.com/en-us/iaas/Content/ContEng/home.htm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Schwarzkopf, M., Konwinski, A., Abd-El-Malek, M., &amp;amp; Wilkes, J. (2013). Omega: Flexible, scalable schedulers for large compute clusters. &lt;em&gt;Proceedings of the 8th ACM European Conference on Computer Systems (EuroSys &amp;lsquo;13)&lt;/em&gt;, 351–364. &lt;a class="link" href="https://doi.org/10.1145/2465351.2465386" target="_blank" rel="noopener"
 &gt;https://doi.org/10.1145/2465351.2465386&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Verma, A., Pedrosa, L., Korupolu, M., Oppenheimer, D., Tune, E., &amp;amp; Wilkes, J. (2015). Large-scale cluster management at Google with Borg. &lt;em&gt;Proceedings of the Tenth European Conference on Computer Systems (EuroSys &amp;lsquo;15)&lt;/em&gt;. &lt;a class="link" href="https://doi.org/10.1145/2741948.2741964" target="_blank" rel="noopener"
 &gt;https://doi.org/10.1145/2741948.2741964&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Published under technical editorial review. All architectural claims reference official vendor documentation and peer-reviewed academic sources per APA 7th Edition.&lt;/em&gt;&lt;/p&gt;</description></item></channel></rss>