<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Marco</title>
    <description>The latest articles on DEV Community by Marco (@marco13moo).</description>
    <link>https://dev.to/marco13moo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4075032%2Fa20d9ca5-581a-4a78-a7f5-ee6aad8134f5.jpg</url>
      <title>DEV Community: Marco</title>
      <link>https://dev.to/marco13moo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/marco13moo"/>
    <language>en</language>
    <item>
      <title>Daily Dose of DevOps — Kubernetes readiness vs liveness probes</title>
      <dc:creator>Marco</dc:creator>
      <pubDate>Wed, 02 Sep 2026 11:54:29 +0000</pubDate>
      <link>https://dev.to/marco13moo/daily-dose-of-devops-kubernetes-readiness-vs-liveness-probes-ea0</link>
      <guid>https://dev.to/marco13moo/daily-dose-of-devops-kubernetes-readiness-vs-liveness-probes-ea0</guid>
      <description>&lt;h1&gt;
  
  
  Kubernetes Probes as Failure Detectors: Semantics, Timing, and Cascading Risk
&lt;/h1&gt;

&lt;p&gt;Kubernetes probes are distributed-systems failure detectors with different control effects. A readiness failure removes a Pod from Service endpoints; a liveness failure asks the kubelet to restart the container. The distinction matters because detection is necessarily imperfect: aggressive thresholds reduce detection latency but increase false positives under transient load.&lt;/p&gt;

&lt;h2&gt;
  
  
  Readiness protects traffic; liveness repairs deadlock
&lt;/h2&gt;

&lt;p&gt;Readiness should answer: “Can this replica safely accept new work now?” It may include critical local state and indispensable downstream dependencies, but indiscriminately probing every dependency can create a cascade: one database slowdown marks every replica unready, eliminating all capacity precisely when graceful degradation is needed.&lt;/p&gt;

&lt;p&gt;Liveness should answer a narrower question: “Is the process irrecoverably stuck such that restart is the best available remediation?” It should not fail because a remote dependency is unavailable. Restarting healthy processes during a network partition adds cold-start pressure without repairing the dependency.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;startupProbe&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;httpGet&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;/health/startup&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;8080&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;periodSeconds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
  &lt;span class="na"&gt;failureThreshold&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;30&lt;/span&gt;
&lt;span class="na"&gt;readinessProbe&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;httpGet&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;/health/ready&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;8080&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;periodSeconds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
  &lt;span class="na"&gt;failureThreshold&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
&lt;span class="na"&gt;livenessProbe&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;httpGet&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;/health/live&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;8080&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;periodSeconds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
  &lt;span class="na"&gt;failureThreshold&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The startup probe creates a temporal firewall: until initialization succeeds, liveness checks are suppressed. This prevents slow but valid startup from entering a restart loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deriving thresholds
&lt;/h2&gt;

&lt;p&gt;Probe timing should follow measured distributions, not folklore. Let the check interval be &lt;em&gt;p&lt;/em&gt;, timeout &lt;em&gt;t&lt;/em&gt;, and failure threshold &lt;em&gt;f&lt;/em&gt;. Approximate worst-case detection latency is &lt;em&gt;p × f&lt;/em&gt;, plus request timeout effects. Choose this against the service’s recovery-time objective and the cost of a false positive. Then validate under CPU throttling, garbage-collection pauses, dependency latency, and node pressure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Readiness changes routing; liveness triggers restart; startup protects initialization.&lt;/li&gt;
&lt;li&gt;Keep liveness local and conservative.&lt;/li&gt;
&lt;li&gt;Design readiness for graceful degradation rather than dependency-amplified outages.&lt;/li&gt;
&lt;li&gt;Derive timings from latency distributions and test them under realistic resource pressure.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>architecture</category>
      <category>devops</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>Daily Dose of DevOps — What is CI/CD and why it matters</title>
      <dc:creator>Marco</dc:creator>
      <pubDate>Tue, 01 Sep 2026 12:16:51 +0000</pubDate>
      <link>https://dev.to/marco13moo/daily-dose-of-devops-what-is-cicd-and-why-it-matters-5h67</link>
      <guid>https://dev.to/marco13moo/daily-dose-of-devops-what-is-cicd-and-why-it-matters-5h67</guid>
      <description>&lt;h1&gt;
  
  
  CI/CD as a Control System: From Commit Entropy to Production Evidence
&lt;/h1&gt;

&lt;p&gt;CI/CD is often reduced to automation, but its deeper purpose is epistemic: it converts uncertain changes into evidence about whether a system remains safe to operate. A pipeline is a feedback controller. Source changes are disturbances; tests, policy checks, and telemetry are sensors; deployment strategies are actuators; service-level objectives define acceptable operating bounds.&lt;/p&gt;

&lt;h2&gt;
  
  
  The control loop
&lt;/h2&gt;

