<?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: Dinesh Reddy</title>
    <description>The latest articles on DEV Community by Dinesh Reddy (@jettidi).</description>
    <link>https://dev.to/jettidi</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%2F2689534%2F5489f9d2-a717-4760-b6cc-2607ed9f751b.jpg</url>
      <title>DEV Community: Dinesh Reddy</title>
      <link>https://dev.to/jettidi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jettidi"/>
    <language>en</language>
    <item>
      <title>Automating Kubernetes Sealed Secrets Management with Jenkins in a Multi-Cloud Environment -Part1</title>
      <dc:creator>Dinesh Reddy</dc:creator>
      <pubDate>Wed, 05 Feb 2025 02:00:11 +0000</pubDate>
      <link>https://dev.to/jettidi/automating-kubernetes-sealed-secrets-management-with-jenkins-in-a-multi-cloud-environment-1ifb</link>
      <guid>https://dev.to/jettidi/automating-kubernetes-sealed-secrets-management-with-jenkins-in-a-multi-cloud-environment-1ifb</guid>
      <description>&lt;h1&gt;
  
  
  🚀 Automating Kubernetes Sealed Secrets Management with Jenkins in a Multi-Cloud Environment
&lt;/h1&gt;

&lt;h2&gt;
  
  
  🗒️ &lt;strong&gt;Introduction&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Managing sensitive data like API keys, passwords, and certificates securely in Kubernetes can be challenging—especially in enterprise environments with multiple clusters. In this guide, we'll explore how to &lt;strong&gt;automate Kubernetes Sealed Secrets management using Jenkins&lt;/strong&gt;, ensuring &lt;strong&gt;security, scalability, and efficiency&lt;/strong&gt; across multi-cloud environments such as &lt;strong&gt;AKS&lt;/strong&gt;, &lt;strong&gt;GKE&lt;/strong&gt;, and &lt;strong&gt;EKS&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛡️ &lt;strong&gt;Background&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;In enterprise environments, sensitive information like API keys, passwords, and certificates must be managed securely. Kubernetes, widely used for container orchestration, stores such data as secrets. However, plain-text Kubernetes secrets are not safe for version control systems or manual handling.&lt;/p&gt;

&lt;p&gt;To address this, &lt;strong&gt;Sealed Secrets&lt;/strong&gt; encrypt sensitive data so it can be safely stored and shared. Deploying and managing these Sealed Secrets efficiently in Amazon AKS requires automation to ensure security, scalability, and ease of use.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚠️ &lt;strong&gt;The Challenge&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Enterprises often face several challenges:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Security Risks:&lt;/strong&gt; Storing secrets in plain text makes them vulnerable to unauthorized access.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manual Errors:&lt;/strong&gt; Manual handling increases the risk of mistakes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complex Management:&lt;/strong&gt; Managing secrets across environments (dev, staging, prod) is time-consuming.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lack of Automation:&lt;/strong&gt; Kubernetes lacks built-in automation for secret encryption and deployment.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  💡 &lt;strong&gt;The Solution: Jenkins + Docker-in-Docker (DIND)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;Jenkins pipeline&lt;/strong&gt;, combined with a &lt;strong&gt;Docker-in-Docker (DIND)&lt;/strong&gt; container, automates the secure management of Sealed Secrets in AKS clusters. Key features include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;🔐 Strong Encryption:&lt;/strong&gt; Uses the Sealed Secrets Controller, ensuring only the AKS cluster can decrypt data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📦 Centralized Management:&lt;/strong&gt; Jenkins standardizes secret generation and deployment across environments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🛡️ Security Compliance:&lt;/strong&gt; Secrets are encrypted before storage to meet strict security standards.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🔑 RBAC Integration:&lt;/strong&gt; Kubernetes Role-Based Access Control (RBAC) adds an extra layer of security.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://github.com/regspweek41/jenkins-sealed-secrets.git" rel="noopener noreferrer"&gt;🔗 Check the GitHub Repository for Reference&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ &lt;strong&gt;Jenkins Pipeline Workflow&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1️⃣ &lt;strong&gt;Prepare the Workspace&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Set up the environment for processing secrets and generating artifacts:&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="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /tmp/jenkins-k8s-apply
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WORKSPACE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/sealed-secrets-artifacts
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /tmp/jenkins-k8s-apply/&lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true
ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /tmp/jenkins-k8s-apply &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Directory is empty"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt; A clean workspace ensures no residual sensitive data remains. ✅&lt;/p&gt;

