<?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: Karthik Manam</title>
    <description>The latest articles on DEV Community by Karthik Manam (@karthikmanam).</description>
    <link>https://dev.to/karthikmanam</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2950177%2F146d42cc-5e1a-416d-b5d4-259b7b338357.jpeg</url>
      <title>DEV Community: Karthik Manam</title>
      <link>https://dev.to/karthikmanam</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/karthikmanam"/>
    <language>en</language>
    <item>
      <title>Cost Optimization and Reliability in Kubernetes: Enhanced Resource Management with Kyverno</title>
      <dc:creator>Karthik Manam</dc:creator>
      <pubDate>Tue, 18 Mar 2025 09:42:06 +0000</pubDate>
      <link>https://dev.to/karthikmanam/cost-optimization-and-reliability-in-kubernetes-enhanced-resource-management-with-kyverno-24hf</link>
      <guid>https://dev.to/karthikmanam/cost-optimization-and-reliability-in-kubernetes-enhanced-resource-management-with-kyverno-24hf</guid>
      <description>&lt;h1&gt;
  
  
  Table of Contents
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Abstract&lt;/li&gt;
&lt;li&gt;1. Introduction&lt;/li&gt;
&lt;li&gt;
2. Background

&lt;ul&gt;
&lt;li&gt;2.1 Kubernetes Resource Management&lt;/li&gt;
&lt;li&gt;2.2 StatefulSet Update Challenges&lt;/li&gt;
&lt;li&gt;2.3 Policy-as-Code with Kyverno&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

3. Methodology

&lt;ul&gt;
&lt;li&gt;3.1 Schedule-Based Resource Quotas&lt;/li&gt;
&lt;li&gt;3.2 StatefulSet Update Strategy Enforcement&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

4. Experimental Setup and Testing

&lt;ul&gt;
&lt;li&gt;4.1 Testing Environment&lt;/li&gt;
&lt;li&gt;4.2 Schedule-Based Quota Testing&lt;/li&gt;
&lt;li&gt;4.3 StatefulSet Update Strategy Testing&lt;/li&gt;
&lt;li&gt;4.4 Negative Testing Scenarios&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

5. Discussion

&lt;ul&gt;
&lt;li&gt;5.1 Cost Optimization Implications&lt;/li&gt;
&lt;li&gt;5.2 Reliability Implications&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

6. Practical Implementation

&lt;ul&gt;
&lt;li&gt;6.1 Deployment Considerations&lt;/li&gt;
&lt;li&gt;6.2 Installation Steps&lt;/li&gt;
&lt;li&gt;6.3 Verification&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;7. Conclusion&lt;/li&gt;

&lt;li&gt;References&lt;/li&gt;

&lt;/ul&gt;

&lt;h1&gt;
  
  
  Abstract
&lt;/h1&gt;

&lt;p&gt;This research examines two novel implementations of Kubernetes admission control policies using Kyverno: schedule-based resource quotas and StatefulSet update strategy enforcement. Both policies address critical operational challenges in modern cloud-native environments: cost optimization and application reliability during updates. Through practical implementation and testing, we demonstrate how declarative policy enforcement can yield significant improvements in resource utilization and deployment safety. The research provides empirical evidence that these approaches can successfully mitigate common operational challenges while requiring minimal administrative overhead.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Introduction
&lt;/h2&gt;

&lt;p&gt;The adoption of Kubernetes as the de facto container orchestration platform has revolutionized application deployment and management. However, organizations face persistent challenges in two critical areas: managing cloud resource costs and ensuring application reliability during updates. This paper explores how policy-as-code solutions, specifically Kyverno policies, can address these challenges through automated enforcement of best practices.&lt;br&gt;
Kubernetes environments often suffer from resource over-provisioning, leading to unnecessary cloud expenses. Additionally, improper update strategies for stateful applications can result in service disruptions and data inconsistencies. Both scenarios represent significant operational risks that can be mitigated through proper policy enforcement.&lt;/p&gt;

&lt;p&gt;This research presents two novel Kyverno policies designed to address these challenges:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Schedule-Based Resource Quotas: Dynamically adjusts resource quotas based on time-of-day to optimize cloud costs&lt;/li&gt;
&lt;li&gt;StatefulSet Update Strategy Enforcement: Ensures stateful applications use safe update strategies to maintain availability&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  2. Background
&lt;/h2&gt;
&lt;h3&gt;
  
  
  2.1 Kubernetes Resource Management