&lt;p&gt;Continuous integration reduces integration entropy by keeping change sets small and repeatedly testing their composition. Continuous delivery preserves a deployable state; continuous deployment automatically promotes changes after policy gates succeed. These are distinct maturity levels, and conflating them creates unsafe expectations.&lt;/p&gt;

&lt;p&gt;A defensible pipeline evaluates more than functional correctness:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Provenance:&lt;/strong&gt; Can every artifact be traced to reviewed source and a reproducible build?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security:&lt;/strong&gt; Were dependencies, secrets, permissions, and artifact signatures evaluated?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operability:&lt;/strong&gt; Do latency, saturation, error-rate, and rollback signals exist before promotion?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Change risk:&lt;/strong&gt; Is rollout scope proportional to uncertainty?
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;promote&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;needs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;unit&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;integration&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;policy&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;sbom&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;production&lt;/span&gt;
  &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cosign verify --key cosign.pub artifact.example/app:$GIT_SHA&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deploy --strategy=canary --initial-traffic=1%&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;verify-slo --window=15m --max-error-budget-burn=2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why small batches dominate
&lt;/h2&gt;

&lt;p&gt;If each changed component has some independent probability of introducing a defect, larger batches increase both the probability of failure and the diagnostic search space. Independence is an imperfect assumption—software dependencies are correlated—but the conclusion survives: small batches shorten feedback latency and improve causal attribution. Deployment frequency is therefore valuable only when paired with fast recovery and trustworthy verification.&lt;/p&gt;

&lt;h2&gt;
  
  
  Failure modes
&lt;/h2&gt;

&lt;p&gt;Pipeline success is not proof of production safety. Tests may encode incomplete specifications; staging traffic rarely matches production; mutable tags can sever provenance; and approval gates can become ceremonial. A mature design treats every gate as a falsifiable claim and continuously measures its predictive power. Flaky tests, for example, are not harmless noise: they weaken the statistical meaning of a green build and train operators to ignore alarms.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;CI/CD is a socio-technical feedback system, not merely a collection of scripts.&lt;/li&gt;
&lt;li&gt;Optimize for evidence quality, small batch size, bounded blast radius, and reversible change.&lt;/li&gt;
&lt;li&gt;A green pipeline is a risk estimate; production telemetry must close the control loop.&lt;/li&gt;
&lt;li&gt;Measure lead time and deployment frequency alongside change-failure rate and recovery time.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>automation</category>
      <category>cicd</category>
      <category>devops</category>
    </item>
    <item>
      <title>Daily Dose of DevOps — GitHub Actions basics for DevOps</title>
      <dc:creator>Marco</dc:creator>
      <pubDate>Mon, 31 Aug 2026 14:43:35 +0000</pubDate>
      <link>https://dev.to/marco13moo/daily-dose-of-devops-github-actions-basics-for-devops-5b70</link>
      <guid>https://dev.to/marco13moo/daily-dose-of-devops-github-actions-basics-for-devops-5b70</guid>
      <description>&lt;h1&gt;
  
  
  GitHub Actions as a Capability System: Secure Automation by Construction
&lt;/h1&gt;

&lt;p&gt;GitHub Actions combines an event system, workflow scheduler, ephemeral compute, and credential broker. Its primary security question is not “Does the YAML run?” but “What authority can untrusted input exercise?” A workflow triggered by pull-request content sits on a trust boundary: branch names, commit contents, issue text, and third-party action outputs may all be attacker-controlled.&lt;/p&gt;

&lt;h2&gt;
  
  
  Minimize authority
&lt;/h2&gt;

&lt;p&gt;Permissions should be explicit and job-scoped. Build jobs usually need read-only repository access; deployment jobs can receive stronger rights only after protected-environment controls succeed. OpenID Connect is preferable to long-lived cloud credentials because it exchanges a short-lived, claim-bound identity at runtime.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;read&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;production&lt;/span&gt;
    &lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;read&lt;/span&gt;
      &lt;span class="na"&gt;id-token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@&amp;lt;immutable-commit-sha&amp;gt;&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm ci --ignore-scripts&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm test&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./scripts/deploy.sh&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pin third-party actions to immutable commit SHAs, review their provenance, and use dependency automation to propose controlled updates. Tags are readable but mutable. Treat workflow logs and artifacts as potential exfiltration channels; masking is not a substitute for preventing secret exposure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reproducibility and concurrency
&lt;/h2&gt;