&lt;h3&gt;
  
  
  2️⃣ &lt;strong&gt;Process Base64 Encoded Secrets&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Decode the provided &lt;code&gt;secrets.yaml&lt;/code&gt; file:&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="nb"&gt;echo&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SECRETS_YAML&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /tmp/jenkins-k8s-apply/secrets.yaml.b64
&lt;span class="nb"&gt;base64&lt;/span&gt; &lt;span class="nt"&gt;--decode&lt;/span&gt; &amp;lt; /tmp/jenkins-k8s-apply/secrets.yaml.b64 &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /tmp/jenkins-k8s-apply/secrets.yaml
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt; /tmp/jenkins-k8s-apply/secrets.yaml
&lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; 5 /tmp/jenkins-k8s-apply/secrets.yaml | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="s1"&gt;'data:'&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"File appears to be empty"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3️⃣ &lt;strong&gt;Apply Kubernetes Config &amp;amp; Fetch Public Certificate&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Fetch the Sealed Secrets Controller’s public certificate:&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="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;KUBECONFIG&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;  &lt;span class="c"&gt;# Validate kubeconfig&lt;/span&gt;

docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;KUBECONFIG&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;:/tmp/kubeconfig &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; /tmp/jenkins-k8s-apply/secrets.yaml:/tmp/secrets.yaml &lt;span class="se"&gt;\&lt;/span&gt;
  docker-dind-kube-secret kubeseal &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--controller-name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;sealed-secrets &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--controller-namespace&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;kube-system &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--kubeconfig&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/tmp/kubeconfig &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--fetch-cert&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /tmp/jenkins-k8s-apply/sealed-secrets-cert.pem

&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt; /tmp/jenkins-k8s-apply/sealed-secrets-cert.pem  &lt;span class="c"&gt;# Validate certificate&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4️⃣ &lt;strong&gt;Create Sealed Secrets&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Encrypt the secrets using the public certificate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;KUBECONFIG&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;:/tmp/kubeconfig &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; /tmp/jenkins-k8s-apply/secrets.yaml:/tmp/secrets.yaml &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; /tmp/jenkins-k8s-apply/sealed-secrets-cert.pem:/tmp/sealed-secrets-cert.pem &lt;span class="se"&gt;\&lt;/span&gt;
  docker-dind-kube-secret sh &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"kubeseal &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
    --controller-name=sealed-secrets &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
    --controller-namespace=kube-system &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
    --format yaml &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
    --cert /tmp/sealed-secrets-cert.pem &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
    --namespace=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;NAMESPACE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
    &amp;lt; /tmp/secrets.yaml"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WORKSPACE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/sealed-secrets-artifacts/sealed-secrets.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5️⃣ &lt;strong&gt;Generate Documentation&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Create metadata to track secret deployments:&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="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Generated on: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WORKSPACE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/sealed-secrets-artifacts/README.txt
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Namespace: &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;NAMESPACE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WORKSPACE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/sealed-secrets-artifacts/README.txt
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Controller: sealed-secrets"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WORKSPACE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/sealed-secrets-artifacts/README.txt
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Controller Namespace: kube-system"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WORKSPACE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/sealed-secrets-artifacts/README.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🎯 &lt;strong&gt;Key Benefits&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;🔒 Enhanced Security:&lt;/strong&gt; Encryption before storage mitigates the risk of data leaks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;⚡ Automation:&lt;/strong&gt; Reduces manual effort, ensuring consistent workflows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🌍 Scalability:&lt;/strong&gt; Easily handles multiple environments and clusters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;✅ Compliance:&lt;/strong&gt; Simplifies regulatory audits with secure secret management.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Seamlessly integrates with existing CI/CD workflows and AWS services—perfect for scaling across clusters. 🚀&lt;/p&gt;