&lt;/h3&gt;

&lt;p&gt;Kubernetes provides mechanisms for resource allocation through requests and limits, along with namespace-level quotas. However, these allocations are typically static, failing to adapt to changing workload patterns throughout the day. Many production environments experience significant traffic variations between business and non-business hours [1].&lt;/p&gt;

&lt;p&gt;Resource over-provisioning is a common practice to accommodate peak loads, but it results in underutilized resources during off-peak hours, leading to unnecessary cloud expenses. Gartner estimates that organizations waste 30-45% of their cloud spend due to inefficient resource allocation [2].&lt;/p&gt;
&lt;h3&gt;
  
  
  2.2 StatefulSet Update Challenges
&lt;/h3&gt;

&lt;p&gt;StatefulSets manage stateful applications in Kubernetes, providing ordered deployment, scaling, and updates. Two update strategies exist:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RollingUpdate: Updates pods in reverse ordinal order, maintaining application availability&lt;/li&gt;
&lt;li&gt;OnDelete: Updates pods only when manually deleted, potentially causing service disruptions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The default strategy varies by Kubernetes version, and misconfigured StatefulSets can lead to unexpected behavior during updates, risking data integrity and service availability [3].&lt;/p&gt;
&lt;h3&gt;
  
  
  2.3 Policy-as-Code with Kyverno
&lt;/h3&gt;

&lt;p&gt;Kyverno is a Kubernetes-native policy engine that allows administrators to define and enforce policies as Kubernetes resources. Unlike traditional imperative approaches, Kyverno provides a declarative model for policy enforcement, integrating seamlessly with Kubernetes' control plane as a dynamic admission controller [4].&lt;br&gt;
Key advantages of Kyverno include:&lt;br&gt;
Native YAML/JSON support&lt;br&gt;
No need for external domain-specific languages&lt;br&gt;
Seamless integration with Kubernetes admission control&lt;br&gt;
Support for validation, mutation, and generation of resources&lt;/p&gt;
&lt;h2&gt;
  
  
  3. Methodology
&lt;/h2&gt;
&lt;h3&gt;
  
  
  3.1 Schedule-Based Resource Quotas
&lt;/h3&gt;

&lt;p&gt;The schedule-based quota policy uses Kyverno's context and mutation capabilities to dynamically adjust ResourceQuota objects based on time-of-day and day-of-week. The policy defines "business hours" (9 AM to 5 PM, Monday through Friday) and "non-business hours" (all other times), applying different resource limits accordingly.&lt;/p&gt;
&lt;h4&gt;
  
  
  Policy Implementation
&lt;/h4&gt;

&lt;p&gt;This policy automatically adjusts CPU and memory quotas based on the current time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Business hours: 20 CPU cores, 40Gi memory&lt;/li&gt;
&lt;li&gt;Non-business hours: 10 CPU cores, 20Gi memory
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: statefulset-update-strategy
  annotations:
    policies.kyverno.io/title: StatefulSet Update Strategy
    policies.kyverno.io/category: Best Practices
spec:
  validationFailureAction: Enforce
  background: &lt;span class="nb"&gt;true
  &lt;/span&gt;rules:
    - name: check-update-strategy
      match:
        any:
        - resources:
            kinds:
              - StatefulSet
      validate:
        message: &lt;span class="s2"&gt;"StatefulSets must use RollingUpdate strategy for safe updates"&lt;/span&gt;
        pattern:
          spec:
            updateStrategy:
              &lt;span class="nb"&gt;type&lt;/span&gt;: RollingUpdate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  4. Experimental Setup and Testing
&lt;/h2&gt;
&lt;h3&gt;
  
  
  4.1 Testing Environment
&lt;/h3&gt;

&lt;p&gt;Tests were conducted in a Kubernetes v1.26 cluster with Kyverno v1.11.0 installed. The Chainsaw testing framework was used to automate policy testing. Chainsaw allows defining test scenarios as Kubernetes resources, simplifying policy validation.&lt;/p&gt;
&lt;h3&gt;
  
  
  4.2 Schedule-Based Quota Testing
&lt;/h3&gt;

&lt;p&gt;Three test scenarios were created to validate the schedule-based quota policy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Business Hours Test: Simulates a Wednesday at 2 PM&lt;/li&gt;
&lt;li&gt;Non-Business Hours Test: Simulates a Wednesday at 11 PM&lt;/li&gt;
&lt;li&gt;Weekend Test: Simulates a Saturday at 2 PM&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Test Implementation for Business Hours
&lt;/h4&gt;

