$ kubectl get all -A

Cloud Backend

What is it?

One example backend where common cloud, DevOps and security tools each have a single job: code reaches two clouds through Git only, infrastructure changes go through reviewed pull requests, the website sits behind Cloudflare, every log lands in one S3 archive, people sign in once and reach production through audited doors, no cloud access key lives longer than a few hours, and clusters run only images that CI signed.

// git push --> production

The architecture

Five flows share the platform: shipping an app, changing the infrastructure, serving the website, collecting logs and detecting threats, and operating it. The diagrams after this one zoom in on traffic, logs, identity and secrets, and the supply chain; the page ends with the Kubernetes vocabulary.

Overview of the example cloud backend across AWS and AzureAt the top, an engineer's laptop with Docker, Vagrant and an EDR agent, and Azure DevOps with the infra, app and gitops repos and Boards. Below, Ansible, Atlantis with Terraform, Jenkins with Podman, JFrog Artifactory and Argo CD with Helm, and Entra ID for every login. Visitors reach Cloudflare, which forwards to Envoy Gateway in the website's EKS cluster. In AWS and Azure: VMs, the ECR and ACR registries, the secret stores and signing keys, the app clusters, the website cluster, and add-ons in every cluster: Prometheus, the Datadog Agent, the OpenTelemetry Collector, the EDR sensor, the Teleport agent, Kyverno and the External Secrets Operator. The Collector and the VMs' syslog feed an S3 log archive, read by Splunk and by Datadog. Wiz scans both clouds, the EDR console receives sensor telemetry, and both report to Splunk. Datadog pages the on-call engineer, who reaches internal tools through OpenVPN and production through Teleport.Engineer's laptopEDR agentAzure DevOps: Repos and Boards / GitHubAWS and AzureEKS / AKS: appsEKS: website (AWS)In every cluster:PrometheusDatadog AgentOTel CollectorEDR sensorTeleport agentKyvernoExternal SecretsDockerbuild, run imagesPodman works tooVagrantlocal VMs to testAnsible rolesinfra repoTerraform modules,atlantis.yamlapp repocode, Dockerfile,Helm chartgitops repoHelm values foreach environmentBoardswork items, linkedto commits and PRsAnsibleconfigures the VMs over SSH,inventory from cloud APIsAtlantisplan and Conftest on every PR,apply once approvedTerraformJenkins / Azure Pipelinestests, scans, signs the image,pushes it, bumps the tagPodmanJFrogArtifactory: Helm charts,proxies npm, PyPI, Maven;Curation blocks bad onesEntra IDone login for people:SSO into clouds and toolsArgo CDcompares Git with clusters,syncs every differenceHelmVisitorsbrowsers loadingthe public websiteCloudflareDNS, CDN, WAF,DDoS protectionVMsEC2 / Azure VMs:Jenkins controller, agents,OpenVPN server,Teleport SSH service;EDR sensor, syslog outRegistryECR / ACR:container imagesSecrets and keysSecrets Manager, Key Vault;KMS keys that sign imagesAppsHelm releases, one perservice; they emit OTLPEnvoy GatewayGateway API ingress;access logs, tracesWebsitethe site'spodsS3 log archiveevery log, in one placeDatadog / Prometheusdashboards, APM, monitorsfor apps, Argo CD, JFrogWizreads both clouds by API,scans disk snapshotsSIEMindexes the S3 archive,correlates EDR and WizEDR consoledetections from laptops,VMs and cluster nodesOn-call engineerlaptop with EDR agent;gets paged, logs inOpenVPN / Client VPNVPN to private subnets:Jenkins, Argo CD UIsTeleportSSO, short-lived certs,kubectl and ssh, audit loggit push1webhook2push image3bump image tag4watches5syncs every cluster6pull image7synced as SecretsPR webhook8terraform apply9playbooks over SSH10test on Vagrant first11mTLS to origin1213syslog14SQS-based S3 input15Datadog Forwarder16agentless scans17telemetry18pages on-call19into the VPCs20tsh login with SSO21kubectl22app deliveryinfrastructurewebsite trafficlogs and securityoperations and accesslocal testing
The cloud box is drawn once: AWS and Azure each run the same pieces, named AWS / Azure; the website cluster and the log archive live in AWS only. Argo CD, Atlantis and Jenkins are drawn apart from the clusters but often run inside one.

