<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Persistent-Volume on K-Life Hack | Systems Architecture &amp; DevOps</title><link>https://klifehack.com/en/tags/persistent-volume/</link><description>Recent content in Persistent-Volume on K-Life Hack | Systems Architecture &amp; DevOps</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Wed, 15 Jul 2026 10:11:41 +0900</lastBuildDate><atom:link href="https://klifehack.com/en/tags/persistent-volume/index.xml" rel="self" type="application/rss+xml"/><item><title>Abstraction Design for Configuration Management and Data Persistence in Kubernetes</title><link>https://klifehack.com/en/p/k8s-config-persistence-strategy/</link><pubDate>Wed, 15 Jul 2026 10:11:41 +0900</pubDate><guid>https://klifehack.com/en/p/k8s-config-persistence-strategy/</guid><description>&lt;h1 id="pod-lifecycle-management-and-data-persistence-strategies-in-kubernetes"&gt;Pod Lifecycle Management and Data Persistence Strategies in Kubernetes
&lt;/h1&gt;&lt;p&gt;In infrastructure configurations using Kubernetes, Pods are inherently designed as ephemeral resources. Due to node maintenance, rolling updates, or unexpected system failures, Pods are frequently destroyed and replaced with new instances. In this dynamic lifecycle, making application configurations or generated data dependent on the internal filesystem of a Pod poses a critical risk of data loss or configuration inconsistency upon instance restart. This article details architectural designs for decoupling application code from configuration and ensuring data persistence.&lt;/p&gt;
&lt;h2 id="decoupling-configuration-management-introducing-configmap"&gt;Decoupling Configuration Management: Introducing ConfigMap
&lt;/h2&gt;&lt;p&gt;The practice of including environment variables or configuration files that control application behavior within the container image (Baking) forces the creation of environment-specific images, significantly reducing the flexibility of the deployment pipeline. By utilizing ConfigMap, it becomes possible to keep images immutable while injecting configurations at runtime.&lt;/p&gt;
&lt;h3 id="creating-and-injecting-configmaps"&gt;Creating and Injecting ConfigMaps
&lt;/h3&gt;&lt;p&gt;Definition of a ConfigMap containing practical configuration data.&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;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Example of creating a ConfigMap from literals&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl create configmap app-config --from-literal&lt;span style="color:#f92672"&gt;=&lt;/span&gt;APP_ENV&lt;span style="color:#f92672"&gt;=&lt;/span&gt;production --from-literal&lt;span style="color:#f92672"&gt;=&lt;/span&gt;LOG_LEVEL&lt;span style="color:#f92672"&gt;=&lt;/span&gt;info
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;There are two primary methods for injecting a created ConfigMap into a Pod: &amp;ldquo;Environment Variables&amp;rdquo; and &amp;ldquo;Volume Mounts.&amp;rdquo;&lt;/p&gt;
&lt;h4 id="1-injection-via-environment-variables"&gt;1. Injection via Environment Variables
&lt;/h4&gt;&lt;p&gt;Suitable for simple key-value format configurations.&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;-webkit-text-size-adjust:none;"&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;apiVersion&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;v1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;kind&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Pod&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;metadata&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;backend-api&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;spec&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;containers&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;api-container&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;backend-service:v1.2.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;env&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;APP_ENVIRONMENT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;valueFrom&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;configMapKeyRef&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;app-config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;key&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;APP_ENV&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="2-injection-via-volume-mounts"&gt;2. Injection via Volume Mounts
&lt;/h4&gt;&lt;p&gt;Suitable for handling complex configuration files such as nginx.conf or application.yaml. The contents of the ConfigMap are expanded as files within a directory.&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;-webkit-text-size-adjust:none;"&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;spec&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;containers&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;web-server&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;nginx:1.25&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumeMounts&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;config-volume&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;mountPath&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;/etc/config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;config-volume&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;configMap&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;app-config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="abstraction-of-data-persistence-pv-and-pvc"&gt;Abstraction of Data Persistence: PV and PVC
&lt;/h2&gt;&lt;p&gt;For data that must be maintained beyond the Pod lifecycle, such as database storage or log output destinations, an abstraction layer using Persistent Volume (PV) and Persistent Volume Claim (PVC) is constructed.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Persistent Volume (PV)&lt;/b&gt;: The physical storage entity within the cluster. Provisioned by an administrator.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Persistent Volume Claim (PVC)&lt;/b&gt;: A storage request by a user. Specifies the required capacity and access modes (e.g., ReadWriteOnce).&lt;/p&gt;
&lt;p&gt;This separation allows developers to utilize persistent storage through a standardized interface without being aware of the underlying storage infrastructure (NFS, cloud block storage, etc.).&lt;/p&gt;
&lt;h2 id="workload-management-and-self-healing"&gt;Workload Management and Self-healing
&lt;/h2&gt;&lt;p&gt;Pods with decoupled configuration and data achieve true availability when managed by controllers.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;Deployment&lt;/b&gt;: Maintains the specified number of replicas and automates rolling updates and rollbacks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;ReplicaSet&lt;/b&gt;: Monitors the health of Pods and provides a self-healing mechanism that immediately recreates Pods that terminate abnormally.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;DaemonSet&lt;/b&gt;: Guarantees the placement of Pods that should run uniformly on all nodes, such as log collection agents or monitoring tools.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="troubleshooting"&gt;Troubleshooting
&lt;/h2&gt;&lt;p&gt;Typical challenges and solutions encountered in production environments.&lt;/p&gt;
&lt;p&gt;⚠️ &lt;b&gt;Propagation Delay of ConfigMap Updates&lt;/b&gt;: Configurations injected as environment variables are not updated without a Pod restart. In the case of volume mounts, updates occur according to the Kubelet sync cycle (default approx. 1 minute), but logic to watch for file changes is required on the application side.&lt;/p&gt;
&lt;p&gt;⚠️ &lt;b&gt;PVC Binding Failure&lt;/b&gt;: If a PVC remains in a Pending state, verify whether the requested accessModes or storageClassName match an existing PV or StorageClass.&lt;/p&gt;
&lt;p&gt;⚠️ &lt;b&gt;Permission Errors&lt;/b&gt;: Non-root users within a container may lack write permissions for volume-mounted directories. This can be resolved by setting the fsGroup in the securityContext.&lt;/p&gt;
&lt;h2 id="operational-verifications"&gt;Operational Verifications
&lt;/h2&gt;&lt;p&gt;Standard verification commands for confirming consistency after deployment.&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;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Verify ConfigMap data integrity
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl describe configmap app-config
&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;# Verify environment variable injection inside the container
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl exec -it backend-api -- env | grep APP_
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;APP_ENVIRONMENT=production
&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;# Check volume mount status
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl exec -it web-server -- ls -l /etc/config
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;total 0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx 1 root root 14 Jul 15 10:00 APP_ENV -&amp;amp;gt; ..data/APP_ENV
&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;# Check PVC binding status
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl get pvc
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;data-claim Bound pvc-550e8400-e29b-41d4-a716-446655440000 10Gi RWO standard 5m
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="key-takeaways"&gt;Key Takeaways
&lt;/h2&gt;&lt;p&gt;The essence of resource management in Kubernetes lies in the premise that &amp;ldquo;Pods are disposable,&amp;rdquo; externalizing configuration to ConfigMaps and state to PV/PVCs. By strictly adhering to this loosely coupled design, resilience to infrastructure changes increases, and a cloud-native environment where automated scaling and self-healing function to their full potential is realized.&lt;/p&gt;</description></item></channel></rss>