&lt;p&gt;Use lockfiles and deterministic installation commands. Separate build from deployment, promote the same verified artifact, and attach provenance rather than rebuilding per environment. Apply concurrency groups to prevent stale deployments from racing newer commits, while choosing cancellation semantics carefully for stateful operations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Model workflows as programs executing with capabilities and untrusted inputs.&lt;/li&gt;
&lt;li&gt;Grant the minimum token permissions at the narrowest job scope.&lt;/li&gt;
&lt;li&gt;Prefer short-lived federated identity and immutable dependencies.&lt;/li&gt;
&lt;li&gt;Build once, verify provenance, and promote the identical artifact through environments.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>automation</category>
      <category>devops</category>
      <category>github</category>
      <category>security</category>
    </item>
    <item>
      <title>Daily Dose of DevOps — Terraform remote state explained</title>
      <dc:creator>Marco</dc:creator>
      <pubDate>Sun, 30 Aug 2026 12:29:31 +0000</pubDate>
      <link>https://dev.to/marco13moo/daily-dose-of-devops-terraform-remote-state-explained-193d</link>
      <guid>https://dev.to/marco13moo/daily-dose-of-devops-terraform-remote-state-explained-193d</guid>
      <description>&lt;h1&gt;
  
  
  Terraform Remote State: A Consistency Boundary for Infrastructure Control
&lt;/h1&gt;

&lt;p&gt;Terraform state is not a cache that can be casually regenerated. It is the controller’s mapping between declarative addresses and real provider objects, including dependency metadata and sensitive attributes. Remote state turns that mapping into a shared consistency boundary for teams and automation.&lt;/p&gt;

&lt;h2&gt;
  
  
  State, locking, and serializability
&lt;/h2&gt;

&lt;p&gt;Concurrent applies are competing writers. Without coordination, each run may calculate a valid plan from the same prior snapshot and then overwrite the other’s observations—a lost-update anomaly. A backend lock approximates single-writer serializability, but only if every writer honors it and lock leases are handled safely.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;terraform&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;backend&lt;/span&gt; &lt;span class="s2"&gt;"s3"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;bucket&lt;/span&gt;       &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"org-terraform-state"&lt;/span&gt;
    &lt;span class="nx"&gt;key&lt;/span&gt;          &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"production/network.tfstate"&lt;/span&gt;
    &lt;span class="nx"&gt;region&lt;/span&gt;       &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"eu-west-1"&lt;/span&gt;
    &lt;span class="nx"&gt;encrypt&lt;/span&gt;      &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="nx"&gt;use_lockfile&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Encryption at rest is necessary but insufficient. Use narrowly scoped identities, transport encryption, access logs, object versioning, retention controls, and tested recovery. State often contains credentials or connection material even when configuration marks outputs as sensitive; “sensitive” primarily controls presentation, not storage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Partition by failure domain
&lt;/h2&gt;

&lt;p&gt;A single monolithic state increases lock contention, plan latency, privilege breadth, and blast radius. Excessive fragmentation, however, produces brittle cross-state dependencies and coordination overhead. Prefer boundaries aligned with ownership, lifecycle, privilege, and failure domains. Exchange stable identifiers through explicit interfaces rather than exposing entire state snapshots.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recovery discipline
&lt;/h2&gt;

&lt;p&gt;Never repair state by editing JSON under pressure. First stop writers, preserve the current object and its versions, compare state with provider reality, and use supported operations such as import, moved blocks, or state move. A backend backup is only credible after a restore exercise demonstrates recovery point and recovery time objectives.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Remote state is a critical consistency and security boundary.&lt;/li&gt;
&lt;li&gt;Locking prevents competing writers only when all automation uses the same backend discipline.&lt;/li&gt;
&lt;li&gt;Partition state along operational boundaries, not arbitrary directory structure.&lt;/li&gt;
&lt;li&gt;Version, audit, encrypt, restrict, and regularly test restoration.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devops</category>
      <category>infrastructure</category>
      <category>terraform</category>
    </item>
    <item>
      <title>Daily Dose of DevOps — Kubernetes readiness vs liveness probes</title>
      <dc:creator>Marco</dc:creator>
      <pubDate>Sat, 29 Aug 2026 12:54:52 +0000</pubDate>
      <link>https://dev.to/marco13moo/daily-dose-of-devops-kubernetes-readiness-vs-liveness-probes-2bnh</link>
      <guid>https://dev.to/marco13moo/daily-dose-of-devops-kubernetes-readiness-vs-liveness-probes-2bnh</guid>
      <description>&lt;h1&gt;
  
  
  Kubernetes Probes as Failure Detectors: Semantics, Timing, and Cascading Risk
&lt;/h1&gt;

&lt;p&gt;Kubernetes probes are distributed-systems failure detectors with different control effects. A readiness failure removes a Pod from Service endpoints; a liveness failure asks the kubelet to restart the container. The distinction matters because detection is necessarily imperfect: aggressive thresholds reduce detection latency but increase false positives under transient load.&lt;/p&gt;

&lt;h2&gt;
  
  
  Readiness protects traffic; liveness repairs deadlock
&lt;/h2&gt;

&lt;p&gt;Readiness should answer: “Can this replica safely accept new work now?” It may include critical local state and indispensable downstream dependencies, but indiscriminately probing every dependency can create a cascade: one database slowdown marks every replica unready, eliminating all capacity precisely when graceful degradation is needed.&lt;/p&gt;