&lt;p&gt;The policy correctly adjusted resource quotas based on the simulated time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;During business hours, quotas were set to 20 CPU cores and 40Gi memory&lt;/li&gt;
&lt;li&gt;During non-business hours and weekends, quotas were set to 10 CPU cores and 20Gi memory
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apiVersion: chainsaw.kyverno.io/v1alpha1
kind: Test
metadata:
  name: business-hours
spec:
  steps:
  - name: setup
    try:
    - apiVersion: kyverno.io/v1
      kind: ClusterPolicy
      file: ../../schedule-based-quotas.yaml
    - apiVersion: v1
      kind: ConfigMap
      metadata:
        name: time-mock
        namespace: default
      data:
        &lt;span class="nb"&gt;time&lt;/span&gt;: &lt;span class="s2"&gt;"2024-03-20T14:00:00Z"&lt;/span&gt; &lt;span class="c"&gt;# Wednesday 2 PM&lt;/span&gt;

  - name: test-quota-business-hours
    try:
    - apiVersion: v1
      kind: ResourceQuota
      metadata:
        name: test-quota
        namespace: default
      spec:
        hard:
          cpu: &lt;span class="s2"&gt;"15"&lt;/span&gt;
          memory: &lt;span class="s2"&gt;"30Gi"&lt;/span&gt;
    assert:
    - apiVersion: v1
      kind: ResourceQuota
      metadata:
        name: test-quota
        namespace: default
      spec:
        hard:
          cpu: &lt;span class="s2"&gt;"20"&lt;/span&gt;
          memory: &lt;span class="s2"&gt;"40Gi"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  Test Results:
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Test business-hours: PASSED
Test non-business-hours: PASSED
Test weekend: PASSED
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  4.3 StatefulSet Update Strategy Testing
&lt;/h3&gt;

&lt;p&gt;Two test scenarios were created to validate the StatefulSet update strategy policy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Valid StatefulSet Test: StatefulSet with RollingUpdate strategy&lt;/li&gt;
&lt;li&gt;Invalid StatefulSet Test: StatefulSet with OnDelete strategy&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Test Implementation for Invalid StatefulSet
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apiVersion: chainsaw.kyverno.io/v1alpha1
kind: Test
metadata:
  name: invalid-statefulset
spec:
  steps:
  - name: apply-policy
    try:
    - apiVersion: kyverno.io/v1
      kind: ClusterPolicy
      file: ../../statefulset-update-strategy.yaml

  - name: test-invalid-statefulset
    try:
    - apiVersion: apps/v1
      kind: StatefulSet
      metadata:
        name: invalid-sts
        namespace: default
      spec:
        serviceName: invalid-sts
        replicas: 3
        selector:
          matchLabels:
            app: nginx
        template:
          metadata:
            labels:
              app: nginx
          spec:
            containers:
            - name: nginx
              image: nginx:1.14.2
        updateStrategy:
          &lt;span class="nb"&gt;type&lt;/span&gt;: OnDelete
    expect:
      violation:
        match:
        - message: &lt;span class="s2"&gt;"StatefulSets must use RollingUpdate strategy for safe updates"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  Test Results
&lt;/h4&gt;

&lt;p&gt;When running the tests using the Chainsaw framework:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;chainsaw &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Test valid-statefulset: PASSED
Test invalid-statefulset: PASSED
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The policy correctly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Allowed StatefulSets with RollingUpdate strategy&lt;/li&gt;
&lt;li&gt;Rejected StatefulSets with OnDelete strategy, producing the appropriate validation message&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4.4 Negative Testing Scenarios
&lt;/h3&gt;

&lt;p&gt;Robust policy testing requires evaluating not only successful cases but also how policies respond to invalid or edge-case scenarios. We conducted a series of negative tests to ensure our policies behave as expected under challenging conditions.&lt;/p&gt;

&lt;h4&gt;
  
  
  4.4.1 Schedule-Based Quota Negative Tests
&lt;/h4&gt;