Ship an app

  1. 1

    Push. An engineer builds and runs the image locally with Docker, pushes a branch to the app repo in Azure Repos and opens a pull request. Branch policies require a review and a green build before anything merges, and push protection rejects any push that contains a detected secret.

  2. 2

    Trigger CI. An Azure DevOps service hook starts a Jenkins pipeline on every push.

  3. 3

    Build and publish. Jenkins agents build the image with Podman, rootless and without a daemon, run the tests, scan the image with Trivy, sign it with Cosign, push it to ECR and ACR, and publish the Helm chart to JFrog Artifactory. Builds fetch their npm, PyPI and Maven dependencies through Artifactory's remote repositories, a cached proxy of the public registries that JFrog Curation filters. The supply chain section below shows each gate.

  4. 4

    Bump the tag. After a merge to main, Jenkins commits the new image tag to the Helm values in the gitops repo. Nobody deploys by hand: a deployment is a commit.

  5. 5

    Detect. Argo CD polls the gitops repo, every three minutes by default, or gets a webhook, and compares what Git describes with what runs in each cluster.

  6. 6

    Sync. Argo CD pulls the chart from Artifactory, renders it with the values from the gitops repo and applies it to every cluster: the app clusters on EKS and AKS, and the website's own EKS cluster. The same mechanism installs the add-ons each cluster runs: Prometheus, the Datadog Agent, the OpenTelemetry Collector, the EDR sensor, the Teleport agent, Kyverno and the External Secrets Operator. Kyverno admits a pod only if its image carries a valid signature.

  7. 7

    Pull. Each cluster pulls the image from the registry of its own cloud. The External Secrets Operator copies the app's passwords and API keys from Secrets Manager or Key Vault into Kubernetes Secrets, so they never sit in Git.

Change the infrastructure

  1. 8

    Plan. Infrastructure changes are pull requests to the infra repo. Atlantis receives the webhook, runs terraform plan, checks the plan against Conftest policies and posts both results as comments on the PR.

  2. 9

    Apply. Once the PR is approved, commenting atlantis apply runs terraform apply: networks, identities, clusters, registries, VMs and the S3 log archive. The Terraform state lives in S3 or Azure Blob Storage, with locking, so two applies never race.

  3. 10

    Configure. Ansible configures what is not in Kubernetes: the VMs for the Jenkins controller and agents, the OpenVPN server and the Teleport SSH service, including their EDR sensor and syslog forwarding. Its inventory plugins list the VMs from the AWS and Azure APIs, and its roles are first tested on the laptop, on Vagrant VMs, through Vagrant's Ansible provisioner.

Serve the website

  1. 11

    Visit. Visitors resolve the website through Cloudflare DNS and reach Cloudflare's edge, which caches static content, filters requests through its WAF and absorbs DDoS attacks.

  2. 12

    Origin. Cloudflare forwards the remaining requests to an AWS Network Load Balancer in front of Envoy Gateway, the Kubernetes Gateway API implementation built on Envoy, in the website's EKS cluster. Envoy accepts only Cloudflare's client certificate (authenticated origin pulls) and routes each request to the website pods.

Collect logs, detect threats

  1. 13

    Collect. Apps and Envoy send traces, metrics and logs in OTLP, OpenTelemetry's protocol, to the Collector in their cluster. The Collector writes logs to the S3 archive, metrics to Prometheus, and traces and metrics to Datadog.

  2. 14

    Archive. VMs and the OpenVPN server send syslog over the private network, through an internal load balancer, to the Collector's syslog receiver, which archives it in S3 too. Cloudflare writes its logs to the same archive with Logpush, and AWS writes CloudTrail and VPC flow logs there.

  3. 15

    Index. Splunk, the SIEM, reads the archive through the AWS add-on's SQS-based S3 input: S3 announces each new object on a queue, and Splunk fetches and indexes it.

  4. 16

    Analyse. The Datadog Forwarder, a Lambda function triggered by new objects, ships the same logs into Datadog, next to the metrics and traces. Datadog also watches Argo CD through its Agent check, and JFrog Artifactory Cloud through its integration.

  5. 17

    Scan. Wiz connects to both clouds with read-only roles, plus permission to snapshot disks, and scans those snapshots instead of running agents, then reports misconfigurations and vulnerabilities. Its findings reach Splunk through the Wiz add-on.

  6. 18

    Detect. The EDR sensor on laptops, VMs and cluster nodes streams process, file and network events to the EDR console, which detects attacks and can isolate a machine. Its detections are forwarded to Splunk, where they meet the cloud logs.