&lt;p&gt;Liveness should answer a narrower question: “Is the process irrecoverably stuck such that restart is the best available remediation?” It should not fail because a remote dependency is unavailable. Restarting healthy processes during a network partition adds cold-start pressure without repairing the dependency.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;startupProbe&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;httpGet&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;/health/startup&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;8080&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;periodSeconds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
  &lt;span class="na"&gt;failureThreshold&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;30&lt;/span&gt;
&lt;span class="na"&gt;readinessProbe&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;httpGet&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;/health/ready&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;8080&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;periodSeconds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
  &lt;span class="na"&gt;failureThreshold&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
&lt;span class="na"&gt;livenessProbe&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;httpGet&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;/health/live&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;8080&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;periodSeconds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
  &lt;span class="na"&gt;failureThreshold&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The startup probe creates a temporal firewall: until initialization succeeds, liveness checks are suppressed. This prevents slow but valid startup from entering a restart loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deriving thresholds
&lt;/h2&gt;

&lt;p&gt;Probe timing should follow measured distributions, not folklore. Let the check interval be &lt;em&gt;p&lt;/em&gt;, timeout &lt;em&gt;t&lt;/em&gt;, and failure threshold &lt;em&gt;f&lt;/em&gt;. Approximate worst-case detection latency is &lt;em&gt;p × f&lt;/em&gt;, plus request timeout effects. Choose this against the service’s recovery-time objective and the cost of a false positive. Then validate under CPU throttling, garbage-collection pauses, dependency latency, and node pressure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Readiness changes routing; liveness triggers restart; startup protects initialization.&lt;/li&gt;
&lt;li&gt;Keep liveness local and conservative.&lt;/li&gt;
&lt;li&gt;Design readiness for graceful degradation rather than dependency-amplified outages.&lt;/li&gt;
&lt;li&gt;Derive timings from latency distributions and test them under realistic resource pressure.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devops</category>
      <category>kubernetes</category>
      <category>sre</category>
    </item>
    <item>
      <title>Daily Dose of DevOps — What is CI/CD and why it matters</title>
      <dc:creator>Marco</dc:creator>
      <pubDate>Fri, 28 Aug 2026 19:11:16 +0000</pubDate>
      <link>https://dev.to/marco13moo/daily-dose-of-devops-what-is-cicd-and-why-it-matters-59j9</link>
      <guid>https://dev.to/marco13moo/daily-dose-of-devops-what-is-cicd-and-why-it-matters-59j9</guid>
      <description>&lt;h1&gt;
  
  
  CI/CD as a Control System: From Commit Entropy to Production Evidence
&lt;/h1&gt;

&lt;p&gt;CI/CD is often reduced to automation, but its deeper purpose is epistemic: it converts uncertain changes into evidence about whether a system remains safe to operate. A pipeline is a feedback controller. Source changes are disturbances; tests, policy checks, and telemetry are sensors; deployment strategies are actuators; service-level objectives define acceptable operating bounds.&lt;/p&gt;

&lt;h2&gt;
  
  
  The control loop
&lt;/h2&gt;

&lt;p&gt;Continuous integration reduces integration entropy by keeping change sets small and repeatedly testing their composition. Continuous delivery preserves a deployable state; continuous deployment automatically promotes changes after policy gates succeed. These are distinct maturity levels, and conflating them creates unsafe expectations.&lt;/p&gt;

&lt;p&gt;A defensible pipeline evaluates more than functional correctness:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Provenance:&lt;/strong&gt; Can every artifact be traced to reviewed source and a reproducible build?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security:&lt;/strong&gt; Were dependencies, secrets, permissions, and artifact signatures evaluated?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operability:&lt;/strong&gt; Do latency, saturation, error-rate, and rollback signals exist before promotion?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Change risk:&lt;/strong&gt; Is rollout scope proportional to uncertainty?
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;promote&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;needs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;unit&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;integration&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;policy&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;sbom&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;production&lt;/span&gt;
  &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cosign verify --key cosign.pub artifact.example/app:$GIT_SHA&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deploy --strategy=canary --initial-traffic=1%&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;verify-slo --window=15m --max-error-budget-burn=2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why small batches dominate
&lt;/h2&gt;

&lt;p&gt;If each changed component has some independent probability of introducing a defect, larger batches increase both the probability of failure and the diagnostic search space. Independence is an imperfect assumption—software dependencies are correlated—but the conclusion survives: small batches shorten feedback latency and improve causal attribution. Deployment frequency is therefore valuable only when paired with fast recovery and trustworthy verification.&lt;/p&gt;

&lt;h2&gt;
  
  
  Failure modes
&lt;/h2&gt;