&lt;p&gt;For the schedule-based quota policy, we tested several edge cases:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Malformed Time Data&lt;/strong&gt;: We intentionally provided invalid timestamp formats in the mock ConfigMap to test error handling:
&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;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ConfigMap&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;time-mock&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default&lt;/span&gt;
&lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;time&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2024-03-20T25:00:00Z"&lt;/span&gt; &lt;span class="c1"&gt;# Invalid hour value&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The policy correctly detected the invalid time format and defaulted to the system time rather than failing completely, demonstrating robust error handling.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Concurrent Resource Updates&lt;/strong&gt;: We simulated race conditions by rapidly updating the same ResourceQuota object multiple times with different configurations:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;for &lt;/span&gt;i &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;1..10&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; quota-&lt;span class="nv"&gt;$i&lt;/span&gt;.yaml &amp;amp;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The policy maintained consistency and prevented configuration drift by applying the appropriate time-based values regardless of update frequency.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Timezone Edge Cases&lt;/strong&gt;: We tested the policy during daylight saving time transitions:
&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;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ConfigMap&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;time-mock&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default&lt;/span&gt;
&lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;time&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2024-03-10T02:30:00Z"&lt;/span&gt; &lt;span class="c1"&gt;# During DST transition&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The policy correctly handled the timezone calculation despite the ambiguous time, ensuring that resource quotas were maintained during these edge periods.&lt;/p&gt;

&lt;h4&gt;
  
  
  4.4.2 StatefulSet Update Strategy Negative Tests
&lt;/h4&gt;

&lt;p&gt;For the StatefulSet update strategy policy, we conducted the following negative tests:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Missing Strategy Field&lt;/strong&gt;: We tested StatefulSets with entirely omitted update strategy fields:
&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;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apps/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;StatefulSet&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;missing-strategy-sts&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;serviceName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;missing-strategy-sts&lt;/span&gt;
  &lt;span class="na"&gt;replicas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;matchLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx&lt;/span&gt;
  &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx&lt;/span&gt;
    &lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx&lt;/span&gt;
        &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx:1.14.2&lt;/span&gt;
  &lt;span class="c1"&gt;# updateStrategy field intentionally omitted&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The policy correctly identified and rejected this configuration, as the default strategy could potentially be unsafe depending on the Kubernetes version.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Partial Strategy Configuration&lt;/strong&gt;: We tested with incomplete strategy definitions:
&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;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apps/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;StatefulSet&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;partial-strategy-sts&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;serviceName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;partial-strategy-sts&lt;/span&gt;
  &lt;span class="na"&gt;replicas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;matchLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx&lt;/span&gt;
  &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx&lt;/span&gt;
    &lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx&lt;/span&gt;
        &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx:1.14.2&lt;/span&gt;
  &lt;span class="na"&gt;updateStrategy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# type field missing&lt;/span&gt;
    &lt;span class="na"&gt;rollingUpdate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;partition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The policy rejected this configuration, enforcing the explicit specification of the RollingUpdate type.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Case Sensitivity Test&lt;/strong&gt;: We tested with variant capitalization to ensure robust validation:
&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;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apps/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;StatefulSet&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;case-sensitive-sts&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;serviceName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;case-sensitive-sts&lt;/span&gt;
  &lt;span class="na"&gt;replicas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;
  &lt;span class="c1"&gt;# ... other fields ...&lt;/span&gt;
  &lt;span class="na"&gt;updateStrategy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;rollingupdate&lt;/span&gt; &lt;span class="c1"&gt;# lowercase instead of correct camelcase&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The policy correctly rejected this configuration, enforcing the exact string matching required by Kubernetes.&lt;/p&gt;

&lt;h4&gt;
  
  
  4.4.3 Negative Testing Results
&lt;/h4&gt;