Operate

  1. 19

    Page. Datadog monitors page the on-call engineer, and so does Alertmanager for the Prometheus rules. Splunk alerts go to the security team.

  2. 20

    VPN. The internal UIs of Jenkins, Argo CD and Atlantis are not open to the internet: the engineer reaches them with OpenVPN, through the server in each cloud's network. Only the webhook endpoints that Azure DevOps calls are exposed, limited to its IP ranges.

  3. 21

    Log in. For production, the engineer runs tsh login, signs in through Entra ID and gets short-lived certificates instead of long-lived SSH keys or kubeconfigs.

  4. 22

    Access. Teleport's proxy forwards kubectl to the agent in each cluster and ssh to the VMs. Agents dial out to the proxy through reverse tunnels, so clusters and VMs need no open inbound port, and every session is recorded.

// who gets in, and how

Traffic and access

Three doors, one per audience. Visitors only ever reach Cloudflare; engineers use OpenVPN for internal tools and Teleport for production, so nothing else listens on the internet.

Three ways in: the public website, internal tools and productionPublic: visitors reach Cloudflare, which forwards through an AWS network load balancer to Envoy Gateway, which routes to the website pods. Internal tools: an engineer's laptop opens an OpenVPN tunnel to the OpenVPN server in the cloud network, which reaches the internal UIs of Jenkins, Argo CD and Atlantis. Production: the engineer logs in to the Teleport proxy, which reaches Teleport agents over reverse tunnels, which give kubectl access to the clusters and ssh access to the VMs.Publicthe websiteVisitorsbrowsers, fromanywhereCloudflareDNS, CDN cache, WAF,DDoS; Logpush to S3Envoy Gatewaybehind an AWS NLB;accepts Cloudflare onlyWebsite podsEKS website cluster;OTLP to the CollectorInternal toolsOpenVPNEngineer's laptopEDR agent,OpenVPN clientOpenVPN tunnelencrypted, UDP 1194,per-user certificateOpenVPN serveron a VM in eachcloud's VPC / VNetInternal UIsJenkins, Argo CD, Atlantis:UIs only on the VPNProductionTeleportEngineer's laptoptsh login,SSO in the browserTeleport proxyshort-lived certificates,records every sessionTeleport agentsdial out: reversetunnels, no open portClusters and VMskubectl to EKS / AKS,ssh to the VMs
Sources: authenticated origin pulls, AWS NLB, Envoy Gateway, OpenVPN, AWS Client VPN (OpenVPN-based), Teleport agents.

// everything lands in S3

Logs, metrics and security

Logs go to one S3 archive first, and the monitoring tools read from it, so no tool owns the only copy and a new tool can replay history. Metrics and traces go straight to the tools that graph them, and security findings to the SIEM.

Where logs, metrics and security findings goFour columns: sources, collect, store and use. Argo CD and JFrog report to Datadog through its integrations. Apps and Envoy send OTLP, and VMs and the OpenVPN server send syslog, to the OpenTelemetry Collector, which sends metrics to Prometheus, traces and metrics to Datadog, and logs to the S3 log archive. Cloudflare writes to S3 with Logpush, and AWS writes CloudTrail and VPC flow logs there. Datadog and Splunk both read the archive. EDR sensors on laptops, VMs and nodes report to the EDR console, and Wiz scans the cloud accounts; both send their findings to Splunk.SOURCESCOLLECTSTOREUSEArgo CD, JFrogmetrics and logsApps, EnvoyOTLP: traces, metrics, logsVMs, OpenVPNsyslog (RFC 5424)CloudflareHTTP, WAF and DNS logsCloudTrail, flow logswritten to S3 by AWSLaptops, VMs, nodesEDR sensorsCloud accountsAPIs, disk snapshotsOTel Collectorreceivers: OTLP, syslogexporters: S3,Prometheus, DatadogEDR consoledetects, isolates a hostWizagentless: read roles, snapshotsPrometheusAlertmanager pagesS3 log archiveone prefix per source,Object Lock: write once,lifecycle to GlacierDatadogmetrics and traces from the Collector,logs from S3 through the Forwarder,Argo CD and JFrog throughtheir integrations;dashboards, APM, monitorsthat page on-callSIEMindexes the S3 archive throughan SQS-based S3 input,correlates EDR and Wiz findings;alerts go to the security teamDatadog integrationstraces, metrics (OTLP)Logpushwritten by AWSdetectionsfindingslogsmetrics and tracessecurity events and findings
Azure's logs reach the same archive through the Collector. Sources: OTLP, syslog receiver, S3 exporter, Datadog exporter, Envoy OpenTelemetry tracer, Logpush to S3, CloudTrail, S3 Object Lock, S3 lifecycle, Splunk SQS-based S3 input, Datadog Forwarder, Datadog for Argo CD, Datadog for JFrog Cloud, agentless scanning, Wiz Add-on for Splunk.