&lt;p&gt;Pipeline success is not proof of production safety. Tests may encode incomplete specifications; staging traffic rarely matches production; mutable tags can sever provenance; and approval gates can become ceremonial. A mature design treats every gate as a falsifiable claim and continuously measures its predictive power. Flaky tests, for example, are not harmless noise: they weaken the statistical meaning of a green build and train operators to ignore alarms.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;CI/CD is a socio-technical feedback system, not merely a collection of scripts.&lt;/li&gt;
&lt;li&gt;Optimize for evidence quality, small batch size, bounded blast radius, and reversible change.&lt;/li&gt;
&lt;li&gt;A green pipeline is a risk estimate; production telemetry must close the control loop.&lt;/li&gt;
&lt;li&gt;Measure lead time and deployment frequency alongside change-failure rate and recovery time.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>automation</category>
      <category>cicd</category>
      <category>devops</category>
    </item>
    <item>
      <title>Daily Dose of DevOps — GitHub Actions basics for DevOps</title>
      <dc:creator>Marco</dc:creator>
      <pubDate>Thu, 27 Aug 2026 18:01:31 +0000</pubDate>
      <link>https://dev.to/marco13moo/daily-dose-of-devops-github-actions-basics-for-devops-2og8</link>
      <guid>https://dev.to/marco13moo/daily-dose-of-devops-github-actions-basics-for-devops-2og8</guid>
      <description>&lt;h1&gt;
  
  
  GitHub Actions as a Capability System: Secure Automation by Construction
&lt;/h1&gt;

&lt;p&gt;GitHub Actions combines an event system, workflow scheduler, ephemeral compute, and credential broker. Its primary security question is not “Does the YAML run?” but “What authority can untrusted input exercise?” A workflow triggered by pull-request content sits on a trust boundary: branch names, commit contents, issue text, and third-party action outputs may all be attacker-controlled.&lt;/p&gt;

&lt;h2&gt;
  
  
  Minimize authority
&lt;/h2&gt;

&lt;p&gt;Permissions should be explicit and job-scoped. Build jobs usually need read-only repository access; deployment jobs can receive stronger rights only after protected-environment controls succeed. OpenID Connect is preferable to long-lived cloud credentials because it exchanges a short-lived, claim-bound identity at runtime.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;read&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;production&lt;/span&gt;
    &lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;read&lt;/span&gt;
      &lt;span class="na"&gt;id-token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@&amp;lt;immutable-commit-sha&amp;gt;&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm ci --ignore-scripts&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm test&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./scripts/deploy.sh&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pin third-party actions to immutable commit SHAs, review their provenance, and use dependency automation to propose controlled updates. Tags are readable but mutable. Treat workflow logs and artifacts as potential exfiltration channels; masking is not a substitute for preventing secret exposure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reproducibility and concurrency
&lt;/h2&gt;

&lt;p&gt;Use lockfiles and deterministic installation commands. Separate build from deployment, promote the same verified artifact, and attach provenance rather than rebuilding per environment. Apply concurrency groups to prevent stale deployments from racing newer commits, while choosing cancellation semantics carefully for stateful operations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Model workflows as programs executing with capabilities and untrusted inputs.&lt;/li&gt;
&lt;li&gt;Grant the minimum token permissions at the narrowest job scope.&lt;/li&gt;
&lt;li&gt;Prefer short-lived federated identity and immutable dependencies.&lt;/li&gt;
&lt;li&gt;Build once, verify provenance, and promote the identical artifact through environments.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>automation</category>
      <category>devops</category>
      <category>github</category>
      <category>security</category>
    </item>
    <item>
      <title>Daily Dose of DevOps — Terraform remote state explained</title>
      <dc:creator>Marco</dc:creator>
      <pubDate>Wed, 26 Aug 2026 07:40:31 +0000</pubDate>
      <link>https://dev.to/marco13moo/daily-dose-of-devops-terraform-remote-state-explained-4p6g</link>
      <guid>https://dev.to/marco13moo/daily-dose-of-devops-terraform-remote-state-explained-4p6g</guid>
      <description>&lt;h1&gt;
  
  
  Terraform Remote State: A Consistency Boundary for Infrastructure Control
&lt;/h1&gt;

&lt;p&gt;Terraform state is not a cache that can be casually regenerated. It is the controller’s mapping between declarative addresses and real provider objects, including dependency metadata and sensitive attributes. Remote state turns that mapping into a shared consistency boundary for teams and automation.&lt;/p&gt;

&lt;h2&gt;
  
  
  State, locking, and serializability
&lt;/h2&gt;

&lt;p&gt;Concurrent applies are competing writers. Without coordination, each run may calculate a valid plan from the same prior snapshot and then overwrite the other’s observations—a lost-update anomaly. A backend lock approximates single-writer serializability, but only if every writer honors it and lock leases are handled safely.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;terraform&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;backend&lt;/span&gt; &lt;span class="s2"&gt;"s3"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;bucket&lt;/span&gt;       &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"org-terraform-state"&lt;/span&gt;
    &lt;span class="nx"&gt;key&lt;/span&gt;          &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"production/network.tfstate"&lt;/span&gt;
    &lt;span class="nx"&gt;region&lt;/span&gt;       &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"eu-west-1"&lt;/span&gt;
    &lt;span class="nx"&gt;encrypt&lt;/span&gt;      &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="nx"&gt;use_lockfile&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Encryption at rest is necessary but insufficient. Use narrowly scoped identities, transport encryption, access logs, object versioning, retention controls, and tested recovery. State often contains credentials or connection material even when configuration marks outputs as sensitive; “sensitive” primarily controls presentation, not storage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Partition by failure domain