&lt;h1&gt;
  
  
  📦 &lt;strong&gt;Part 2: Automating Kubernetes Sealed Secrets in Multi-Cloud Environments&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;In &lt;strong&gt;Part 2&lt;/strong&gt;, we’ll expand this approach to &lt;strong&gt;multi-cloud environments&lt;/strong&gt;, covering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AKS (Non-Production)&lt;/strong&gt; ✅
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GKE (Production Cluster 1)&lt;/strong&gt; ☁️
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EKS (Production Cluster 2)&lt;/strong&gt; 🛡️
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stay tuned for advanced multi-cloud secret management techniques! 💼&lt;/p&gt;




</description>
      <category>jenkins</category>
      <category>kubernetes</category>
      <category>cicd</category>
      <category>secret</category>
    </item>
    <item>
      <title>Automating Kubernetes Sealed Secrets Management with Jenkins in a Multi-Cloud Environment-Part2</title>
      <dc:creator>Dinesh Reddy</dc:creator>
      <pubDate>Wed, 05 Feb 2025 01:17:56 +0000</pubDate>
      <link>https://dev.to/jettidi/automating-kubernetes-sealed-secrets-management-with-jenkins-in-a-multi-cloud-environment-455g</link>
      <guid>https://dev.to/jettidi/automating-kubernetes-sealed-secrets-management-with-jenkins-in-a-multi-cloud-environment-455g</guid>
      <description>&lt;h1&gt;
  
  
  Automating Secure Kubernetes Sealed Secrets with Jenkins Pipeline in a Multi-Cloud Environment
&lt;/h1&gt;