// no long-lived keys

Identity and secrets

People sign in once, through Entra ID, and machines never use a stored cloud key: every credential is issued on demand and expires within hours, so a copied file or a leaked log line stops working by itself. Leaving someone's Entra group removes their access everywhere within hours.

How people, pods and pipelines get credentialsPeople: an engineer signs in to Entra ID with MFA, which hands out short-lived access through IAM Identity Center, az login and Teleport certificates to the clouds and clusters; Azure DevOps, Argo CD, Jenkins, JFrog, Datadog, Splunk and Wiz use the same Entra ID login. Workloads: the External Secrets Operator reads Secrets Manager and Key Vault with EKS Pod Identity or AKS Workload ID and writes Kubernetes Secrets that the app pods read. Pipelines: Jenkins and Atlantis run on VMs whose instance profile or managed identity yields short-lived tokens for the cloud APIs.PeopleengineersEngineer's laptopone account with MFA,no cloud keys on diskEntra IDMFA, Conditional Access;groups decide rolesShort-lived accessIAM Identity Center, az login,Teleport certificatesClouds, clustersconsoles and APIs,kubectl and sshWorkloadsapp podsSecret storesSecrets Manager (AWS),Key Vault (Azure)External Secretssigns in with EKS PodIdentity or AKS Workload IDKubernetes Secretcreated and refreshedby the operatorApp podreads it as a file or env;the value is never in GitPipelinesCI and TerraformJenkins, Atlantisrun on cloud VMs,store no cloud keysVM identityEC2 instance profile,Azure managed identityShort-lived tokensfrom AWS STS or Entra ID,renewed automaticallyCloud APIspush to ECR / ACR, KMS sign,terraform applySame Entra ID login:Azure DevOpsArgo CDJenkinsJFrogDatadogSplunkWiz
Teleport needs its Enterprise edition to sign in through Entra ID; the Community Edition only offers GitHub. Pods that call cloud APIs themselves, such as an app writing to S3, use the same pod identity without going through a Secret. Sources: Entra ID with IAM Identity Center, Teleport with Entra ID, Argo CD with Entra ID, Jenkins Entra ID plugin, External Secrets for AWS, and for Key Vault, EKS Pod Identity, AKS Workload ID, EC2 instance roles, Azure managed identities.

// only signed images run

Supply chain

Every change passes a row of gates, and any gate can stop it: a secret never lands in Git, a risky package never enters the cache, and a cluster runs only images that CI signed. Infrastructure has its own gates, and Wiz checks afterwards for what got through or was changed by hand.

Gates between a commit and productionApps: push protection in Azure Repos rejects secrets, JFrog Curation blocks risky packages, Trivy scans the image and writes its SBOM, Cosign signs image and SBOM with a KMS key, and Kyverno admits only images signed by that key. Infrastructure: an infra pull request, Atlantis runs terraform plan, Conftest checks the plan against Rego rules, Terraform applies after review, and Wiz finds what slipped by or was changed by hand.Appscommit to podPush protectionrejects pushesthat contain secretsCurationblocks risky packagesbefore they are cachedTrivyscans the image,writes its SBOMCosignsigns image and SBOMwith a KMS keyKyvernoadmits only imagessigned by that keyInfrastructurePR to cloudinfra PRa Terraform change,push protection tooAtlantisruns terraform plan,posts it on the PRConftestRego rules on the plan:encryption, no public S3Terraformapplies after reviewand passing policiesWizfinds what slipped byor was changed by hand
Xray still scans what Artifactory stores, Helm charts included; its download blocking for remote repositories moves to Curation during 2026. Sources: push protection in Azure Repos, JFrog Curation, Xray policies, Trivy SBOM, Cosign with KMS, SBOM attestations, Kyverno image verification, Atlantis policy checks, Conftest.

// one job each

Who does what

