<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>DevOps core technologies, detailed review on DevOps &amp; SRE interview questions</title><link>https://ewry.net/devops-sre-interview-questions/docs/devops-tools-detailed-review/</link><description>Recent content in DevOps core technologies, detailed review on DevOps &amp; SRE interview questions</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://ewry.net/devops-sre-interview-questions/docs/devops-tools-detailed-review/index.xml" rel="self" type="application/rss+xml"/><item><title>Ansible Interview Questions &amp; Answers — Playbooks, Roles, Vault</title><link>https://ewry.net/devops-sre-interview-questions/ansible/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ewry.net/devops-sre-interview-questions/ansible/</guid><description>&lt;h1 id="ansible-core-concepts"&gt;&lt;strong&gt;Ansible core concepts&lt;/strong&gt;&lt;a class="anchor" href="#ansible-core-concepts"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="core-concepts"&gt;&lt;strong&gt;Core Concepts&lt;/strong&gt;&lt;a class="anchor" href="#core-concepts"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Agentless&lt;/strong&gt;: Works over SSH/WinRM. No agent installed on target hosts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Idempotent&lt;/strong&gt;: Running the same play multiple times leads to the same state.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Declarative&lt;/strong&gt;: You describe the desired final state; modules handle the how.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;YAML-based Playbooks&lt;/strong&gt;: Tasks written as YAML documents.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inventory&lt;/strong&gt;: List of hosts — static file, dynamic script, cloud plugin.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Modules&lt;/strong&gt;: Reusable units of work (&lt;code&gt;apt&lt;/code&gt;, &lt;code&gt;yum&lt;/code&gt;, &lt;code&gt;copy&lt;/code&gt;, &lt;code&gt;template&lt;/code&gt;, &lt;code&gt;service&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Roles&lt;/strong&gt;: Standard structure for reusable automation (tasks, handlers, templates).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Facts&lt;/strong&gt;: System information gathered automatically (&lt;code&gt;ansible_facts&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="inventory"&gt;&lt;strong&gt;Inventory&lt;/strong&gt;&lt;a class="anchor" href="#inventory"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Default: &lt;code&gt;/etc/ansible/hosts&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Supports &lt;strong&gt;groups&lt;/strong&gt;, &lt;strong&gt;nested groups&lt;/strong&gt;, &lt;strong&gt;variables per host/group&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Supports &lt;strong&gt;dynamic inventory&lt;/strong&gt; (AWS, GCP, Azure, Kubernetes…).&lt;/li&gt;
&lt;li&gt;Host vars override group vars → group vars override global vars.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="playbooks"&gt;&lt;strong&gt;Playbooks&lt;/strong&gt;&lt;a class="anchor" href="#playbooks"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;YAML file describing plays: hosts + tasks.&lt;/li&gt;
&lt;li&gt;Each &lt;strong&gt;task&lt;/strong&gt; uses a module.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;handlers&lt;/strong&gt; for notification-based tasks (restart service only when needed).&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;when&lt;/strong&gt; for conditionals.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;loops&lt;/strong&gt; for repetitive tasks.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;become: yes&lt;/strong&gt; for privilege escalation.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="variables"&gt;&lt;strong&gt;Variables&lt;/strong&gt;&lt;a class="anchor" href="#variables"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Several places: playbooks, inventory, &lt;code&gt;group_vars/&lt;/code&gt;, &lt;code&gt;host_vars/&lt;/code&gt;, vars_files, extra vars.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Precedence&lt;/strong&gt;: extra vars &amp;gt; task vars &amp;gt; block vars &amp;gt; play vars &amp;gt; inventory.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;{{ variable }}&lt;/code&gt; syntax.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Jinja2 templating&lt;/strong&gt; for complex expressions.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="roles"&gt;&lt;strong&gt;Roles&lt;/strong&gt;&lt;a class="anchor" href="#roles"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Roles are reusable automation units.&lt;/li&gt;
&lt;li&gt;Standard directories: &lt;code&gt;tasks&lt;/code&gt;, &lt;code&gt;handlers&lt;/code&gt;, &lt;code&gt;templates&lt;/code&gt;, &lt;code&gt;files&lt;/code&gt;, &lt;code&gt;vars&lt;/code&gt;, &lt;code&gt;defaults&lt;/code&gt;, &lt;code&gt;meta&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;defaults&lt;/strong&gt; have lowest priority; &lt;strong&gt;vars&lt;/strong&gt; have higher.&lt;/li&gt;
&lt;li&gt;Galaxy roles installed using &lt;code&gt;ansible-galaxy install&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="modules"&gt;&lt;strong&gt;Modules&lt;/strong&gt;&lt;a class="anchor" href="#modules"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Most common modules for interviews:&lt;/p&gt;</description></item><item><title>AWS &amp; cloud concepts in general</title><link>https://ewry.net/devops-sre-interview-questions/aws-cloud-concepts/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ewry.net/devops-sre-interview-questions/aws-cloud-concepts/</guid><description>&lt;h1 id="aws--cloud-concepts-in-general"&gt;&lt;strong&gt;AWS &amp;amp; cloud concepts in general&lt;/strong&gt;&lt;a class="anchor" href="#aws--cloud-concepts-in-general"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="core-aws-concepts"&gt;&lt;strong&gt;Core AWS Concepts&lt;/strong&gt;&lt;a class="anchor" href="#core-aws-concepts"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Regions&lt;/strong&gt; = isolated geographic areas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Availability Zones (AZs)&lt;/strong&gt; = physically separate datacenters inside a region.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Edge Locations&lt;/strong&gt; = global CDN points for CloudFront.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IAM&lt;/strong&gt; = users, roles, policies (JSON). Always assign &lt;strong&gt;least privilege&lt;/strong&gt;. Prefer &lt;strong&gt;IAM Roles&lt;/strong&gt; over access keys.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Organizations&lt;/strong&gt; = multi-account structure; service control policies (SCPs) to restrict accounts.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="networking"&gt;&lt;strong&gt;Networking&lt;/strong&gt;&lt;a class="anchor" href="#networking"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;VPC&lt;/strong&gt; = isolated virtual network.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Subnets&lt;/strong&gt;: public (route to IGW) / private (route via NAT or no internet).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IGW&lt;/strong&gt; = direct internet access.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NAT Gateway&lt;/strong&gt; = outbound internet for private subnets.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Route Tables&lt;/strong&gt; = control traffic.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Security Groups&lt;/strong&gt; = stateful firewall.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NACLs&lt;/strong&gt; = stateless firewall.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VPC Peering&lt;/strong&gt; = connect VPCs (no transitive routing).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Transit Gateway&lt;/strong&gt; = scalable hub for multi-VPC, hybrid networks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PrivateLink&lt;/strong&gt; = private connectivity to services without exposing to internet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Elastic Load Balancers (ELB)&lt;/strong&gt;: ALB (HTTP/HTTPS), NLB (TCP/UDP), CLB (legacy).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Global Accelerator&lt;/strong&gt; = Anycast routing for TCP/UDP acceleration.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="compute"&gt;&lt;strong&gt;Compute&lt;/strong&gt;&lt;a class="anchor" href="#compute"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="ec2"&gt;&lt;strong&gt;EC2&lt;/strong&gt;&lt;a class="anchor" href="#ec2"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Instances with different families:&lt;/p&gt;</description></item><item><title>Docker Interview Questions — Images, Networking, Volumes &amp; containerd</title><link>https://ewry.net/devops-sre-interview-questions/docker-container-runtimes/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ewry.net/devops-sre-interview-questions/docker-container-runtimes/</guid><description>&lt;h1 id="docker-and-container-runtimes"&gt;&lt;strong&gt;Docker and container runtimes&lt;/strong&gt;&lt;a class="anchor" href="#docker-and-container-runtimes"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="core-concepts"&gt;&lt;strong&gt;Core Concepts&lt;/strong&gt;&lt;a class="anchor" href="#core-concepts"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Docker packages applications into &lt;strong&gt;containers&lt;/strong&gt;: isolated, reproducible environments.&lt;/li&gt;
&lt;li&gt;Containers share the &lt;strong&gt;host OS kernel&lt;/strong&gt;, unlike VMs. Lightweight and fast.&lt;/li&gt;
&lt;li&gt;Containers run from &lt;strong&gt;images&lt;/strong&gt; (immutable templates).&lt;/li&gt;
&lt;li&gt;A Dockerfile defines &lt;strong&gt;how an image is built&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Layers are &lt;strong&gt;cached&lt;/strong&gt;, enabling fast rebuilds.&lt;/li&gt;
&lt;li&gt;A container runtime (Docker, containerd, CRI-O) executes containers.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="docker-architecture"&gt;&lt;strong&gt;Docker Architecture&lt;/strong&gt;&lt;a class="anchor" href="#docker-architecture"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Docker Engine&lt;/strong&gt; = Docker CLI + Docker API + Docker daemon + container runtime.&lt;/li&gt;
&lt;li&gt;Docker now uses &lt;strong&gt;containerd&lt;/strong&gt; under the hood.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;runc&lt;/strong&gt; is the low-level OCI-compliant runtime that actually spawns containers.&lt;/li&gt;
&lt;li&gt;Separation of concerns:
&lt;ul&gt;
&lt;li&gt;Docker CLI → user interface&lt;/li&gt;
&lt;li&gt;Dockerd → builds &amp;amp; manages images/containers&lt;/li&gt;
&lt;li&gt;containerd → container lifecycle&lt;/li&gt;
&lt;li&gt;runc → executes containers according to OCI spec&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="images--layers"&gt;&lt;strong&gt;Images &amp;amp; Layers&lt;/strong&gt;&lt;a class="anchor" href="#images--layers"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Docker images are &lt;strong&gt;layered filesystems&lt;/strong&gt; (UnionFS).&lt;/li&gt;
&lt;li&gt;Each Dockerfile line creates a new &lt;strong&gt;layer&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Layers are &lt;strong&gt;read-only&lt;/strong&gt;; containers add a writable layer on top.&lt;/li&gt;
&lt;li&gt;Layers are &lt;strong&gt;reused across images&lt;/strong&gt;, reducing disk usage.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;COPY&lt;/code&gt; and &lt;code&gt;RUN&lt;/code&gt; create layers; &lt;code&gt;CMD&lt;/code&gt; and &lt;code&gt;ENTRYPOINT&lt;/code&gt; do not.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="container-lifecycle"&gt;&lt;strong&gt;Container Lifecycle&lt;/strong&gt;&lt;a class="anchor" href="#container-lifecycle"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Key states: &lt;strong&gt;created → running → paused → stopped → removed&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker run&lt;/code&gt; = create + start.&lt;/li&gt;
&lt;li&gt;Containers should be &lt;strong&gt;stateless&lt;/strong&gt;; data must go to volumes.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="volumes--storage"&gt;&lt;strong&gt;Volumes &amp;amp; Storage&lt;/strong&gt;&lt;a class="anchor" href="#volumes--storage"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Volumes persist data outside container lifecycle.&lt;/li&gt;
&lt;li&gt;Types: &lt;strong&gt;volumes&lt;/strong&gt;, &lt;strong&gt;bind mounts&lt;/strong&gt;, &lt;strong&gt;tmpfs&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Volumes recommended for production (managed by Docker).&lt;/li&gt;
&lt;li&gt;Bind mounts recommended for local development.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="networking"&gt;&lt;strong&gt;Networking&lt;/strong&gt;&lt;a class="anchor" href="#networking"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Default driver: &lt;strong&gt;bridge&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Others: &lt;strong&gt;host&lt;/strong&gt;, &lt;strong&gt;none&lt;/strong&gt;, &lt;strong&gt;overlay&lt;/strong&gt;, &lt;strong&gt;macvlan&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Overlay networks commonly used in &lt;strong&gt;Docker Swarm&lt;/strong&gt; and Kubernetes (via CNI).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker run -p&lt;/code&gt; maps container port → host port.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="dockerfile-best-practices"&gt;&lt;strong&gt;Dockerfile Best Practices&lt;/strong&gt;&lt;a class="anchor" href="#dockerfile-best-practices"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Use small base images (&lt;code&gt;alpine&lt;/code&gt;, &lt;code&gt;distroless&lt;/code&gt;, &lt;code&gt;scratch&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;multi-stage builds&lt;/strong&gt; to reduce size.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;.dockerignore&lt;/code&gt; to avoid huge contexts.&lt;/li&gt;
&lt;li&gt;Avoid &lt;code&gt;ADD&lt;/code&gt; unless necessary; prefer &lt;code&gt;COPY&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Always define &lt;code&gt;USER&lt;/code&gt; (drop root).&lt;/li&gt;
&lt;li&gt;Keep layers minimal and logical.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="entrypoint-vs-cmd"&gt;&lt;strong&gt;ENTRYPOINT vs CMD&lt;/strong&gt;&lt;a class="anchor" href="#entrypoint-vs-cmd"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ENTRYPOINT&lt;/strong&gt;: fixed executable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CMD&lt;/strong&gt;: default arguments.&lt;/li&gt;
&lt;li&gt;Combine both:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ENTRYPOINT&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;myapp&amp;#34;&lt;/span&gt;]&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;CMD&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;--help&amp;#34;&lt;/span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="security"&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;a class="anchor" href="#security"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Never run containers as &lt;strong&gt;root&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;read-only root filesystem&lt;/strong&gt; when possible.&lt;/li&gt;
&lt;li&gt;Scan images with &lt;code&gt;docker scan&lt;/code&gt; or Trivy.&lt;/li&gt;
&lt;li&gt;Use minimal images to reduce attack surface.&lt;/li&gt;
&lt;li&gt;Namespaces, cgroups, AppArmor/SELinux provide isolation.&lt;/li&gt;
&lt;li&gt;OCI runtimes enforce seccomp and capabilities.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="containerd-important-for-interviews"&gt;&lt;strong&gt;containerd (Important for interviews)&lt;/strong&gt;&lt;a class="anchor" href="#containerd-important-for-interviews"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;containerd is a &lt;strong&gt;container runtime&lt;/strong&gt; used by Docker and Kubernetes.&lt;/li&gt;
&lt;li&gt;Kubernetes uses containerd via &lt;strong&gt;CRI&lt;/strong&gt; (Container Runtime Interface).&lt;/li&gt;
&lt;li&gt;Features:
&lt;ul&gt;
&lt;li&gt;Image management&lt;/li&gt;
&lt;li&gt;Snapshotters (overlay2, btrfs, zfs)&lt;/li&gt;
&lt;li&gt;Container lifecycle&lt;/li&gt;
&lt;li&gt;gRPC API&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;runc used by containerd for OCI container execution.&lt;/li&gt;
&lt;li&gt;Lightweight, fast, production-grade runtime.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="oci-open-container-initiative"&gt;&lt;strong&gt;OCI (Open Container Initiative)&lt;/strong&gt;&lt;a class="anchor" href="#oci-open-container-initiative"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;OCI defines two specs:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Image spec&lt;/strong&gt; (how images are structured)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Runtime spec&lt;/strong&gt; (how containers are executed)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Ensures compatibility between Docker, containerd, CRI-O, Podman.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="docker-compose"&gt;&lt;strong&gt;Docker Compose&lt;/strong&gt;&lt;a class="anchor" href="#docker-compose"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Compose manages multi-container applications.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt; defines services, networks, and volumes.&lt;/li&gt;
&lt;li&gt;Used for development; not recommended for production.&lt;/li&gt;
&lt;li&gt;Can use profiles to enable/disable specific services.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="performance"&gt;&lt;strong&gt;Performance&lt;/strong&gt;&lt;a class="anchor" href="#performance"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Containers start in &lt;strong&gt;milliseconds&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Low overhead since they share host kernel.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;docker stats&lt;/code&gt; for monitoring.&lt;/li&gt;
&lt;li&gt;Use build cache + multi-stage builds for optimal performance.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="common-interview-qa-insights"&gt;&lt;strong&gt;Common Interview Q&amp;amp;A Insights&lt;/strong&gt;&lt;a class="anchor" href="#common-interview-qa-insights"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Q: Docker vs containerd?&lt;/strong&gt; A: Docker is a full platform (CLI + daemon + build system); containerd is the low-level runtime Docker uses. Kubernetes uses containerd directly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Q: How do containers isolate processes?&lt;/strong&gt; A: Linux &lt;strong&gt;namespaces&lt;/strong&gt;, &lt;strong&gt;cgroups&lt;/strong&gt;, &lt;strong&gt;capabilities&lt;/strong&gt;, &lt;strong&gt;seccomp&lt;/strong&gt;, and &lt;strong&gt;rootfs&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Q: Why are images immutable?&lt;/strong&gt; A: To ensure reproducibility, predictability, and fast deployment.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Q: How do you reduce image size?&lt;/strong&gt; A: Multi-stage builds, smaller base images, fewer layers, proper caching.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Q: Difference between &lt;code&gt;ENTRYPOINT&lt;/code&gt; and &lt;code&gt;CMD&lt;/code&gt;?&lt;/strong&gt; A: ENTRYPOINT = main command; CMD = default args.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Q: Persistent data strategy?&lt;/strong&gt; A: Volumes or external storage; containers should stay stateless.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="production-grade-dockerfile-example"&gt;&lt;strong&gt;Production-grade Dockerfile example&lt;/strong&gt;&lt;a class="anchor" href="#production-grade-dockerfile-example"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; &lt;span style="color:#e6db74"&gt;golang:1.23-alpine&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; &lt;span style="color:#e6db74"&gt;builder&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;LABEL&lt;/span&gt; org.opencontainers.image.title&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;my-go-service&amp;#34;&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;# Build-time variables&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;ARG&lt;/span&gt; VERSION&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;dev&amp;#34;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;# Runtime env in builder (affects build tools)&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;ENV&lt;/span&gt; CGO_ENABLED&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;&lt;/span&gt; GO111MODULE&lt;span style="color:#f92672"&gt;=&lt;/span&gt;on &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;&lt;/span&gt; GOOS&lt;span style="color:#f92672"&gt;=&lt;/span&gt;$TARGETOS &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;&lt;/span&gt; GOARCH&lt;span style="color:#f92672"&gt;=&lt;/span&gt;$TARGETARCH&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;# Set shell (handy for strict mode)&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;SHELL&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;/bin/sh&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;-ceu&amp;#34;&lt;/span&gt;]&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;WORKDIR&lt;/span&gt; &lt;span style="color:#e6db74"&gt;/src&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;# Install build deps (if you need git, ca-certs, etc.)&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;RUN&lt;/span&gt; apk add --no-cache ca-certificates tzdata git&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;# Copy only go.mod/go.sum first to maximize cache reuse&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;COPY&lt;/span&gt; go.mod go.sum ./&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;RUN&lt;/span&gt; --mount&lt;span style="color:#f92672"&gt;=&lt;/span&gt;type&lt;span style="color:#f92672"&gt;=&lt;/span&gt;cache,target&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/go/pkg/mod &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;&lt;/span&gt; go mod download&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;COPY&lt;/span&gt; . .&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;# Build (with cached build dir)&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;RUN&lt;/span&gt; --mount&lt;span style="color:#f92672"&gt;=&lt;/span&gt;type&lt;span style="color:#f92672"&gt;=&lt;/span&gt;cache,target&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/root/.cache/go-build &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;&lt;/span&gt; go build -trimpath &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;&lt;/span&gt; -ldflags &lt;span style="color:#e6db74"&gt;&amp;#34;-s -w \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; -X main.version=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;VERSION&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; -X main.commit=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;COMMIT_SHA&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;&lt;/span&gt; -o /out/app ./cmd/app&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;# Minimal runtime stage&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; &lt;span style="color:#e6db74"&gt;gcr.io/distroless/static-debian12:nonroot&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; &lt;span style="color:#e6db74"&gt;runtime&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;# Runtime env&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;ENV&lt;/span&gt; APP_ENV&lt;span style="color:#f92672"&gt;=&lt;/span&gt;production &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;&lt;/span&gt; TZ&lt;span style="color:#f92672"&gt;=&lt;/span&gt;UTC &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;&lt;/span&gt; PORT&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;8080&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WORKDIR&lt;/span&gt; &lt;span style="color:#e6db74"&gt;/app&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;# Copy binary from builder&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;COPY&lt;/span&gt; --from&lt;span style="color:#f92672"&gt;=&lt;/span&gt;builder /out/app /app/app&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;USER&lt;/span&gt; &lt;span style="color:#e6db74"&gt;nonroot:nonroot&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;EXPOSE&lt;/span&gt; &lt;span style="color:#e6db74"&gt;8080&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;# Optional volume (for mutable data, logs, etc.)&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;VOLUME&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;/app/data&amp;#34;&lt;/span&gt;]&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;# Healthcheck (note: distroless has no shell; use exec-form)&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;HEALTHCHECK&lt;/span&gt; --interval&lt;span style="color:#f92672"&gt;=&lt;/span&gt;30s --timeout&lt;span style="color:#f92672"&gt;=&lt;/span&gt;3s --start-period&lt;span style="color:#f92672"&gt;=&lt;/span&gt;10s --retries&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;&lt;/span&gt; CMD &lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;/app/app&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;healthcheck&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;# Signal for graceful shutdown&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;STOPSIGNAL&lt;/span&gt; &lt;span style="color:#e6db74"&gt;SIGTERM&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;# Entry + default args&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;ENTRYPOINT&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;/app/app&amp;#34;&lt;/span&gt;]&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;CMD&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;serve&amp;#34;&lt;/span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h1 id="docker-interview-questions"&gt;&lt;strong&gt;Docker interview questions&lt;/strong&gt;&lt;a class="anchor" href="#docker-interview-questions"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="1-what-is-the-difference-between-an-image-and-a-container"&gt;&lt;strong&gt;1. What is the difference between an image and a container?&lt;/strong&gt;&lt;a class="anchor" href="#1-what-is-the-difference-between-an-image-and-a-container"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Answer:&lt;/strong&gt;
An &lt;strong&gt;image&lt;/strong&gt; is a read-only blueprint (layers + metadata).
A &lt;strong&gt;container&lt;/strong&gt; is a &lt;strong&gt;running instance&lt;/strong&gt; of that image with a writable layer on top.&lt;/p&gt;</description></item><item><title>GitHub Actions</title><link>https://ewry.net/devops-sre-interview-questions/github-actions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ewry.net/devops-sre-interview-questions/github-actions/</guid><description>&lt;h1 id="github-actions"&gt;&lt;strong&gt;GitHub Actions&lt;/strong&gt;&lt;a class="anchor" href="#github-actions"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="core-concepts"&gt;&lt;strong&gt;Core Concepts&lt;/strong&gt;&lt;a class="anchor" href="#core-concepts"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;GitHub Actions is a CI/CD platform integrated into GitHub.&lt;/li&gt;
&lt;li&gt;Workflows are defined in YAML under &lt;code&gt;.github/workflows/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Workflows run on triggers (events), jobs, and steps.&lt;/li&gt;
&lt;li&gt;Runners execute jobs — GitHub-hosted or self-hosted.&lt;/li&gt;
&lt;li&gt;Reusable workflows allow DRY pipelines across repos.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="workflows"&gt;&lt;strong&gt;Workflows&lt;/strong&gt;&lt;a class="anchor" href="#workflows"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A workflow = set of jobs triggered by events.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Common triggers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;push&lt;/code&gt;, &lt;code&gt;pull_request&lt;/code&gt;, &lt;code&gt;workflow_dispatch&lt;/code&gt;, &lt;code&gt;schedule (cron)&lt;/code&gt;, &lt;code&gt;release&lt;/code&gt;, &lt;code&gt;issue_comment&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can define multiple workflows per repository.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="jobs"&gt;&lt;strong&gt;Jobs&lt;/strong&gt;&lt;a class="anchor" href="#jobs"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Jobs run in parallel by default.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;needs:&lt;/code&gt; to define dependencies (sequential execution).&lt;/li&gt;
&lt;li&gt;Each job runs on its own fresh runner VM.&lt;/li&gt;
&lt;li&gt;Common runners: &lt;code&gt;ubuntu-latest&lt;/code&gt;, &lt;code&gt;windows-latest&lt;/code&gt;, &lt;code&gt;macos-latest&lt;/code&gt;, or self-hosted.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="steps"&gt;&lt;strong&gt;Steps&lt;/strong&gt;&lt;a class="anchor" href="#steps"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Steps run inside jobs.&lt;/li&gt;
&lt;li&gt;Steps can run shell commands or actions (reusable logic).&lt;/li&gt;
&lt;li&gt;Steps share workspace but not environment by default unless &lt;code&gt;env:&lt;/code&gt; is set.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="actions"&gt;&lt;strong&gt;Actions&lt;/strong&gt;&lt;a class="anchor" href="#actions"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Reusable units of logic.&lt;/p&gt;</description></item><item><title>GitLab CI/CD Interview Questions — Pipelines, Runners, Environments</title><link>https://ewry.net/devops-sre-interview-questions/gitlab/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ewry.net/devops-sre-interview-questions/gitlab/</guid><description>&lt;h1 id="gitlab-cicd-core-concepts"&gt;&lt;strong&gt;GitLab CI/CD core concepts&lt;/strong&gt;&lt;a class="anchor" href="#gitlab-cicd-core-concepts"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="core-concepts"&gt;&lt;strong&gt;Core Concepts&lt;/strong&gt;&lt;a class="anchor" href="#core-concepts"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;GitLab CI/CD runs pipelines defined in &lt;strong&gt;.gitlab-ci.yml&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Pipelines consist of &lt;strong&gt;stages&lt;/strong&gt; (build → test → deploy).&lt;/li&gt;
&lt;li&gt;Each stage contains &lt;strong&gt;jobs&lt;/strong&gt;, executed by &lt;strong&gt;GitLab Runners&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Runners can be &lt;strong&gt;shared&lt;/strong&gt;, &lt;strong&gt;group&lt;/strong&gt;, or &lt;strong&gt;project&lt;/strong&gt; level.&lt;/li&gt;
&lt;li&gt;Pipelines run automatically on &lt;strong&gt;push&lt;/strong&gt;, &lt;strong&gt;MR&lt;/strong&gt;, or &lt;strong&gt;manual triggers&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="gitlab-ciyml-basics"&gt;&lt;strong&gt;.gitlab-ci.yml Basics&lt;/strong&gt;&lt;a class="anchor" href="#gitlab-ciyml-basics"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Must be in repository root.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Default structure:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;stages&lt;/span&gt;: [&lt;span style="color:#ae81ff"&gt;build, test, deploy]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;job_name&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;stage&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;build&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;script&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use &lt;strong&gt;only/except&lt;/strong&gt; or &lt;strong&gt;rules:&lt;/strong&gt; to control job execution.&lt;/p&gt;</description></item><item><title>Kafka &amp; NATS Interview Questions — Topics, Partitions, Consumer Groups</title><link>https://ewry.net/devops-sre-interview-questions/kafka-nats-etc/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ewry.net/devops-sre-interview-questions/kafka-nats-etc/</guid><description>&lt;h1 id="kafka-nats-and-streaming--messaging-in-distributed-systems-in-general"&gt;&lt;strong&gt;Kafka, NATS, and streaming &amp;amp; messaging in distributed systems in general&lt;/strong&gt;&lt;a class="anchor" href="#kafka-nats-and-streaming--messaging-in-distributed-systems-in-general"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="messaging-in-distributed-systems-foundations"&gt;Messaging in Distributed Systems (Foundations)&lt;a class="anchor" href="#messaging-in-distributed-systems-foundations"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Why messaging is used&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It decouples producers from consumers in time and space.&lt;/li&gt;
&lt;li&gt;Producers do not block waiting for consumers.&lt;/li&gt;
&lt;li&gt;Systems tolerate partial failures better.&lt;/li&gt;
&lt;li&gt;Traffic spikes are absorbed by the broker instead of crashing services.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Asynchronous vs synchronous&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Messaging is asynchronous by default.&lt;/li&gt;
&lt;li&gt;This improves latency isolation but complicates error handling.&lt;/li&gt;
&lt;li&gt;Failures move from call-time to processing-time.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Common messaging patterns&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Kubernetes Interview Questions — Pods, RBAC, Networking &amp; Autoscaling</title><link>https://ewry.net/devops-sre-interview-questions/kubernetes/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ewry.net/devops-sre-interview-questions/kubernetes/</guid><description>&lt;h1 id="kubernetes-core-concepts"&gt;&lt;strong&gt;Kubernetes core concepts&lt;/strong&gt;&lt;a class="anchor" href="#kubernetes-core-concepts"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="core-concepts"&gt;&lt;strong&gt;Core Concepts&lt;/strong&gt;&lt;a class="anchor" href="#core-concepts"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Kubernetes is a container orchestration system for managing containerized apps at scale.&lt;/li&gt;
&lt;li&gt;Main objects: &lt;strong&gt;Pod&lt;/strong&gt;, &lt;strong&gt;Deployment&lt;/strong&gt;, &lt;strong&gt;ReplicaSet&lt;/strong&gt;, &lt;strong&gt;Service&lt;/strong&gt;, &lt;strong&gt;ConfigMap&lt;/strong&gt;, &lt;strong&gt;Secret&lt;/strong&gt;, &lt;strong&gt;Ingress&lt;/strong&gt;, &lt;strong&gt;PV/PVC&lt;/strong&gt;, &lt;strong&gt;Namespace&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Control plane components: &lt;strong&gt;API Server&lt;/strong&gt;, &lt;strong&gt;Scheduler&lt;/strong&gt;, &lt;strong&gt;Controller Manager&lt;/strong&gt;, &lt;strong&gt;etcd&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Node components: &lt;strong&gt;kubelet&lt;/strong&gt;, &lt;strong&gt;kube-proxy&lt;/strong&gt;, container runtime (containerd/Docker/CRI-O).&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="pods"&gt;&lt;strong&gt;Pods&lt;/strong&gt;&lt;a class="anchor" href="#pods"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Smallest deployable unit.&lt;/li&gt;
&lt;li&gt;Usually 1 container per Pod.&lt;/li&gt;
&lt;li&gt;Ephemeral by design — replaced, not repaired.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="deployments--replicasets"&gt;&lt;strong&gt;Deployments &amp;amp; ReplicaSets&lt;/strong&gt;&lt;a class="anchor" href="#deployments--replicasets"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Deployment manages ReplicaSets and provides rollout/rollback features.&lt;/li&gt;
&lt;li&gt;Rolling updates by default, supports strategies: &lt;strong&gt;RollingUpdate&lt;/strong&gt; and &lt;strong&gt;Recreate&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Revision history stored in ReplicaSets.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="services"&gt;&lt;strong&gt;Services&lt;/strong&gt;&lt;a class="anchor" href="#services"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Stable network endpoint for Pods.&lt;/li&gt;
&lt;li&gt;Types: &lt;strong&gt;ClusterIP&lt;/strong&gt;, &lt;strong&gt;NodePort&lt;/strong&gt;, &lt;strong&gt;LoadBalancer&lt;/strong&gt;, &lt;strong&gt;ExternalName&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Uses kube-proxy (iptables or IPVS) for traffic routing.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="ingress"&gt;&lt;strong&gt;Ingress&lt;/strong&gt;&lt;a class="anchor" href="#ingress"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;HTTP(S) routing + TLS termination.&lt;/li&gt;
&lt;li&gt;Requires an &lt;strong&gt;Ingress Controller&lt;/strong&gt; (NGINX, Traefik, HAProxy, Cilium, etc.).&lt;/li&gt;
&lt;li&gt;Replaces many NodePort/LoadBalancer services.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="configmaps--secrets"&gt;&lt;strong&gt;ConfigMaps &amp;amp; Secrets&lt;/strong&gt;&lt;a class="anchor" href="#configmaps--secrets"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ConfigMaps hold non-sensitive config.&lt;/li&gt;
&lt;li&gt;Secrets hold sensitive data (base64-encoded, optionally encrypted at rest).&lt;/li&gt;
&lt;li&gt;Mounted as env vars or files.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="networking"&gt;&lt;strong&gt;Networking&lt;/strong&gt;&lt;a class="anchor" href="#networking"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Every Pod gets a unique IP; Pods can communicate without NAT.&lt;/li&gt;
&lt;li&gt;CNI plugins: &lt;strong&gt;Calico&lt;/strong&gt;, &lt;strong&gt;Cilium&lt;/strong&gt;, &lt;strong&gt;Flannel&lt;/strong&gt;, &lt;strong&gt;Weave&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;kube-proxy manages virtual IPs for services.&lt;/li&gt;
&lt;li&gt;Ingress handles L7; Services handle L4.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="volumes--storage"&gt;&lt;strong&gt;Volumes &amp;amp; Storage&lt;/strong&gt;&lt;a class="anchor" href="#volumes--storage"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PV&lt;/strong&gt; = cluster-level storage resource.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PVC&lt;/strong&gt; = claim requesting storage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;StorageClass&lt;/strong&gt; defines dynamic provisioning.&lt;/li&gt;
&lt;li&gt;Common providers: EBS, GCE PD, Ceph, NFS, Longhorn.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="namespaces"&gt;&lt;strong&gt;Namespaces&lt;/strong&gt;&lt;a class="anchor" href="#namespaces"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Logical isolation in the cluster.&lt;/li&gt;
&lt;li&gt;Important for RBAC, resource quotas, and multi-tenancy.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="rbac"&gt;&lt;strong&gt;RBAC&lt;/strong&gt;&lt;a class="anchor" href="#rbac"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Role/ClusterRole → set of permissions.&lt;/li&gt;
&lt;li&gt;RoleBinding/ClusterRoleBinding → assign permissions.&lt;/li&gt;
&lt;li&gt;Follows the principle of least privilege.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="autoscaling"&gt;&lt;strong&gt;Autoscaling&lt;/strong&gt;&lt;a class="anchor" href="#autoscaling"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;HPA&lt;/strong&gt;: scales Pods based on CPU/memory/custom metrics.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VPA&lt;/strong&gt;: suggests or sets resource requests/limits.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cluster Autoscaler&lt;/strong&gt;: scales the node pool.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="probes"&gt;&lt;strong&gt;Probes&lt;/strong&gt;&lt;a class="anchor" href="#probes"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Liveness&lt;/strong&gt;: restart container if app is stuck.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Readiness&lt;/strong&gt;: remove from Service endpoints until ready.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Startup&lt;/strong&gt;: delay other probes until app starts.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="resource-management"&gt;&lt;strong&gt;Resource Management&lt;/strong&gt;&lt;a class="anchor" href="#resource-management"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;requests&lt;/code&gt; = minimum guaranteed resources.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;limits&lt;/code&gt; = max allowed resources.&lt;/li&gt;
&lt;li&gt;Poor requests/limits → throttling, OOMKills, bad scheduling.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="logs--debugging"&gt;&lt;strong&gt;Logs &amp;amp; Debugging&lt;/strong&gt;&lt;a class="anchor" href="#logs--debugging"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;kubectl logs&lt;/code&gt;, &lt;code&gt;kubectl exec&lt;/code&gt;, &lt;code&gt;kubectl describe&lt;/code&gt;, &lt;code&gt;kubectl get events&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Ephemeral containers for debugging in production.&lt;/li&gt;
&lt;li&gt;Metrics with Prometheus + Grafana.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="rollouts"&gt;&lt;strong&gt;Rollouts&lt;/strong&gt;&lt;a class="anchor" href="#rollouts"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;kubectl rollout status&lt;/code&gt;, &lt;code&gt;history&lt;/code&gt;, &lt;code&gt;undo&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Strategies: &lt;strong&gt;rolling&lt;/strong&gt;, &lt;strong&gt;blue/green&lt;/strong&gt;, &lt;strong&gt;canary&lt;/strong&gt; (via Argo Rollouts/Flagger).&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="security"&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;a class="anchor" href="#security"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Disable anonymous access to API server.&lt;/li&gt;
&lt;li&gt;Limit capabilities via PodSecurityContext.&lt;/li&gt;
&lt;li&gt;Use NetworkPolicies for L3/L4 isolation.&lt;/li&gt;
&lt;li&gt;Store secrets in encrypted storage (Vault, KMS).&lt;/li&gt;
&lt;li&gt;Scan images (Trivy, Anchore, Clair).&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="scheduling"&gt;&lt;strong&gt;Scheduling&lt;/strong&gt;&lt;a class="anchor" href="#scheduling"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Scheduler picks best node based on resources + constraints.&lt;/li&gt;
&lt;li&gt;Affinity/anti-affinity, taints/tolerations influence scheduling.&lt;/li&gt;
&lt;li&gt;NodeSelector = basic placement.&lt;/li&gt;
&lt;li&gt;PriorityClasses control eviction order.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="daemonsets-jobs-cronjobs"&gt;&lt;strong&gt;DaemonSets, Jobs, CronJobs&lt;/strong&gt;&lt;a class="anchor" href="#daemonsets-jobs-cronjobs"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DaemonSet&lt;/strong&gt;: runs 1 Pod per node (logging, monitoring).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Job&lt;/strong&gt;: run task once until successful.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CronJob&lt;/strong&gt;: scheduled Jobs.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="etcd"&gt;&lt;strong&gt;etcd&lt;/strong&gt;&lt;a class="anchor" href="#etcd"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Strongly consistent key-value store.&lt;/li&gt;
&lt;li&gt;Stores all cluster state.&lt;/li&gt;
&lt;li&gt;Backups critical for disaster recovery.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="common-interview-questions-to-expect"&gt;&lt;strong&gt;Common Interview Questions to Expect&lt;/strong&gt;&lt;a class="anchor" href="#common-interview-questions-to-expect"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Explain Pod vs Deployment.&lt;/li&gt;
&lt;li&gt;How does service discovery work?&lt;/li&gt;
&lt;li&gt;Difference between Ingress and Service.&lt;/li&gt;
&lt;li&gt;How HPA works under the hood.&lt;/li&gt;
&lt;li&gt;What’s the purpose of RBAC?&lt;/li&gt;
&lt;li&gt;Pod rescheduling logic when a node dies.&lt;/li&gt;
&lt;li&gt;Taints vs tolerations vs affinity.&lt;/li&gt;
&lt;li&gt;Troubleshooting a CrashLoopBackOff.&lt;/li&gt;
&lt;li&gt;How to secure a cluster.&lt;/li&gt;
&lt;li&gt;StorageClass/PV/PVC workflow.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h1 id="kubernetes-interview-questions"&gt;&lt;strong&gt;Kubernetes interview questions&lt;/strong&gt;&lt;a class="anchor" href="#kubernetes-interview-questions"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="1-what-is-the-difference-between-a-deployment-and-a-statefulset"&gt;&lt;strong&gt;1. What is the difference between a Deployment and a StatefulSet?&lt;/strong&gt;&lt;a class="anchor" href="#1-what-is-the-difference-between-a-deployment-and-a-statefulset"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A &lt;strong&gt;Deployment&lt;/strong&gt; manages stateless apps with interchangeable pods, while a &lt;strong&gt;StatefulSet&lt;/strong&gt; ensures stable network identities, persistent storage per pod, and ordered, deterministic scaling.&lt;/p&gt;</description></item><item><title>Linux Interview Questions for DevOps &amp; SRE — Processes, systemd, Networking</title><link>https://ewry.net/devops-sre-interview-questions/linux/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ewry.net/devops-sre-interview-questions/linux/</guid><description>&lt;h1 id="linux-core-concepts"&gt;&lt;strong&gt;Linux core concepts&lt;/strong&gt;&lt;a class="anchor" href="#linux-core-concepts"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="1-linux-architecture"&gt;&lt;strong&gt;1. Linux Architecture&lt;/strong&gt;&lt;a class="anchor" href="#1-linux-architecture"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Everything is a file (devices, sockets, pipes).&lt;/li&gt;
&lt;li&gt;Kernel handles process scheduling, memory, I/O, networking.&lt;/li&gt;
&lt;li&gt;System calls bridge user space ↔ kernel space (&lt;code&gt;strace&lt;/code&gt; shows them).&lt;/li&gt;
&lt;li&gt;Runlevels replaced by systemd targets (multi-user, graphical).&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="2-processes--systemd"&gt;&lt;strong&gt;2. Processes &amp;amp; Systemd&lt;/strong&gt;&lt;a class="anchor" href="#2-processes--systemd"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ps aux&lt;/code&gt;, &lt;code&gt;top&lt;/code&gt;, &lt;code&gt;htop&lt;/code&gt;, &lt;code&gt;atop&lt;/code&gt; → inspect processes &amp;amp; resource usage.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;systemctl start/stop/status/enable/disable/restart unit&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Signals: &lt;code&gt;SIGTERM&lt;/code&gt; (15, graceful), &lt;code&gt;SIGKILL&lt;/code&gt; (9, force), &lt;code&gt;SIGINT&lt;/code&gt; (2, Ctrl+C).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nice&lt;/code&gt; &amp;amp; &lt;code&gt;renice&lt;/code&gt; → CPU scheduling priorities.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nohup&lt;/code&gt; &amp;amp; &lt;code&gt;&amp;amp;&lt;/code&gt; → run tasks in background.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="3-filesystems"&gt;&lt;strong&gt;3. Filesystems&lt;/strong&gt;&lt;a class="anchor" href="#3-filesystems"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Common FS: ext4, xfs, btrfs, zfs.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;df -h&lt;/code&gt; → disk usage.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;du -sh *&lt;/code&gt; → directory usage.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lsblk&lt;/code&gt;, &lt;code&gt;blkid&lt;/code&gt;, &lt;code&gt;mount&lt;/code&gt;, &lt;code&gt;umount&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/fstab&lt;/code&gt; → persistent mounts.&lt;/li&gt;
&lt;li&gt;Inodes track metadata; running out of inodes breaks file creation.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="4-permissions--ownership"&gt;&lt;strong&gt;4. Permissions &amp;amp; Ownership&lt;/strong&gt;&lt;a class="anchor" href="#4-permissions--ownership"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;rwx&lt;/code&gt; model for user/group/other.&lt;/p&gt;</description></item><item><title>Networking (TCP/IP, load balancing, etc)</title><link>https://ewry.net/devops-sre-interview-questions/networking-tcp-ip-etc/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ewry.net/devops-sre-interview-questions/networking-tcp-ip-etc/</guid><description>&lt;h1 id="networking-core-concepts"&gt;&lt;strong&gt;Networking core concepts&lt;/strong&gt;&lt;a class="anchor" href="#networking-core-concepts"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="osi-model-7-layers"&gt;&lt;strong&gt;OSI Model (7 layers)&lt;/strong&gt;&lt;a class="anchor" href="#osi-model-7-layers"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://assets.bytebytego.com/diagrams/0295-osi-model.jpeg" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;L1 – Physical:&lt;/strong&gt; Cables, NICs, bits.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;L2 – Data Link:&lt;/strong&gt; MAC addresses, switches, VLANs, STP.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;L3 – Network:&lt;/strong&gt; IP, routing, subnets, CIDR, ARP.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;L4 – Transport:&lt;/strong&gt; TCP/UDP, ports, handshake, retransmission.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;L5 – Session:&lt;/strong&gt; Connection management. Rare in practical ops.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;L6 – Presentation:&lt;/strong&gt; Encryption, compression, TLS framing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;L7 – Application:&lt;/strong&gt; HTTP, DNS, SMTP, gRPC.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="key-interview-tip"&gt;Key Interview Tip&lt;a class="anchor" href="#key-interview-tip"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;OSI layers help &lt;strong&gt;troubleshoot&lt;/strong&gt;: “Which layer is failing?”&lt;/li&gt;
&lt;li&gt;Map protocols to layers (HTTP → L7, TLS → L6, IP → L3, etc).&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="tcpip-model-4-layers"&gt;&lt;strong&gt;TCP/IP Model (4 layers)&lt;/strong&gt;&lt;a class="anchor" href="#tcpip-model-4-layers"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://i.ibb.co/d419t4S6/image.png" alt="" /&gt;&lt;/p&gt;</description></item><item><title>PostgreSQL Interview Questions — Indexes, MVCC, Replication &amp; Performance</title><link>https://ewry.net/devops-sre-interview-questions/postgresql-database-concepts/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ewry.net/devops-sre-interview-questions/postgresql-database-concepts/</guid><description>&lt;h1 id="postgresql--database-concepts-in-general"&gt;&lt;strong&gt;PostgreSQL &amp;amp; database concepts in general&lt;/strong&gt;&lt;a class="anchor" href="#postgresql--database-concepts-in-general"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="architecture"&gt;&lt;strong&gt;Architecture&lt;/strong&gt;&lt;a class="anchor" href="#architecture"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;PostgreSQL uses a &lt;strong&gt;process-based&lt;/strong&gt; architecture (one OS process per connection).&lt;/li&gt;
&lt;li&gt;Uses &lt;strong&gt;WAL (Write-Ahead Log)&lt;/strong&gt; to guarantee durability.&lt;/li&gt;
&lt;li&gt;Data stored in &lt;strong&gt;pages (8 KB)&lt;/strong&gt; inside &lt;strong&gt;tablespaces&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MVCC (Multi-Version Concurrency Control)&lt;/strong&gt; enables high concurrency without read locks.&lt;/li&gt;
&lt;li&gt;Uses &lt;strong&gt;shared buffers&lt;/strong&gt; + &lt;strong&gt;OS page cache&lt;/strong&gt; together.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="mvcc"&gt;&lt;strong&gt;MVCC&lt;/strong&gt;&lt;a class="anchor" href="#mvcc"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Each row has &lt;strong&gt;xmin/xmax&lt;/strong&gt; transaction IDs.&lt;/li&gt;
&lt;li&gt;No locks for reads → avoids read contention.&lt;/li&gt;
&lt;li&gt;Dead tuples accumulate → require &lt;strong&gt;VACUUM&lt;/strong&gt; to clean them.&lt;/li&gt;
&lt;li&gt;MVCC ensures &lt;strong&gt;consistent snapshot isolation&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="indexes"&gt;&lt;strong&gt;Indexes&lt;/strong&gt;&lt;a class="anchor" href="#indexes"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Most common: &lt;strong&gt;B-Tree&lt;/strong&gt; (default).&lt;/li&gt;
&lt;li&gt;Others: &lt;strong&gt;GIN&lt;/strong&gt; (full-text search, JSONB), &lt;strong&gt;GiST&lt;/strong&gt; (geospatial), &lt;strong&gt;BRIN&lt;/strong&gt; (very large, sequential tables), &lt;strong&gt;HASH&lt;/strong&gt; (rarely used).&lt;/li&gt;
&lt;li&gt;Too many indexes slow down &lt;strong&gt;writes&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reindex&lt;/strong&gt; needed if index bloats.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="replication"&gt;&lt;strong&gt;Replication&lt;/strong&gt;&lt;a class="anchor" href="#replication"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Native replication is &lt;strong&gt;physical WAL streaming&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Terraform Interview Questions — State, Modules, Providers &amp; IaC Best Practices</title><link>https://ewry.net/devops-sre-interview-questions/terraform-iaac/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ewry.net/devops-sre-interview-questions/terraform-iaac/</guid><description>&lt;h1 id="terraform"&gt;&lt;strong&gt;Terraform&lt;/strong&gt;&lt;a class="anchor" href="#terraform"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="core-concepts"&gt;&lt;strong&gt;Core Concepts&lt;/strong&gt;&lt;a class="anchor" href="#core-concepts"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;IaC tool&lt;/strong&gt; using declarative syntax (HCL).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Idempotent&lt;/strong&gt;: same config → same result.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Execution plan&lt;/strong&gt;: &lt;code&gt;terraform plan&lt;/code&gt; shows actions before applying.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;State file&lt;/strong&gt; tracks real infrastructure and resource mappings.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Providers&lt;/strong&gt; are plugins to manage cloud resources (AWS, GCP, Azure, etc.).&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="state-management"&gt;&lt;strong&gt;State Management&lt;/strong&gt;&lt;a class="anchor" href="#state-management"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;terraform.tfstate&lt;/code&gt; stores resource attributes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Remote backends&lt;/strong&gt; (S3 + DynamoDB, GCS, Azure Blob) enable teamwork + locking.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;State locking&lt;/strong&gt; prevents concurrent writes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;State is sensitive&lt;/strong&gt; → encrypt + restrict access.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;terraform state rm/mv&lt;/code&gt; for manual state surgery.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="modules"&gt;&lt;strong&gt;Modules&lt;/strong&gt;&lt;a class="anchor" href="#modules"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Reusable components of Terraform configuration.&lt;/li&gt;
&lt;li&gt;Improve DRY, structure, and versioning.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;public registry&lt;/strong&gt; or private repositories.&lt;/li&gt;
&lt;li&gt;Pin version: &lt;code&gt;source = &amp;quot;...&amp;quot; version = &amp;quot;x.y.z&amp;quot;&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="variables--outputs"&gt;&lt;strong&gt;Variables &amp;amp; Outputs&lt;/strong&gt;&lt;a class="anchor" href="#variables--outputs"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Variables defined in &lt;code&gt;variables.tf&lt;/code&gt;, passed via &lt;code&gt;.tfvars&lt;/code&gt;, CLI, or environment.&lt;/li&gt;
&lt;li&gt;Sensitive inputs: &lt;code&gt;sensitive = true&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Outputs&lt;/strong&gt; expose resource info (IP, URL) and can be marked sensitive.&lt;/li&gt;
&lt;li&gt;Input variable precedence: CLI &amp;gt; tfvars &amp;gt; environment &amp;gt; defaults.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="terraform-lifecycle"&gt;&lt;strong&gt;Terraform Lifecycle&lt;/strong&gt;&lt;a class="anchor" href="#terraform-lifecycle"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;terraform init&lt;/code&gt; → download providers.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;terraform validate&lt;/code&gt; → check syntax.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;terraform plan&lt;/code&gt; → preview changes.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;terraform apply&lt;/code&gt; → create/update/delete.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;terraform destroy&lt;/code&gt; → teardown.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="resource-lifecycle-rules"&gt;&lt;strong&gt;Resource Lifecycle Rules&lt;/strong&gt;&lt;a class="anchor" href="#resource-lifecycle-rules"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;create_before_destroy&lt;/code&gt; prevents downtime.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prevent_destroy = true&lt;/code&gt; protects critical resources.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ignore_changes&lt;/code&gt; allows external changes without drift detection.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="terraform-provisioners"&gt;&lt;strong&gt;Terraform Provisioners&lt;/strong&gt;&lt;a class="anchor" href="#terraform-provisioners"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Not recommended&lt;/strong&gt; unless no alternative.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;local-exec&lt;/code&gt; runs local commands.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;remote-exec&lt;/code&gt; runs commands on remote machines.&lt;/li&gt;
&lt;li&gt;Better use: Ansible, cloud-init, user_data.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="backends"&gt;&lt;strong&gt;Backends&lt;/strong&gt;&lt;a class="anchor" href="#backends"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Store &amp;amp; manage state remotely.&lt;/li&gt;
&lt;li&gt;Common backends: &lt;strong&gt;S3 (with DynamoDB lock)&lt;/strong&gt;, &lt;strong&gt;Consul&lt;/strong&gt;, &lt;strong&gt;Terraform Cloud&lt;/strong&gt;, &lt;strong&gt;GCS&lt;/strong&gt;, &lt;strong&gt;Azure Blob&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Backend configuration cannot use variables.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="workspaces"&gt;&lt;strong&gt;Workspaces&lt;/strong&gt;&lt;a class="anchor" href="#workspaces"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Logical separation of state within the same config.&lt;/li&gt;
&lt;li&gt;Good for simple multi-env (dev/stage/prod), but many teams prefer &lt;strong&gt;separate state files per environment&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="dependency-management"&gt;&lt;strong&gt;Dependency Management&lt;/strong&gt;&lt;a class="anchor" href="#dependency-management"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Terraform handles dependencies automatically via attributes.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;depends_on&lt;/code&gt; is used when implicit dependency is missing (use sparingly).&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="drift-detection"&gt;&lt;strong&gt;Drift Detection&lt;/strong&gt;&lt;a class="anchor" href="#drift-detection"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Run &lt;code&gt;terraform plan&lt;/code&gt; frequently.&lt;/li&gt;
&lt;li&gt;Config != actual cloud resources → drift.&lt;/li&gt;
&lt;li&gt;Use CI pipelines for automated drift checks.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="security-best-practices"&gt;&lt;strong&gt;Security Best Practices&lt;/strong&gt;&lt;a class="anchor" href="#security-best-practices"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Never store secrets in tfvars or state.&lt;/li&gt;
&lt;li&gt;Use Vault or Cloud KMS/Secrets Manager.&lt;/li&gt;
&lt;li&gt;Restrict who can read &lt;code&gt;terraform.tfstate&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Use S3 bucket encryption &amp;amp; versioning for state.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="testing--cicd"&gt;&lt;strong&gt;Testing &amp;amp; CI/CD&lt;/strong&gt;&lt;a class="anchor" href="#testing--cicd"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;tflint&lt;/strong&gt; → syntax + best practices.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;tfsec / checkov&lt;/strong&gt; → security scanning.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;terratest&lt;/strong&gt; → automated infra tests in Go.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pre-commit hooks&lt;/strong&gt; for fmt, validate.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="common-interview-questions"&gt;&lt;strong&gt;Common Interview Questions&lt;/strong&gt;&lt;a class="anchor" href="#common-interview-questions"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Explain Terraform state and why it&amp;rsquo;s needed.&lt;/li&gt;
&lt;li&gt;Difference between &lt;strong&gt;local&lt;/strong&gt; and &lt;strong&gt;remote&lt;/strong&gt; backends.&lt;/li&gt;
&lt;li&gt;What happens if you manually modify resources in AWS?&lt;/li&gt;
&lt;li&gt;Purpose of modules and how to structure them.&lt;/li&gt;
&lt;li&gt;How to handle secrets in Terraform?&lt;/li&gt;
&lt;li&gt;Difference between workspaces vs separate repos/states.&lt;/li&gt;
&lt;li&gt;How to avoid downtime during resource updates?&lt;/li&gt;
&lt;li&gt;Why provisioners are discouraged.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="recommended-terraform-directory-structure"&gt;&lt;strong&gt;Recommended Terraform directory structure&lt;/strong&gt;&lt;a class="anchor" href="#recommended-terraform-directory-structure"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;terraform/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── modules/ &lt;span style="color:#75715e"&gt;# reusable building blocks (no env-specific values)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├── vpc/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ │ ├── main.tf
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ │ ├── variables.tf
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ │ ├── outputs.tf
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ │ └── README.md
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├── eks/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ └── rds/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── envs/ &lt;span style="color:#75715e"&gt;# environment roots (compose modules here)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├── dev/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ │ ├── main.tf &lt;span style="color:#75715e"&gt;# calls modules&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ │ ├── variables.tf
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ │ ├── dev.tfvars &lt;span style="color:#75715e"&gt;# optional: env values&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ │ ├── backend.tf &lt;span style="color:#75715e"&gt;# remote state config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ │ └── providers.tf
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├── stage/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ └── prod/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── global/ &lt;span style="color:#75715e"&gt;# shared things used by multiple envs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├── iam/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├── route53/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ └── org-policies/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── scripts/ &lt;span style="color:#75715e"&gt;# helper scripts (plan wrappers, lint, etc.)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├── fmt.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├── validate.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ └── drift-check.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── policies/ &lt;span style="color:#75715e"&gt;# OPA/Sentinel/Conftest policies&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── tests/ &lt;span style="color:#75715e"&gt;# terratest / kitchen-terraform / etc.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── .terraform.lock.hcl
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;└── README.md&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="related-topics"&gt;Related topics&lt;a class="anchor" href="#related-topics"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ewry.net/devops-sre-interview-questions/"&gt;DevOps &amp;amp; SRE interview questions — main page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ewry.net/devops-sre-interview-questions/devops-middle-senior-interview-questions/"&gt;DevOps middle+, senior interview questions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ewry.net/devops-sre-interview-questions/ansible/"&gt;Ansible&lt;/a&gt; — configuration management paired with Terraform&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ewry.net/devops-sre-interview-questions/kubernetes/"&gt;Kubernetes&lt;/a&gt; — infrastructure Terraform often provisions&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ewry.net/devops-sre-interview-questions/aws-cloud-concepts/"&gt;AWS &amp;amp; cloud concepts&lt;/a&gt; — cloud provider Terraform manages&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ewry.net/devops-sre-interview-questions/github-actions/"&gt;GitHub Actions&lt;/a&gt; — run Terraform in CI/CD pipelines&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ewry.net/devops-sre-interview-questions/gitlab/"&gt;GitLab CI/CD&lt;/a&gt; — alternative CI for Terraform workflows&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>