&lt;/h2&gt;

&lt;p&gt;A single monolithic state increases lock contention, plan latency, privilege breadth, and blast radius. Excessive fragmentation, however, produces brittle cross-state dependencies and coordination overhead. Prefer boundaries aligned with ownership, lifecycle, privilege, and failure domains. Exchange stable identifiers through explicit interfaces rather than exposing entire state snapshots.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recovery discipline
&lt;/h2&gt;

&lt;p&gt;Never repair state by editing JSON under pressure. First stop writers, preserve the current object and its versions, compare state with provider reality, and use supported operations such as import, moved blocks, or state move. A backend backup is only credible after a restore exercise demonstrates recovery point and recovery time objectives.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Remote state is a critical consistency and security boundary.&lt;/li&gt;
&lt;li&gt;Locking prevents competing writers only when all automation uses the same backend discipline.&lt;/li&gt;
&lt;li&gt;Partition state along operational boundaries, not arbitrary directory structure.&lt;/li&gt;
&lt;li&gt;Version, audit, encrypt, restrict, and regularly test restoration.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>automation</category>
      <category>devops</category>
      <category>infrastructure</category>
      <category>terraform</category>
    </item>
    <item>
      <title>Daily Dose of DevOps — Kubernetes readiness vs liveness probes</title>
      <dc:creator>Marco</dc:creator>
      <pubDate>Tue, 25 Aug 2026 07:38:51 +0000</pubDate>
      <link>https://dev.to/marco13moo/daily-dose-of-devops-kubernetes-readiness-vs-liveness-probes-17ij</link>
      <guid>https://dev.to/marco13moo/daily-dose-of-devops-kubernetes-readiness-vs-liveness-probes-17ij</guid>
      <description>&lt;h1&gt;
  
  
  Kubernetes Probes as Failure Detectors: Semantics, Timing, and Cascading Risk
&lt;/h1&gt;

&lt;p&gt;Kubernetes probes are distributed-systems failure detectors with different control effects. A readiness failure removes a Pod from Service endpoints; a liveness failure asks the kubelet to restart the container. The distinction matters because detection is necessarily imperfect: aggressive thresholds reduce detection latency but increase false positives under transient load.&lt;/p&gt;

&lt;h2&gt;
  
  
  Readiness protects traffic; liveness repairs deadlock
&lt;/h2&gt;

&lt;p&gt;Readiness should answer: “Can this replica safely accept new work now?” It may include critical local state and indispensable downstream dependencies, but indiscriminately probing every dependency can create a cascade: one database slowdown marks every replica unready, eliminating all capacity precisely when graceful degradation is needed.&lt;/p&gt;

&lt;p&gt;Liveness should answer a narrower question: “Is the process irrecoverably stuck such that restart is the best available remediation?” It should not fail because a remote dependency is unavailable. Restarting healthy processes during a network partition adds cold-start pressure without repairing the dependency.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;startupProbe&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;httpGet&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;/health/startup&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;8080&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;periodSeconds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
  &lt;span class="na"&gt;failureThreshold&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;30&lt;/span&gt;
&lt;span class="na"&gt;readinessProbe&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;httpGet&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;/health/ready&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;8080&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;periodSeconds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
  &lt;span class="na"&gt;failureThreshold&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
&lt;span class="na"&gt;livenessProbe&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;httpGet&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;/health/live&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;8080&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;periodSeconds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
  &lt;span class="na"&gt;failureThreshold&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The startup probe creates a temporal firewall: until initialization succeeds, liveness checks are suppressed. This prevents slow but valid startup from entering a restart loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deriving thresholds
&lt;/h2&gt;

