GCP GKE: From VPC to Enterprise Workflow
Build the cloud foundation beneath Kubernetes, then prove which Google Cloud and Kubernetes objects serve one the enterprise AI workflow platform request.
The enterprise problem and today’s slice
Enterprise problem: the enterprise AI workflow platform's workflow-platform can be healthy as a container yet remain unreachable or unsafe when its Google Cloud project, virtual network, GKE cluster, workload identity, or load balancer is wrong, leaving customers with timeouts and operators with an unclear owner. Whole-course context: Earlier Kubernetes days established that pod memory ends in physical RAM; today consumes that hardware-to-pod model and places it inside Google Cloud Platform (GCP), where Google Kubernetes Engine (GKE) manages Kubernetes while Compute Engine virtual machines supply worker hardware. Today’s slice: We create the network-to-runtime path for one production-shaped the enterprise AI workflow platform deployment and keep cloud IAM authority separate from Kubernetes authorization. End-of-day evidence: A reviewer can trace a public request to a named Service, pod, node VM, subnet, and GKE control plane, with command output and immutable deployment revision. Still unsolved: Multi-cloud equivalence, Terraform ownership, GitOps reconciliation, global failover, and production spend approval remain later decisions.
Customer use cases
A cloud cluster is not a customer outcome, so creating one without a request path can spend money while the enterprise AI workflow platform still returns no page. These use cases bind infrastructure creation to visible service and denial evidence.
| Use case ID | Actor | Customer job | Success outcome | Denial or recovery evidence |
|---|---|---|---|---|
| D62-UC-01 | platform engineer | Provision a bounded GKE foundation and publish the workflow-platform | A reader receives the expected revision through a Google Cloud load balancer and healthy GKE pods | A missing route, quota, IAM permission, or readiness signal blocks rollout with a named event and leaves the previous endpoint healthy |
| D62-UC-02 | the enterprise AI workflow platform security reviewer | Verify that the workflow-platform reaches only approved Google APIs with workload identity | The pod uses a Kubernetes ServiceAccount mapped by policy, without a downloaded service-account key | An unbound pod receives an authorization denial while the approved pod and public read path remain healthy |
Actor-centred user stories
Cloud defaults can hide consequential choices, so each actor needs acceptance conditions spanning both Google Cloud and Kubernetes. These stories demand positive and negative observations rather than a green console icon.
| Story ID | Use case IDs | User story | Observable acceptance conditions |
|---|---|---|---|
| D62-US-01 | D62-UC-01 | As a platform engineer, I want a VPC-native GKE cluster and repeatable deployment, so that readers reach the intended workflow-platform revision on schedulable nodes | Cluster, node, Service, EndpointSlice, pod revision, HTTP response, environment, timestamp, and run ID are captured; an unready revision receives no production traffic |
| D62-US-02 | D62-UC-02 | As an enterprise AI workflow platform security reviewer, I want workload-scoped Google API authority, so that compromising the workflow-platform pod does not inherit broad node credentials | Approved identity call succeeds, unbound ServiceAccount call is denied, no key file exists, and both observations record actor, resource, scope, precondition, environment, time, and trace ID |
End-to-end product flows
A deployment can fail at any boundary between a browser and a process, so the flow must preserve the ownership of every hop. It starts with a customer-visible publish action and ends with request and denial evidence.
| Flow ID | Use case IDs | Path | Trigger | Numbered steps | Terminal evidence |
|---|---|---|---|---|---|
| D62-FLOW-01 | D62-UC-01 | Happy | Platform engineer approves the enterprise AI workflow platform release | 1. Create or select the Google Cloud project and VPC subnet. 2. Create a regional GKE cluster and node pool. 3. Obtain cluster credentials. 4. Apply the enterprise AI workflow platform Deployment and Service. 5. GKE schedules pods onto Compute Engine VMs. 6. Cloud Load Balancing forwards a reader request to a ready pod. 7. Record the served revision. | Actor, project, cluster, namespace, image digest, Service address, HTTP result, environment, timestamp, and immutable rollout/run ID |
| D62-FLOW-02 | D62-UC-02 | Denied | Reviewer starts a probe pod with an unapproved ServiceAccount | 1. Request a Google API token from the GKE metadata service. 2. IAM evaluates the workload principal and resource policy. 3. Deny the unbound principal. 4. Repeat with the approved the enterprise AI workflow platform ServiceAccount. 5. Confirm the public workflow-platform remains healthy. | Denied principal and API scope, approved positive-control result, endpoint probe, environment, timestamp, and immutable audit/trace ID |
System design derived from the flows
GKE does not erase the hardware layers beneath Kubernetes; it assigns management responsibility for some of them. In GKE Standard, Google manages the control plane while the customer manages node configuration, and worker nodes are Compute Engine VMs; in Autopilot, GKE also manages the underlying node infrastructure (GKE cluster architecture).
| Use case ID | Entry point | Responsible services | Authoritative store | Failure evidence |
|---|---|---|---|---|
| D62-UC-01 | Approved release plus reader URL | Google Cloud Resource Manager, VPC, GKE control plane, Compute Engine node pool, Kubernetes Deployment/Service controllers, Cloud Load Balancing | Google Cloud resource APIs for project/network/cluster; Kubernetes API store for workload desired and observed state | Cloud API denial or quota error, unschedulable pod, failed readiness, absent EndpointSlice, load-balancer error, or wrong served digest |
| D62-UC-02 | Workload identity probe | GKE metadata server, Kubernetes ServiceAccount, Workload Identity Federation for GKE, Google Cloud IAM and target API | Kubernetes API for ServiceAccount; Google Cloud IAM policy and audit log for external API authority | Token or API PERMISSION_DENIED for unbound principal, unexpectedly broad success, key file present, or absent audit record |
GKE VPC-native clusters use alias IP ranges so pod addresses are natively routable in the VPC, and this is the default network mode for new clusters (VPC-native clusters). Workload Identity Federation for GKE lets a Kubernetes workload receive narrowly scoped Google API access without distributing service-account key files (GKE workload identity).
Data model and ownership
Cloud and cluster records must not be collapsed into one “deployment” row because each has a different authority and deletion path. The generated workflow-platform stores content elsewhere; this slice needs infrastructure, workload, and evidence state only.
Generated-application database: Not created in this slice — the enterprise AI workflow platform workflow-platform serves an immutable image while Google Cloud resource state, Kubernetes API state, and deployment evidence are sufficient for the network-to-process proof.
| Record or entity | Store and owner | Primary key | Foreign key or opaque reference | Tenant key | Material constraint | Lifecycle and deletion | Use case IDs |
|---|---|---|---|---|---|---|---|
| GkeFoundation | Google Cloud resource APIs, owned by platform engineering | Project ID plus cluster resource name | VPC/subnet and node-pool resource names | Google Cloud project ID | Pod, Service, node, and control-plane CIDRs must not overlap; region and release policy are reviewed before creation | Created before workloads; upgraded in place where supported; cluster deletion removes cluster-owned compute but not unrelated project resources | D62-UC-01 |
| WorkloadRevision | Kubernetes API store, owned by Deployment controller and the enterprise AI workflow platform team | Deployment UID plus revision | Opaque image digest and cluster resource name | Namespace | Only ready pods matching the selector enter Service endpoints; image is digest-pinned | Created by apply, retained in rollout history, rolled back or deleted with namespace policy | D62-UC-01 |
| WorkloadAuthorityBinding | Kubernetes API plus Google Cloud IAM policy, jointly owned by platform security | Kubernetes ServiceAccount UID plus IAM policy etag | Opaque Google workload-principal URI and target resource name | Namespace and Google Cloud project ID | Mapping grants only named resource/actions; node identity does not imply workload identity | Created after review, independently revoked in IAM or Kubernetes, audit retained by policy | D62-UC-02 |
| DeploymentProof | CI artifact store and cloud audit logs, owned by release engineering | Run ID | Opaque cluster, revision, request trace, and IAM audit IDs | Environment | Positive and negative observations must use the same reviewed revision and environment | Appended per release, retained immutably, expired by audit policy | D62-UC-01, D62-UC-02 |
Build the foundation one block at a time
Creating Kubernetes objects before planning address space can force a cluster rebuild or cause unreachable pods. Expand the three-box model in dependency order: project and IAM, then network, then managed control plane and worker compute, then workload and ingress.
Use a regional cluster for production-shaped availability because its control plane is replicated across zones; Google’s GKE guidance recommends regional clusters for production workloads (cluster creation guidance). The lab values below are illustrative: a real team must allocate non-overlapping CIDRs, quota, IAM, and spend before applying them.
gcloud services enable container.googleapis.com compute.googleapis.com
gcloud container clusters create enterprise-workflow-prod \
--region=europe-west2 \
--release-channel=regular \
--enable-ip-alias \
--workload-pool="${GOOGLE_CLOUD_PROJECT}.svc.id.goog" \
--machine-type=e2-standard-4 \
--num-nodes=1
gcloud container clusters get-credentials enterprise-workflow-prod --region=europe-west2
kubectl apply -f k8s/enterprise-workflow.yaml
kubectl rollout status deployment/enterprise-workflow -n workflow-platform
kubectl get service,pods,endpointslices -n workflow-platform -o wide
Deploy the enterprise AI workflow platform and expose only ready replicas
A running process is not automatically a safe backend, so traffic must depend on readiness rather than container existence. This manifest creates Kubernetes software objects; the GKE cloud integration then allocates external load-balancing infrastructure, while the scheduler and kubelet place and run the image on node hardware.
apiVersion: apps/v1
kind: Deployment
metadata:
name: enterprise-workflow
namespace: workflow-platform
spec:
replicas: 2
selector:
matchLabels:
app: enterprise-workflow
template:
metadata:
labels:
app: enterprise-workflow
spec:
serviceAccountName: enterprise-workflow
containers:
- name: workflow-platform
image: europe-west2-docker.pkg.dev/enterprise-workflow-prod/workflow-platform/site@sha256:REPLACE_ME
ports:
- containerPort: 3000
resources:
requests:
cpu: 250m
memory: 256Mi
limits:
memory: 512Mi
readinessProbe:
httpGet:
path: /healthz
port: 3000
---
apiVersion: v1
kind: Service
metadata:
name: enterprise-workflow
namespace: workflow-platform
spec:
type: LoadBalancer
selector:
app: enterprise-workflow
ports:
- port: 80
targetPort: 3000
Code versus physical and software effects
Commands are requests to control planes, not magic instructions to chips, so operators must know which effects are direct and which are eventual. The table maps each line to the durable state, software reconciliation, physical allocation, and customer outcome it can cause.
| Code or declaration | Control-plane state | Software effect | Hardware or network effect | Deployment outcome |
|---|---|---|---|---|
gcloud services enable ... | Enables project APIs | Google API endpoints accept authorized resource requests | No VM or pod exists yet | Cluster creation becomes possible |
gcloud container clusters create | Creates GKE cluster and node-pool resources | Managed control plane starts; kubelets register nodes | Compute Engine VMs reserve vCPU, DRAM, disk, NICs, and IPs on Google hardware | Scheduler gains allocatable nodes |
kubectl apply -f k8s/enterprise-workflow.yaml | Stores Deployment and Service desired state | Controllers create ReplicaSet, pods, EndpointSlices, and load-balancer configuration | Containers consume node CPU/RAM; cloud networking allocates forwarding resources | Ready image revision becomes reachable |
requests.memory: 256Mi | Stores a scheduling reservation | Scheduler admits each pod only where 256 MiB fits | Does not install RAM or pre-allocate a contiguous block | Prevents placement on an over-reserved node |
limits.memory: 512Mi | Stores a runtime ceiling | Container runtime configures a Linux cgroup limit | Adds no node memory; kernel can kill a process that crosses the ceiling | Bounds one container, potentially producing OOMKilled |
kubectl rollout status | Reads observed rollout conditions | Watches controller progress | Allocates no resources | Proves readiness, not end-user reachability |
Failure modes and decision rules
A single timeout does not identify the failed layer, so guessing can replace healthy nodes while a selector remains wrong. Move from outside inward and change the narrowest owner whose evidence fails.
| Observation | Interpretation | Decision |
|---|---|---|
| Cloud API returns IAM or quota denial | Foundation creation never reached Kubernetes | Correct the reviewed project permission or quota; do not edit pod YAML |
Pod is Pending with Insufficient memory | Existing node allocatable budgets cannot satisfy requests | Add/resize compatible node capacity or justify a smaller request |
| Pods are Ready but Service has no endpoints | Labels/selectors or readiness association is wrong | Repair Kubernetes desired state; do not resize VMs |
| Service has endpoints but external probe fails | Load balancer, firewall, routing, or application response path failed | Trace forwarding rule to pod and compare internal versus external probe |
| Workload can call every Google API | Identity scope is broader than intended | Revoke broad binding and grant resource-specific IAM to the workload principal |
Decision rule: use GKE when the organisation wants Kubernetes semantics while delegating control-plane operations to Google; choose Standard when node-level choices are required, and evaluate Autopilot when delegating node infrastructure is worth its constraints. Use self-managed Kubernetes only when the control-plane or host-level control justifies owning upgrades, availability, security, and repair.
Key takeaways
A managed Kubernetes cluster is still a stack from physical machines through cloud resources to Kubernetes objects and application processes. GKE changes who operates layers; it does not remove those layers.
- A reader reaches the enterprise AI workflow platform through cloud networking, Kubernetes service discovery, a ready pod, and a process consuming node hardware.
- Google Cloud IAM, Kubernetes RBAC, and application authorization are independent boundaries.
- GKE Standard delegates the control plane; Autopilot delegates more of the node infrastructure.
- A code line should be reviewed for control-plane, software, hardware, and customer-visible effects.
Checklist
A production-shaped lab is only complete when it proves placement, reachability, identity denial, and cleanup ownership. Record these checks beside the immutable deployment revision.
- [ ] Named project, region, VPC/subnet, cluster mode, release channel, and non-overlapping IP ranges
- [ ] Captured node VM identity, allocatable CPU/memory, pod placement, and image digest
- [ ] Proved Service endpoints and external HTTP response from the intended revision
- [ ] Proved approved Google API authority and an unapproved ServiceAccount denial
- [ ] Documented spend owner and safe deletion order before provisioning
Primary references
GKE separates its control plane from node and workload execution; review the provider model in the GKE cluster architecture documentation. Service-account authority is independently scoped and revocable; see Kubernetes ServiceAccounts.