&lt;p&gt;Managing Kubernetes secrets securely across multiple environments and clusters can be challenging. This Jenkins pipeline simplifies and automates the secure management of Kubernetes sealed secrets across Azure Kubernetes Service (AKS), Google Kubernetes Engine (GKE), and Amazon Elastic Kubernetes Service (EKS). It ensures secure handling of sensitive information while optimizing efficiency through dynamic environment setups and parallel processing.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Key Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Dynamic Cluster Selection&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The pipeline dynamically determines target clusters based on the &lt;code&gt;ENVIRONMENT&lt;/code&gt; parameter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Non-Production:&lt;/strong&gt; Targets the AKS cluster using the &lt;code&gt;Stage&lt;/code&gt; credential.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Production:&lt;/strong&gt; Targets both GKE (Production Cluster 1) and EKS (Production Cluster 2) using &lt;code&gt;Production_1&lt;/code&gt; and &lt;code&gt;Production_2&lt;/code&gt; credentials, respectively.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Parallel Processing for Efficiency&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;To speed up multi-cluster operations, the &lt;code&gt;Process Clusters&lt;/code&gt; stage runs workflows in parallel:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Production:&lt;/strong&gt; Processes GKE and EKS clusters simultaneously.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Non-Production:&lt;/strong&gt; Processes only the AKS cluster.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Secure Sealed Secrets Workflow&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Decodes&lt;/strong&gt; the Base64-encoded &lt;code&gt;Secrets.yaml&lt;/code&gt; file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fetches&lt;/strong&gt; the public certificate from the Sealed Secrets controller.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Encrypts&lt;/strong&gt; the secrets for the respective cluster and namespace.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generates&lt;/strong&gt; &lt;code&gt;sealed-secrets.yaml&lt;/code&gt; artifacts for secure deployment.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Dynamic and Reusable Pipeline&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The cluster list and credentials are dynamically configured, making the pipeline adaptable for additional clusters or environments with minimal changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. &lt;strong&gt;Post-Build Artifact Management&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Archives artifacts (sealed-secrets.yaml, README.txt) per cluster.&lt;/li&gt;
&lt;li&gt;Makes them accessible through the Jenkins UI for easy retrieval.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔄 Jenkins Pipeline Script Explained
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Parameters
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="n"&gt;parameters&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;name:&lt;/span&gt; &lt;span class="s1"&gt;'NAMESPACE'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;defaultValue:&lt;/span&gt; &lt;span class="s1"&gt;'default'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;description:&lt;/span&gt; &lt;span class="s2"&gt;"'Kubernetes namespace for the sealed secret')"&lt;/span&gt;
    &lt;span class="n"&gt;choice&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;name:&lt;/span&gt; &lt;span class="s1"&gt;'ENVIRONMENT'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;choices:&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'Non-Production'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Production'&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="nl"&gt;description:&lt;/span&gt; &lt;span class="s2"&gt;"'Select the target environment')"&lt;/span&gt;
    &lt;span class="n"&gt;base64File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;name:&lt;/span&gt; &lt;span class="s1"&gt;'SECRETS_YAML'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;description:&lt;/span&gt; &lt;span class="s2"&gt;"'Upload Base64-encoded Secrets.yaml file')"&lt;/span&gt;
    &lt;span class="n"&gt;booleanParam&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;name:&lt;/span&gt; &lt;span class="s1"&gt;'STORE_CERT'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;defaultValue:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;description:&lt;/span&gt; &lt;span class="s2"&gt;"'Store the public certificate for future use')"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;NAMESPACE&lt;/code&gt;&lt;/strong&gt;: Target namespace in Kubernetes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;ENVIRONMENT&lt;/code&gt;&lt;/strong&gt;: Determines the operational environment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;SECRETS_YAML&lt;/code&gt;&lt;/strong&gt;: Base64-encoded YAML file with sensitive data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;STORE_CERT&lt;/code&gt;&lt;/strong&gt;: Option to archive the public certificate for future use.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Environment Variables
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="n"&gt;environment&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;WORK_DIR&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'/tmp/jenkins-k8s-apply'&lt;/span&gt;
    &lt;span class="n"&gt;CONTROLLER_NAMESPACE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'kube-system'&lt;/span&gt;
    &lt;span class="n"&gt;CONTROLLER_NAME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'sealed-secrets'&lt;/span&gt;
    &lt;span class="n"&gt;CERT_FILE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'sealed-secrets-cert.pem'&lt;/span&gt;
    &lt;span class="n"&gt;DOCKER_IMAGE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'docker-dind-kube-secret'&lt;/span&gt;
    &lt;span class="n"&gt;ARTIFACTS_DIR&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'sealed-secrets-artifacts'&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Defines key directories and configurations, including the workspace, Sealed Secrets controller details, and Docker image.&lt;/p&gt;

&lt;h3&gt;
  
  
  Environment Setup
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Environment Setup'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;script&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;clusters&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ENVIRONMENT&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;'Production'&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;
                &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;id:&lt;/span&gt; &lt;span class="s1"&gt;'prod-cluster-1'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;name:&lt;/span&gt; &lt;span class="s1"&gt;'Production Cluster 1'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;credentialId:&lt;/span&gt; &lt;span class="s1"&gt;'Production_1'&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt;
                &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;id:&lt;/span&gt; &lt;span class="s1"&gt;'prod-cluster-2'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;name:&lt;/span&gt; &lt;span class="s1"&gt;'Production Cluster 2'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;credentialId:&lt;/span&gt; &lt;span class="s1"&gt;'Production_2'&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
            &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;
                &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;id:&lt;/span&gt; &lt;span class="s1"&gt;'non-prod-cluster'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;name:&lt;/span&gt; &lt;span class="s1"&gt;'Non-Production Cluster'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;credentialId:&lt;/span&gt; &lt;span class="s1"&gt;'Stage'&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
            &lt;span class="o"&gt;];&lt;/span&gt;

            &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CLUSTER_IDS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clusters&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;id&lt;/span&gt; &lt;span class="o"&gt;}.&lt;/span&gt;&lt;span class="na"&gt;join&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;','&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;clusters&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;cluster&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
                &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"CLUSTER_${cluster.id}_NAME"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cluster&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
                &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"CLUSTER_${cluster.id}_CRED"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cluster&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;credentialId&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dynamically sets up clusters and credentials based on the environment.&lt;/p&gt;