&lt;p&gt;Probe timing should follow measured distributions, not folklore. Let the check interval be &lt;em&gt;p&lt;/em&gt;, timeout &lt;em&gt;t&lt;/em&gt;, and failure threshold &lt;em&gt;f&lt;/em&gt;. Approximate worst-case detection latency is &lt;em&gt;p × f&lt;/em&gt;, plus request timeout effects. Choose this against the service’s recovery-time objective and the cost of a false positive. Then validate under CPU throttling, garbage-collection pauses, dependency latency, and node pressure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Readiness changes routing; liveness triggers restart; startup protects initialization.&lt;/li&gt;
&lt;li&gt;Keep liveness local and conservative.&lt;/li&gt;
&lt;li&gt;Design readiness for graceful degradation rather than dependency-amplified outages.&lt;/li&gt;
&lt;li&gt;Derive timings from latency distributions and test them under realistic resource pressure.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devops</category>
      <category>kubernetes</category>
      <category>sre</category>
    </item>
    <item>
      <title>Daily Dose of DevOps — What is CI/CD and why it matters</title>
      <dc:creator>Marco</dc:creator>
      <pubDate>Mon, 24 Aug 2026 07:52:16 +0000</pubDate>
      <link>https://dev.to/marco13moo/daily-dose-of-devops-what-is-cicd-and-why-it-matters-3opo</link>
      <guid>https://dev.to/marco13moo/daily-dose-of-devops-what-is-cicd-and-why-it-matters-3opo</guid>
      <description>&lt;h1&gt;
  
  
  CI/CD as a Control System: From Commit Entropy to Production Evidence
&lt;/h1&gt;

&lt;p&gt;CI/CD is often reduced to automation, but its deeper purpose is epistemic: it converts uncertain changes into evidence about whether a system remains safe to operate. A pipeline is a feedback controller. Source changes are disturbances; tests, policy checks, and telemetry are sensors; deployment strategies are actuators; service-level objectives define acceptable operating bounds.&lt;/p&gt;

&lt;h2&gt;
  
  
  The control loop
&lt;/h2&gt;

&lt;p&gt;Continuous integration reduces integration entropy by keeping change sets small and repeatedly testing their composition. Continuous delivery preserves a deployable state; continuous deployment automatically promotes changes after policy gates succeed. These are distinct maturity levels, and conflating them creates unsafe expectations.&lt;/p&gt;

&lt;p&gt;A defensible pipeline evaluates more than functional correctness:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Provenance:&lt;/strong&gt; Can every artifact be traced to reviewed source and a reproducible build?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security:&lt;/strong&gt; Were dependencies, secrets, permissions, and artifact signatures evaluated?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operability:&lt;/strong&gt; Do latency, saturation, error-rate, and rollback signals exist before promotion?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Change risk:&lt;/strong&gt; Is rollout scope proportional to uncertainty?
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;promote&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;needs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;unit&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;integration&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;policy&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;sbom&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;production&lt;/span&gt;
  &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cosign verify --key cosign.pub artifact.example/app:$GIT_SHA&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deploy --strategy=canary --initial-traffic=1%&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;verify-slo --window=15m --max-error-budget-burn=2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why small batches dominate
&lt;/h2&gt;

&lt;p&gt;If each changed component has some independent probability of introducing a defect, larger batches increase both the probability of failure and the diagnostic search space. Independence is an imperfect assumption—software dependencies are correlated—but the conclusion survives: small batches shorten feedback latency and improve causal attribution. Deployment frequency is therefore valuable only when paired with fast recovery and trustworthy verification.&lt;/p&gt;

&lt;h2&gt;
  
  
  Failure modes
&lt;/h2&gt;

&lt;p&gt;Pipeline success is not proof of production safety. Tests may encode incomplete specifications; staging traffic rarely matches production; mutable tags can sever provenance; and approval gates can become ceremonial. A mature design treats every gate as a falsifiable claim and continuously measures its predictive power. Flaky tests, for example, are not harmless noise: they weaken the statistical meaning of a green build and train operators to ignore alarms.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;CI/CD is a socio-technical feedback system, not merely a collection of scripts.&lt;/li&gt;
&lt;li&gt;Optimize for evidence quality, small batch size, bounded blast radius, and reversible change.&lt;/li&gt;
&lt;li&gt;A green pipeline is a risk estimate; production telemetry must close the control loop.&lt;/li&gt;
&lt;li&gt;Measure lead time and deployment frequency alongside change-failure rate and recovery time.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>automation</category>
      <category>cicd</category>
      <category>devops</category>
    </item>
    <item>
      <title>Daily Dose of DevOps — GitHub Actions basics for DevOps</title>
      <dc:creator>Marco</dc:creator>
      <pubDate>Sun, 23 Aug 2026 07:27:58 +0000</pubDate>
      <link>https://dev.to/marco13moo/daily-dose-of-devops-github-actions-basics-for-devops-l6o</link>
      <guid>https://dev.to/marco13moo/daily-dose-of-devops-github-actions-basics-for-devops-l6o</guid>
      <description>&lt;h1&gt;
  
  
  GitHub Actions as a Capability System: Secure Automation by Construction
&lt;/h1&gt;

&lt;p&gt;GitHub Actions combines an event system, workflow scheduler, ephemeral compute, and credential broker. Its primary security question is not “Does the YAML run?” but “What authority can untrusted input exercise?” A workflow triggered by pull-request content sits on a trust boundary: branch names, commit contents, issue text, and third-party action outputs may all be attacker-controlled.&lt;/p&gt;

&lt;h2&gt;
  
  
  Minimize authority