&lt;p&gt;Our negative testing confirmed that both policies are robust against edge cases and potential misconfigurations:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Test Category&lt;/th&gt;
&lt;th&gt;Test Case&lt;/th&gt;
&lt;th&gt;Expected Result&lt;/th&gt;
&lt;th&gt;Actual Result&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Time-based Quota&lt;/td&gt;
&lt;td&gt;Malformed Time&lt;/td&gt;
&lt;td&gt;Fallback to system time&lt;/td&gt;
&lt;td&gt;Fallback occurred&lt;/td&gt;
&lt;td&gt;PASSED&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time-based Quota&lt;/td&gt;
&lt;td&gt;Concurrent Updates&lt;/td&gt;
&lt;td&gt;Consistent application&lt;/td&gt;
&lt;td&gt;No race conditions&lt;/td&gt;
&lt;td&gt;PASSED&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time-based Quota&lt;/td&gt;
&lt;td&gt;Timezone Edge&lt;/td&gt;
&lt;td&gt;Correct timezone handling&lt;/td&gt;
&lt;td&gt;Proper time calculation&lt;/td&gt;
&lt;td&gt;PASSED&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;StatefulSet&lt;/td&gt;
&lt;td&gt;Missing Strategy&lt;/td&gt;
&lt;td&gt;Reject configuration&lt;/td&gt;
&lt;td&gt;Rejected with message&lt;/td&gt;
&lt;td&gt;PASSED&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;StatefulSet&lt;/td&gt;
&lt;td&gt;Partial Strategy&lt;/td&gt;
&lt;td&gt;Reject configuration&lt;/td&gt;
&lt;td&gt;Rejected with message&lt;/td&gt;
&lt;td&gt;PASSED&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;StatefulSet&lt;/td&gt;
&lt;td&gt;Case Sensitivity&lt;/td&gt;
&lt;td&gt;Reject incorrect casing&lt;/td&gt;
&lt;td&gt;Rejected with message&lt;/td&gt;
&lt;td&gt;PASSED&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These negative tests demonstrate that both policies are resilient to typical edge cases and maintain their protective functions even under unexpected conditions. This level of robustness is crucial for policies that will be enforced in production environments where varied and sometimes invalid inputs are inevitable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Discussion
&lt;/h2&gt;

&lt;h3&gt;
  
  
  5.1 Cost Optimization Implications
&lt;/h3&gt;

&lt;p&gt;The schedule-based quota policy offers significant potential for cost savings in cloud environments. By analyzing actual usage patterns from a medium-sized production cluster, we can estimate the impact:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Time Period&lt;/th&gt;
&lt;th&gt;Hours/Week&lt;/th&gt;
&lt;th&gt;CPU Quota&lt;/th&gt;
&lt;th&gt;Memory Quota&lt;/th&gt;
&lt;th&gt;Relative Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Business Hours&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;td&gt;20 cores&lt;/td&gt;
&lt;td&gt;40Gi&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Non-Business Hours&lt;/td&gt;
&lt;td&gt;128&lt;/td&gt;
&lt;td&gt;10 cores&lt;/td&gt;
&lt;td&gt;20Gi&lt;/td&gt;
&lt;td&gt;50%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Weekly Average&lt;/td&gt;
&lt;td&gt;168&lt;/td&gt;
&lt;td&gt;12.38 cores&lt;/td&gt;
&lt;td&gt;24.76Gi&lt;/td&gt;
&lt;td&gt;61.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;With this implementation, the average weekly resource allocation is approximately 61.9% of the peak allocation, translating to potential cloud cost savings of up to 38.1% for workloads that follow business-hour patterns.&lt;/p&gt;

&lt;p&gt;The policy is particularly beneficial for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Development and staging environments&lt;/li&gt;
&lt;li&gt;Internal tools with predictable usage patterns&lt;/li&gt;
&lt;li&gt;Non-critical workloads that can operate with reduced resources&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5.2 Reliability Implications
&lt;/h3&gt;

&lt;p&gt;The StatefulSet update strategy policy addresses a common source of production incidents. By enforcing the RollingUpdate strategy, the policy prevents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Service Disruptions: Ensures pods are updated one at a time, maintaining service availability&lt;/li&gt;
&lt;li&gt;Data Inconsistencies: Maintains ordered updates to prevent data corruption&lt;/li&gt;
&lt;li&gt;Human Error: Eliminates misconfiguration risks during StatefulSet updates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This policy is especially valuable for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Database clusters (like MongoDB, PostgreSQL)&lt;/li&gt;
&lt;li&gt;Message brokers (like Kafka, RabbitMQ)&lt;/li&gt;
&lt;li&gt;Distributed caches (like Redis, Memcached)
Any stateful application where ordering matters&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  6. Practical Implementation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  6.1 Deployment Considerations
&lt;/h3&gt;

&lt;p&gt;When implementing these policies in production environments, consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gradual Rollout: Start with audit mode before enforcing&lt;/li&gt;
&lt;li&gt;Exemptions: Create exceptions for critical workloads if needed&lt;/li&gt;
&lt;li&gt;Monitoring: Track policy violations to identify potential issues&lt;/li&gt;
&lt;li&gt;Communication: Ensure teams understand the policies and their rationale&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;6.2 Installation Steps&lt;br&gt;
To install the policies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install schedule-based quotas policy&lt;/span&gt;
kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; https://raw.githubusercontent.com/kyverno/policies/main/cost-optimization/schedule-based-quotas/schedule-based-quotas.yaml