ToolJob in this modelTalks to
AnsibleConfigures the VMs that are not in Kubernetes.VMs, Vagrant
Argo CDCD: keeps every cluster equal to the gitops repo.Azure Repos, JFrog, Kubernetes
AtlantisRuns Terraform from pull requests, so every infrastructure change is reviewed with its plan.Azure Repos, Terraform
AWSRuns one copy of the platform (EKS, ECR, EC2, VPC, IAM), the website's own EKS cluster and the S3 log archive.Terraform, Argo CD, Wiz
AzureRuns the other copy: AKS, ACR, Azure VMs, VNet and Entra ID.Terraform, Argo CD, Wiz
Azure DevOpsHosts the three Git repos behind branch policies and push protection, and Boards for work items.Jenkins, Atlantis, Argo CD
CloudflareDNS, CDN, WAF and DDoS protection in front of the website; pushes its logs to S3.visitors, Envoy, S3
ConftestChecks every Terraform plan against Rego policies before Atlantis may apply it.Atlantis
CosignSigns each image and attests its SBOM with a key kept in AWS KMS or Key Vault.Jenkins, ECR, ACR, Kyverno
DatadogDashboards, APM and monitors for the apps, Argo CD and JFrog.the Collector, S3, on-call
DockerBuilds and runs images on the laptop.nothing in production
EDRSensors on laptops, VMs and nodes that detect and contain attacks on the machine.EDR console, Splunk
Entra IDThe one login for people: MFA and Conditional Access, single sign-on into the clouds and tools, groups mapped to roles.AWS, Teleport, the web tools
EnvoyEnvoy Gateway is the website cluster's ingress; it sends access logs and traces in OTLP.Cloudflare, the Collector
External SecretsCopies secrets from the cloud stores into Kubernetes Secrets, using the pod identity of its cloud.Secrets Manager, Key Vault
HelmPackages each app and each add-on as a chart, with values per environment.Argo CD, JFrog
JenkinsCI: tests, builds, scans, signs and pushes images, publishes charts, bumps the tag in the gitops repo.Azure DevOps, Podman, JFrog
JFrogArtifactory hosts the Helm charts and proxies npm, PyPI and Maven; Curation blocks risky packages, Xray scans what is stored.Jenkins, Argo CD, Datadog
KubernetesRuns the apps, the website and the add-ons, on EKS and AKS.Argo CD, the registries
KyvernoAdmission policies in every cluster: only signed images from our registries may run.Kubernetes, Cosign
OpenTelemetryOne protocol, OTLP, and one Collector per cluster for traces, metrics and logs.apps, Envoy, S3, Datadog
OpenVPNVPN from engineers' laptops to the private subnets that hold the internal UIs.laptops, VMs
PodmanBuilds images on the Jenkins agents, rootless and without a daemon.Jenkins, ECR, ACR
PrometheusStores cluster metrics and evaluates alert rules; Alertmanager pages on-call.the Collector
Secret storesAWS Secrets Manager and Azure Key Vault hold passwords, API keys and the signing keys.External Secrets, Cosign
SplunkSIEM: indexes the S3 archive and correlates it with EDR and Wiz findings.S3, EDR, Wiz
syslogThe standard log protocol of VMs and network appliances such as the VPN server.the Collector
TeleportThe one way into production: SSO, short-lived certificates, kubectl and ssh, recorded sessions.clusters, VMs, engineers
TerraformDeclares the resources in both clouds; keeps state in S3 or Blob Storage.AWS, Azure
TrivyScans each image for known vulnerabilities in Jenkins and writes its SBOM.Jenkins, Cosign
VagrantLocal VMs to test Ansible roles before they reach the cloud.Ansible
WizAgentless cloud security: scans both clouds for misconfigurations and vulnerabilities.AWS, Azure, Splunk

Other choices. This is one coherent model, not the only one. The comparisons below cover the Git host, CI, monitoring and VPN. Docker and Podman build the same OCI images, so the laptop and CI can differ. EDR is a category: CrowdStrike Falcon, Microsoft Defender for Endpoint and SentinelOne all fit that box. HashiCorp Vault could replace both cloud secret stores with one, and issue database passwords on demand. gitleaks in a pre-commit hook catches a secret before it even leaves the laptop. OPA Gatekeeper can replace Kyverno, Checkov can replace Conftest, and Grype and Syft can replace Trivy. Sources: Azure DevOps to Jenkins, Atlantis Git hosts, Argo CD clusters, Artifactory remote repositories, kube-prometheus-stack, Alertmanager, teleport-kube-agent, azurerm backend, Azure inventory, Vault database secrets, gitleaks.

// pick one per row

Interchangeable pieces

Four places in the overview carry a slash: either tool fits there, and the rest of the model stays the same. The first column is the one the steps above describe; for monitoring they use both.

Git host: Azure DevOps or GitHub

