<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>containeroo.ch on contineroo.ch</title>
    <link>/</link>
    <description>Recent content in containeroo.ch on contineroo.ch</description>
    <generator>Hugo</generator>
    <language>en-US</language>
    <atom:link href="/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Account</title>
      <link>/docs/cloudflare-operator/resources/account/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/docs/cloudflare-operator/resources/account/</guid>
      <description>&lt;p&gt;The API specification can be viewed &lt;a href=&#34;/docs/cloudflare-operator/api_reference/#cloudflare-operator.io/v1.Account&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;In order to use cloudflare-operator, you need to create an account resource. This resource contains the credentials for the Cloudflare API.&lt;/p&gt;&#xA;&lt;p&gt;Learn more about the account resource in the &lt;a href=&#34;/docs/cloudflare-operator/get_started/&#34;&gt;getting started guide&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Core Concepts</title>
      <link>/docs/agent-forge-operator/core_concepts/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/docs/agent-forge-operator/core_concepts/</guid>
      <description>&lt;h2 id=&#34;architecture&#34;&gt;Architecture&lt;/h2&gt;&#xA;&lt;p&gt;agent-forge-operator is a demand-driven bridge between HyperShift Agent&#xA;NodePools and vSphere inventory. It does not scale NodePools directly and it&#xA;does not replace the hosted cluster autoscaler. It reacts to demand that&#xA;HyperShift and CAPI already expressed through &lt;code&gt;AgentMachine&lt;/code&gt; resources.&lt;/p&gt;&#xA;&lt;p&gt;The reconciliation flow is:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;The hosted cluster autoscaler changes HyperShift &lt;code&gt;NodePool&lt;/code&gt; demand.&lt;/li&gt;&#xA;&lt;li&gt;HyperShift and CAPI render &lt;code&gt;AgentMachine&lt;/code&gt; and &lt;code&gt;Machine&lt;/code&gt; resources.&lt;/li&gt;&#xA;&lt;li&gt;Waiting &lt;code&gt;AgentMachine&lt;/code&gt; resources report &lt;code&gt;Ready=False&lt;/code&gt; with &lt;code&gt;Reason=NoSuitableAgents&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;VsphereAgentPool&lt;/code&gt; reconciliation plans required capacity from AgentMachine demand, existing Agents, owned VMs, and InfraEnv state.&lt;/li&gt;&#xA;&lt;li&gt;A &lt;code&gt;VsphereAgent&lt;/code&gt; request creates one vSphere VM.&lt;/li&gt;&#xA;&lt;li&gt;The VM boots the InfraEnv discovery ISO and appears as an Assisted Installer &lt;code&gt;Agent&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;The operator prepares the Agent so the Agent CAPI provider can bind it to a Machine.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;demand&#34;&gt;Demand&lt;/h2&gt;&#xA;&lt;p&gt;The operator watches CAPI &lt;code&gt;AgentMachine&lt;/code&gt; objects for one HyperShift&#xA;&lt;code&gt;NodePool&lt;/code&gt;. It creates capacity only when an &lt;code&gt;AgentMachine&lt;/code&gt; reports&#xA;&lt;code&gt;Ready=False&lt;/code&gt; with &lt;code&gt;Reason=NoSuitableAgents&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Core Concepts</title>
      <link>/docs/cloudflare-operator/core_concepts/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/docs/cloudflare-operator/core_concepts/</guid>
      <description>&lt;h2 id=&#34;architecture&#34;&gt;Architecture&lt;/h2&gt;&#xA;&lt;p&gt;cloudflare-operator is designed to serve as the single source of truth for Cloudflare DNS records.&lt;br&gt;&#xA;It relies on the Kubernetes API to store the desired state of DNS records using Custom Resource Definitions (CRDs).&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/img/cloudflare-operator-architecture.png&#34; alt=&#34;cloudflare-operator architecture&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;dns-records&#34;&gt;DNS records&lt;/h2&gt;&#xA;&lt;p&gt;Cloudflare DNS records are specified using a CRD (&lt;code&gt;dnsrecords.cloudflare-operator.io&lt;/code&gt;).&lt;br&gt;&#xA;These records can be created manually, through a GitOps workflow, or automatically generated from Kubernetes Ingress resources and supported Gateway API routes when the feature flag is enabled.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Create DNS records from Ingress</title>
      <link>/docs/cloudflare-operator/guides/ingress/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/docs/cloudflare-operator/guides/ingress/</guid>
      <description>&lt;p&gt;cloudflare-operator can create DNS records from Ingress resources. This guide shows how to configure the controller to automatically create DNS records for your Ingress resources. The same annotations also apply to supported Gateway API route objects when the feature flag &lt;code&gt;--enable-gateway-api&lt;/code&gt; is enabled.&lt;/p&gt;&#xA;&lt;h2 id=&#34;ingress-annotations&#34;&gt;Ingress annotations&lt;/h2&gt;&#xA;&lt;p&gt;One of the following annotations is required: &lt;code&gt;cloudflare-operator.io/content&lt;/code&gt; or &lt;code&gt;cloudflare-operator.io/ip-ref&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;Ingress objects that do not have one of these annotations will be ignored by cloudflare-operator.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Monitoring with Prometheus</title>
      <link>/docs/agent-forge-operator/guides/monitoring/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/docs/agent-forge-operator/guides/monitoring/</guid>
      <description>&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Prometheus Operator or kube-prometheus-stack.&lt;/li&gt;&#xA;&lt;li&gt;agent-forge-operator installed through the Helm chart.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;enable-metrics-resources&#34;&gt;Enable metrics resources&lt;/h2&gt;&#xA;&lt;p&gt;Create a &lt;code&gt;values.yaml&lt;/code&gt; file:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;---&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;metrics&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;serviceMonitor&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;enabled&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;prometheusRule&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;enabled&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Install or upgrade the Helm chart by following &lt;a href=&#34;/docs/agent-forge-operator/installation/#customized-installation&#34;&gt;the installation guide&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;available-metrics&#34;&gt;Available metrics&lt;/h2&gt;&#xA;&lt;p&gt;The controller exposes these application metrics:&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Metric&lt;/th&gt;&#xA;          &lt;th&gt;Meaning&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;agent_forge_vsphere_vm_operations_total&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;VM create/delete attempts by operation and result.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;agent_forge_iso_operations_total&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;ISO cache ensure/delete attempts by operation and result.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;agent_forge_pool_capacity&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Per-pool capacity gauges for desired, waiting, available, pending, and planned-create counts.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;You can also use kube-state-metrics to alert on &lt;code&gt;VsphereAgentPool&lt;/code&gt; and&#xA;&lt;code&gt;VsphereAgent&lt;/code&gt; conditions once those custom resources are configured for state&#xA;metrics collection.&lt;/p&gt;</description>
    </item>
    <item>
      <title>VsphereAgentPool</title>
      <link>/docs/agent-forge-operator/resources/vsphereagentpool/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/docs/agent-forge-operator/resources/vsphereagentpool/</guid>
      <description>&lt;p&gt;The API specification can be viewed &lt;a href=&#34;/docs/agent-forge-operator/api_reference/#agent-forge.containeroo.ch/v1alpha1.VsphereAgentPool&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;VsphereAgentPool&lt;/code&gt; is a namespace-scoped bridge between one HyperShift Agent&#xA;&lt;code&gt;NodePool&lt;/code&gt; and vSphere VM inventory.&lt;/p&gt;&#xA;&lt;p&gt;HyperShift and CAPI remain authoritative. The operator reacts to&#xA;&lt;code&gt;AgentMachine&lt;/code&gt; objects that report &lt;code&gt;Ready=False&lt;/code&gt; with &lt;code&gt;Reason=NoSuitableAgents&lt;/code&gt;&#xA;by ensuring enough matching Assisted Installer &lt;code&gt;Agent&lt;/code&gt; objects can exist.&lt;/p&gt;&#xA;&lt;h2 id=&#34;example&#34;&gt;Example&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;apiVersion&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;agent-forge.containeroo.ch/v1alpha1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;kind&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;VsphereAgentPool&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;metadata&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;demo-worker&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;namespace&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;demo&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;spec&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;hostedClusterRef&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;demo&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;nodePoolRef&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;demo-worker&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;infraEnvRef&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;demo&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;controlPlaneNamespace&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;demo-demo&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;cleanupPolicy&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;Delete&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;vsphere&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;credentialsSecretRef&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;vsphere-credentials&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;datacenter&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;dc1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;datastoreCluster&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;workload-datastore-cluster&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;isoDatastore&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;iso-datastore&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;resourcePool&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;cluster/Resources&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;folder&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;demo&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;network&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;VM Network&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;template&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;namePrefix&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;demo-worker&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;numCPUs&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;memoryMiB&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;16384&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;diskGiB&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;agent&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;role&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;worker&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;approve&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;labels&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;hypershift.openshift.io/nodepool-role&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;worker&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;customer&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;example&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;iso&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;checkInterval&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;10m&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;retainVersions&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;pathPrefix&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;agent-forge/demo/demo-worker&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;required-spec-fields&#34;&gt;Required spec fields&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Field&lt;/th&gt;&#xA;          &lt;th&gt;Description&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;spec.hostedClusterRef.name&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;HostedCluster name in the same namespace as this resource.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;spec.nodePoolRef.name&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;HyperShift NodePool name in the same namespace as this resource.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;spec.infraEnvRef.name&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Assisted Installer InfraEnv name in the same namespace.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;spec.controlPlaneNamespace&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Hosted control plane namespace containing CAPI &lt;code&gt;AgentMachine&lt;/code&gt; and &lt;code&gt;Machine&lt;/code&gt; objects.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;spec.vsphere.credentialsSecretRef.name&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Secret containing vSphere &lt;code&gt;server&lt;/code&gt;, &lt;code&gt;username&lt;/code&gt;, and &lt;code&gt;password&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;spec.vsphere.datastoreCluster&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Datastore cluster for VM disks.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;spec.vsphere.isoDatastore&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Datastore for cached discovery ISOs.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;spec.vsphere.resourcePool&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Resource pool path, for example &lt;code&gt;cluster/Resources&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;spec.vsphere.network&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;vSphere network attached to the VM NIC.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;spec.agent.labels&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Labels required on discovered Agents. These should match the NodePool Agent selector.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;important-optional-spec-fields&#34;&gt;Important optional spec fields&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Field&lt;/th&gt;&#xA;          &lt;th&gt;Description&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;spec.vsphere.credentialsSecretRef.namespace&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Secret namespace. Defaults to the resource namespace.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;spec.vsphere.datacenter&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;vSphere datacenter name. Defaults to &lt;code&gt;dc1&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;spec.vsphere.folder&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;VM folder path. Defaults logically to the hosted cluster name when empty.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;spec.vsphere.vmTags&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Optional vSphere tag IDs to attach to created VMs.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;spec.vsphere.guestID&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Guest OS identifier. Defaults to &lt;code&gt;rhel9_64Guest&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;spec.vsphere.scsiType&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;SCSI controller type. Defaults to &lt;code&gt;pvscsi&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;spec.vsphere.firmware&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;VM firmware, &lt;code&gt;efi&lt;/code&gt; or &lt;code&gt;bios&lt;/code&gt;. Defaults to &lt;code&gt;efi&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;spec.vsphere.networkAdapterType&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;NIC adapter type. Defaults to &lt;code&gt;vmxnet3&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;spec.template.namePrefix&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Prefix for operator-created VM names.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;spec.template.numCPUs&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;VM vCPU count. Defaults to &lt;code&gt;4&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;spec.template.memoryMiB&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;VM memory in MiB. Defaults to &lt;code&gt;16384&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;spec.template.diskGiB&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Primary disk size in GiB. Defaults to &lt;code&gt;100&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;spec.agent.role&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Value for &lt;code&gt;hypershift.openshift.io/nodepool-role&lt;/code&gt;. Defaults to &lt;code&gt;worker&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;spec.agent.approve&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;When true, patch matching Agents with &lt;code&gt;spec.approved=true&lt;/code&gt;. Defaults to &lt;code&gt;true&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;spec.iso.checkInterval&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;How often to download and hash the InfraEnv ISO. Defaults to &lt;code&gt;10m&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;spec.iso.retainVersions&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Number of content-addressed ISO objects to keep. Defaults to &lt;code&gt;2&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;spec.iso.pathPrefix&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Datastore directory for cached ISO objects.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;spec.cleanupPolicy&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;Delete&lt;/code&gt; removes stale owned VMs and unbound Agents. &lt;code&gt;Retain&lt;/code&gt; leaves them in place. Defaults to &lt;code&gt;Delete&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;status&#34;&gt;Status&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;VsphereAgentPool.status&lt;/code&gt; reports observed AgentMachine demand, matching Agent&#xA;capacity, owned VM identities, active ISO cache state, planned actions, and&#xA;conditions.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Create DNS records from Gateway API routes</title>
      <link>/docs/cloudflare-operator/guides/gateway-api/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/docs/cloudflare-operator/guides/gateway-api/</guid>
      <description>&lt;p&gt;cloudflare-operator can create DNS records from Gateway API route resources. This is an opt-in feature controlled by &lt;code&gt;--enable-gateway-api&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Supported route kinds:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;HTTPRoute&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;TLSRoute&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;GRPCRoute&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;code&gt;TCPRoute&lt;/code&gt; and &lt;code&gt;UDPRoute&lt;/code&gt; are not supported directly because Gateway API does not define route-level hostnames for them. If you need DNS for TCP or UDP traffic, create a &lt;code&gt;DNSRecord&lt;/code&gt; resource manually for the hostname that should resolve to your gateway.&lt;/p&gt;&#xA;&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Install the Gateway API CRDs (for example &lt;code&gt;gateway.networking.k8s.io/v1&lt;/code&gt; from the upstream install manifests).&lt;/li&gt;&#xA;&lt;li&gt;Start cloudflare-operator with the flag &lt;code&gt;--enable-gateway-api&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;When installed with Helm, enable Gateway API reconciliation with:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Get Started</title>
      <link>/docs/agent-forge-operator/get_started/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/docs/agent-forge-operator/get_started/</guid>
      <description>&lt;p&gt;This tutorial walks through a first &lt;code&gt;VsphereAgentPool&lt;/code&gt; and active VM&#xA;reconciliation.&lt;/p&gt;&#xA;&lt;h2 id=&#34;before-you-begin&#34;&gt;Before you begin&lt;/h2&gt;&#xA;&lt;p&gt;The following prerequisites are required:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;A Kubernetes or OpenShift management cluster with agent-forge-operator installed.&lt;/li&gt;&#xA;&lt;li&gt;HyperShift and Assisted Installer resources.&lt;/li&gt;&#xA;&lt;li&gt;A hosted cluster that uses the Agent platform.&lt;/li&gt;&#xA;&lt;li&gt;A &lt;code&gt;NodePool&lt;/code&gt; for the hosted cluster.&lt;/li&gt;&#xA;&lt;li&gt;CAPI &lt;code&gt;AgentMachine&lt;/code&gt; and &lt;code&gt;Machine&lt;/code&gt; objects rendered for that NodePool in the hosted control plane namespace.&lt;/li&gt;&#xA;&lt;li&gt;An &lt;code&gt;InfraEnv&lt;/code&gt; in the hosted cluster namespace with &lt;code&gt;status.isoDownloadURL&lt;/code&gt; populated.&lt;/li&gt;&#xA;&lt;li&gt;vSphere credentials that can upload the discovery ISO, create VMs, power on VMs, and destroy operator-owned VMs.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;The examples use these names:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Get Started</title>
      <link>/docs/cloudflare-operator/get_started/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/docs/cloudflare-operator/get_started/</guid>
      <description>&lt;p&gt;This tutorial shows you how to get started with using cloudflare-operator and create a sample DNS record.&lt;/p&gt;&#xA;&lt;h2 id=&#34;before-you-begin&#34;&gt;Before you begin&lt;/h2&gt;&#xA;&lt;p&gt;The following prerequisites are required to complete this tutorial:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;A Kubernetes cluster with cloudflare-operator installed (follow &lt;a href=&#34;/docs/cloudflare-operator/installation/&#34;&gt;the installation guide&lt;/a&gt;)&lt;/li&gt;&#xA;&lt;li&gt;A Cloudflare account&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;create-cloudflare-api-token&#34;&gt;Create Cloudflare API token&lt;/h2&gt;&#xA;&lt;p&gt;The token can be created by following &lt;a href=&#34;https://developers.cloudflare.com/fundamentals/api/get-started/create-token/&#34; target=&#34;blank&#34;&gt;this guide&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The following permissions are required:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;Zone:Zone:Read&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Zone:DNS:Edit&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Configure the following &lt;code&gt;Zone resources&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;Include:All zones&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;or, if you want to limit the zones to which the token has access:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Monitoring with Prometheus</title>
      <link>/docs/cloudflare-operator/guides/monitoring/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/docs/cloudflare-operator/guides/monitoring/</guid>
      <description>&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/prometheus-community/helm-charts/tree/main/charts/prometheus&#34;&gt;Prometheus&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/helm-charts/tree/main/charts/grafana&#34;&gt;Grafana&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-state-metrics&#34;&gt;kube-state-metrics&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;The easiest way to deploy all the necessary components is to use&#xA;&lt;a href=&#34;https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack&#34;&gt;kube-prometheus-stack&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;enable-metrics&#34;&gt;Enable metrics&lt;/h2&gt;&#xA;&lt;p&gt;In order to enable metrics and automatically deploy the required resources, you need to reconfigure the Helm chart.&lt;/p&gt;&#xA;&lt;p&gt;Create a &lt;code&gt;values.yaml&lt;/code&gt; file with the following content:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;---&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;metrics&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;podMonitor&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;enabled&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;prometheusRule&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;enabled&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now you can install / upgrade the Helm chart by following &lt;a href=&#34;/docs/cloudflare-operator/installation/#customized-installation&#34;&gt;the installation guide&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;install-cloudflare-operator-grafana-dashboard&#34;&gt;Install cloudflare-operator Grafana dashboard&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Download Grafana dashboard&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wget https://raw.githubusercontent.com/containeroo/cloudflare-operator/master/config/manifests/grafana/dashboards/overview.json -O /tmp/grafana-dashboard-cloudflare-operator.json&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Create the configmap&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl create configmap grafana-dashboard-cloudflare-operator --from-file&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/tmp/grafana-dashboard-cloudflare-operator.json&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Add label so Grafana can fetch dashboard&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl label configmap grafana-dashboard-cloudflare-operator grafana_dashboard&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;available-metrics&#34;&gt;Available metrics&lt;/h2&gt;&#xA;&lt;p&gt;For each &lt;code&gt;cloudflare-operator.io&lt;/code&gt; kind, the controller exposes a gauge metric to track the status condition.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Troubleshooting</title>
      <link>/docs/agent-forge-operator/guides/troubleshooting/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/docs/agent-forge-operator/guides/troubleshooting/</guid>
      <description>&lt;h2 id=&#34;agentmachine-demand-is-not-observed&#34;&gt;AgentMachine demand is not observed&lt;/h2&gt;&#xA;&lt;p&gt;Check AgentMachines in the hosted control plane namespace:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl -n demo-demo get agentmachines.capi-provider.agent-install.openshift.io -o yaml&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl -n demo get vsphereagentpool demo-worker &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  -o jsonpath&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;{.status.conditions[?(@.type==&amp;#34;AgentMachineDemandFound&amp;#34;)]}{&amp;#34;\n&amp;#34;}&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Confirm that the AgentMachine has the expected&#xA;&lt;code&gt;hypershift.openshift.io/nodePool&lt;/code&gt; annotation and reports &lt;code&gt;Ready=False&lt;/code&gt; with&#xA;&lt;code&gt;Reason=NoSuitableAgents&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;infraenv-iso-is-unavailable&#34;&gt;InfraEnv ISO is unavailable&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl -n demo get infraenv demo -o yaml&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl -n demo get vsphereagentpool demo-worker &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  -o jsonpath&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;{.status.conditions[?(@.type==&amp;#34;InfraEnvAvailable&amp;#34;)]}{&amp;#34;\n&amp;#34;}&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The operator cannot create bootable discovery VMs until&#xA;&lt;code&gt;status.isoDownloadURL&lt;/code&gt; is populated on the InfraEnv.&lt;/p&gt;</description>
    </item>
    <item>
      <title>VsphereAgent</title>
      <link>/docs/agent-forge-operator/resources/vsphereagent/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/docs/agent-forge-operator/resources/vsphereagent/</guid>
      <description>&lt;p&gt;The API specification can be viewed &lt;a href=&#34;/docs/agent-forge-operator/api_reference/#agent-forge.containeroo.ch/v1alpha1.VsphereAgent&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;VsphereAgent&lt;/code&gt; represents one vSphere VM requested to satisfy AgentMachine&#xA;demand.&lt;/p&gt;&#xA;&lt;p&gt;Most users do not create &lt;code&gt;VsphereAgent&lt;/code&gt; resources manually. The&#xA;&lt;code&gt;AgentMachine&lt;/code&gt; controller creates one &lt;code&gt;VsphereAgent&lt;/code&gt; for each waiting&#xA;&lt;code&gt;AgentMachine&lt;/code&gt; when the selected &lt;code&gt;VsphereAgentPool&lt;/code&gt; needs additional capacity.&lt;/p&gt;&#xA;&lt;h2 id=&#34;example&#34;&gt;Example&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;apiVersion&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;agent-forge.containeroo.ch/v1alpha1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;kind&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;VsphereAgent&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;metadata&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;demo-worker-abc12&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;namespace&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;demo&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;spec&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;poolRef&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;demo-worker&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;spec&#34;&gt;Spec&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Field&lt;/th&gt;&#xA;          &lt;th&gt;Description&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;spec.poolRef.name&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Name of the &lt;code&gt;VsphereAgentPool&lt;/code&gt; whose configuration is used to create and manage the VM.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;status&#34;&gt;Status&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Field&lt;/th&gt;&#xA;          &lt;th&gt;Description&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;status.observedGeneration&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Latest resource generation reconciled by the controller.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;status.vm.name&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;vSphere VM name.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;status.vm.biosUUID&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;VM BIOS UUID when known.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;status.vm.macAddress&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Primary NIC MAC address when known.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;status.vm.agentRef&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Discovered Assisted Installer Agent matched to this VM.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;status.vm.machineRef&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;CAPI Machine paired with this VM when bound.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;status.vm.phase&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;VM lifecycle phase such as &lt;code&gt;Provisioning&lt;/code&gt;, &lt;code&gt;Available&lt;/code&gt;, &lt;code&gt;Bound&lt;/code&gt;, &lt;code&gt;Released&lt;/code&gt;, or &lt;code&gt;Orphaned&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;status.conditions&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Readiness and provider errors.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;When a &lt;code&gt;VsphereAgent&lt;/code&gt; is deleted, its finalizer deletes the paired vSphere VM&#xA;unless the owning &lt;code&gt;VsphereAgentPool&lt;/code&gt; uses &lt;code&gt;spec.cleanupPolicy: Retain&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Zone</title>
      <link>/docs/cloudflare-operator/resources/zone/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/docs/cloudflare-operator/resources/zone/</guid>
      <description>&lt;p&gt;The API specification can be viewed &lt;a href=&#34;/docs/cloudflare-operator/api_reference/#cloudflare-operator.io/v1.Zone&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Zone resources represent Cloudflare zones and are used to tell cloudflare-operator which zones to manage.&lt;/p&gt;&#xA;&lt;p&gt;Learn more about the zone resource in the &lt;a href=&#34;/docs/cloudflare-operator/get_started/&#34;&gt;getting started guide&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;If you have more than one Account resource, set &lt;code&gt;spec.accountRef.name&lt;/code&gt; on each Zone so the operator knows which Cloudflare credentials to use. When only one Account exists in the cluster, &lt;code&gt;accountRef&lt;/code&gt; can be omitted.&lt;/p&gt;&#xA;&lt;h2 id=&#34;prevent-certain-dns-records-from-being-deleted-when-zone-prune-is-enabled&#34;&gt;Prevent Certain DNS Records From Being Deleted When Zone Prune Is Enabled&lt;/h2&gt;&#xA;&lt;p&gt;Prior to &lt;strong&gt;v1.7.0&lt;/strong&gt;, &lt;code&gt;cloudflare-operator&lt;/code&gt; had a fixed set of DNS records that were always ignored when &lt;code&gt;Zone&lt;/code&gt; prune was enabled. These included records required for ACME certificate validation and Cloudflare-specific TXT records. Users could not modify this behavior.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cleanup Policy</title>
      <link>/docs/agent-forge-operator/guides/cleanup/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/docs/agent-forge-operator/guides/cleanup/</guid>
      <description>&lt;p&gt;&lt;code&gt;spec.cleanupPolicy&lt;/code&gt; controls whether agent-forge-operator deletes external&#xA;inventory when demand disappears or when a pool is deleted.&lt;/p&gt;&#xA;&lt;h2 id=&#34;delete&#34;&gt;Delete&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;Delete&lt;/code&gt; is the default policy.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;spec&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;cleanupPolicy&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;Delete&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With &lt;code&gt;Delete&lt;/code&gt;, the operator removes stale owned vSphere VMs and unbound Agents&#xA;when they are no longer needed. Scale-down is conservative: the controller&#xA;first observes a paired CAPI &lt;code&gt;Machine&lt;/code&gt; entering deletion, waits until that&#xA;Machine has disappeared, and only then deletes the paired &lt;code&gt;VsphereAgent&lt;/code&gt;, VM,&#xA;and stale Agent.&lt;/p&gt;</description>
    </item>
    <item>
      <title>DNSRecord</title>
      <link>/docs/cloudflare-operator/resources/dnsrecord/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/docs/cloudflare-operator/resources/dnsrecord/</guid>
      <description>&lt;p&gt;The API specification can be viewed &lt;a href=&#34;/docs/cloudflare-operator/api_reference/#cloudflare-operator.io/v1.DNSRecord&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;DNSRecord resources represent DNS records in the Cloudflare account.&lt;/p&gt;&#xA;&lt;p&gt;For each DNS record, you need to create a DNSRecord resource.&lt;/p&gt;&#xA;&lt;p&gt;cloudflare-operator will create the DNS record in the Cloudflare account and keep it in sync with the DNSRecord resource.&lt;/p&gt;&#xA;&lt;p&gt;As described in the Ingress and Gateway API guides, cloudflare-operator can create DNSRecords from Ingress and supported Gateway API route resources.&lt;/p&gt;&#xA;&lt;p&gt;DNSRecords are reconciled through the Account selected by their matching Zone. If the Zone does not set &lt;code&gt;spec.accountRef.name&lt;/code&gt;, a DNSRecord can set &lt;code&gt;spec.accountRef.name&lt;/code&gt; directly. If both the Zone and DNSRecord set an Account, they must reference the same Account.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Dynamic DNS with IP objects</title>
      <link>/docs/cloudflare-operator/guides/dynamic_ip/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/docs/cloudflare-operator/guides/dynamic_ip/</guid>
      <description>&lt;p&gt;As described in the &lt;a href=&#34;/docs/cloudflare-operator/core_concepts/#ip-objects&#34;&gt;core concept&lt;/a&gt;, IP objects allow you to&#xA;use cloudflare-operator as a dynamic DNS controller.&lt;/p&gt;&#xA;&lt;p&gt;In this guide, we will configure an IP object to fetch the public IP address from the internet and use it as the target&#xA;content for a DNS record.&lt;/p&gt;&#xA;&lt;h2 id=&#34;simple-example&#34;&gt;Simple example&lt;/h2&gt;&#xA;&lt;p&gt;Create an IP object with the following content:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;---&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;apiVersion&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;cloudflare-operator.io/v1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;kind&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;IP&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;metadata&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;external-v4&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;spec&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;ipSources&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - &lt;span style=&#34;color:#f92672&#34;&gt;requestMethod&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;GET&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;url&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;https://ifconfig.me/ip&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - &lt;span style=&#34;color:#f92672&#34;&gt;requestMethod&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;GET&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;url&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;https://ipecho.net/plain&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - &lt;span style=&#34;color:#f92672&#34;&gt;requestMethod&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;GET&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;url&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;https://myip.is/ip/&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - &lt;span style=&#34;color:#f92672&#34;&gt;requestMethod&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;GET&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;url&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;https://checkip.amazonaws.com&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - &lt;span style=&#34;color:#f92672&#34;&gt;requestMethod&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;GET&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;url&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;https://api.ipify.org&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;type&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;dynamic&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;interval&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;5m0s&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The IP object will fetch the public IP address from the internet using one of the specified URLs.&lt;br&gt;&#xA;If the request fails, the next URL will be tried. If all URLs fail, the last known IP will be used and&#xA;the ready condition will be set to &lt;code&gt;false&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Installation</title>
      <link>/docs/agent-forge-operator/installation/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/docs/agent-forge-operator/installation/</guid>
      <description>&lt;p&gt;This guide walks you through installing agent-forge-operator.&lt;/p&gt;&#xA;&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Install Helm 3.&lt;/li&gt;&#xA;&lt;li&gt;Kubernetes or OpenShift cluster.&lt;/li&gt;&#xA;&lt;li&gt;HyperShift and Assisted Installer resources for Agent platform clusters.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;install-agent-forge-operator&#34;&gt;Install agent-forge-operator&lt;/h2&gt;&#xA;&lt;h3 id=&#34;helm-repository&#34;&gt;Helm repository&lt;/h3&gt;&#xA;&lt;p&gt;Add the containeroo Helm chart repository:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;helm repo add containeroo https://charts.containeroo.ch&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Update the Helm chart repository:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;helm repo update&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;custom-resource-definitions&#34;&gt;Custom Resource Definitions&lt;/h3&gt;&#xA;&lt;p&gt;The Helm chart includes the &lt;code&gt;VsphereAgent&lt;/code&gt; and &lt;code&gt;VsphereAgentPool&lt;/code&gt; CRDs in the&#xA;chart &lt;code&gt;crds/&lt;/code&gt; directory. Helm installs CRDs on first install, but does not&#xA;upgrade or delete CRDs during normal chart upgrades.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Installation</title>
      <link>/docs/cloudflare-operator/installation/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/docs/cloudflare-operator/installation/</guid>
      <description>&lt;p&gt;This guide walks you through installing cloudflare-operator.&lt;/p&gt;&#xA;&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Install Helm 3&lt;/li&gt;&#xA;&lt;li&gt;Kubernetes cluster&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;install-cloudflare-operator&#34;&gt;Install cloudflare-operator&lt;/h2&gt;&#xA;&lt;h3 id=&#34;helm-repository&#34;&gt;Helm repository&lt;/h3&gt;&#xA;&lt;p&gt;Add the cloudflare-operator Helm chart repository:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;helm repo add containeroo https://charts.containeroo.ch&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Update the Helm chart repository:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;helm repo update&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;custom-resource-definitions&#34;&gt;Custom Resource Definitions&lt;/h3&gt;&#xA;&lt;p&gt;As per the Helm best practices, cloudflare-operator Helm chart doesn&amp;rsquo;t ship with CRDs.&lt;/p&gt;&#xA;&lt;p&gt;To install the latest CRDs, run the following command:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl apply -f https://github.com/containeroo/cloudflare-operator/releases/latest/download/crds.yaml&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you want to install a specific version of CRDs, run the following command:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Zone Migration</title>
      <link>/docs/cloudflare-operator/guides/zone_migration/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/docs/cloudflare-operator/guides/zone_migration/</guid>
      <description>&lt;p&gt;Starting with version v1.4.0, DNS record management has been redesigned to support externally managed records. This update requires users to explicitly specify which zones the operator should manage, providing greater control and preventing unintended modifications.&lt;/p&gt;&#xA;&lt;p&gt;For users already running cloudflare-operator prior to v1.4.0, existing functionality remains unchanged, except that DNS records are no longer automatically pruned. To restore the previous behavior, set the &lt;code&gt;spec.prune&lt;/code&gt; field to &lt;code&gt;true&lt;/code&gt; in the Zone object.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Fetch IP from a Kubernetes object</title>
      <link>/docs/cloudflare-operator/guides/ip_from_k8s/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/docs/cloudflare-operator/guides/ip_from_k8s/</guid>
      <description>&lt;p&gt;If you have a Kubernetes object that contains an IP address, you can use cloudflare-operator to fetch the IP address from the object and use it as the target content for a DNS record.&lt;/p&gt;&#xA;&lt;p&gt;This can be useful if you are using Istio or want to fetch the IP from a Kubernetes service.&lt;/p&gt;&#xA;&lt;p&gt;This guide will show you how to configure an IP object to fetch the IP address from a Kubernetes service.&lt;/p&gt;</description>
    </item>
    <item>
      <title>IP</title>
      <link>/docs/cloudflare-operator/resources/ip/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/docs/cloudflare-operator/resources/ip/</guid>
      <description>&lt;p&gt;The API specification can be viewed &lt;a href=&#34;/docs/cloudflare-operator/api_reference/#cloudflare-operator.io/v1.IP&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;As described in the &lt;a href=&#34;/docs/cloudflare-operator/core_concepts/#ip-objects&#34;&gt;core concept&lt;/a&gt;, IP objects can be used&#xA;to follow the &amp;ldquo;don&amp;rsquo;t repeat yourself&amp;rdquo; (DRY) principle.&lt;/p&gt;&#xA;&lt;p&gt;They also allow you to use the same IP address in multiple DNS records and let you use cloudflare-operator&#xA;as a dynamic DNS service.&lt;/p&gt;&#xA;&lt;p&gt;Learn more about the usage of IP objects in the &lt;a href=&#34;/docs/cloudflare-operator/guides/dynamic_ip/&#34;&gt;dynamic DNS guide&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>API Reference</title>
      <link>/docs/agent-forge-operator/api_reference/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/docs/agent-forge-operator/api_reference/</guid>
      <description>&lt;p&gt;Packages:&lt;/p&gt;&#xA;&lt;ul class=&#34;simple&#34;&gt;&#xA;&lt;li&gt;&#xA;&lt;a href=&#34;#agent-forge.containeroo.ch%2fv1alpha1&#34;&gt;agent-forge.containeroo.ch/v1alpha1&lt;/a&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;agent-forge.containeroo.ch/v1alpha1&#34;&gt;agent-forge.containeroo.ch/v1alpha1&lt;/h2&gt;&#xA;&lt;p&gt;Package v1alpha1 contains API Schema definitions for the agent-forge.containeroo.ch v1alpha1 API group.&lt;/p&gt;&#xA;Resource Types:&#xA;&lt;ul class=&#34;simple&#34;&gt;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;agent-forge.containeroo.ch/v1alpha1.AgentBindingSpec&#34;&gt;AgentBindingSpec&#xA;&lt;/h3&gt;&#xA;&lt;p&gt;&#xA;(&lt;em&gt;Appears on:&lt;/em&gt;&#xA;&lt;a href=&#34;#agent-forge.containeroo.ch/v1alpha1.VsphereAgentPoolSpec&#34;&gt;VsphereAgentPoolSpec&lt;/a&gt;)&#xA;&lt;/p&gt;&#xA;&lt;p&gt;AgentBindingSpec describes how a discovered Assisted Installer Agent should&#xA;be made consumable by the Hypershift Agent NodePool.&lt;/p&gt;&#xA;&lt;div class=&#34;md-typeset__scrollwrap&#34;&gt;&#xA;&lt;div class=&#34;md-typeset__table&#34;&gt;&#xA;&lt;table&gt;&#xA;&lt;thead&gt;&#xA;&lt;tr&gt;&#xA;&lt;th&gt;Field&lt;/th&gt;&#xA;&lt;th&gt;Description&lt;/th&gt;&#xA;&lt;/tr&gt;&#xA;&lt;/thead&gt;&#xA;&lt;tbody&gt;&#xA;&lt;tr&gt;&#xA;&lt;td&gt;&#xA;&lt;code&gt;role&lt;/code&gt;&lt;br&gt;&#xA;&lt;em&gt;&#xA;string&#xA;&lt;/em&gt;&#xA;&lt;/td&gt;&#xA;&lt;td&gt;&#xA;&lt;p&gt;Role is the Hypershift NodePool role label value to apply to discovered&#xA;Agents. For worker pools this is normally &amp;ldquo;worker&amp;rdquo;.&lt;/p&gt;&#xA;&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&lt;tr&gt;&#xA;&lt;td&gt;&#xA;&lt;code&gt;labels&lt;/code&gt;&lt;br&gt;&#xA;&lt;em&gt;&#xA;map[string]string&#xA;&lt;/em&gt;&#xA;&lt;/td&gt;&#xA;&lt;td&gt;&#xA;&lt;p&gt;Labels are required on a discovered Agent before the Agent CAPI provider&#xA;can bind it to an AgentMachine. These should match the NodePool&#xA;spec.platform.agent.agentLabelSelector labels.&lt;/p&gt;</description>
    </item>
    <item>
      <title>API Reference</title>
      <link>/docs/cloudflare-operator/api_reference/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/docs/cloudflare-operator/api_reference/</guid>
      <description>&lt;p&gt;Packages:&lt;/p&gt;&#xA;&lt;ul class=&#34;simple&#34;&gt;&#xA;  &lt;li&gt;&#xA;    &lt;a href=&#34;#cloudflare-operator.io%2fv1&#34;&gt;cloudflare-operator.io/v1&lt;/a&gt;&#xA;  &lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;cloudflare-operator.io/v1&#34;&gt;cloudflare-operator.io/v1&lt;/h2&gt;&#xA;&lt;p&gt;Package v1 contains API Schema definitions for the source v1 API group&lt;/p&gt;&#xA;Resource Types:&#xA;&lt;ul class=&#34;simple&#34;&gt;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;cloudflare-operator.io/v1.Account&#34;&gt;Account&lt;/h3&gt;&#xA;&lt;p&gt;Account is the Schema for the accounts API&lt;/p&gt;&#xA;&lt;div class=&#34;md-typeset__scrollwrap&#34;&gt;&#xA;  &lt;div class=&#34;md-typeset__table&#34;&gt;&#xA;    &lt;table&gt;&#xA;      &lt;thead&gt;&#xA;        &lt;tr&gt;&#xA;          &lt;th&gt;Field&lt;/th&gt;&#xA;          &lt;th&gt;Description&lt;/th&gt;&#xA;        &lt;/tr&gt;&#xA;      &lt;/thead&gt;&#xA;      &lt;tbody&gt;&#xA;        &lt;tr&gt;&#xA;          &lt;td&gt;&#xA;            &lt;code&gt;metadata&lt;/code&gt;&lt;br /&gt;&#xA;            &lt;em&gt;&#xA;              &lt;a&#xA;                href=&#34;https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.26/#objectmeta-v1-meta&#34;&#xA;              &gt;&#xA;                Kubernetes meta/v1.ObjectMeta&#xA;              &lt;/a&gt;&#xA;            &lt;/em&gt;&#xA;          &lt;/td&gt;&#xA;          &lt;td&gt;&#xA;            Refer to the Kubernetes API documentation for the fields of the&#xA;            &lt;code&gt;metadata&lt;/code&gt; field.&#xA;          &lt;/td&gt;&#xA;        &lt;/tr&gt;&#xA;        &lt;tr&gt;&#xA;          &lt;td&gt;&#xA;            &lt;code&gt;spec&lt;/code&gt;&lt;br /&gt;&#xA;            &lt;em&gt;&#xA;              &lt;a href=&#34;#cloudflare-operator.io/v1.AccountSpec&#34;&gt; AccountSpec &lt;/a&gt;&#xA;            &lt;/em&gt;&#xA;          &lt;/td&gt;&#xA;          &lt;td&gt;&#xA;            &lt;br /&gt;&#xA;            &lt;br /&gt;&#xA;            &lt;table&gt;&#xA;              &lt;tr&gt;&#xA;                &lt;td&gt;&#xA;                  &lt;code&gt;apiToken&lt;/code&gt;&lt;br /&gt;&#xA;                  &lt;em&gt;&#xA;                    &lt;a href=&#34;#cloudflare-operator.io/v1.AccountSpecApiToken&#34;&gt;&#xA;                      AccountSpecApiToken&#xA;                    &lt;/a&gt;&#xA;                  &lt;/em&gt;&#xA;                &lt;/td&gt;&#xA;                &lt;td&gt;&#xA;                  &lt;p&gt;Cloudflare API token&lt;/p&gt;&#xA;                &lt;/td&gt;&#xA;              &lt;/tr&gt;&#xA;              &lt;tr&gt;&#xA;                &lt;td&gt;&#xA;                  &lt;code&gt;interval&lt;/code&gt;&lt;br /&gt;&#xA;                  &lt;em&gt;&#xA;                    &lt;a&#xA;                      href=&#34;https://godoc.org/k8s.io/apimachinery/pkg/apis/meta/v1#Duration&#34;&#xA;                    &gt;&#xA;                      Kubernetes meta/v1.Duration&#xA;                    &lt;/a&gt;&#xA;                  &lt;/em&gt;&#xA;                &lt;/td&gt;&#xA;                &lt;td&gt;&#xA;                  &lt;em&gt;(Optional)&lt;/em&gt;&#xA;                  &lt;p&gt;Interval to check account status&lt;/p&gt;&#xA;                &lt;/td&gt;&#xA;              &lt;/tr&gt;&#xA;              &lt;tr&gt;&#xA;                &lt;td&gt;&#xA;                  &lt;code&gt;managedZones&lt;/code&gt;&lt;br /&gt;&#xA;                  &lt;em&gt; []string &lt;/em&gt;&#xA;                &lt;/td&gt;&#xA;                &lt;td&gt;&#xA;                  &lt;em&gt;(Optional)&lt;/em&gt;&#xA;                  &lt;p&gt;&#xA;                    List of zone names that should be managed by&#xA;                    cloudflare-operator Deprecated and will be removed in a&#xA;                    future release&#xA;                  &lt;/p&gt;</description>
    </item>
    <item>
      <title>Migration to cloudflare-operator</title>
      <link>/docs/cloudflare-operator/guides/migration/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/docs/cloudflare-operator/guides/migration/</guid>
      <description>&lt;p&gt;cloudflare-operator is designed to be the single source of truth for DNS records. This means that all records not known to cloudflare-operator will be deleted.&lt;/p&gt;&#xA;&lt;p&gt;In order to prevent the deletion of the entire DNS zone after you have installed cloudflare-operator, you need to migrate your DNS records to cloudflare-operator.&lt;/p&gt;&#xA;&lt;p&gt;For that we have created a &lt;a href=&#34;https://github.com/containeroo/cfop-generator&#34; target=&#34;blank&#34;&gt;migration tool&lt;/a&gt; that generates DNSRecord objects for all DNS records in your DNS zone.&lt;/p&gt;&#xA;&lt;p&gt;To export your DNS records, follow &lt;a href=&#34;https://developers.cloudflare.com/dns/manage-dns-records/how-to/import-and-export/#export-records&#34; target=&#34;blank&#34;&gt;this guide&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Traefik 2.2 &#43; Docker: Global entrypoint configuration</title>
      <link>/blog/2020/03/25/traefik-2.2--docker-global-entrypoint-configuration/</link>
      <pubDate>Wed, 25 Mar 2020 00:00:00 +0000</pubDate>
      <guid>/blog/2020/03/25/traefik-2.2--docker-global-entrypoint-configuration/</guid>
      <description>&lt;img alt=&#34;Header image&#34; src=&#34;featured-image.png&#34; /&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://user-images.githubusercontent.com/5674651/76004307-90636980-5f09-11ea-9338-b3055d8b20ee.png&#34;&gt;Image Source&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;With Traefik 2.2 it is now easier then ever to globally configure your entrypoints.&lt;/p&gt;&#xA;&lt;p&gt;We will show you how you can define a global redirect to &lt;code&gt;https&lt;/code&gt; and how to set a default &lt;code&gt;certResolver&lt;/code&gt;. So you don&amp;rsquo;t have to set the &lt;code&gt;https&lt;/code&gt; redirect in each docker-compose file.&lt;/p&gt;&#xA;&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;&#xA;&lt;p&gt;In order to follow along, you&amp;rsquo;ll need to read &lt;a href=&#34;https://blog.containeroo.ch/2019/09/24/2019-09-24_traefik-2.0-docker-an-advanced-guide/&#34;&gt;the advanced Traefik guide&lt;/a&gt; and the &lt;a href=&#34;https://blog.containeroo.ch/2019/11/12/2019-11-12_traefik-2.0-wildcard-lets-encrypt-certificates/&#34;&gt;wildcard guide&lt;/a&gt; first!&lt;/p&gt;&#xA;&lt;h2 id=&#34;update-traefik-configuration&#34;&gt;Update Traefik Configuration&lt;/h2&gt;&#xA;&lt;p&gt;Change the entrypoints in the basic Traefik configuration file (&lt;code&gt;/opt/containers/traefik/data/traefik.yml&lt;/code&gt;) as follows:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Traefik 2.0: Route external services through Traefik</title>
      <link>/blog/2020/01/02/traefik-2.0-route-external-services-through-traefik/</link>
      <pubDate>Thu, 02 Jan 2020 00:00:00 +0000</pubDate>
      <guid>/blog/2020/01/02/traefik-2.0-route-external-services-through-traefik/</guid>
      <description>&lt;img alt=&#34;Header image&#34; src=&#34;featured-image.png&#34; /&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://docs.traefik.io/assets/img/providers.png&#34;&gt;Image Source&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;In this tutorial we will show you how you can route non-Docker services through Traefik.&lt;/p&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s suppose you want to access your Pi-hole admin console (&lt;a href=&#34;http://192.168.0.10:80/admin&#34;&gt;http://192.168.0.10:80/admin&lt;/a&gt;) by browsing to &lt;code&gt;pihole.example.com&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;&#xA;&lt;p&gt;You have read our other articles:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.containeroo.ch/2019/09/24/2019-09-24_traefik-2.0-docker-a-simple-step-by-step-guide/&#34;&gt;Traefik 2.0 + Docker: A Simple Step by Step Guide&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.containeroo.ch/2019/09/24/2019-09-24_traefik-2.0-docker-an-advanced-guide/&#34;&gt;Traefik 2.0 + Docker: An Advanced Guide&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;and you use &lt;a href=&#34;https://gist.github.com/containeroo-gists/866810758db56ea33a9c59390c18ea81&#34;&gt;this Traefik configuration&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Make sure you configure in the providers section of your &lt;code&gt;/opt/traefik/data/traefik.yml&lt;/code&gt; an external configuration file &lt;code&gt;/config.yml&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Traefik 2.0: Paranoid about mounting /var/run/docker.sock?</title>
      <link>/blog/2019/11/12/traefik-2.0-paranoid-about-mounting-/var/run/docker.sock/</link>
      <pubDate>Tue, 12 Nov 2019 00:00:00 +0000</pubDate>
      <guid>/blog/2019/11/12/traefik-2.0-paranoid-about-mounting-/var/run/docker.sock/</guid>
      <description>&lt;img alt=&#34;Header image&#34; src=&#34;featured-image.png&#34; /&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.docker.com&#34;&gt;Image Source&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-problem&#34;&gt;The Problem&lt;/h2&gt;&#xA;&lt;p&gt;If you have followed our previous guides, you mount the Docker Socket ( &lt;code&gt;/var/run/docker.sock&lt;/code&gt;) into the Traefik container. If someone gets access into the Traefik container, they can gain full access to your host machine. This makes our paranoia level increase slightly&amp;hellip;&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-solution&#34;&gt;The Solution&lt;/h2&gt;&#xA;&lt;p&gt;We found a nice little container (&lt;a href=&#34;https://github.com/Tecnativa/docker-socket-proxy&#34;&gt;Socket-Proxy&lt;/a&gt;) which &amp;ldquo;filters&amp;rdquo; all requests to the Docker API. We can allow only &lt;code&gt;get&lt;/code&gt; requests to the Docker API and restrict it to &lt;code&gt;/containers/*&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Traefik 2.0: Wildcard Let&#39;s Encrypt Certificates</title>
      <link>/blog/2019/11/12/traefik-2.0-wildcard-lets-encrypt-certificates/</link>
      <pubDate>Tue, 12 Nov 2019 00:00:00 +0000</pubDate>
      <guid>/blog/2019/11/12/traefik-2.0-wildcard-lets-encrypt-certificates/</guid>
      <description>&lt;img alt=&#34;Header image&#34; src=&#34;featured-image.png&#34; /&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://letsencrypt.org/images/le-logo-wide.png&#34;&gt;Image Source&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;In this tutorial we will setup Traefik to obtain wildcard certificates from Let&amp;rsquo;s Encrypt. This requires DNS challenge to be setup. Usually Traefik obtains a certificate for every subdomain. We can simplify this process by telling Traefik to use a wildcard (*.example.com) certificate instead.&lt;/p&gt;&#xA;&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Registered Domain&lt;/li&gt;&#xA;&lt;li&gt;Authoritative DNS Servers from one of &lt;a href=&#34;https://docs.traefik.io/https/acme/#providers&#34;&gt;these providers&lt;/a&gt; (you may need to change your DNS servers of your domain to one of the provider in the list)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;In this tutorial we will use Cloudflare as our DNS servers for our domain.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using Pi-hole to route your services internally</title>
      <link>/blog/2019/11/12/using-pi-hole-to-route-your-services-internally/</link>
      <pubDate>Tue, 12 Nov 2019 00:00:00 +0000</pubDate>
      <guid>/blog/2019/11/12/using-pi-hole-to-route-your-services-internally/</guid>
      <description>&lt;img alt=&#34;Header image&#34; src=&#34;featured-image.png&#34; /&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.taste-of-it.de/wp-content/uploads/2019/09/pihole-logo.png&#34;&gt;Image Source&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-problem&#34;&gt;The Problem&lt;/h2&gt;&#xA;&lt;p&gt;If you have followed our previous guides, chances are that you have a domain, some DNS records pointing to your public IP, port forwarding enabled and a Docker server running some services.&lt;/p&gt;&#xA;&lt;p&gt;Most likely your domain resolves to your public IP from you internal network as well.&#xA;This causes a problem: All the traffic between your devices (e.g. your phone) to your server (physically in the same location) gets routed trough the internet, which means you have to utilize your upload and download bandwidth at the same time (e.g. while streaming from Plex), which not only causes a slower connection but also adds an unnecessary high latency.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Traefik 2.0 &#43; Docker: A Simple Step by Step Guide</title>
      <link>/blog/2019/09/24/traefik-2.0--docker-a-simple-step-by-step-guide/</link>
      <pubDate>Tue, 24 Sep 2019 00:00:00 +0000</pubDate>
      <guid>/blog/2019/09/24/traefik-2.0--docker-a-simple-step-by-step-guide/</guid>
      <description>&lt;img alt=&#34;Header image&#34; src=&#34;featured-image.png&#34; /&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://docs.traefik.io/assets/img/traefik-architecture.png&#34;&gt;Image Source&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;In this tutorial we will go trough the following things:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Setup and configure Traefik in a Docker container&lt;/li&gt;&#xA;&lt;li&gt;Let&amp;rsquo;s Encrypt setup for automatic HTTPS certificates&lt;/li&gt;&#xA;&lt;li&gt;Deploy a simple service (Portainer) and expose it to the internet&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;You will find all the required configuration files in our &lt;a href=&#34;https://github.com/containeroo/traefik-simple&#34;&gt;Git repository&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;&#xA;&lt;p&gt;In order to follow along, you need these things:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Docker (obviously)&lt;/li&gt;&#xA;&lt;li&gt;Docker Compose&lt;/li&gt;&#xA;&lt;li&gt;A domain&lt;/li&gt;&#xA;&lt;li&gt;Ports 80 and 443 forwarded to your Docker host&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;setup-and-configure-traefik-with-lets-encrypt&#34;&gt;Setup and configure Traefik with Let&amp;rsquo;s Encrypt&lt;/h2&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s get started by setting up Traefik.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Traefik 2.0 &#43; Docker: An Advanced Guide</title>
      <link>/blog/2019/09/24/traefik-2.0--docker-an-advanced-guide/</link>
      <pubDate>Tue, 24 Sep 2019 00:00:00 +0000</pubDate>
      <guid>/blog/2019/09/24/traefik-2.0--docker-an-advanced-guide/</guid>
      <description>&lt;img alt=&#34;Header image&#34; src=&#34;featured-image.png&#34; /&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://docs.traefik.io/assets/img/routers.png&#34;&gt;Image Source&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;This tutorial is the second part of &lt;a href=&#34;https://blog.containeroo.ch/2019/09/24/2019-09-24_traefik-2.0-docker-a-simple-step-by-step-guide/&#34;&gt;this article&lt;/a&gt;. We will go trough the following configurations:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Add a file provider to &lt;code&gt;traefik.yml&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Create a config file for a central configuration for storing middlewares &lt;code&gt;config.yml&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Configure a middleware chain&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;You will find all the required configuration files in our Git &lt;a href=&#34;https://github.com/containeroo/traefik-advanced&#34;&gt;repository&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;&#xA;&lt;p&gt;In order to follow along, you&amp;rsquo;ll need to read &lt;a href=&#34;https://blog.containeroo.ch/2019/09/24/2019-09-24_traefik-2.0-docker-a-simple-step-by-step-guide/&#34;&gt;this post&lt;/a&gt;!&lt;/p&gt;&#xA;&lt;h2 id=&#34;update-traefik-configuration&#34;&gt;Update Traefik configuration&lt;/h2&gt;&#xA;&lt;p&gt;To setup a reusable middleware add an additional provider in the Traefik configuration file &lt;code&gt;traefik.yml&lt;/code&gt; (&lt;code&gt;/opt/containers/traefik/traefik.yml&lt;/code&gt;) (lines 15 and 16).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Search Results</title>
      <link>/search/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/search/</guid>
      <description></description>
    </item>
  </channel>
</rss>
