<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Custom Resources Archives - Linuxcent</title>
	<atom:link href="https://linuxcent.com/tag/custom-resources/feed/" rel="self" type="application/rss+xml" />
	<link>https://linuxcent.com/tag/custom-resources/</link>
	<description>Infrastructure security, from the kernel up.</description>
	<lastBuildDate>Sat, 09 May 2026 18:40:28 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0.4</generator>

<image>
	<url>https://linuxcent.com/wp-content/uploads/2026/04/favicon-512x512-1-150x150.png</url>
	<title>Custom Resources Archives - Linuxcent</title>
	<link>https://linuxcent.com/tag/custom-resources/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">211632295</site>	<item>
		<title>CRDs You Already Use: cert-manager, KEDA, and External Secrets Explained</title>
		<link>https://linuxcent.com/kubernetes-custom-resources-examples/</link>
					<comments>https://linuxcent.com/kubernetes-custom-resources-examples/#respond</comments>
		
		<dc:creator><![CDATA[Vamshi Krishna Santhapuri]]></dc:creator>
		<pubDate>Sat, 25 Apr 2026 18:15:04 +0000</pubDate>
				<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[cert-manager]]></category>
		<category><![CDATA[CRD]]></category>
		<category><![CDATA[Custom Resources]]></category>
		<category><![CDATA[External Secrets]]></category>
		<category><![CDATA[KEDA]]></category>
		<category><![CDATA[Operators]]></category>
		<guid isPermaLink="false">https://linuxcent.com/kubernetes-custom-resources-examples/</guid>

					<description><![CDATA[<p><span class="span-reading-time rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Reading Time: </span> <span class="rt-time"> 6</span> <span class="rt-label rt-postfix">minutes</span></span>See Kubernetes custom resources in action: cert-manager Certificates, KEDA ScaledObjects, and External Secrets — understand what CRDs look like before you build one.</p>
<p>The post <a href="https://linuxcent.com/kubernetes-custom-resources-examples/">CRDs You Already Use: cert-manager, KEDA, and External Secrets Explained</a> appeared first on <a href="https://linuxcent.com">Linuxcent</a>.</p>
]]></description>
										<content:encoded><![CDATA[<span class="span-reading-time rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Reading Time: </span> <span class="rt-time"> 6</span> <span class="rt-label rt-postfix">minutes</span></span><style>
pre{position:relative;background:#1e1e1e;color:#d4d4d4;
    padding:16px 16px 16px 20px;border-radius:6px;overflow-x:auto;
    font-family:'JetBrains Mono','Fira Code','Cascadia Code',Consolas,'Courier New',monospace;
    font-size:.88em;line-height:1.6;border-left:4px solid #555}
code{background:#f4f4f4;padding:2px 5px;border-radius:3px;font-size:.9em}
pre code{background:transparent;padding:0;color:inherit}
pre[data-lang="bash"],pre[data-lang="sh"],
pre[data-lang="shell"],pre[data-lang="zsh"]{border-left-color:#4ec9b0}
pre[data-lang="yaml"],pre[data-lang="json"],
pre[data-lang="toml"],pre[data-lang="xml"]{border-left-color:#569cd6}
pre[data-lang="python"],pre[data-lang="go"],pre[data-lang="rust"],
pre[data-lang="java"],pre[data-lang="c"],pre[data-lang="cpp"]{border-left-color:#c586c0}
pre[data-lang="text"],pre[data-lang="output"],
pre[data-lang="console"]{border-left-color:#888}
.lc-copy-btn{position:absolute;top:8px;right:8px;background:#2d2d2d;color:#ccc;
    border:1px solid #444;border-radius:4px;padding:3px 9px;font-size:.75em;
    font-family:system-ui,sans-serif;cursor:pointer;opacity:0;
    transition:opacity .15s,background .15s;line-height:1.6}
pre:hover .lc-copy-btn{opacity:1}
.lc-copy-btn:hover{background:#3a3a3a;color:#fff}
.lc-copy-btn.copied{color:#4ec9b0;border-color:#4ec9b0}
.lc-lang-badge{position:absolute;top:8px;left:20px;font-family:system-ui,sans-serif;
    font-size:.7em;color:#666;text-transform:uppercase;letter-spacing:.04em;
    line-height:1;pointer-events:none;opacity:0;transition:opacity .15s}
pre:hover .lc-lang-badge{opacity:1}
table{border-collapse:collapse;width:100%;margin:16px 0}
th,td{border:1px solid #ddd;padding:10px 14px;text-align:left}
th{background:#f0f0f0;font-weight:600}
tr:nth-child(even){background:#fafafa}
</style>
<p><script>
(function(){
  if(window.__lcCodeEnhanced)return;
  window.__lcCodeEnhanced=true;
  function enhance(){
    document.querySelectorAll('pre').forEach(function(pre){
      var code=pre.querySelector('code');
      var lang='';
      if(code){var m=(code.className||'').match(/language-(\S+)/);if(m)lang=m[1].toLowerCase();}
      if(lang)pre.setAttribute('data-lang',lang);
      if(lang){var badge=document.createElement('span');badge.className='lc-lang-badge';badge.textContent=lang;pre.insertBefore(badge,pre.firstChild);}
      var btn=document.createElement('button');
      btn.className='lc-copy-btn';btn.textContent='Copy';btn.setAttribute('aria-label','Copy code to clipboard');
      pre.appendChild(btn);
      btn.addEventListener('click',function(){
        var text=code?code.innerText:pre.innerText;
        if(navigator.clipboard&&window.isSecureContext){
          navigator.clipboard.writeText(text).then(function(){ok(btn);}).catch(function(){fb(text,btn);});
        }else{fb(text,btn);}
      });
    });
  }
  function ok(btn){btn.textContent='Copied!';btn.classList.add('copied');setTimeout(function(){btn.textContent='Copy';btn.classList.remove('copied');},2000);}
  function fb(text,btn){
    try{var ta=document.createElement('textarea');ta.value=text;ta.style.cssText='position:fixed;left:-9999px;top:-9999px;opacity:0';document.body.appendChild(ta);ta.select();document.execCommand('copy');document.body.removeChild(ta);ok(btn);}
    catch(e){btn.textContent='✗ Failed';setTimeout(function(){btn.textContent='Copy';},2000);}
  }
  if(document.readyState==='loading'){document.addEventListener('DOMContentLoaded',enhance);}else{enhance();}
})();
</script></p>
<p><em>Kubernetes CRDs &amp; Operators: Extending the API, Episode 2</em><br />
<em><a href="/what-is-kubernetes-crd/">What Is a CRD?</a> · </em><em><a href="/kubernetes-custom-resources-examples/">CRDs You Already Use</a></em><em> · <a href="/kubernetes-crd-schema-explained/">CRD Anatomy</a> · <a href="/write-kubernetes-crd-yaml-walkthrough/">Write Your First CRD</a> · <a href="/kubernetes-crd-cel-validation/">CEL Validation</a> · <a href="/kubernetes-controller-reconcile-loop/">Controller Loop</a> · <a href="/build-kubernetes-operator-controller-runtime/">Build an Operator</a> · <a href="/kubernetes-crd-versioning-conversion-webhook/">CRD Versioning</a> · <a href="/kubernetes-admission-webhooks-explained/">Admission Webhooks</a> · <a href="/kubernetes-crd-production-finalizers-conditions-rbac/">CRDs in Production</a></em></p>
<hr />
<h2 id="tldr">TL;DR</h2>
<ul>
<li>cert-manager, KEDA, and External Secrets Operator are all CRD-based systems — understanding their custom resources shows you what a well-designed CRD looks like before you build one</li>
<li>cert-manager&#8217;s <code class="" data-line="">Certificate</code> CRD expresses desired TLS state; the cert-manager controller reconciles that state by issuing, renewing, and storing certificates in Secrets</li>
<li>KEDA&#8217;s <code class="" data-line="">ScaledObject</code> extends the HorizontalPodAutoscaler with external metrics (queue depth, Kafka lag, Prometheus queries) — the KEDA operator translates ScaledObjects into native HPA objects</li>
<li>External Secrets Operator&#8217;s <code class="" data-line="">ExternalSecret</code> abstracts over secret backends (AWS Secrets Manager, HashiCorp Vault, GCP Secret Manager) — the controller pulls values and writes Kubernetes Secrets</li>
<li>All three follow the same pattern: you describe <strong>desired state</strong> in a custom resource; the operator <strong>reconciles</strong> actual state to match</li>
<li>Kubernetes custom resources examples like these are the fastest way to internalize the CRD mental model before writing your own</li>
</ul>
<hr />
<h2 id="the-big-picture">The Big Picture</h2>
<pre><code class="" data-line="">  THREE CRD-BASED OPERATORS AND WHAT THEY MANAGE

  ┌─────────────────────────────────────────────────────────────┐
  │  cert-manager                                               │
  │  Certificate CR  →  controller issues cert  →  TLS Secret  │
  └─────────────────────────────────────────────────────────────┘

  ┌─────────────────────────────────────────────────────────────┐
  │  KEDA                                                       │
  │  ScaledObject CR  →  controller creates HPA  →  Pod count  │
  └─────────────────────────────────────────────────────────────┘

  ┌─────────────────────────────────────────────────────────────┐
  │  External Secrets Operator                                  │
  │  ExternalSecret CR  →  controller pulls  →  K8s Secret      │
  │                         from Vault/AWS/GCP                  │
  └─────────────────────────────────────────────────────────────┘

  In every case:
  User creates CR  →  Operator watches CR  →  Operator acts  →  Status updated
</code></pre>
<p>Kubernetes custom resources examples from real tools like these reveal the design pattern you will use in every CRD you build: express desired state declaratively, let the controller bridge the gap to actual state, surface the outcome in the status subresource.</p>
<hr />
<h2 id="why-look-at-existing-crds-first">Why Look at Existing CRDs First?</h2>
<p>Before designing your own CRD, you want to understand what good CRD design looks like from the user&#8217;s perspective. The engineers at Jetstack (cert-manager), KEDACORE (KEDA), and External Secrets contributors have collectively solved the same problems you will face:</p>
<ul>
<li>What goes in <code class="" data-line="">spec</code> vs <code class="" data-line="">status</code>?</li>
<li>How do you reference other Kubernetes objects?</li>
<li>How do you handle secrets and credentials securely?</li>
<li>What does a healthy vs unhealthy custom resource look like?</li>
</ul>
<p>Studying these before writing your own saves you from the most common first-timer mistakes.</p>
<hr />
<h2 id="cert-manager-the-certificate-crd">cert-manager: The Certificate CRD</h2>
<p>cert-manager is the most widely deployed CRD-based system in Kubernetes. It manages TLS certificates from Let&#8217;s Encrypt, internal CAs, and cloud providers.</p>
<h3 id="the-core-crds">The core CRDs</h3>
<pre><code class="" data-line="">kubectl get crds | grep cert-manager
</code></pre>
<pre><code class="" data-line="">certificates.cert-manager.io
certificaterequests.cert-manager.io
challenges.acme.cert-manager.io
clusterissuers.cert-manager.io
issuers.cert-manager.io
orders.acme.cert-manager.io
</code></pre>
<p>The one you interact with most is <code class="" data-line="">Certificate</code>. Here is a real example:</p>
<pre><code class="" data-line="">apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: api-tls
  namespace: production
spec:
  secretName: api-tls-cert        # cert-manager writes the TLS Secret here
  duration: 2160h                 # 90 days
  renewBefore: 720h               # renew 30 days before expiry
  subject:
    organizations:
      - example.com
  dnsNames:
    - api.example.com
    - api-internal.example.com
  issuerRef:
    name: letsencrypt-prod
    kind: ClusterIssuer
</code></pre>
<p>What happens after you apply this:</p>
<ol>
<li>cert-manager controller sees the new <code class="" data-line="">Certificate</code> object</li>
<li>It contacts the referenced <code class="" data-line="">ClusterIssuer</code> (Let&#8217;s Encrypt in this case)</li>
<li>It completes the ACME challenge, obtains the certificate</li>
<li>It writes the certificate and private key into the <code class="" data-line="">api-tls-cert</code> Secret</li>
<li>It updates the <code class="" data-line="">Certificate</code> object&#8217;s <code class="" data-line="">status</code> to reflect success</li>
</ol>
<pre><code class="" data-line="">kubectl describe certificate api-tls -n production
</code></pre>
<pre><code class="" data-line="">Status:
  Conditions:
    Last Transition Time:  2026-04-10T08:00:00Z
    Message:               Certificate is up to date and has not expired
    Reason:                Ready
    Status:                True
    Type:                  Ready
  Not After:               2026-07-09T08:00:00Z
  Not Before:              2026-04-10T08:00:00Z
  Renewal Time:            2026-06-09T08:00:00Z
</code></pre>
<h3 id="what-this-teaches-you-about-crd-design">What this teaches you about CRD design</h3>
<ul>
<li><code class="" data-line="">spec.secretName</code> — the CR references an output object by name. The controller creates or updates that object.</li>
<li><code class="" data-line="">spec.issuerRef</code> — the CR references another custom resource (<code class="" data-line="">ClusterIssuer</code>) by name. This is a common pattern for separating configuration concerns.</li>
<li><code class="" data-line="">status.conditions</code> — the standard Kubernetes condition pattern: <code class="" data-line="">type</code>, <code class="" data-line="">status</code>, <code class="" data-line="">reason</code>, <code class="" data-line="">message</code>. You will use the same structure in your own CRDs.</li>
<li>The controller owns <code class="" data-line="">status</code> — users own <code class="" data-line="">spec</code>. This separation is a core convention.</li>
</ul>
<hr />
<h2 id="keda-the-scaledobject-crd">KEDA: The ScaledObject CRD</h2>
<p>KEDA (Kubernetes Event-Driven Autoscaling) extends Kubernetes autoscaling beyond CPU and memory. It can scale deployments based on queue depth, Kafka consumer lag, Prometheus metric values, and dozens of other event sources.</p>
<h3 id="the-core-crds_1">The core CRDs</h3>
<pre><code class="" data-line="">kubectl get crds | grep keda
</code></pre>
<pre><code class="" data-line="">clustertriggerauthentications.keda.sh
scaledjobs.keda.sh
scaledobjects.keda.sh
triggerauthentications.keda.sh
</code></pre>
<p>A <code class="" data-line="">ScaledObject</code> ties a Deployment to an external scaler:</p>
<pre><code class="" data-line="">apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: order-processor-scaler
  namespace: production
spec:
  scaleTargetRef:
    name: order-processor        # the Deployment to scale
  minReplicaCount: 0             # scale to zero when idle
  maxReplicaCount: 50
  triggers:
    - type: aws-sqs-queue
      metadata:
        queueURL: https://sqs.us-east-1.amazonaws.com/123456789/orders
        queueLength: &quot;5&quot;         # target: 5 messages per pod
        awsRegion: us-east-1
      authenticationRef:
        name: keda-sqs-auth      # TriggerAuthentication for AWS credentials
</code></pre>
<p>What KEDA does with this:</p>
<ol>
<li>KEDA controller sees the <code class="" data-line="">ScaledObject</code></li>
<li>It creates a native <code class="" data-line="">HorizontalPodAutoscaler</code> object targeting the <code class="" data-line="">order-processor</code> Deployment</li>
<li>KEDA&#8217;s metrics adapter polls the SQS queue depth and exposes it as a custom metric</li>
<li>The HPA uses that metric to scale replicas — including to zero when the queue is empty</li>
</ol>
<pre><code class="" data-line="">kubectl get scaledobject order-processor-scaler -n production
</code></pre>
<pre><code class="" data-line="">NAME                       SCALETARGETKIND      SCALETARGETNAME    MIN   MAX   TRIGGERS         READY   ACTIVE
order-processor-scaler     apps/Deployment      order-processor    0     50    aws-sqs-queue    True    True
</code></pre>
<h3 id="what-this-teaches-you-about-crd-design_1">What this teaches you about CRD design</h3>
<ul>
<li><code class="" data-line="">spec.scaleTargetRef</code> — targeting another object by name. The controller acts on that object, not on the CR itself.</li>
<li><code class="" data-line="">spec.triggers</code> — a list of trigger specifications. Lists of typed sub-objects are a recurring CRD pattern.</li>
<li><code class="" data-line="">spec.minReplicaCount: 0</code> — expressing scale-to-zero as a first-class concept in the API. Built-in HPA does not support this; KEDA&#8217;s CRD extends the vocabulary of what is expressible.</li>
<li>The KEDA operator translates <code class="" data-line="">ScaledObject</code> → native HPA. The CRD is an abstraction over a more complex Kubernetes object. This &#8220;translate and manage child resources&#8221; pattern is extremely common in operators.</li>
</ul>
<hr />
<h2 id="external-secrets-operator-the-externalsecret-crd">External Secrets Operator: The ExternalSecret CRD</h2>
<p>External Secrets Operator (ESO) solves a specific problem: secrets live in external systems (AWS Secrets Manager, HashiCorp Vault, GCP Secret Manager), but Kubernetes workloads need them as Kubernetes Secrets. ESO bridges the gap.</p>
<h3 id="the-core-crds_2">The core CRDs</h3>
<pre><code class="" data-line="">kubectl get crds | grep external-secrets
</code></pre>
<pre><code class="" data-line="">clusterexternalsecrets.external-secrets.io
clustersecretstores.external-secrets.io
externalsecrets.external-secrets.io
secretstores.external-secrets.io
</code></pre>
<p>A <code class="" data-line="">SecretStore</code> defines the backend connection:</p>
<pre><code class="" data-line="">apiVersion: external-secrets.io/v1beta1
kind: SecretStore
metadata:
  name: aws-secrets-manager
  namespace: production
spec:
  provider:
    aws:
      service: SecretsManager
      region: us-east-1
      auth:
        jwt:
          serviceAccountRef:
            name: eso-sa            # uses IRSA/workload identity
</code></pre>
<p>An <code class="" data-line="">ExternalSecret</code> defines what to pull and how to map it:</p>
<pre><code class="" data-line="">apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
  name: database-creds
  namespace: production
spec:
  refreshInterval: 1h
  secretStoreRef:
    name: aws-secrets-manager
    kind: SecretStore
  target:
    name: database-secret          # Kubernetes Secret to create/update
    creationPolicy: Owner
  data:
    - secretKey: username          # key in the K8s Secret
      remoteRef:
        key: prod/database         # path in AWS Secrets Manager
        property: username         # property within that secret
    - secretKey: password
      remoteRef:
        key: prod/database
        property: password
</code></pre>
<p>After ESO reconciles this:</p>
<pre><code class="" data-line="">kubectl get secret database-secret -n production -o jsonpath=&#039;{.data.username}&#039; | base64 -d
# outputs: db_user
</code></pre>
<pre><code class="" data-line="">kubectl describe externalsecret database-creds -n production
</code></pre>
<pre><code class="" data-line="">Status:
  Conditions:
    Last Transition Time:   2026-04-10T08:00:00Z
    Message:                Secret was synced
    Reason:                 SecretSynced
    Status:                 True
    Type:                   Ready
  Refresh Time:             2026-04-10T09:00:00Z
  Synced Resource Version:  1-abc123
</code></pre>
<h3 id="what-this-teaches-you-about-crd-design_2">What this teaches you about CRD design</h3>
<ul>
<li><code class="" data-line="">spec.secretStoreRef</code> — referencing a configuration CRD (<code class="" data-line="">SecretStore</code>) from an operational CRD (<code class="" data-line="">ExternalSecret</code>). This layering of CRDs to separate concerns is a mature pattern.</li>
<li><code class="" data-line="">spec.refreshInterval</code> — the CR expresses a desired behavior (periodic sync), not just a desired state snapshot. CRDs can express temporal behaviors.</li>
<li><code class="" data-line="">spec.target.creationPolicy: Owner</code> — ESO will set an owner reference on the created Secret, so deleting the <code class="" data-line="">ExternalSecret</code> cascades to deleting the Secret. This is how controllers manage lifecycle.</li>
<li>Sensitive values never appear in the CR — only paths and references. The controller handles the actual secret retrieval. This is a key security pattern in CRD design.</li>
</ul>
<hr />
<h2 id="the-common-pattern-across-all-three">The Common Pattern Across All Three</h2>
<pre><code class="" data-line="">  OPERATOR PATTERN (cert-manager / KEDA / ESO / every other operator)

  User applies CR
        │
        ▼
  Controller watches CRDs
  (informer cache, events queue)
        │
        ▼
  Controller reconciles:
  actual state ──→ compare ──→ desired state
        │              │
        │         (gap found)
        │              │
        ▼              ▼
  Takes action      Updates status
  (issue cert,      conditions in CR
   create HPA,
   sync Secret)
        │
        └──── loops back, watches for next change
</code></pre>
<p>The design contract:<br />
&#8211; <strong>Users write <code class="" data-line="">spec</code></strong> — what they want<br />
&#8211; <strong>Controllers read <code class="" data-line="">spec</code>, write <code class="" data-line="">status</code></strong> — what actually happened<br />
&#8211; <strong>Status conditions are truth</strong> — <code class="" data-line="">Ready: True/False</code> with <code class="" data-line="">reason</code> and <code class="" data-line="">message</code> tell operators what the controller knows</p>
<p>This pattern, <a href="/kubernetes-controller-reconcile-loop/">explained in depth in EP06</a>, is why CRDs and controllers are designed the way they are.</p>
<hr />
<h2 id="common-mistakes"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Common Mistakes</h2>
<p><strong>Installing CRDs without the controller.</strong> If you install cert-manager&#8217;s CRDs from the <code class="" data-line="">crds.yaml</code> manifest without installing cert-manager itself, <code class="" data-line="">Certificate</code> objects will be accepted by the API server but never reconciled. The <code class="" data-line="">Ready</code> condition will never appear. Always install the operator alongside its CRDs.</p>
<p><strong>Editing status fields directly.</strong> Many teams try <code class="" data-line="">kubectl patch</code> or <code class="" data-line="">kubectl edit</code> to update a custom resource&#8217;s status to work around a stuck controller. Most well-written controllers overwrite status every reconcile loop — your manual change will be wiped. Fix the underlying issue, not the status display.</p>
<p><strong>Assuming CRD deletion is safe.</strong> Covered in EP01 but worth repeating: deleting a CRD cascades to deleting all instances. If you <code class="" data-line="">kubectl delete crd certificates.cert-manager.io</code>, every <code class="" data-line="">Certificate</code> object in every namespace is gone and cert-manager will stop issuing. Back up CRDs and their instances before any CRD deletion.</p>
<hr />
<h2 id="quick-reference">Quick Reference</h2>
<pre><code class="" data-line=""># See all CRDs installed by cert-manager
kubectl get crds | grep cert-manager.io

# Get all Certificates across all namespaces
kubectl get certificates -A

# Watch cert-manager reconcile a new Certificate
kubectl get certificate api-tls -n production -w

# See all ScaledObjects and their current state
kubectl get scaledobjects -A

# Check ESO sync status for all ExternalSecrets
kubectl get externalsecrets -A

# Inspect what APIs a CRD exposes
kubectl api-resources | grep cert-manager
</code></pre>
<hr />
<h2 id="key-takeaways">Key Takeaways</h2>
<ul>
<li>cert-manager, KEDA, and ESO are canonical examples of well-designed CRD-based operators</li>
<li>All three follow the same pattern: user writes <code class="" data-line="">spec</code>, controller reconciles to actual state, status reflects outcome</li>
<li><code class="" data-line="">spec</code> expresses desired state declaratively; the controller figures out how to achieve it</li>
<li>Status conditions (<code class="" data-line="">type</code>, <code class="" data-line="">status</code>, <code class="" data-line="">reason</code>, <code class="" data-line="">message</code>) are the standard way to surface controller outcomes</li>
<li>Sensitive values never appear in the CR — controllers retrieve them from external systems using references and credentials</li>
</ul>
<hr />
<h2 id="whats-next">What&#8217;s Next</h2>
<p><a href="/kubernetes-crd-schema-explained/">EP03: CRD Anatomy</a> opens the YAML of a CRD itself — <code class="" data-line="">spec.versions</code>, OpenAPI schema properties, scope, names, and subresources. You have seen CRDs from the outside; next we look at how they are structured on the inside.</p>
<p>Get EP03 in your inbox when it publishes → <a href="https://linuxcent.com">subscribe at linuxcent.com</a></p>
<p><a class="a2a_button_mastodon" href="https://www.addtoany.com/add_to/mastodon?linkurl=https%3A%2F%2Flinuxcent.com%2Fkubernetes-custom-resources-examples%2F&amp;linkname=CRDs%20You%20Already%20Use%3A%20cert-manager%2C%20KEDA%2C%20and%20External%20Secrets%20Explained" title="Mastodon" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Flinuxcent.com%2Fkubernetes-custom-resources-examples%2F&amp;linkname=CRDs%20You%20Already%20Use%3A%20cert-manager%2C%20KEDA%2C%20and%20External%20Secrets%20Explained" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Flinuxcent.com%2Fkubernetes-custom-resources-examples%2F&amp;linkname=CRDs%20You%20Already%20Use%3A%20cert-manager%2C%20KEDA%2C%20and%20External%20Secrets%20Explained" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_reddit" href="https://www.addtoany.com/add_to/reddit?linkurl=https%3A%2F%2Flinuxcent.com%2Fkubernetes-custom-resources-examples%2F&amp;linkname=CRDs%20You%20Already%20Use%3A%20cert-manager%2C%20KEDA%2C%20and%20External%20Secrets%20Explained" title="Reddit" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_x" href="https://www.addtoany.com/add_to/x?linkurl=https%3A%2F%2Flinuxcent.com%2Fkubernetes-custom-resources-examples%2F&amp;linkname=CRDs%20You%20Already%20Use%3A%20cert-manager%2C%20KEDA%2C%20and%20External%20Secrets%20Explained" title="X" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Flinuxcent.com%2Fkubernetes-custom-resources-examples%2F&amp;linkname=CRDs%20You%20Already%20Use%3A%20cert-manager%2C%20KEDA%2C%20and%20External%20Secrets%20Explained" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_copy_link" href="https://www.addtoany.com/add_to/copy_link?linkurl=https%3A%2F%2Flinuxcent.com%2Fkubernetes-custom-resources-examples%2F&amp;linkname=CRDs%20You%20Already%20Use%3A%20cert-manager%2C%20KEDA%2C%20and%20External%20Secrets%20Explained" title="Copy Link" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Flinuxcent.com%2Fkubernetes-custom-resources-examples%2F&#038;title=CRDs%20You%20Already%20Use%3A%20cert-manager%2C%20KEDA%2C%20and%20External%20Secrets%20Explained" data-a2a-url="https://linuxcent.com/kubernetes-custom-resources-examples/" data-a2a-title="CRDs You Already Use: cert-manager, KEDA, and External Secrets Explained"></a></p><p>The post <a href="https://linuxcent.com/kubernetes-custom-resources-examples/">CRDs You Already Use: cert-manager, KEDA, and External Secrets Explained</a> appeared first on <a href="https://linuxcent.com">Linuxcent</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://linuxcent.com/kubernetes-custom-resources-examples/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1678</post-id>	</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Page Caching using Disk: Enhanced 

Served from: linuxcent.com @ 2026-08-28 10:20:16 by W3 Total Cache
-->