This model uses Azure DevOps because Repos, Boards and Entra ID live in one Microsoft tenant. GitHub takes the same place: Argo CD, Atlantis and Jenkins work with both.

Azure DevOpsGitHub
HostingAzure DevOps Services, or Azure DevOps Server on your own machinesGitHub.com, or GitHub Enterprise Server on your own machines
Merge rulesBranch policies: reviewers, build validation, linked work itemsRulesets and branch protection: reviews, status checks
Work trackingBoards: backlogs, sprints, work items linked to commitsIssues and Projects
Built-in CIAzure PipelinesGitHub Actions
Secret scanningGitHub Secret Protection for Azure DevOps, with push protectionGitHub Secret Protection, with push protection
Sign-inEach organization is connected to an Entra ID tenantEntra ID through Enterprise Managed Users or SAML, on GitHub Enterprise
Open sourcePublic projects are retired; they turn private in 2027Public repositories, where most open source lives

Sources: branch policies, rulesets, Azure DevOps and Entra ID, Enterprise Managed Users, push protection, public projects retirement.

CI: Jenkins or Azure Pipelines

Jenkins is here because it runs anywhere and its agents sit on our own VMs, next to the registries. Azure Pipelines removes the controller you would otherwise run and patch.

JenkinsAzure Pipelines
Who runs itYou: the controller, its agents, upgrades and plugin updatesMicrosoft runs the service; agents are Microsoft-hosted or your own
Pipeline fileJenkinsfile, in Groovyazure-pipelines.yml, in YAML
ExtensionsPlugins, each with its own releases and security advisoriesTasks from the Visual Studio Marketplace
Trigger from Azure ReposAn Azure DevOps service hookBuilt in, including build validation on pull requests
Cloud credentialsThe agent VM's instance profile or managed identityService connections with workload identity federation; AWS through the AWS Toolkit's OIDC option
CostFree software; you pay for the VMs and the time to run themFree tier of one Microsoft-hosted job (1,800 minutes a month) and one self-hosted job, then per parallel job

Sources: Jenkins pipelines, Jenkins security advisories, Azure DevOps to Jenkins, parallel jobs, workload identity service connections, Azure DevOps to AWS with OIDC.

Monitoring: Datadog or Prometheus

The model runs both: Prometheus in each cluster for metrics and alert rules, Datadog for dashboards, APM and logs across everything. Either one can also work alone.

DatadogPrometheus and Grafana
Who runs itDatadog, as a service that stores and scales the dataYou: one Prometheus per cluster, Grafana for dashboards
SignalsMetrics, traces, logs and APM in one placeMetrics only; Loki adds logs and Tempo adds traces
AlertingMonitors, with paging integrationsRules in Prometheus; Alertmanager routes and pages
RetentionSet by your plan, kept by DatadogLocal disk, 15 days by default; Thanos or Mimir for long-term
OpenTelemetryThe Collector's Datadog exporter, or OTLP into the AgentA native OTLP receiver since Prometheus 3, or remote write from the Collector
Argo CD and JFrogThe Agent's Argo CD check and the JFrog Cloud integrationScrape Argo CD's metrics endpoint and Artifactory's OpenMetrics API
CostPriced per host and by data volume, so it grows with the fleetFree software; you pay for storage and the people who run it

Sources: Datadog OTLP ingestion, Datadog pricing, Prometheus storage, Prometheus and OpenTelemetry, Thanos, Loki, Argo CD metrics, JFrog Open Metrics.

VPN: OpenVPN, AWS Client VPN and others

The VPN only opens the internal UIs; production goes through Teleport. A self-run server works the same in both clouds, while the managed options trade that for one service per cloud.

OpenVPNAWS Client VPNAzure VPN GatewayWireGuard
Who runs itYou, on a VM in each cloudAWS, as a managed endpointAzure, as a gateway in the VNetYou, on a VM in each cloud
ProtocolOpenVPN, over TLSOpenVPN-based, over TLSOpenVPN, IKEv2 or SSTPWireGuard, over UDP
Sign-inCertificates, plus plugins for LDAP or RADIUSCertificates, Active Directory, or SAML with Entra IDCertificates, RADIUS, or Entra ID through the Azure VPN Client (Windows, macOS)One key pair per device; no users or SSO
ReachBoth clouds, one server eachAWS VPCs onlyAzure VNets onlyBoth clouds, one server each
PriceThe VMPer endpoint-hour plus per connection-hourPer gateway-hour, by SKUThe VM
Logssyslog to the CollectorConnection logs to CloudWatch LogsDiagnostic logs to Azure MonitorAlmost none, by design