&lt;/h2&gt;

&lt;p&gt;Permissions should be explicit and job-scoped. Build jobs usually need read-only repository access; deployment jobs can receive stronger rights only after protected-environment controls succeed. OpenID Connect is preferable to long-lived cloud credentials because it exchanges a short-lived, claim-bound identity at runtime.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;read&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;production&lt;/span&gt;
    &lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;read&lt;/span&gt;
      &lt;span class="na"&gt;id-token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@&amp;lt;immutable-commit-sha&amp;gt;&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm ci --ignore-scripts&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm test&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./scripts/deploy.sh&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pin third-party actions to immutable commit SHAs, review their provenance, and use dependency automation to propose controlled updates. Tags are readable but mutable. Treat workflow logs and artifacts as potential exfiltration channels; masking is not a substitute for preventing secret exposure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reproducibility and concurrency
&lt;/h2&gt;

&lt;p&gt;Use lockfiles and deterministic installation commands. Separate build from deployment, promote the same verified artifact, and attach provenance rather than rebuilding per environment. Apply concurrency groups to prevent stale deployments from racing newer commits, while choosing cancellation semantics carefully for stateful operations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Model workflows as programs executing with capabilities and untrusted inputs.&lt;/li&gt;
&lt;li&gt;Grant the minimum token permissions at the narrowest job scope.&lt;/li&gt;
&lt;li&gt;Prefer short-lived federated identity and immutable dependencies.&lt;/li&gt;
&lt;li&gt;Build once, verify provenance, and promote the identical artifact through environments.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>automation</category>
      <category>devops</category>
      <category>github</category>
      <category>security</category>
    </item>
    <item>
      <title>Daily Dose of DevOps — Terraform remote state explained</title>
      <dc:creator>Marco</dc:creator>
      <pubDate>Sat, 22 Aug 2026 07:25:37 +0000</pubDate>
      <link>https://dev.to/marco13moo/daily-dose-of-devops-terraform-remote-state-explained-2104</link>
      <guid>https://dev.to/marco13moo/daily-dose-of-devops-terraform-remote-state-explained-2104</guid>
      <description>&lt;h1&gt;
  
  
  Terraform Remote State: A Consistency Boundary for Infrastructure Control
&lt;/h1&gt;

&lt;p&gt;Terraform state is not a cache that can be casually regenerated. It is the controller’s mapping between declarative addresses and real provider objects, including dependency metadata and sensitive attributes. Remote state turns that mapping into a shared consistency boundary for teams and automation.&lt;/p&gt;

&lt;h2&gt;
  
  
  State, locking, and serializability
&lt;/h2&gt;

&lt;p&gt;Concurrent applies are competing writers. Without coordination, each run may calculate a valid plan from the same prior snapshot and then overwrite the other’s observations—a lost-update anomaly. A backend lock approximates single-writer serializability, but only if every writer honors it and lock leases are handled safely.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;terraform&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;backend&lt;/span&gt; &lt;span class="s2"&gt;"s3"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;bucket&lt;/span&gt;       &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"org-terraform-state"&lt;/span&gt;
    &lt;span class="nx"&gt;key&lt;/span&gt;          &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"production/network.tfstate"&lt;/span&gt;
    &lt;span class="nx"&gt;region&lt;/span&gt;       &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"eu-west-1"&lt;/span&gt;
    &lt;span class="nx"&gt;encrypt&lt;/span&gt;      &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="nx"&gt;use_lockfile&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Encryption at rest is necessary but insufficient. Use narrowly scoped identities, transport encryption, access logs, object versioning, retention controls, and tested recovery. State often contains credentials or connection material even when configuration marks outputs as sensitive; “sensitive” primarily controls presentation, not storage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Partition by failure domain
&lt;/h2&gt;

&lt;p&gt;A single monolithic state increases lock contention, plan latency, privilege breadth, and blast radius. Excessive fragmentation, however, produces brittle cross-state dependencies and coordination overhead. Prefer boundaries aligned with ownership, lifecycle, privilege, and failure domains. Exchange stable identifiers through explicit interfaces rather than exposing entire state snapshots.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recovery discipline
&lt;/h2&gt;

&lt;p&gt;Never repair state by editing JSON under pressure. First stop writers, preserve the current object and its versions, compare state with provider reality, and use supported operations such as import, moved blocks, or state move. A backend backup is only credible after a restore exercise demonstrates recovery point and recovery time objectives.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Remote state is a critical consistency and security boundary.&lt;/li&gt;
&lt;li&gt;Locking prevents competing writers only when all automation uses the same backend discipline.&lt;/li&gt;
&lt;li&gt;Partition state along operational boundaries, not arbitrary directory structure.&lt;/li&gt;
&lt;li&gt;Version, audit, encrypt, restrict, and regularly test restoration.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devops</category>
      <category>infrastructure</category>
      <category>terraform</category>
    </item>
  </channel>
</rss>