&lt;h3&gt;
  
  
  Preparing the Workspace
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Prepare Workspace'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;script&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="s2"&gt;"""
                mkdir -p ${WORK_DIR}
                mkdir -p ${WORKSPACE}/${ARTIFACTS_DIR}
                rm -f ${WORK_DIR}/* || true
                rm -rf ${WORKSPACE}/${ARTIFACTS_DIR}/* || true
            """&lt;/span&gt;

            &lt;span class="n"&gt;writeFile&lt;/span&gt; &lt;span class="nl"&gt;file:&lt;/span&gt; &lt;span class="s2"&gt;"${WORK_DIR}/secrets.yaml.b64"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;text:&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;SECRETS_YAML&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="s2"&gt;"base64 --decode &amp;lt; ${WORK_DIR}/secrets.yaml.b64 &amp;gt; ${WORK_DIR}/secrets.yaml"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prepares directories, cleans up old artifacts, and decodes the Base64 secrets file.&lt;/p&gt;

&lt;h3&gt;
  
  
  Processing Clusters in Parallel
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Process Clusters'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;script&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;parallelStages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[:];&lt;/span&gt;

            &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CLUSTER_IDS&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;split&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;','&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;clusterId&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
                &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;clusterName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"CLUSTER_${clusterId}_NAME"&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;
                &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;credentialId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"CLUSTER_${clusterId}_CRED"&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;

                &lt;span class="n"&gt;parallelStages&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;clusterName&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Process ${clusterName}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                        &lt;span class="n"&gt;withCredentials&lt;/span&gt;&lt;span class="o"&gt;([&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;credentialsId:&lt;/span&gt; &lt;span class="n"&gt;credentialId&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;variable:&lt;/span&gt; &lt;span class="s1"&gt;'KUBECONFIG'&lt;/span&gt;&lt;span class="o"&gt;)])&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                            &lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="s2"&gt;"docker run --rm -v \${KUBECONFIG}:/tmp/kubeconfig -v ${WORK_DIR}/secrets.yaml:/tmp/secrets.yaml ${DOCKER_IMAGE} kubeseal --controller-name=${CONTROLLER_NAME} --controller-namespace=${CONTROLLER_NAMESPACE} --cert /tmp/sealed-secrets-cert.pem --namespace=${params.NAMESPACE} &amp;lt; /tmp/secrets.yaml &amp;gt; ${WORKSPACE}/${ARTIFACTS_DIR}/${clusterId}/sealed-secrets.yaml"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
                        &lt;span class="o"&gt;}&lt;/span&gt;
                    &lt;span class="o"&gt;}&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;

            &lt;span class="n"&gt;parallel&lt;/span&gt; &lt;span class="n"&gt;parallelStages&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Processes each cluster in parallel to optimize execution time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Post-Build Actions
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="n"&gt;post&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;always&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="s2"&gt;"rm -rf ${WORK_DIR}"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;archiveArtifacts&lt;/span&gt; &lt;span class="nl"&gt;artifacts:&lt;/span&gt; &lt;span class="s2"&gt;"${ARTIFACTS_DIR}/*/**"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;fingerprint:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;success&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Pipeline completed successfully!"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;failure&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Pipeline failed. Check logs for details."&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Cleans up the workspace.&lt;/li&gt;
&lt;li&gt;Archives artifacts for easy retrieval.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🌟 Key Benefits
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic Configuration:&lt;/strong&gt; Easy to add new clusters without major code changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parallel Processing:&lt;/strong&gt; Optimized runtime for multi-cluster environments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secure Operations:&lt;/strong&gt; End-to-end encryption with Kubernetes Sealed Secrets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Cloud Ready:&lt;/strong&gt; Works seamlessly with AKS, GKE, and EKS.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This Jenkins pipeline provides a robust, secure, and efficient way to manage Kubernetes secrets across multiple clouds. Feel free to adapt it to your organization's needs! 🚀&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>jenkins</category>
      <category>security</category>
      <category>secret</category>
    </item>
  </channel>
</rss>