Tailscale and NetBird add users, SSO and access rules on top of WireGuard. Zero-trust proxies such as Cloudflare Access or Teleport's application access can replace the VPN entirely, by putting each internal UI behind a login.

Sources: OpenVPN manual, Client VPN authentication, Client VPN pricing, Client VPN logging, Azure point-to-site VPN, WireGuard, Tailscale, Cloudflare Access, Teleport application access.

// kubectl api-resources

Kubernetes vocabulary

A cluster has two halves: the control plane, which stores what you asked for and decides where it runs, and the nodes, which run it. On EKS and AKS the cloud runs the control plane; you get its API and bring the nodes, unless you pick EKS Auto Mode or AKS Automatic, where the cloud manages them too. The first diagram shows the parts of a cluster, the second the objects you write into it, and the table defines each word.

The parts of a cluster

The components of a Kubernetes clusterClients such as kubectl and Argo CD call the kube-apiserver. In the control plane, run by EKS or AKS, the API server is the only component that talks to etcd, and the kube-scheduler, the kube-controller-manager and the cloud-controller-manager all watch and update the API server. Below, two nodes, each a VM, run a kubelet that watches the API server for its pods, the containerd runtime and kube-proxy; the CNI plugin gives each pod an IP. Each node runs a web pod from a Deployment and an agent pod from a DaemonSet.Control plane (EKS / AKS run it)Node 1: a VMCNI: VPC CNI / Azure CNIkubeletregisters the node,starts its podscontainerdthe runtime: pullsimages, runs containerskube-proxyService IPs to pod IPs,as iptables rulesPod: web (Deployment)container: webIP 10.0.1.23Pod: agent (DaemonSet)container: agentIP 10.0.1.40Node 2: a VMCNI: VPC CNI / Azure CNIkubeletregisters the node,starts its podscontainerdthe runtime: pullsimages, runs containerskube-proxyService IPs to pod IPs,as iptables rulesPod: web (Deployment)container: webIP 10.0.2.17Pod: agent (DaemonSet)container: agentIP 10.0.2.9kubectl, Argo CDengineers through Teleport,Argo CD applying Gitetcdkey-value storeof every object:what you asked forand what runskube-apiserverthe only door, a REST API:authenticates, authorizes,runs admission webhookssuch as Kyverno,saves objects in etcdkube-schedulerpicks a node for each new pod, by requests, affinity and taintskube-controller-managercontrol loops: turns Deployments into ReplicaSets, ReplicaSets into Podscloud-controller-managerasks the cloud for load balancers, routes and node detailsHTTPSkubelets watch the API for their pods
Arrows point to whoever is called. The controllers and the kubelets never call each other: they watch the API for changes and write their results back. Only the API server talks to etcd; it also calls the kubelet for kubectl logs and exec. Sources: cluster components, EKS architecture, AKS core concepts, kube-proxy modes, Amazon VPC CNI, Azure CNI, admission webhooks.

The objects you write

The Kubernetes objects behind one appIn the namespace web: a HorizontalPodAutoscaler sets the replicas of a Deployment, which creates a ReplicaSet, which creates the pods. A Gateway's listener passes requests to an HTTPRoute, which picks a Service, which selects the pods by label. Each pod uses a ConfigMap, a Secret, a ServiceAccount and a PersistentVolumeClaim. Outside any namespace: Node, Namespace, PersistentVolume, StorageClass, GatewayClass, ClusterRole and CustomResourceDefinition.Namespace: webHorizontalPodAutoscalerchanges the replica countfrom CPU or custom metricsDeploymentimage, replicas, strategy;rolls out new versionsReplicaSetkeeps N identical pods;one per Deployment versionGatewaya listener: port 443 andits TLS certificate;class: Envoy GatewayHTTPRoutehost and path rulesthat pick a ServiceServicea stable IP and DNS name;selects pods by label;EndpointSlices list themPodsone or more containerssharing an IP and volumes;labels: app=webcreatesUsed by each pod:ConfigMap: settingsSecret: passwords, keysServiceAccount: its identityPersistentVolumeClaim: a diskCluster-wide objects:NodeNamespacePersistentVolumeStorageClassGatewayClassClusterRoleCustomResourceDefinition
Objects find each other by name or by label: the Service and the ReplicaSet both find their pods through the label app=web, so a pod with the wrong label gets no traffic. Sources: Deployments, DaemonSets, Services, Gateway API, Ingress, frozen, Secrets, persistent volumes, HorizontalPodAutoscaler, RBAC, custom resources.