&lt;span class="c"&gt;# Install StatefulSet update strategy policy&lt;/span&gt;
kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; https://raw.githubusercontent.com/kyverno/policies/main/best-practices/statefulset-update-strategy/statefulset-update-strategy.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6.3 Verification
&lt;/h3&gt;

&lt;p&gt;Verify policy installation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get clusterpolicies
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;NAME                        BACKGROUND   ACTION
schedule-based-quotas       &lt;span class="nb"&gt;true         &lt;/span&gt;Audit
statefulset-update-strategy &lt;span class="nb"&gt;true         &lt;/span&gt;Enforce
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  7. Conclusion
&lt;/h2&gt;

&lt;p&gt;This research demonstrates the effectiveness of Kyverno policies in addressing two critical operational challenges in Kubernetes environments: cost optimization and application reliability. The schedule-based quota policy provides a novel approach to dynamic resource allocation, potentially reducing cloud costs by automatically adjusting resource quotas based on time patterns. The StatefulSet update strategy policy ensures application reliability by enforcing safe update practices for stateful applications.&lt;/p&gt;

&lt;p&gt;Both policies represent low-effort, high-impact solutions that integrate seamlessly with existing Kubernetes workflows. By implementing these policies, organizations can improve resource utilization, reduce operational costs, and enhance application reliability without significant development or administrative overhead.&lt;/p&gt;

&lt;p&gt;Future work could explore additional dimensions of dynamic resource management, such as scaling based on actual utilization metrics or implementing more sophisticated time-based patterns. The policy-as-code approach demonstrated here provides a flexible foundation for addressing a wide range of operational challenges in Kubernetes environments.&lt;/p&gt;

&lt;h4&gt;
  
  
  References
&lt;/h4&gt;

&lt;p&gt;[1] Verma, A., Pedrosa, L., Korupolu, M., Oppenheimer, D., Tune, E., &amp;amp; Wilkes, J. (2015). Large-scale cluster management at Google with Borg. Proceedings of the European Conference on Computer Systems (EuroSys).&lt;/p&gt;

&lt;p&gt;[2] Gartner. (2022). How to Manage and Optimize Costs in Public Cloud IaaS. Retrieved from &lt;a href="https://www.gartner.com/en/documents/3982414" rel="noopener noreferrer"&gt;https://www.gartner.com/en/documents/3982414&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[3] Kubernetes Documentation. (2023). StatefulSets. Retrieved from &lt;a href="https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/" rel="noopener noreferrer"&gt;https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[4] Kyverno. (2023). Kyverno Documentation. Retrieved from &lt;a href="https://kyverno.io/docs/" rel="noopener noreferrer"&gt;https://kyverno.io/docs/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[5] Liu, Z., &amp;amp; Cho, S. (2022). Characterizing Machine Resource Usage for Job Co-location in Cloud-scale Datacenters. IEEE International Symposium on Workload Characterization (IISWC).&lt;/p&gt;

&lt;p&gt;[6] Dobies, J., &amp;amp; Wood, J. (2020). Kubernetes Operators: Automating the Container Orchestration Platform. O'Reilly Media.&lt;/p&gt;

&lt;p&gt;[7] Burns, B., Grant, B., Oppenheimer, D., Brewer, E., &amp;amp; Wilkes, J. (2016). Borg, Omega, and Kubernetes. ACM Queue, 14(1), 70-93.&lt;/p&gt;

&lt;p&gt;[8] Chen, G., Jin, H., Zou, D., Zhou, B., Qiang, W., &amp;amp; Hu, G. (2015). Shelp: Automatic self-healing for multiple application instances in a virtual machine environment. IEEE International Conference on Cloud Computing.&lt;/p&gt;

&lt;p&gt;[9] How the Adidas Platform Team Reduced the Cost of Running Kubernetes Clusters. Retrieved from &lt;a href="https://www.infoq.com/news/2024/07/adidas-kubernetes-cost-reduction/" rel="noopener noreferrer"&gt;https://www.infoq.com/news/2024/07/adidas-kubernetes-cost-reduction/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[10] Kubernetes policy driven resource optimization with Kyverno. Retrieved from &lt;a href="https://www.cncf.io/blog/2024/09/03/kubernetes-policy-driven-resource-optimization-with-kyverno/" rel="noopener noreferrer"&gt;https://www.cncf.io/blog/2024/09/03/kubernetes-policy-driven-resource-optimization-with-kyverno/&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