Glossary

TermWhat it isIn this model
Admission webhookA call the API server makes before it saves an object; the webhook can reject or change it.Kyverno rejects pods whose image is not signed.
cloud-controller-managerControl plane loops that talk to the cloud: load balancers, routes, node details.Run by AWS and Azure inside the managed control plane.
CNI pluginGives each pod an IP address and connects it to the network.Amazon VPC CNI on EKS, Azure CNI on AKS.
ConfigMapSettings that are not secret, read by pods as files or environment variables.Per-environment settings rendered from the Helm values.
Container runtimePulls images and runs containers on behalf of the kubelet, through the CRI.containerd on EKS and AKS nodes.
Control planeThe API server, etcd, the scheduler and the controllers: the half that decides.Run by EKS and AKS; you only see the API.
CustomResourceDefinitionAdds a new object type to the API.Argo CD's Application, Kyverno's ClusterPolicy, External Secrets' ExternalSecret.
DaemonSetRuns one copy of a pod on every node, or on chosen nodes.The Datadog Agent and the EDR sensor.
DeploymentDeclares a stateless app: image, replica count, rollout strategy.Each app and the website; Jenkins changes the image tag through Git.
etcdThe key-value database that stores every object.Hidden inside EKS and AKS. EKS encrypts its data with KMS by default; AKS can, with Key Vault.
Gateway, HTTPRouteGateway API objects: a Gateway opens a listener, HTTPRoutes send hosts and paths to Services. They succeed Ingress, which is frozen.Envoy Gateway in the website cluster.
HorizontalPodAutoscalerChanges a Deployment's replica count from CPU, memory or custom metrics.Scales the website pods with CPU load or request rate.
Job, CronJobPods that run to completion, once or on a schedule.Not used in this model; typical for database migrations and nightly reports.
kube-apiserverThe REST API in front of the cluster; every component and every client goes through it.kubectl reaches it through Teleport; Argo CD applies Git through it.
kube-controller-managerControl loops that turn objects into more objects: a Deployment into ReplicaSets, a ReplicaSet into Pods.Run by EKS and AKS.
kube-proxyPrograms each node so that a Service IP reaches one of its pods, with iptables rules by default.A DaemonSet on EKS and AKS nodes.
kube-schedulerPicks a node for each new pod, from its resource requests, affinity rules and taints.Run by EKS and AKS.
kubeconfigA file with the API server address and the credentials that kubectl uses.tsh kube login writes one with short-lived certificates.
kubectlThe command-line client of the API.Engineers, through Teleport.
kubeletThe agent on each node: registers it, starts its pods through the runtime, reports their health.On every EKS and AKS node.
Label, selectorKey-value tags on objects, and the queries that match them.app=web ties the website's Service and ReplicaSet to its pods.
NamespaceA folder for objects, with its own access rules and quotas.One per app, and one per add-on.
NodeA machine that runs pods, with a kubelet, a runtime and kube-proxy.EC2 or Azure VMs in managed node groups or node pools; Karpenter or the Cluster Autoscaler adds more when pods do not fit.
OperatorA controller and its custom resources, that runs a piece of software for you.The External Secrets Operator; Argo CD works the same way.
PersistentVolume, PVCA PersistentVolumeClaim asks for storage; the cluster binds it to a PersistentVolume that its StorageClass creates.EBS volumes on EKS and Azure Disks on AKS, through their CSI drivers.
PodThe smallest unit: one or more containers sharing an IP, volumes and a lifecycle.Every app instance, the website, every add-on.
RBACRoles and ClusterRoles list allowed actions; RoleBindings grant them to users, groups or ServiceAccounts.Teleport maps Entra ID groups to Kubernetes groups.
ReplicaSetKeeps a fixed number of identical pods running; a Deployment creates one per version.Created by Deployments, never by hand.
SecretA ConfigMap for sensitive values. Base64 is only an encoding: the protection comes from RBAC and etcd encryption.Written by External Secrets from Secrets Manager and Key Vault.
ServiceA stable virtual IP and DNS name in front of a set of pods. Types: ClusterIP, NodePort, LoadBalancer.One per app; the website's HTTPRoute points to its Service.
ServiceAccountThe identity of a pod inside the cluster.EKS Pod Identity and AKS Workload ID map it to a cloud role.
StatefulSetLike a Deployment, but each pod keeps a stable name and its own volume.Databases and queues, when they run in the cluster.