diff --git a/devel/404.html b/devel/404.html index 1b325200ac..c2309e9368 100644 --- a/devel/404.html +++ b/devel/404.html @@ -90,7 +90,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="./offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="./offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="./" data-offline-search-max-results="10" > diff --git a/devel/docs/advanced/index.html b/devel/docs/advanced/index.html new file mode 100644 index 0000000000..85f196de0d --- /dev/null +++ b/devel/docs/advanced/index.html @@ -0,0 +1,1288 @@ + + + + + + + + + + + + + + + + + + + + + +Advanced Features | Verrazzano Enterprise Container Platform + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+
+ + +
+ + + + + +
+

Advanced Features

+ + + +
+ + + + + + + + +
+ + +
+
+ Create OCNE Clusters Running on Microsoft Azure +
+

Configure Oracle Cloud Native Environment self-managed clusters to run on Microsoft Azure

+
+ + +
+
+ Create OCNE Clusters Running on VMware vSphere +
+

Configure Oracle Cloud Native Environment self-managed clusters to run on VMware vSphere

+
+ + +
+ +
+ + + + + + +
+ +
+
+ +
+
+
+ +
+ + + + + + + + + \ No newline at end of file diff --git a/devel/docs/advanced/index.xml b/devel/docs/advanced/index.xml new file mode 100644 index 0000000000..f6ff1109ee --- /dev/null +++ b/devel/docs/advanced/index.xml @@ -0,0 +1,5030 @@ + + + Verrazzano Enterprise Container Platform – Advanced Features + /docs/advanced/ + Recent content in Advanced Features on Verrazzano Enterprise Container Platform + Hugo -- gohugo.io + + + + + + + + + + + Docs: Create OCNE Clusters Running on Microsoft Azure + /docs/advanced/ocne-azure/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/advanced/ocne-azure/ + + + + + +<div class="alert alert-danger" role="alert"> +<h4 class="alert-heading">NOTE</h4> + + This feature is experimental. It has not been thoroughly tested and is provided for informational purposes only. We make no guarantees about its safety or stability and do not recommend implementing this feature in production environments. + +</div> + +<p>The Cluster API project provides a standard set of Kubernetes-style APIs for cluster management. Officially, Verrazzano currently only supports using Cluster API to <a href="../../docs/setup/provision-cluster/">provision OCNE and OKE clusters on OCI</a>.</p> +<p>However, you can also experiment with using the features of the Cluster API project directly to deploy OCNE clusters on Microsoft Azure.</p> +<p>For more information on Cluster API or Cluster API with Azure, see:</p> +<ul> +<li><a href="https://cluster-api.sigs.k8s.io/introduction.html">Kubernetes Cluster API Documentation</a></li> +<li><a href="https://capz.sigs.k8s.io/introduction">The Cluster API Provider Azure Book</a> +<ul> +<li><a href="https://capz.sigs.k8s.io/topics/getting-started">Getting started with cluster-api-provider-azure</a></li> +</ul> +</li> +</ul> + + +<div class="alert alert-primary" role="alert"> +<h4 class="alert-heading">NOTE</h4> + + <p>Verrazzano and Cluster API use slightly different terminology for the same concepts:</p> +<ul> +<li>Admin cluster (Verrazzano) = management cluster (Cluster API)</li> +<li>Managed cluster (Verrazzano) = workload cluster (Cluster API)</li> +</ul> + + +</div> + +<h2 id="prepare-azure-resources">Prepare Azure resources</h2> +<p>Before you can deploy a Cluster API cluster, you need to set up a few resources in Azure.</p> +<ol> +<li>Install the Azure command-line interface (CLI) tool. For instructions, see <a href="https://learn.microsoft.com/en-us/cli/azure/install-azure-cli">How to install the Azure CLI</a> in the Microsoft Azure documentation.</li> +<li>Create an Azure resource group. In the Azure CLI, run the following command: +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre tabindex="0"><code>$ az group create --name &lt;ResourceGroupName&gt; --location &lt;location&gt; +</code></pre></div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script> +For more detailed instructions, see <a href="https://learn.microsoft.com/en-us/azure/azure-resource-manager/management/manage-resource-groups-cli">Manage Azure Resource Groups by using Azure CLI</a> in the Microsoft Azure documentation.</li> +<li>Create a service principal. Make sure it has the privileges it needs to create resources. This means a contributor role at minimum. The following example creates a service principal, assigns it the contributor role, and defines its scope. +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre tabindex="0"><code>$ az ad sp create-for-rbac --name myServicePrincipalName \ + --role Contributor \ + --scopes /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName +</code></pre></div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script> +For more detailed instructions, see <a href="https://learn.microsoft.com/en-us/cli/azure/azure-cli-sp-tutorial-1">Create an Azure service principal with Azure CLI</a> in the Microsoft Azure documentation.</li> +</ol> +<h2 id="set-up-the-admin-cluster">Set up the admin cluster</h2> +<p>The Cluster API requires an initial cluster as a starting point to deploy its resources.</p> +<ol> +<li> +<p>Install kind. Follow the instructions at <a href="https://kind.sigs.k8s.io/docs/user/quick-start/#installation">Installation</a> in the kind documentation.</p> +</li> +<li> +<p>Create a Kubernetes cluster using kind. Follow the instructions at <a href="https://cluster-api.sigs.k8s.io/user/quick-start#install-andor-configure-a-kubernetes-cluster">Quick Start: Install and/or configure a Kubernetes cluster</a> in The Cluster API Book.</p> +</li> +<li> +<p>Install the clusterctl CLI tool. clusterctl manages the lifecycle operations of a cluster API admin cluster. Follow the instructions at <a href="https://cluster-api.sigs.k8s.io/user/quick-start.html#install-clusterctl">Quick Start: Install clusterctl</a> in the Cluster API Book.</p> +</li> +<li> +<p>Install the Verrazzano CLI tool using the instructions at <a href="../../docs/setup/install/prepare/cli-setup/">CLI Setup</a>.</p> +</li> +<li> +<p>Install Verrazzano on the cluster using either the <code>dev</code> or <code>prod</code> installation profile. Follow the instructions at <a href="../../docs/setup/install/perform/cli-installation/">Install with CLI</a>. The <code>certManager</code> and <code>clusterAPI</code> components are required and must remain enabled.</p> +</li> +<li> +<p>On the cluster, set environment variables for the following Azure resource IDs from your Azure account and from the service principal you created:</p> +<ul> +<li>Subscription ID</li> +<li>Tenant ID</li> +<li>Client ID</li> +<li>Client Secret</li> +</ul> +<p>For example: +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre tabindex="0"><code># Azure resource IDs +$ export AZURE_SUBSCRIPTION_ID=&#34;&lt;SubscriptionId&gt;&#34; +$ export AZURE_TENANT_ID=&#34;&lt;Tenant&gt;&#34; +$ export AZURE_CLIENT_ID=&#34;&lt;AppId&gt;&#34; +$ export AZURE_CLIENT_SECRET=&#34;&lt;Password&gt;&#34; + +# Base64 encode the Azure Resource IDs +$ export AZURE_SUBSCRIPTION_ID_B64=&#34;$(echo -n &#34;$AZURE_SUBSCRIPTION_ID&#34; | base64 | tr -d &#39;\n&#39;)&#34; +$ export AZURE_TENANT_ID_B64=&#34;$(echo -n &#34;$AZURE_TENANT_ID&#34; | base64 | tr -d &#39;\n&#39;)&#34; +$ export AZURE_CLIENT_ID_B64=&#34;$(echo -n &#34;$AZURE_CLIENT_ID&#34; | base64 | tr -d &#39;\n&#39;)&#34; +$ export AZURE_CLIENT_SECRET_B64=&#34;$(echo -n &#34;$AZURE_CLIENT_SECRET&#34; | base64 | tr -d &#39;\n&#39;)&#34; + +# Settings needed for AzureClusterIdentity used by the AzureCluster +$ export AZURE_CLUSTER_IDENTITY_SECRET_NAME=&#34;&lt;cluster-identity-secret&gt;&#34; +$ export CLUSTER_IDENTITY_NAME=&#34;&lt;cluster-identity&gt;&#34; +$ export AZURE_CLUSTER_IDENTITY_SECRET_NAMESPACE=&#34;default&#34; +</code></pre></div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script></p> +</li> +<li> +<p>Create a secret that includes the password of the service principal identity created in Azure. This secret is referenced by the AzureClusterIdentity used by the AzureCluster. +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre tabindex="0"><code>$ kubectl create secret generic &#34;${AZURE_CLUSTER_IDENTITY_SECRET_NAME}&#34; --from-literal=clientSecret=&#34;${AZURE_CLIENT_SECRET}&#34; --namespace &#34;${AZURE_CLUSTER_IDENTITY_SECRET_NAMESPACE}&#34; +</code></pre></div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script></p> +</li> +<li> +<p>Install the Cluster API Azure infrastructure provider. +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre tabindex="0"><code>$ clusterctl init -n verrazzano-capi -i azure +</code></pre></div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script></p> +<p>clusterctl will report when the admin cluster was successfully initialized.</p> +</li> +</ol> +<h2 id="create-a-managed-cluster">Create a managed cluster</h2> +<p>The Cluster API uses a cluster template to deploy a predefined set of Cluster API objects and create a managed cluster.</p> +<ol> +<li> +<p>Set the following environment variables so they are available to the cluster template. Update the values to reflect your own environment. +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre tabindex="0"><code># Base64 encoded SSH key for node access +$ export AZURE_SSH_PUBLIC_KEY_B64=&#34;&lt;sshKey&gt;&#34; + +# Select VM types. +$ export AZURE_CONTROL_PLANE_MACHINE_TYPE=&#34;Standard_D2s_v3&#34; +$ export AZURE_NODE_MACHINE_TYPE=&#34;Standard_D2s_v3&#34; + +# [Optional] Select resource group. The default value is ${CLUSTER_NAME}. +$ export AZURE_RESOURCE_GROUP=&#34;&lt;resourceGroupName&gt; + +# Name of the Azure datacenter location. Change this value to your desired location. +$ export AZURE_LOCATION=&#34;&lt;location&gt;&#34; + +# Cluster name info +$ export CLUSTER_NAME=&#34;capi-quickstart&#34; +$ export KUBERNETES_VERSION=&#34;&lt;k8sVersion&gt;&#34; +$ export NAMESPACE=&#34;default&#34; +$ export CONTROL_PLANE_MACHINE_COUNT=&#34;1&#34; +$ export WORKER_MACHINE_COUNT=&#34;1&#34; +</code></pre></div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script></p> +</li> +<li> +<p>Copy the cluster template and save it locally as <code>azure-capi.yaml</code>.</p> + <details> + <summary><b>Click here for the cluster template</b></summary> + <style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre tabindex="0"><code>apiVersion: cluster.x-k8s.io/v1beta1 +kind: Cluster +metadata: + name: ${CLUSTER_NAME} + namespace: default +spec: + clusterNetwork: + pods: + cidrBlocks: + - 192.168.0.0/16 + controlPlaneRef: + apiVersion: controlplane.cluster.x-k8s.io/v1beta1 + kind: OCNEControlPlane + name: ${CLUSTER_NAME}-control-plane + infrastructureRef: + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + kind: AzureCluster + name: ${CLUSTER_NAME} +--- +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +kind: AzureCluster +metadata: + name: ${CLUSTER_NAME} + namespace: default +spec: + identityRef: + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + kind: AzureClusterIdentity + name: ${CLUSTER_IDENTITY_NAME} + location: ${AZURE_LOCATION} + networkSpec: + subnets: + - name: control-plane-subnet + role: control-plane + - name: node-subnet + role: node + vnet: + name: ${AZURE_VNET_NAME:=${CLUSTER_NAME}-vnet} + resourceGroup: ${AZURE_RESOURCE_GROUP:=${CLUSTER_NAME}} + subscriptionID: ${AZURE_SUBSCRIPTION_ID} +--- +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +kind: AzureMachineTemplate +metadata: + name: ${CLUSTER_NAME}-control-plane + namespace: default +spec: + template: + spec: + image: + marketplace: + publisher: &#34;Oracle&#34; + offer: &#34;Oracle-Linux&#34; + sku: &#34;ol88-lvm-gen2&#34; + version: &#34;8.8.3&#34; + dataDisks: + - diskSizeGB: 256 + lun: 0 + nameSuffix: etcddisk + osDisk: + diskSizeGB: 128 + osType: Linux + sshPublicKey: ${AZURE_SSH_PUBLIC_KEY_B64:=&#34;&#34;} + vmSize: ${AZURE_CONTROL_PLANE_MACHINE_TYPE} +--- +apiVersion: cluster.x-k8s.io/v1beta1 +kind: MachineDeployment +metadata: + name: ${CLUSTER_NAME}-md-0 + namespace: default +spec: + clusterName: ${CLUSTER_NAME} + replicas: ${WORKER_MACHINE_COUNT} + selector: + matchLabels: null + template: + spec: + bootstrap: + configRef: + apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 + kind: OCNEConfigTemplate + name: ${CLUSTER_NAME}-md-0 + clusterName: ${CLUSTER_NAME} + infrastructureRef: + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + kind: AzureMachineTemplate + name: ${CLUSTER_NAME}-md-0 + version: ${KUBERNETES_VERSION} +--- +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +kind: AzureMachineTemplate +metadata: + name: ${CLUSTER_NAME}-md-0 + namespace: default +spec: + template: + spec: + image: + marketplace: + publisher: &#34;Oracle&#34; + offer: &#34;Oracle-Linux&#34; + sku: &#34;ol88-lvm-gen2&#34; + version: &#34;8.8.3&#34; + osDisk: + diskSizeGB: 128 + osType: Linux + sshPublicKey: ${AZURE_SSH_PUBLIC_KEY_B64:=&#34;&#34;} + vmSize: ${AZURE_NODE_MACHINE_TYPE} +--- +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +kind: AzureClusterIdentity +metadata: + labels: + clusterctl.cluster.x-k8s.io/move-hierarchy: &#34;true&#34; + name: ${CLUSTER_IDENTITY_NAME} + namespace: default +spec: + allowedNamespaces: {} + clientID: ${AZURE_CLIENT_ID} + clientSecret: + name: ${AZURE_CLUSTER_IDENTITY_SECRET_NAME} + namespace: ${AZURE_CLUSTER_IDENTITY_SECRET_NAMESPACE} + tenantID: ${AZURE_TENANT_ID} + type: ServicePrincipal +--- +apiVersion: controlplane.cluster.x-k8s.io/v1alpha1 +kind: OCNEControlPlane +metadata: + name: ${CLUSTER_NAME}-control-plane + namespace: default +spec: + moduleOperator: + enabled: true + verrazzanoPlatformOperator: + enabled: true + controlPlaneConfig: + clusterConfiguration: + apiServer: + extraArgs: + cloud-provider: external + certSANs: + - localhost + - 127.0.0.1 + dns: + imageRepository: ${OCNE_IMAGE_REPOSITORY=container-registry.oracle.com}/${OCNE_IMAGE_PATH=olcne} + imageTag: ${DNS_TAG=v1.9.3} + etcd: + local: + imageRepository: ${OCNE_IMAGE_REPOSITORY=container-registry.oracle.com}/${OCNE_IMAGE_PATH=olcne} + imageTag: ${ETCD_TAG=3.5.6} + controllerManager: + extraArgs: + cloud-provider: external + networking: {} + scheduler: {} + imageRepository: ${OCNE_IMAGE_REPOSITORY=container-registry.oracle.com}/${OCNE_IMAGE_PATH=olcne} + files: + - contentFrom: + secret: + key: control-plane-azure.json + name: ${CLUSTER_NAME}-control-plane-azure-json + owner: root:root + path: /etc/kubernetes/azure.json + permissions: &#34;0644&#34; + initConfiguration: + nodeRegistration: + criSocket: /var/run/crio/crio.sock + kubeletExtraArgs: + cloud-provider: external + name: &#39;{{ local_hostname }}&#39; + joinConfiguration: + discovery: {} + nodeRegistration: + criSocket: /var/run/crio/crio.sock + kubeletExtraArgs: + cloud-provider: external + name: &#39;{{ local_hostname }}&#39; + preOCNECommands: + - hostnamectl set-hostname &#34;{{ ds.meta_data.hostname }}&#34; + - echo &#34;::1 ipv6-localhost ipv6-loopback localhost6 localhost6.localdomain6&#34; + &gt;/etc/hosts + - echo &#34;127.0.0.1 {{ ds.meta_data.hostname }} {{ local_hostname }} localhost + localhost.localdomain localhost4 localhost4.localdomain4&#34; &gt;&gt;/etc/hosts + users: + - name: opc + sudo: ALL=(ALL) NOPASSWD:ALL + machineTemplate: + infrastructureRef: + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + kind: AzureMachineTemplate + name: ${CLUSTER_NAME}-control-plane + namespace: default + replicas: ${CONTROL_PLANE_MACHINE_COUNT} + version: ${KUBERNETES_VERSION} +--- +apiVersion: bootstrap.cluster.x-k8s.io/v1alpha1 +kind: OCNEConfigTemplate +metadata: + name: ${CLUSTER_NAME}-md-0 + namespace: default +spec: + template: + spec: + clusterConfiguration: + imageRepository: ${OCNE_IMAGE_REPOSITORY=container-registry.oracle.com}/${OCNE_IMAGE_PATH=olcne} + joinConfiguration: + nodeRegistration: + kubeletExtraArgs: + cloud-provider: external + name: &#39;{{ local_hostname }}&#39; + preOCNECommands: + - hostnamectl set-hostname &#34;{{ ds.meta_data.hostname }}&#34; + - echo &#34;::1 ipv6-localhost ipv6-loopback localhost6 localhost6.localdomain6&#34; + &gt;/etc/hosts + - echo &#34;127.0.0.1 {{ ds.meta_data.hostname }} {{ local_hostname }} localhost + localhost.localdomain localhost4 localhost4.localdomain4&#34; &gt;&gt;/etc/hosts + users: + - name: opc + sudo: ALL=(ALL) NOPASSWD:ALL +</code></pre></div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script> + </details> +</li> +<li> +<p>Generate and apply the template by running the following command: +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre tabindex="0"><code>$ clusterctl generate yaml --from azure-capi.yaml | kubectl apply -f - +</code></pre></div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script></p> +</li> +</ol> +<p>To view the status of the cluster and its resources, run: +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre tabindex="0"><code>$ clusterctl describe cluster $CLUSTER_NAME +</code></pre></div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script></p> +<p>To get the <code>kubeconfig</code> file, run: +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre tabindex="0"><code>$ clusterctl get kubeconfig ${CLUSTER_NAME} &gt; ${CLUSTER_NAME}.kubeconfig +</code></pre></div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script></p> +<h2 id="finish-cluster-configuration">Finish cluster configuration</h2> +<p>After the cluster resources are created, you must perform some additional steps to finish the configuration of the cluster.</p> +<ol> +<li>Install a cloud controller manager (CCM). A CCM is necessary when deploying cloud resources such as load balancers. +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre tabindex="0"><code>$ helm install --kubeconfig=./${CLUSTER_NAME}.kubeconfig --repo https://raw.githubusercontent.com/kubernetes-sigs/cloud-provider-azure/master/helm/repo cloud-provider-azure --generate-name --set infra.clusterName=clusterName --set cloudControllerManager.clusterCIDR=&#34;192.168.0.0/16&#34; --set cloudControllerManager.caCertDir=/etc/pki/ca-trust +</code></pre></div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script></li> +<li>Install a container network interface (CNI). The following example uses the Calico CNI. +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre tabindex="0"><code>$ helm repo add projectcalico https://docs.tigera.io/calico/charts --kubeconfig=./${CLUSTER_NAME}.kubeconfig &amp;&amp; \ +$ helm install calico projectcalico/tigera-operator --kubeconfig=./${CLUSTER_NAME}.kubeconfig -f https://raw.githubusercontent.com/kubernetes-sigs/cluster-api-provider-azure/main/templates/addons/calico/values.yaml --namespace tigera-operator --create-namespace +</code></pre></div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script></li> +</ol> +<p>Your admin cluster and first managed cluster are now up and running and ready to deploy applications. You can add more managed clusters as needed.</p> +<p>For more information, refer to the documentation for Cluster API and Cluster API Azure:</p> +<ul> +<li><a href="https://cluster-api.sigs.k8s.io/introduction.html">Kubernetes Cluster API Documentation</a></li> +<li><a href="https://capz.sigs.k8s.io/introduction">The Cluster API Provider Azure Book</a></li> +</ul> +<h2 id="troubleshoot-the-deployment">Troubleshoot the deployment</h2> +<p>If the deployment of the Azure resources fails, then you can check the following log files to diagnose the issue:</p> +<p>The Azure cluster controller provider logs: +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre tabindex="0"><code>$ kubectl logs -n verrazzano-capi -l cluster.x-k8s.io/provider=infrastructure-azure +</code></pre></div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script> +The OCNE control plane provider logs: +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre tabindex="0"><code>$ kubectl logs -n verrazzano-capi -l cluster.x-k8s.io/provider=control-plane-ocne +</code></pre></div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script></p> +<p><strong>NOTE</strong>: If a pod enters a <code>CrashLoopBackOff</code> state, then you can either restart the deployment or wait for the state to run its course. This is a known issue that should not affect the deployment of your cluster.</p> +<h2 id="delete-the-clusters">Delete the clusters</h2> +<ol> +<li>Delete the managed clusters. +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre tabindex="0"><code>$ kubectl delete cluster $CLUSTER_NAME +</code></pre></div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script></li> +<li>Delete the admin cluster. +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre tabindex="0"><code>$ kind delete cluster +</code></pre></div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script></li> +</ol> +<p>Do not use <code>kubectl delete -f capi-quickstart.yaml</code> to delete the entire cluster template at once because it might leave behind pending resources that you need to clean up manually.</p> + + + + + + Docs: Create OCNE Clusters Running on VMware vSphere + /docs/advanced/ocne-vsphere/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/advanced/ocne-vsphere/ + + + + + +<div class="alert alert-danger" role="alert"> +<h4 class="alert-heading">NOTE</h4> + + This feature is experimental. It has not been thoroughly tested and is provided for informational purposes only. We make no guarantees about its safety or stability and do not recommend implementing this feature in production environments. + +</div> + +<p>The Cluster API project provides a standard set of Kubernetes-style APIs for cluster management. Officially, Verrazzano currently only supports using Cluster API to <a href="../../docs/setup/provision-cluster/">provision OCNE and OKE clusters on OCI</a>.</p> +<p>However, you can also experiment with using the features of the Cluster API project directly to deploy OCNE clusters on VMware vSphere.</p> +<p>For more information on Cluster API or Cluster API with vSphere, see:</p> +<ul> +<li><a href="https://cluster-api.sigs.k8s.io/introduction.html">Kubernetes Cluster API Documentation</a></li> +<li><a href="https://github.com/kubernetes-sigs/cluster-api-provider-vsphere">Kubernetes Cluster API Provider vSphere</a> +<ul> +<li><a href="https://github.com/kubernetes-sigs/cluster-api-provider-vsphere/blob/main/docs/getting_started.md">Getting started with Cluster API Provider vSphere</a></li> +</ul> +</li> +</ul> + + +<div class="alert alert-primary" role="alert"> +<h4 class="alert-heading">NOTE</h4> + + <p>Verrazzano and Cluster API use slightly different terminology for the same concepts:</p> +<ul> +<li>Admin cluster (Verrazzano) = management cluster (Cluster API)</li> +<li>Managed cluster (Verrazzano) = workload cluster (Cluster API)</li> +</ul> + + +</div> + +<h2 id="before-you-begin">Before you begin</h2> +<p>If you have an existing vSphere environment, you can ignore <a href="#set-up-a-vmware-software-defined-data-center">Set up a VMware Software-Defined Data Center</a> and start from <a href="#prepare-the-vm-environment">Prepare the VM environment</a>. Confirm that your environment meets the requirements as specified at <a href="https://github.com/kubernetes-sigs/cluster-api-provider-vsphere/blob/main/docs/getting_started.md#install-requirements">Cluster API Provider vSphere: Install Requirements</a>.</p> +<p>Otherwise, create a vSphere environment. We recommend using the Oracle Cloud VMware Solution as described in <a href="#set-up-a-vmware-software-defined-data-center">Set up a VMware Software-Defined Data Center</a>. It deploys a VMware software-defined data center (SDDC) on Oracle Cloud Infrastructure (OCI) and then integrates it with other Oracle services running on Oracle Cloud. This solution was developed in partnership with VMware to provide an environment that adheres to best practices recommended by VMware.</p> +<p>For more information on the Oracle Cloud VMware Solution, see <a href="https://docs.oracle.com/en/solutions/deploy-vmware-sddc-oci/index.html#GUID-860B8193-4612-4589-81DB-A8F63ADBD0F4">Deploy a highly available VMware-based SDDC to the cloud</a> in the Oracle Help Architecture Center.</p> +<h2 id="set-up-a-vmware-software-defined-data-center">Set up a VMware Software-Defined Data Center</h2> + + +<div class="alert alert-primary" role="alert"> +<h4 class="alert-heading">NOTE</h4> + + Skip this section if you have configured a vSphere environment or a VMware SDDC already. + +</div> + +<p>Use the Oracle Cloud VMware Solution to rapidly create a VMware SDDC.</p> +<ol> +<li> +<p>Set up a virtual cloud network (VCN). You can choose to use an existing VCN or let the Oracle Cloud VMware Solution create its own VCN as part of the SDDC provisioning process. If you use an existing VCN, then make sure it meets the requirements defined in <a href="https://docs.oracle.com/en/solutions/deploy-vmware-sddc-oci/deploy-sddc-cloud1.html#GUID-EC84353E-01A8-4F41-A43A-10A47C66611C">Prepare Your Deployment</a> in the Oracle Help Architecture Center.</p> +</li> +<li> +<p>Deploy the SDDC. To request a new VMware SDDC on OCI, follow the instructions at <a href="https://docs.oracle.com/en/solutions/deploy-vmware-sddc-oci/deploy-sddc-cloud1.html#GUID-8D3BD5B0-F603-4529-903F-641C24935720">Deploy the SDDC</a> in the Oracle Help Architecture Center.</p> +</li> +<li> +<p>Ensure that the various components were created successfully. Follow the instructions at <a href="https://docs.oracle.com/en/solutions/deploy-vmware-sddc-oci/deploy-sddc-cloud1.html#GUID-E170AD8F-7E51-44C6-93D9-DC332F3D8025">Monitor the SDDC Creation Process</a> in the Oracle Help Architecture Center.</p> +</li> +</ol> +<h2 id="prepare-the-vm-environment">Prepare the VM environment</h2> +<ol> +<li> +<p>Download an Oracle Linux 8 ISO image from <a href="https://yum.oracle.com/oracle-linux-isos.html">Oracle Linux Installation Media</a>.</p> +</li> +<li> +<p>Upload the Oracle Linux 8 ISO image to vSphere. Use the steps at <a href="https://docs.vmware.com/en/VMware-vSphere/7.0/com.vmware.vsphere.vm_admin.doc/GUID-492D6904-7471-4D66-9555-9466CCCA6931.html">Upload ISO Image Installation Media for a Guest Operating System</a> in the vSphere documentation.</p> +</li> +<li> +<p>Deploy a VM by following the instructions at <a href="https://docs.vmware.com/en/VMware-vSphere/7.0/com.vmware.vsphere.vm_admin.doc/GUID-AE8AFBF1-75D1-4172-988C-378C35C9FAF2.html?hWord=N4IghgNiBcIEZgM4FMAEA3AtiAvkA">Create a Virtual Machine with the New Virtual Machine Wizard</a> in the vSphere documentation.</p> +</li> +<li> +<p>Install cloud-init on the VM. +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre tabindex="0"><code>$ sudo yum install -y cloud-init +</code></pre></div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script></p> +</li> +<li> +<p>Initialize cloud-init. +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre tabindex="0"><code>$ cloud-init init --local +</code></pre></div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script> +When cloud-init is successfully configured, it returns a message similar to the following: +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre tabindex="0"><code>$ cloud-init v. 20.1.0011 running &#39;init-local&#39; at Fri, 01 Apr 2022 01:26:11 +0000. Up 38.70 seconds. +</code></pre></div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script></p> +</li> +<li> +<p>Shut down the VM.</p> +</li> +<li> +<p>Convert the VM into a template and name it <code>OL8-Base-Template</code>. Follow the instructions at <a href="https://docs.vmware.com/en/VMware-vSphere/7.0/com.vmware.vsphere.vm_admin.doc/GUID-5B3737CC-28DB-4334-BD18-6E12011CDC9F.html">Clone a Virtual Machine to a Template</a> in the vSphere documentation.</p> +</li> +</ol> +<h2 id="set-up-the-admin-cluster">Set up the admin cluster</h2> +<p>The Cluster API requires an initial cluster as a starting point to deploy its resources.</p> +<ol> +<li> +<p>Install kind. Follow the instructions at <a href="https://kind.sigs.k8s.io/docs/user/quick-start/#installation">Installation</a> in the kind documentation.</p> +</li> +<li> +<p>Create a Kubernetes cluster using kind. This cluster must be accessible by the VMware SDDC. Follow the instructions at <a href="https://cluster-api.sigs.k8s.io/user/quick-start#install-andor-configure-a-kubernetes-cluster">Quick Start: Install and/or configure a Kubernetes cluster</a> in The Cluster API Book.</p> +</li> +<li> +<p>Install the clusterctl CLI tool. clusterctl manages the lifecycle operations of a cluster API admin cluster. Follow instructions at <a href="https://cluster-api.sigs.k8s.io/user/quick-start.html#install-clusterctl">Quick Start: Install clusterctl</a> in the Cluster API Book.</p> +</li> +<li> +<p>Install the Verrazzano CLI tool using the instructions at <a href="../../docs/setup/install/prepare/cli-setup/">CLI Setup</a>.</p> +</li> +<li> +<p>Install Verrazzano on the cluster using either the <code>dev</code> or <code>prod</code> profile. Follow the instructions at <a href="../../docs/setup/install/perform/cli-installation/">Install with CLI</a>.</p> +</li> +<li> +<p>On the cluster, set the following vSphere environment variables. Update the values to reflect your own environment. +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre tabindex="0"><code>$ export VSPHERE_PASSWORD=&#34;&lt;vmware-password&gt;&#34; +$ export VSPHERE_USERNAME=&#34;administrator@vsphere.local&#34; +$ export VSPHERE_SERVER=&#34;&lt;IP address or FQDN&gt;&#34; +$ export VSPHERE_DATACENTER=&#34;&lt;SDDC-Datacenter&gt;&#34; +$ export VSPHERE_DATASTORE=&#34;&lt;vSAN-Datastore&gt;&#34; +$ export VSPHERE_NETWORK=&#34;workload&#34; +$ export VSPHERE_RESOURCE_POOL=&#34;*/Resources/Workload&#34; +$ export VSPHERE_FOLDER=&#34;&lt;folder-name&gt;&#34; +$ export VSPHERE_TEMPLATE=&#34;OL8-Base-Template&#34; +$ export VSPHERE_SSH_AUTHORIZED_KEY=&#34;&lt;Public-SSH-Authorized-Key&gt;&#34; +$ export VSPHERE_TLS_THUMBPRINT=&#34;&lt;SHA1 thumbprint of vCenter certificate&gt;&#34; +$ export VSPHERE_STORAGE_POLICY=&#34;&#34; +$ export CONTROL_PLANE_ENDPOINT_IP=&#34;&lt;IP address or FQDN&gt;&#34; +</code></pre></div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script> +For information on the values of the environment variables, see <a href="https://github.com/kubernetes-sigs/cluster-api-provider-vsphere/blob/main/docs/getting_started.md#configuring-and-installing-cluster-api-provider-vsphere-in-a-management-cluster">Configuring and installing Cluster API Provider vSphere in a management cluster</a> in the Cluster API Provider vSphere documentation.</p> +</li> +<li> +<p>Install the Cluster API Provider vSphere to initialize the admin cluster. +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre tabindex="0"><code>$ clusterctl init -n verrazzano-capi -i vsphere +</code></pre></div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script></p> +<p>clusterctl will report when the admin cluster was successfully initialized.</p> +</li> +</ol> +<h2 id="create-a-managed-cluster">Create a managed cluster</h2> +<p>The Cluster API uses a cluster template to deploy a predefined set of Cluster API objects and create a managed cluster.</p> +<ol> +<li> +<p>Copy the cluster template and save it locally as <code>vsphere-capi.yaml</code>.</p> + <details> + <summary><b>Click here for the cluster template</b></summary> + <style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre tabindex="0"><code>apiVersion: cluster.x-k8s.io/v1beta1 +kind: Cluster +metadata: + labels: + cluster.x-k8s.io/cluster-name: ${CLUSTER_NAME} + name: ${CLUSTER_NAME} + namespace: ${NAMESPACE} +spec: + clusterNetwork: + pods: + cidrBlocks: + - ${POD_CIDR=192.168.0.0/16} + serviceDomain: cluster.local + services: + cidrBlocks: + - ${CLUSTER_CIDR=10.128.0.0/12} + controlPlaneRef: + apiVersion: controlplane.cluster.x-k8s.io/v1alpha1 + kind: OCNEControlPlane + name: ${CLUSTER_NAME}-control-plane + namespace: ${NAMESPACE} + infrastructureRef: + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + kind: VSphereCluster + name: ${CLUSTER_NAME} + namespace: ${NAMESPACE} +--- +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +kind: VSphereCluster +metadata: + name: ${CLUSTER_NAME} + namespace: ${NAMESPACE} +spec: + controlPlaneEndpoint: + host: ${CONTROL_PLANE_ENDPOINT_IP} + port: 6443 + identityRef: + kind: Secret + name: ${CLUSTER_NAME} + server: ${VSPHERE_SERVER} + thumbprint: &#39;${VSPHERE_TLS_THUMBPRINT}&#39; +--- +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +kind: VSphereMachineTemplate +metadata: + name: ${CLUSTER_NAME}-control-plane + namespace: ${NAMESPACE} +spec: + template: + spec: + cloneMode: linkedClone + datacenter: ${VSPHERE_DATACENTER=oci-w01dc} + datastore: ${VSPHERE_DATASTORE=vsanDatastore} + diskGiB: ${VSPHERE_DISK=200} + folder: ${VSPHERE_FOLDER=CAPI} + memoryMiB: ${VSPHERE_MEMORY=32384} + network: + devices: + - dhcp4: true + networkName: &#34;${VSPHERE_NETWORK=workload}&#34; + numCPUs: ${VSPHERE_CPU=4} + os: Linux + resourcePool: &#39;${VSPHERE_RESOURCE_POOL=*/Resources/Workload}&#39; + server: &#39;${VSPHERE_SERVER=11.0.11.130}&#39; + storagePolicyName: ${VSPHERE_STORAGE_POLICY=&#34;&#34;} + template: ${VSPHERE_TEMPLATE=OL8-Base-Template} + thumbprint: &#39;${VSPHERE_TLS_THUMBPRINT}&#39; +--- +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +kind: VSphereMachineTemplate +metadata: + name: ${CLUSTER_NAME}-md-0 + namespace: ${NAMESPACE} +spec: + template: + spec: + cloneMode: linkedClone + datacenter: ${VSPHERE_DATACENTER=oci-w01dc} + datastore: ${VSPHERE_DATASTORE=vsanDatastore} + diskGiB: ${VSPHERE_DISK=200} + folder: ${VSPHERE_FOLDER=CAPI} + memoryMiB: ${VSPHERE_MEMORY=32384} + network: + devices: + - dhcp4: true + networkName: &#34;${VSPHERE_NETWORK=workload}&#34; + numCPUs: ${VSPHERE_CPU=4} + os: Linux + resourcePool: &#39;${VSPHERE_RESOURCE_POOL=*/Resources/Workload}&#39; + server: &#39;${VSPHERE_SERVER=11.0.11.130}&#39; + storagePolicyName: ${VSPHERE_STORAGE_POLICY=&#34;&#34;} + template: ${VSPHERE_TEMPLATE=OL8-Base-Template} + thumbprint: &#39;${VSPHERE_TLS_THUMBPRINT}&#39; +--- +apiVersion: controlplane.cluster.x-k8s.io/v1alpha1 +kind: OCNEControlPlane +metadata: + name: ${CLUSTER_NAME}-control-plane + namespace: ${NAMESPACE} +spec: + moduleOperator: + enabled: true + verrazzanoPlatformOperator: + enabled: true + controlPlaneConfig: + clusterConfiguration: + apiServer: + extraArgs: + cloud-provider: external + certSANs: + - localhost + - 127.0.0.1 + dns: + imageRepository: ${OCNE_IMAGE_REPOSITORY=container-registry.oracle.com}/${OCNE_IMAGE_PATH=olcne} + imageTag: ${DNS_TAG=v1.9.3} + etcd: + local: + imageRepository: ${OCNE_IMAGE_REPOSITORY=container-registry.oracle.com}/${OCNE_IMAGE_PATH=olcne} + imageTag: ${ETCD_TAG=3.5.6} + controllerManager: + extraArgs: + cloud-provider: external + networking: {} + scheduler: {} + imageRepository: ${OCNE_IMAGE_REPOSITORY=container-registry.oracle.com}/${OCNE_IMAGE_PATH=olcne} + files: + - content: | + apiVersion: v1 + kind: Pod + metadata: + creationTimestamp: null + name: kube-vip + namespace: kube-system + spec: + containers: + - args: + - manager + env: + - name: cp_enable + value: &#34;true&#34; + - name: vip_interface + value: &#34;&#34; + - name: address + value: ${CONTROL_PLANE_ENDPOINT_IP} + - name: port + value: &#34;6443&#34; + - name: vip_arp + value: &#34;true&#34; + - name: vip_leaderelection + value: &#34;true&#34; + - name: vip_leaseduration + value: &#34;15&#34; + - name: vip_renewdeadline + value: &#34;10&#34; + - name: vip_retryperiod + value: &#34;2&#34; + image: ghcr.io/kube-vip/kube-vip:v0.5.11 + imagePullPolicy: IfNotPresent + name: kube-vip + resources: {} + securityContext: + capabilities: + add: + - NET_ADMIN + - NET_RAW + volumeMounts: + - mountPath: /etc/kubernetes/admin.conf + name: kubeconfig + hostAliases: + - hostnames: + - kubernetes + ip: 127.0.0.1 + hostNetwork: true + volumes: + - hostPath: + path: /etc/kubernetes/admin.conf + type: FileOrCreate + name: kubeconfig + status: {} + owner: root:root + path: /etc/kubernetes/manifests/kube-vip.yaml + initConfiguration: + nodeRegistration: + criSocket: /var/run/crio/crio.sock + kubeletExtraArgs: + cloud-provider: external + name: &#39;{{ local_hostname }}&#39; + joinConfiguration: + discovery: {} + nodeRegistration: + criSocket: /var/run/crio/crio.sock + kubeletExtraArgs: + cloud-provider: external + name: &#39;{{ local_hostname }}&#39; + verbosity: 9 + preOCNECommands: + - hostnamectl set-hostname &#34;{{ ds.meta_data.hostname }}&#34; + - echo &#34;::1 ipv6-localhost ipv6-loopback localhost6 localhost6.localdomain6&#34; + &gt;/etc/hosts + - echo &#34;127.0.0.1 {{ ds.meta_data.hostname }} {{ local_hostname }} localhost + localhost.localdomain localhost4 localhost4.localdomain4&#34; &gt;&gt;/etc/hosts + users: + - name: opc + sshAuthorizedKeys: + - ${VSPHERE_SSH_AUTHORIZED_KEY} + sudo: ALL=(ALL) NOPASSWD:ALL + machineTemplate: + infrastructureRef: + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + kind: VSphereMachineTemplate + name: ${CLUSTER_NAME}-control-plane + namespace: ${NAMESPACE} + replicas: ${CONTROL_PLANE_MACHINE_COUNT=1} + version: ${KUBERNETES_VERSION=v1.26.6} +--- +apiVersion: bootstrap.cluster.x-k8s.io/v1alpha1 +kind: OCNEConfigTemplate +metadata: + name: ${CLUSTER_NAME}-md-0 + namespace: ${NAMESPACE} +spec: + template: + spec: + clusterConfiguration: + imageRepository: ${OCNE_IMAGE_REPOSITORY=container-registry.oracle.com}/${OCNE_IMAGE_PATH=olcne} + joinConfiguration: + nodeRegistration: + kubeletExtraArgs: + cloud-provider: external + name: &#39;{{ local_hostname }}&#39; + verbosity: 9 + preOCNECommands: + - hostnamectl set-hostname &#34;{{ ds.meta_data.hostname }}&#34; + - echo &#34;::1 ipv6-localhost ipv6-loopback localhost6 localhost6.localdomain6&#34; + &gt;/etc/hosts + - echo &#34;127.0.0.1 {{ ds.meta_data.hostname }} {{ local_hostname }} localhost + localhost.localdomain localhost4 localhost4.localdomain4&#34; &gt;&gt;/etc/hosts + users: + - name: opc + sshAuthorizedKeys: + - ${VSPHERE_SSH_AUTHORIZED_KEY} + sudo: ALL=(ALL) NOPASSWD:ALL +--- +apiVersion: cluster.x-k8s.io/v1beta1 +kind: MachineDeployment +metadata: + labels: + cluster.x-k8s.io/cluster-name: ${CLUSTER_NAME} + name: ${CLUSTER_NAME}-md-0 + namespace: ${NAMESPACE} +spec: + clusterName: ${CLUSTER_NAME} + replicas: ${NODE_MACHINE_COUNT=3} + selector: + matchLabels: {} + template: + metadata: + labels: + cluster.x-k8s.io/cluster-name: ${CLUSTER_NAME} + spec: + bootstrap: + configRef: + apiVersion: bootstrap.cluster.x-k8s.io/v1alpha1 + kind: OCNEConfigTemplate + name: ${CLUSTER_NAME}-md-0 + clusterName: ${CLUSTER_NAME} + infrastructureRef: + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + kind: VSphereMachineTemplate + name: ${CLUSTER_NAME}-md-0 + version: ${KUBERNETES_VERSION=v1.26.6} +--- +apiVersion: addons.cluster.x-k8s.io/v1beta1 +kind: ClusterResourceSet +metadata: + name: ${CLUSTER_NAME}-crs-0 + namespace: ${NAMESPACE} +spec: + clusterSelector: + matchLabels: + cluster.x-k8s.io/cluster-name: ${CLUSTER_NAME} + resources: + - kind: Secret + name: ${CLUSTER_NAME}-vsphere-csi-controller + - kind: ConfigMap + name: ${CLUSTER_NAME}-vsphere-csi-controller-role + - kind: ConfigMap + name: ${CLUSTER_NAME}-vsphere-csi-controller-binding + - kind: Secret + name: ${CLUSTER_NAME}-csi-vsphere-config + - kind: ConfigMap + name: csi.vsphere.vmware.com + - kind: ConfigMap + name: vsphere-csi-controller-sa + - kind: ConfigMap + name: vsphere-csi-node-sa + - kind: ConfigMap + name: ${CLUSTER_NAME}-vsphere-csi-node-cluster-role + - kind: ConfigMap + name: ${CLUSTER_NAME}-vsphere-csi-node-cluster-role-binding + - kind: ConfigMap + name: ${CLUSTER_NAME}-vsphere-csi-node-role + - kind: ConfigMap + name: ${CLUSTER_NAME}-vsphere-csi-node-binding + - kind: ConfigMap + name: ${CLUSTER_NAME}-internal-feature-states.csi.vsphere.vmware.com + - kind: ConfigMap + name: ${CLUSTER_NAME}-vsphere-csi-controller-service + - kind: ConfigMap + name: ${CLUSTER_NAME}-vsphere-csi-controller + - kind: ConfigMap + name: ${CLUSTER_NAME}-vsphere-csi-node + - kind: ConfigMap + name: ${CLUSTER_NAME}-vsphere-csi-node-windows + - kind: Secret + name: ${CLUSTER_NAME}-cloud-controller-manager + - kind: Secret + name: ${CLUSTER_NAME}-cloud-provider-vsphere-credentials + - kind: ConfigMap + name: ${CLUSTER_NAME}-cpi-manifests + strategy: Reconcile +--- +apiVersion: v1 +kind: Secret +metadata: + name: ${CLUSTER_NAME} + namespace: ${NAMESPACE} +stringData: + password: ${VSPHERE_PASSWORD} + username: ${VSPHERE_USERNAME} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: ${CLUSTER_NAME}-vsphere-csi-controller + namespace: ${NAMESPACE} +data: + data: | + apiVersion: v1 + kind: ServiceAccount + metadata: + name: vsphere-csi-controller + namespace: kube-system +--- +apiVersion: v1 +data: + data: | + apiVersion: rbac.authorization.k8s.io/v1 + kind: ClusterRole + metadata: + name: vsphere-csi-controller-role + rules: + - apiGroups: [&#34;&#34;] + resources: [&#34;nodes&#34;, &#34;pods&#34;, &#34;configmaps&#34;] + verbs: [&#34;get&#34;, &#34;list&#34;, &#34;watch&#34;] + - apiGroups: [&#34;&#34;] + resources: [&#34;persistentvolumeclaims&#34;] + verbs: [&#34;get&#34;, &#34;list&#34;, &#34;watch&#34;, &#34;update&#34;] + - apiGroups: [&#34;&#34;] + resources: [&#34;persistentvolumeclaims/status&#34;] + verbs: [&#34;patch&#34;] + - apiGroups: [&#34;&#34;] + resources: [&#34;persistentvolumes&#34;] + verbs: [&#34;get&#34;, &#34;list&#34;, &#34;watch&#34;, &#34;create&#34;, &#34;update&#34;, &#34;delete&#34;, &#34;patch&#34;] + - apiGroups: [&#34;&#34;] + resources: [&#34;events&#34;] + verbs: [&#34;get&#34;, &#34;list&#34;, &#34;watch&#34;, &#34;create&#34;, &#34;update&#34;, &#34;patch&#34;] + - apiGroups: [&#34;coordination.k8s.io&#34;] + resources: [&#34;leases&#34;] + verbs: [&#34;get&#34;, &#34;watch&#34;, &#34;list&#34;, &#34;delete&#34;, &#34;update&#34;, &#34;create&#34;] + - apiGroups: [&#34;storage.k8s.io&#34;] + resources: [&#34;storageclasses&#34;, &#34;csinodes&#34;] + verbs: [&#34;get&#34;, &#34;list&#34;, &#34;watch&#34;] + - apiGroups: [&#34;storage.k8s.io&#34;] + resources: [&#34;volumeattachments&#34;] + verbs: [&#34;get&#34;, &#34;list&#34;, &#34;watch&#34;, &#34;patch&#34;] + - apiGroups: [&#34;cns.vmware.com&#34;] + resources: [&#34;triggercsifullsyncs&#34;] + verbs: [&#34;create&#34;, &#34;get&#34;, &#34;update&#34;, &#34;watch&#34;, &#34;list&#34;] + - apiGroups: [&#34;cns.vmware.com&#34;] + resources: [&#34;cnsvspherevolumemigrations&#34;] + verbs: [&#34;create&#34;, &#34;get&#34;, &#34;list&#34;, &#34;watch&#34;, &#34;update&#34;, &#34;delete&#34;] + - apiGroups: [&#34;apiextensions.k8s.io&#34;] + resources: [&#34;customresourcedefinitions&#34;] + verbs: [&#34;get&#34;, &#34;create&#34;, &#34;update&#34;] + - apiGroups: [&#34;storage.k8s.io&#34;] + resources: [&#34;volumeattachments/status&#34;] + verbs: [&#34;patch&#34;] + - apiGroups: [&#34;cns.vmware.com&#34;] + resources: [&#34;cnsvolumeoperationrequests&#34;] + verbs: [&#34;create&#34;, &#34;get&#34;, &#34;list&#34;, &#34;update&#34;, &#34;delete&#34;] + - apiGroups: [ &#34;snapshot.storage.k8s.io&#34; ] + resources: [ &#34;volumesnapshots&#34; ] + verbs: [ &#34;get&#34;, &#34;list&#34; ] + - apiGroups: [ &#34;snapshot.storage.k8s.io&#34; ] + resources: [ &#34;volumesnapshotclasses&#34; ] + verbs: [ &#34;watch&#34;, &#34;get&#34;, &#34;list&#34; ] + - apiGroups: [ &#34;snapshot.storage.k8s.io&#34; ] + resources: [ &#34;volumesnapshotcontents&#34; ] + verbs: [ &#34;create&#34;, &#34;get&#34;, &#34;list&#34;, &#34;watch&#34;, &#34;update&#34;, &#34;delete&#34;, &#34;patch&#34;] + - apiGroups: [ &#34;snapshot.storage.k8s.io&#34; ] + resources: [ &#34;volumesnapshotcontents/status&#34; ] + verbs: [ &#34;update&#34;, &#34;patch&#34; ] + - apiGroups: [ &#34;cns.vmware.com&#34; ] + resources: [ &#34;csinodetopologies&#34; ] + verbs: [&#34;get&#34;, &#34;update&#34;, &#34;watch&#34;, &#34;list&#34;] +kind: ConfigMap +metadata: + name: ${CLUSTER_NAME}-vsphere-csi-controller-role + namespace: ${NAMESPACE} +--- +apiVersion: v1 +data: + data: | + apiVersion: rbac.authorization.k8s.io/v1 + kind: ClusterRoleBinding + metadata: + name: vsphere-csi-controller-binding + roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: vsphere-csi-controller-role + subjects: + - kind: ServiceAccount + name: vsphere-csi-controller + namespace: kube-system +kind: ConfigMap +metadata: + name: ${CLUSTER_NAME}-vsphere-csi-controller-binding + namespace: ${NAMESPACE} +--- +apiVersion: v1 +kind: Secret +metadata: + name: ${CLUSTER_NAME}-csi-vsphere-config + namespace: ${NAMESPACE} +stringData: + data: | + apiVersion: v1 + kind: Secret + metadata: + name: csi-vsphere-config + namespace: kube-system + stringData: + csi-vsphere.conf: |+ + [Global] + thumbprint = &#34;${VSPHERE_TLS_THUMBPRINT}&#34; + cluster-id = &#34;${NAMESPACE}/${CLUSTER_NAME}&#34; + + [VirtualCenter &#34;${VSPHERE_SERVER}&#34;] + insecure-flag = &#34;true&#34; + user = &#34;${VSPHERE_USERNAME}&#34; + password = &#34;${VSPHERE_PASSWORD}&#34; + datacenters = &#34;${VSPHERE_DATACENTER}&#34; + targetvSANFileShareDatastoreURLs = &#34;${VSPHERE_DATASTORE_URL_SAN}&#34; + + [Network] + public-network = &#34;${VSPHERE_NETWORK=workload}&#34; + + type: Opaque +type: addons.cluster.x-k8s.io/resource-set +--- +apiVersion: v1 +data: + data: | + apiVersion: storage.k8s.io/v1 + kind: CSIDriver + metadata: + name: csi.vsphere.vmware.com + spec: + attachRequired: true + podInfoOnMount: false +kind: ConfigMap +metadata: + name: csi.vsphere.vmware.com + namespace: ${NAMESPACE} +--- +apiVersion: v1 +data: + data: | + kind: ServiceAccount + apiVersion: v1 + metadata: + name: vsphere-csi-controller + namespace: kube-system +kind: ConfigMap +metadata: + name: vsphere-csi-controller-sa + namespace: ${NAMESPACE} +--- +apiVersion: v1 +data: + data: | + kind: ServiceAccount + apiVersion: v1 + metadata: + name: vsphere-csi-node + namespace: kube-system +kind: ConfigMap +metadata: + name: vsphere-csi-node-sa + namespace: ${NAMESPACE} +--- +apiVersion: v1 +data: + data: | + apiVersion: rbac.authorization.k8s.io/v1 + kind: ClusterRole + metadata: + name: vsphere-csi-node-cluster-role + rules: + - apiGroups: [&#34;cns.vmware.com&#34;] + resources: [&#34;csinodetopologies&#34;] + verbs: [&#34;create&#34;, &#34;watch&#34;, &#34;get&#34;, &#34;patch&#34;] + - apiGroups: [&#34;&#34;] + resources: [&#34;nodes&#34;] + verbs: [&#34;get&#34;] +kind: ConfigMap +metadata: + name: ${CLUSTER_NAME}-vsphere-csi-node-cluster-role + namespace: ${NAMESPACE} +--- +apiVersion: v1 +data: + data: | + kind: ClusterRoleBinding + apiVersion: rbac.authorization.k8s.io/v1 + metadata: + name: vsphere-csi-node-cluster-role-binding + subjects: + - kind: ServiceAccount + name: vsphere-csi-node + namespace: kube-system + roleRef: + kind: ClusterRole + name: vsphere-csi-node-cluster-role + apiGroup: rbac.authorization.k8s.io +kind: ConfigMap +metadata: + name: ${CLUSTER_NAME}-vsphere-csi-node-cluster-role-binding + namespace: ${NAMESPACE} +--- +apiVersion: v1 +data: + data: | + kind: Role + apiVersion: rbac.authorization.k8s.io/v1 + metadata: + name: vsphere-csi-node-role + namespace: kube-system + rules: + - apiGroups: [&#34;&#34;] + resources: [&#34;configmaps&#34;] + verbs: [&#34;get&#34;, &#34;list&#34;, &#34;watch&#34;] +kind: ConfigMap +metadata: + name: ${CLUSTER_NAME}-vsphere-csi-node-role + namespace: ${NAMESPACE} +--- +apiVersion: v1 +data: + data: | + kind: RoleBinding + apiVersion: rbac.authorization.k8s.io/v1 + metadata: + name: vsphere-csi-node-binding + namespace: kube-system + subjects: + - kind: ServiceAccount + name: vsphere-csi-node + namespace: kube-system + roleRef: + kind: Role + name: vsphere-csi-node-role + apiGroup: rbac.authorization.k8s.io +kind: ConfigMap +metadata: + name: ${CLUSTER_NAME}-vsphere-csi-node-binding + namespace: ${NAMESPACE} +--- +apiVersion: v1 +data: + data: | + apiVersion: v1 + data: + &#34;csi-migration&#34;: &#34;true&#34; + &#34;csi-auth-check&#34;: &#34;true&#34; + &#34;online-volume-extend&#34;: &#34;true&#34; + &#34;trigger-csi-fullsync&#34;: &#34;false&#34; + &#34;async-query-volume&#34;: &#34;true&#34; + &#34;improved-csi-idempotency&#34;: &#34;true&#34; + &#34;improved-volume-topology&#34;: &#34;true&#34; + &#34;block-volume-snapshot&#34;: &#34;true&#34; + &#34;csi-windows-support&#34;: &#34;false&#34; + &#34;use-csinode-id&#34;: &#34;true&#34; + &#34;list-volumes&#34;: &#34;false&#34; + &#34;pv-to-backingdiskobjectid-mapping&#34;: &#34;false&#34; + &#34;cnsmgr-suspend-create-volume&#34;: &#34;true&#34; + &#34;topology-preferential-datastores&#34;: &#34;true&#34; + &#34;max-pvscsi-targets-per-vm&#34;: &#34;true&#34; + kind: ConfigMap + metadata: + name: internal-feature-states.csi.vsphere.vmware.com + namespace: kube-system +kind: ConfigMap +metadata: + name: ${CLUSTER_NAME}-internal-feature-states.csi.vsphere.vmware.com + namespace: ${NAMESPACE} +--- +apiVersion: v1 +data: + data: | + apiVersion: v1 + kind: Service + metadata: + name: vsphere-csi-controller + namespace: kube-system + labels: + app: vsphere-csi-controller + spec: + ports: + - name: ctlr + port: 2112 + targetPort: 2112 + protocol: TCP + - name: syncer + port: 2113 + targetPort: 2113 + protocol: TCP + selector: + app: vsphere-csi-controller +kind: ConfigMap +metadata: + name: ${CLUSTER_NAME}-vsphere-csi-controller-service + namespace: ${NAMESPACE} +--- +apiVersion: v1 +data: + data: | + kind: Deployment + apiVersion: apps/v1 + metadata: + name: vsphere-csi-controller + namespace: kube-system + spec: + replicas: 1 + strategy: + type: RollingUpdate + rollingUpdate: + maxUnavailable: 1 + maxSurge: 0 + selector: + matchLabels: + app: vsphere-csi-controller + template: + metadata: + labels: + app: vsphere-csi-controller + role: vsphere-csi + spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: &#34;app&#34; + operator: In + values: + - vsphere-csi-controller + topologyKey: &#34;kubernetes.io/hostname&#34; + serviceAccountName: vsphere-csi-controller + nodeSelector: + node-role.kubernetes.io/control-plane: &#34;&#34; + tolerations: + - key: node-role.kubernetes.io/master + operator: Exists + effect: NoSchedule + - key: node-role.kubernetes.io/control-plane + operator: Exists + effect: NoSchedule + # uncomment below toleration if you need an aggressive pod eviction in case when + # node becomes not-ready or unreachable. Default is 300 seconds if not specified. + #- key: node.kubernetes.io/not-ready + # operator: Exists + # effect: NoExecute + # tolerationSeconds: 30 + #- key: node.kubernetes.io/unreachable + # operator: Exists + # effect: NoExecute + # tolerationSeconds: 30 + dnsPolicy: &#34;Default&#34; + containers: + - name: csi-attacher + image: k8s.gcr.io/sig-storage/csi-attacher:v3.5.0 + args: + - &#34;--v=4&#34; + - &#34;--timeout=300s&#34; + - &#34;--csi-address=$(ADDRESS)&#34; + - &#34;--leader-election&#34; + - &#34;--kube-api-qps=100&#34; + - &#34;--kube-api-burst=100&#34; + env: + - name: ADDRESS + value: /csi/csi.sock + volumeMounts: + - mountPath: /csi + name: socket-dir + - name: csi-resizer + image: k8s.gcr.io/sig-storage/csi-resizer:v1.5.0 + args: + - &#34;--v=4&#34; + - &#34;--timeout=300s&#34; + - &#34;--handle-volume-inuse-error=false&#34; + - &#34;--csi-address=$(ADDRESS)&#34; + - &#34;--kube-api-qps=100&#34; + - &#34;--kube-api-burst=100&#34; + - &#34;--leader-election&#34; + env: + - name: ADDRESS + value: /csi/csi.sock + volumeMounts: + - mountPath: /csi + name: socket-dir + - name: vsphere-csi-controller + image: gcr.io/cloud-provider-vsphere/csi/release/driver:v2.7.0 + args: + - &#34;--fss-name=internal-feature-states.csi.vsphere.vmware.com&#34; + - &#34;--fss-namespace=$(CSI_NAMESPACE)&#34; + imagePullPolicy: &#34;Always&#34; + env: + - name: CSI_ENDPOINT + value: unix:///csi/csi.sock + - name: X_CSI_MODE + value: &#34;controller&#34; + - name: X_CSI_SPEC_DISABLE_LEN_CHECK + value: &#34;true&#34; + - name: X_CSI_SERIAL_VOL_ACCESS_TIMEOUT + value: 3m + - name: VSPHERE_CSI_CONFIG + value: &#34;/etc/cloud/csi-vsphere.conf&#34; + - name: LOGGER_LEVEL + value: &#34;PRODUCTION&#34; # Options: DEVELOPMENT, PRODUCTION + - name: INCLUSTER_CLIENT_QPS + value: &#34;100&#34; + - name: INCLUSTER_CLIENT_BURST + value: &#34;100&#34; + - name: CSI_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + volumeMounts: + - mountPath: /etc/cloud + name: vsphere-config-volume + readOnly: true + - mountPath: /csi + name: socket-dir + ports: + - name: healthz + containerPort: 9808 + protocol: TCP + - name: prometheus + containerPort: 2112 + protocol: TCP + livenessProbe: + httpGet: + path: /healthz + port: healthz + initialDelaySeconds: 10 + timeoutSeconds: 3 + periodSeconds: 5 + failureThreshold: 3 + - name: liveness-probe + image: k8s.gcr.io/sig-storage/livenessprobe:v2.7.0 + args: + - &#34;--v=4&#34; + - &#34;--csi-address=/csi/csi.sock&#34; + volumeMounts: + - name: socket-dir + mountPath: /csi + - name: vsphere-syncer + image: gcr.io/cloud-provider-vsphere/csi/release/syncer:v2.7.0 + args: + - &#34;--leader-election&#34; + - &#34;--fss-name=internal-feature-states.csi.vsphere.vmware.com&#34; + - &#34;--fss-namespace=$(CSI_NAMESPACE)&#34; + imagePullPolicy: &#34;Always&#34; + ports: + - containerPort: 2113 + name: prometheus + protocol: TCP + env: + - name: FULL_SYNC_INTERVAL_MINUTES + value: &#34;30&#34; + - name: VSPHERE_CSI_CONFIG + value: &#34;/etc/cloud/csi-vsphere.conf&#34; + - name: LOGGER_LEVEL + value: &#34;PRODUCTION&#34; # Options: DEVELOPMENT, PRODUCTION + - name: INCLUSTER_CLIENT_QPS + value: &#34;100&#34; + - name: INCLUSTER_CLIENT_BURST + value: &#34;100&#34; + - name: GODEBUG + value: x509sha1=1 + - name: CSI_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + volumeMounts: + - mountPath: /etc/cloud + name: vsphere-config-volume + readOnly: true + - name: csi-provisioner + image: k8s.gcr.io/sig-storage/csi-provisioner:v3.2.1 + args: + - &#34;--v=4&#34; + - &#34;--timeout=300s&#34; + - &#34;--csi-address=$(ADDRESS)&#34; + - &#34;--kube-api-qps=100&#34; + - &#34;--kube-api-burst=100&#34; + - &#34;--leader-election&#34; + - &#34;--default-fstype=ext4&#34; + # needed only for topology aware setup + #- &#34;--feature-gates=Topology=true&#34; + #- &#34;--strict-topology&#34; + env: + - name: ADDRESS + value: /csi/csi.sock + volumeMounts: + - mountPath: /csi + name: socket-dir + - name: csi-snapshotter + image: k8s.gcr.io/sig-storage/csi-snapshotter:v6.0.1 + args: + - &#34;--v=4&#34; + - &#34;--kube-api-qps=100&#34; + - &#34;--kube-api-burst=100&#34; + - &#34;--timeout=300s&#34; + - &#34;--csi-address=$(ADDRESS)&#34; + - &#34;--leader-election&#34; + env: + - name: ADDRESS + value: /csi/csi.sock + volumeMounts: + - mountPath: /csi + name: socket-dir + volumes: + - name: vsphere-config-volume + secret: + secretName: csi-vsphere-config + - name: socket-dir + emptyDir: {} + +kind: ConfigMap +metadata: + name: ${CLUSTER_NAME}-vsphere-csi-controller + namespace: ${NAMESPACE} +--- +apiVersion: v1 +data: + data: | + kind: DaemonSet + apiVersion: apps/v1 + metadata: + name: vsphere-csi-node + namespace: kube-system + spec: + selector: + matchLabels: + app: vsphere-csi-node + updateStrategy: + type: &#34;RollingUpdate&#34; + rollingUpdate: + maxUnavailable: 1 + template: + metadata: + labels: + app: vsphere-csi-node + role: vsphere-csi + spec: + nodeSelector: + kubernetes.io/os: linux + serviceAccountName: vsphere-csi-node + hostNetwork: true + dnsPolicy: &#34;ClusterFirstWithHostNet&#34; + containers: + - name: node-driver-registrar + image: k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.5.1 + args: + - &#34;--v=5&#34; + - &#34;--csi-address=$(ADDRESS)&#34; + - &#34;--kubelet-registration-path=$(DRIVER_REG_SOCK_PATH)&#34; + env: + - name: ADDRESS + value: /csi/csi.sock + - name: DRIVER_REG_SOCK_PATH + value: /var/lib/kubelet/plugins/csi.vsphere.vmware.com/csi.sock + volumeMounts: + - name: plugin-dir + mountPath: /csi + - name: registration-dir + mountPath: /registration + livenessProbe: + exec: + command: + - /csi-node-driver-registrar + - --kubelet-registration-path=/var/lib/kubelet/plugins/csi.vsphere.vmware.com/csi.sock + - --mode=kubelet-registration-probe + initialDelaySeconds: 3 + - name: vsphere-csi-node + image: gcr.io/cloud-provider-vsphere/csi/release/driver:v2.7.0 + args: + - &#34;--fss-name=internal-feature-states.csi.vsphere.vmware.com&#34; + - &#34;--fss-namespace=$(CSI_NAMESPACE)&#34; + imagePullPolicy: &#34;Always&#34; + env: + - name: NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName + - name: CSI_ENDPOINT + value: unix:///csi/csi.sock + - name: MAX_VOLUMES_PER_NODE + value: &#34;59&#34; # Maximum number of volumes that controller can publish to the node. If value is not set or zero Kubernetes decide how many volumes can be published by the controller to the node. + - name: X_CSI_MODE + value: &#34;node&#34; + - name: X_CSI_SPEC_REQ_VALIDATION + value: &#34;false&#34; + - name: X_CSI_SPEC_DISABLE_LEN_CHECK + value: &#34;true&#34; + - name: LOGGER_LEVEL + value: &#34;PRODUCTION&#34; # Options: DEVELOPMENT, PRODUCTION + - name: GODEBUG + value: x509sha1=1 + - name: CSI_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: NODEGETINFO_WATCH_TIMEOUT_MINUTES + value: &#34;1&#34; + securityContext: + privileged: true + capabilities: + add: [&#34;SYS_ADMIN&#34;] + allowPrivilegeEscalation: true + volumeMounts: + - name: plugin-dir + mountPath: /csi + - name: pods-mount-dir + mountPath: /var/lib/kubelet + # needed so that any mounts setup inside this container are + # propagated back to the host machine. + mountPropagation: &#34;Bidirectional&#34; + - name: device-dir + mountPath: /dev + - name: blocks-dir + mountPath: /sys/block + - name: sys-devices-dir + mountPath: /sys/devices + ports: + - name: healthz + containerPort: 9808 + protocol: TCP + livenessProbe: + httpGet: + path: /healthz + port: healthz + initialDelaySeconds: 10 + timeoutSeconds: 5 + periodSeconds: 5 + failureThreshold: 3 + - name: liveness-probe + image: k8s.gcr.io/sig-storage/livenessprobe:v2.7.0 + args: + - &#34;--v=4&#34; + - &#34;--csi-address=/csi/csi.sock&#34; + volumeMounts: + - name: plugin-dir + mountPath: /csi + volumes: + - name: registration-dir + hostPath: + path: /var/lib/kubelet/plugins_registry + type: Directory + - name: plugin-dir + hostPath: + path: /var/lib/kubelet/plugins/csi.vsphere.vmware.com + type: DirectoryOrCreate + - name: pods-mount-dir + hostPath: + path: /var/lib/kubelet + type: Directory + - name: device-dir + hostPath: + path: /dev + - name: blocks-dir + hostPath: + path: /sys/block + type: Directory + - name: sys-devices-dir + hostPath: + path: /sys/devices + type: Directory + tolerations: + - effect: NoExecute + operator: Exists + - effect: NoSchedule + operator: Exists +kind: ConfigMap +metadata: + name: ${CLUSTER_NAME}-vsphere-csi-node + namespace: ${NAMESPACE} +--- +apiVersion: v1 +data: + data: | + kind: DaemonSet + apiVersion: apps/v1 + metadata: + name: vsphere-csi-node-windows + namespace: kube-system + spec: + selector: + matchLabels: + app: vsphere-csi-node-windows + updateStrategy: + type: RollingUpdate + rollingUpdate: + maxUnavailable: 1 + template: + metadata: + labels: + app: vsphere-csi-node-windows + role: vsphere-csi-windows + spec: + nodeSelector: + kubernetes.io/os: windows + serviceAccountName: vsphere-csi-node + containers: + - name: node-driver-registrar + image: k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.5.1 + args: + - &#34;--v=5&#34; + - &#34;--csi-address=$(ADDRESS)&#34; + - &#34;--kubelet-registration-path=$(DRIVER_REG_SOCK_PATH)&#34; + env: + - name: ADDRESS + value: &#39;unix://C:\\csi\\csi.sock&#39; + - name: DRIVER_REG_SOCK_PATH + value: &#39;C:\\var\\lib\\kubelet\\plugins\\csi.vsphere.vmware.com\\csi.sock&#39; + volumeMounts: + - name: plugin-dir + mountPath: /csi + - name: registration-dir + mountPath: /registration + livenessProbe: + exec: + command: + - /csi-node-driver-registrar.exe + - --kubelet-registration-path=C:\\var\\lib\\kubelet\\plugins\\csi.vsphere.vmware.com\\csi.sock + - --mode=kubelet-registration-probe + initialDelaySeconds: 3 + - name: vsphere-csi-node + image: gcr.io/cloud-provider-vsphere/csi/release/driver:v2.7.0 + args: + - &#34;--fss-name=internal-feature-states.csi.vsphere.vmware.com&#34; + - &#34;--fss-namespace=$(CSI_NAMESPACE)&#34; + imagePullPolicy: &#34;Always&#34; + env: + - name: NODE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: spec.nodeName + - name: CSI_ENDPOINT + value: &#39;unix://C:\\csi\\csi.sock&#39; + - name: MAX_VOLUMES_PER_NODE + value: &#34;59&#34; # Maximum number of volumes that controller can publish to the node. If value is not set or zero Kubernetes decide how many volumes can be published by the controller to the node. + - name: X_CSI_MODE + value: node + - name: X_CSI_SPEC_REQ_VALIDATION + value: &#39;false&#39; + - name: X_CSI_SPEC_DISABLE_LEN_CHECK + value: &#34;true&#34; + - name: LOGGER_LEVEL + value: &#34;PRODUCTION&#34; # Options: DEVELOPMENT, PRODUCTION + - name: X_CSI_LOG_LEVEL + value: DEBUG + - name: CSI_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: NODEGETINFO_WATCH_TIMEOUT_MINUTES + value: &#34;1&#34; + volumeMounts: + - name: plugin-dir + mountPath: &#39;C:\csi&#39; + - name: pods-mount-dir + mountPath: &#39;C:\var\lib\kubelet&#39; + - name: csi-proxy-volume-v1 + mountPath: \\.\pipe\csi-proxy-volume-v1 + - name: csi-proxy-filesystem-v1 + mountPath: \\.\pipe\csi-proxy-filesystem-v1 + - name: csi-proxy-disk-v1 + mountPath: \\.\pipe\csi-proxy-disk-v1 + - name: csi-proxy-system-v1alpha1 + mountPath: \\.\pipe\csi-proxy-system-v1alpha1 + ports: + - name: healthz + containerPort: 9808 + protocol: TCP + livenessProbe: + httpGet: + path: /healthz + port: healthz + initialDelaySeconds: 10 + timeoutSeconds: 5 + periodSeconds: 5 + failureThreshold: 3 + - name: liveness-probe + image: k8s.gcr.io/sig-storage/livenessprobe:v2.7.0 + args: + - &#34;--v=4&#34; + - &#34;--csi-address=/csi/csi.sock&#34; + volumeMounts: + - name: plugin-dir + mountPath: /csi + volumes: + - name: registration-dir + hostPath: + path: &#39;C:\var\lib\kubelet\plugins_registry\&#39; + type: Directory + - name: plugin-dir + hostPath: + path: &#39;C:\var\lib\kubelet\plugins\csi.vsphere.vmware.com\&#39; + type: DirectoryOrCreate + - name: pods-mount-dir + hostPath: + path: \var\lib\kubelet + type: Directory + - name: csi-proxy-disk-v1 + hostPath: + path: \\.\pipe\csi-proxy-disk-v1 + type: &#39;&#39; + - name: csi-proxy-volume-v1 + hostPath: + path: \\.\pipe\csi-proxy-volume-v1 + type: &#39;&#39; + - name: csi-proxy-filesystem-v1 + hostPath: + path: \\.\pipe\csi-proxy-filesystem-v1 + type: &#39;&#39; + - name: csi-proxy-system-v1alpha1 + hostPath: + path: \\.\pipe\csi-proxy-system-v1alpha1 + type: &#39;&#39; + tolerations: + - effect: NoExecute + operator: Exists + - effect: NoSchedule + operator: Exists +kind: ConfigMap +metadata: + name: ${CLUSTER_NAME}-vsphere-csi-node-windows + namespace: ${NAMESPACE} +--- +apiVersion: v1 +kind: Secret +metadata: + name: ${CLUSTER_NAME}-cloud-controller-manager + namespace: ${NAMESPACE} +stringData: + data: | + apiVersion: v1 + kind: ServiceAccount + metadata: + labels: + component: cloud-controller-manager + vsphere-cpi-infra: service-account + name: cloud-controller-manager + namespace: kube-system +type: addons.cluster.x-k8s.io/resource-set +--- +apiVersion: v1 +kind: Secret +metadata: + name: ${CLUSTER_NAME}-cloud-provider-vsphere-credentials + namespace: ${NAMESPACE} +stringData: + data: | + apiVersion: v1 + kind: Secret + metadata: + labels: + component: cloud-controller-manager + vsphere-cpi-infra: secret + name: cloud-provider-vsphere-credentials + namespace: kube-system + stringData: + ${VSPHERE_SERVER}.password: ${VSPHERE_PASSWORD} + ${VSPHERE_SERVER}.username: ${VSPHERE_USERNAME} + type: Opaque +type: addons.cluster.x-k8s.io/resource-set +--- +apiVersion: v1 +data: + data: | + --- + apiVersion: rbac.authorization.k8s.io/v1 + kind: ClusterRole + metadata: + labels: + component: cloud-controller-manager + vsphere-cpi-infra: role + name: system:cloud-controller-manager + rules: + - apiGroups: + - &#34;&#34; + resources: + - events + verbs: + - create + - patch + - update + - apiGroups: + - &#34;&#34; + resources: + - nodes + verbs: + - &#39;*&#39; + - apiGroups: + - &#34;&#34; + resources: + - nodes/status + verbs: + - patch + - apiGroups: + - &#34;&#34; + resources: + - services + verbs: + - list + - patch + - update + - watch + - apiGroups: + - &#34;&#34; + resources: + - services/status + verbs: + - patch + - apiGroups: + - &#34;&#34; + resources: + - serviceaccounts + verbs: + - create + - get + - list + - watch + - update + - apiGroups: + - &#34;&#34; + resources: + - persistentvolumes + verbs: + - get + - list + - watch + - update + - apiGroups: + - &#34;&#34; + resources: + - endpoints + verbs: + - create + - get + - list + - watch + - update + - apiGroups: + - &#34;&#34; + resources: + - secrets + verbs: + - get + - list + - watch + - apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - get + - watch + - list + - update + - create + --- + apiVersion: rbac.authorization.k8s.io/v1 + kind: ClusterRoleBinding + metadata: + labels: + component: cloud-controller-manager + vsphere-cpi-infra: cluster-role-binding + name: system:cloud-controller-manager + roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: system:cloud-controller-manager + subjects: + - kind: ServiceAccount + name: cloud-controller-manager + namespace: kube-system + - kind: User + name: cloud-controller-manager + --- + apiVersion: v1 + data: + vsphere.conf: | + global: + port: 443 + secretName: cloud-provider-vsphere-credentials + secretNamespace: kube-system + thumbprint: &#39;${VSPHERE_TLS_THUMBPRINT}&#39; + vcenter: + ${VSPHERE_SERVER}: + datacenters: + - &#39;${VSPHERE_DATACENTER}&#39; + server: &#39;${VSPHERE_SERVER}&#39; + kind: ConfigMap + metadata: + name: vsphere-cloud-config + namespace: kube-system + --- + apiVersion: rbac.authorization.k8s.io/v1 + kind: RoleBinding + metadata: + labels: + component: cloud-controller-manager + vsphere-cpi-infra: role-binding + name: servicecatalog.k8s.io:apiserver-authentication-reader + namespace: kube-system + roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: extension-apiserver-authentication-reader + subjects: + - kind: ServiceAccount + name: cloud-controller-manager + namespace: kube-system + - kind: User + name: cloud-controller-manager + --- + apiVersion: apps/v1 + kind: DaemonSet + metadata: + labels: + component: cloud-controller-manager + tier: control-plane + name: vsphere-cloud-controller-manager + namespace: kube-system + spec: + selector: + matchLabels: + name: vsphere-cloud-controller-manager + template: + metadata: + labels: + component: cloud-controller-manager + name: vsphere-cloud-controller-manager + tier: control-plane + spec: + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: node-role.kubernetes.io/control-plane + operator: Exists + - matchExpressions: + - key: node-role.kubernetes.io/master + operator: Exists + containers: + - args: + - --v=2 + - --cloud-provider=vsphere + - --cloud-config=/etc/cloud/vsphere.conf + image: gcr.io/cloud-provider-vsphere/cpi/release/manager:v1.25.3 + name: vsphere-cloud-controller-manager + resources: + requests: + cpu: 200m + volumeMounts: + - mountPath: /etc/cloud + name: vsphere-config-volume + readOnly: true + hostNetwork: true + priorityClassName: system-node-critical + securityContext: + runAsUser: 1001 + serviceAccountName: cloud-controller-manager + tolerations: + - effect: NoSchedule + key: node.cloudprovider.kubernetes.io/uninitialized + value: &#34;true&#34; + - effect: NoSchedule + key: node-role.kubernetes.io/master + operator: Exists + - effect: NoSchedule + key: node-role.kubernetes.io/control-plane + operator: Exists + - effect: NoSchedule + key: node.kubernetes.io/not-ready + operator: Exists + volumes: + - configMap: + name: vsphere-cloud-config + name: vsphere-config-volume + updateStrategy: + type: RollingUpdate +kind: ConfigMap +metadata: + name: ${CLUSTER_NAME}-cpi-manifests + namespace: ${NAMESPACE} + + + + +--- +apiVersion: addons.cluster.x-k8s.io/v1beta1 +kind: ClusterResourceSet +metadata: + name: ${CLUSTER_NAME}-calico-module-resource + namespace: ${NAMESPACE} +spec: + clusterSelector: + matchLabels: + cluster.x-k8s.io/cluster-name: ${CLUSTER_NAME} + resources: + - kind: ConfigMap + name: ${CLUSTER_NAME}-calico-module-cr + strategy: Reconcile +--- +apiVersion: v1 +data: + calico.yaml: | + apiVersion: platform.verrazzano.io/v1alpha1 + kind: Module + metadata: + name: calico + namespace: default + spec: + moduleName: calico + targetNamespace: default + values: + tigeraOperator: + version: ${TIGERA_TAG=v1.29.0} + installation: + cni: + type: Calico + calicoNetwork: + bgp: Disabled + ipPools: + - cidr: ${POD_CIDR=192.168.0.0/16} + encapsulation: VXLAN + registry: ${OCNE_IMAGE_REPOSITORY=container-registry.oracle.com} + imagePath: ${OCNE_IMAGE_PATH=olcne} +kind: ConfigMap +metadata: + annotations: + note: generated + labels: + type: generated + name: ${CLUSTER_NAME}-calico-module-cr + namespace: ${NAMESPACE} +</code></pre></div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script> + </details> +</li> +<li> +<p>Generate and apply the template by running the following command: +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre tabindex="0"><code>$ clusterctl generate yaml --from vsphere-capi.yaml | kubectl apply -f - +</code></pre></div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script></p> +</li> +</ol> +<p>To get the <code>kubeconfig</code> file, run: +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre tabindex="0"><code>$ clusterctl get kubeconfig kluster1 -n kluster1 &gt; kluster1 +</code></pre></div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script></p> +<h2 id="finish-cluster-configuration">Finish cluster configuration</h2> +<p>After the cluster resources are created, you must perform some additional steps to finish the configuration of the cluster.</p> +<ol> +<li> +<p>If vSphere does not have a load balancer, then you can deploy MetalLB. +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre tabindex="0"><code>$ export KUBECONFIG=kluster1 + +ADDRESS_RANGE=${1:-&#34;subnet-from-vSphere-network&#34;}; + +$ kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.7/config/manifests/metallb-native.yaml --wait=true; +$ kubectl rollout status deployment -n metallb-system controller -w; +$ kubectl apply -f - &lt;&lt;EOF1 + apiVersion: metallb.io/v1beta1 + kind: IPAddressPool + metadata: + name: vzlocalpool + namespace: metallb-system + spec: + addresses: + - ${ADDRESS_RANGE} +EOF1 + +$ kubectl apply -f - &lt;&lt;-EOF2 + apiVersion: metallb.io/v1beta1 + kind: L2Advertisement + metadata: + name: vzmetallb + namespace: metallb-system + spec: + ipAddressPools: + - vzlocalpool +EOF2 + +$ sleep 10; +$ kubectl wait --namespace metallb-system --for=condition=ready pod --all --timeout=300s +</code></pre></div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script></p> +</li> +<li> +<p>Create a default storage class on the cluster. +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre tabindex="0"><code>$ export KUBECONFIG=kluster1 +$ kubectl apply -f - &lt;&lt;-EOF + kind: StorageClass + apiVersion: storage.k8s.io/v1 + metadata: + name: vmware-sc + annotations: + storageclass.kubernetes.io/is-default-class: &#34;true&#34; + provisioner: csi.vsphere.vmware.com + volumeBindingMode: WaitForFirstConsumer +EOF +</code></pre></div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script></p> +</li> +<li> +<p>Install Verrazzano on the managed cluster. +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre tabindex="0"><code>$ export KUBECONFIG=kluster1 + +$ vz install -f - &lt;&lt;EOF + apiVersion: install.verrazzano.io/v1beta1 + kind: Verrazzano + metadata: + name: example-verrazzano + spec: + profile: dev + defaultVolumeSource: + persistentVolumeClaim: + claimName: verrazzano-storage + volumeClaimSpecTemplates: + - metadata: + name: verrazzano-storage + spec: + resources: + requests: + storage: 2Gi +EOF +</code></pre></div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script></p> +</li> +</ol> +<p>Your admin cluster and first managed cluster are now up and running and ready to deploy applications. You can also add more managed clusters.</p> +<p>For more information, refer to the documentation for Cluster API and Cluster API vSphere:</p> +<ul> +<li><a href="https://cluster-api.sigs.k8s.io/introduction.html">Kubernetes Cluster API Documentation</a></li> +<li><a href="https://github.com/kubernetes-sigs/cluster-api-provider-vsphere">Kubernetes Cluster API Provider vSphere</a></li> +</ul> +<h2 id="troubleshoot-the-deployment">Troubleshoot the deployment</h2> +<p>If the deployment of the vSphere resources fails, then you can check the log files to diagnose the issue.</p> +<p>The vSphere cluster controller provider logs: +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre tabindex="0"><code>$ kubectl logs -n verrazzano-capi -l cluster.x-k8s.io/provider=infrastructure-vsphere +</code></pre></div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script></p> +<p>The OCNE control plane provider logs: +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre tabindex="0"><code>$ kubectl logs -n verrazzano-capi -l cluster.x-k8s.io/provider=control-plane-ocne +</code></pre></div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script></p> +<p><strong>NOTE</strong>: If the CSI pod deploys before Calico, then the pod may enter a <code>CrashLoop</code> state. Restart the pod to fix the issue.</p> +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre tabindex="0"><code>$ kubectl --kubeconfig kluster1 scale deploy -n kube-system vsphere-csi-controller --replicas=0 +$ kubectl --kubeconfig kluster1 scale deploy -n kube-system vsphere-csi-controller --replicas=1 +</code></pre></div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script> +<h2 id="delete-the-clusters">Delete the clusters</h2> +<ol> +<li>Delete the managed clusters. +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre tabindex="0"><code>$ kubectl delete cluster $CLUSTER_NAME +</code></pre></div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script></li> +<li>Delete the admin cluster. +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre tabindex="0"><code>$ kind delete cluster +</code></pre></div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script></li> +</ol> +<p>Do not use <code>kubectl delete -f capi-quickstart.yaml</code> to delete the entire cluster template at once because it might leave behind pending resources that you need to clean up manually.</p> + + + + + + diff --git a/devel/docs/advanced/ocne-azure/index.html b/devel/docs/advanced/ocne-azure/index.html new file mode 100644 index 0000000000..0d05a4d601 --- /dev/null +++ b/devel/docs/advanced/ocne-azure/index.html @@ -0,0 +1,3114 @@ + + + + + + + + + + + + + + + + + + + + +Create OCNE Clusters Running on Microsoft Azure | Verrazzano Enterprise Container Platform + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+
+ + +
+ + + + + +
+

Create OCNE Clusters Running on Microsoft Azure

+
Configure Oracle Cloud Native Environment self-managed clusters to run on Microsoft Azure
+ + + + + +

The Cluster API project provides a standard set of Kubernetes-style APIs for cluster management. Officially, Verrazzano currently only supports using Cluster API to provision OCNE and OKE clusters on OCI.

+

However, you can also experiment with using the features of the Cluster API project directly to deploy OCNE clusters on Microsoft Azure.

+

For more information on Cluster API or Cluster API with Azure, see:

+ + + + + +

Prepare Azure resources

+

Before you can deploy a Cluster API cluster, you need to set up a few resources in Azure.

+
    +
  1. Install the Azure command-line interface (CLI) tool. For instructions, see How to install the Azure CLI in the Microsoft Azure documentation.
  2. +
  3. Create an Azure resource group. In the Azure CLI, run the following command: + + +
    +
    +
    $ az group create --name <ResourceGroupName> --location <location>
    +
    + +
    + + +For more detailed instructions, see Manage Azure Resource Groups by using Azure CLI in the Microsoft Azure documentation.
  4. +
  5. Create a service principal. Make sure it has the privileges it needs to create resources. This means a contributor role at minimum. The following example creates a service principal, assigns it the contributor role, and defines its scope. + + +
    +
    +
    $ az ad sp create-for-rbac  --name myServicePrincipalName \
    +                            --role Contributor \
    +                            --scopes /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName
    +
    + +
    + + +For more detailed instructions, see Create an Azure service principal with Azure CLI in the Microsoft Azure documentation.
  6. +
+

Set up the admin cluster

+

The Cluster API requires an initial cluster as a starting point to deploy its resources.

+
    +
  1. +

    Install kind. Follow the instructions at Installation in the kind documentation.

    +
  2. +
  3. +

    Create a Kubernetes cluster using kind. Follow the instructions at Quick Start: Install and/or configure a Kubernetes cluster in The Cluster API Book.

    +
  4. +
  5. +

    Install the clusterctl CLI tool. clusterctl manages the lifecycle operations of a cluster API admin cluster. Follow the instructions at Quick Start: Install clusterctl in the Cluster API Book.

    +
  6. +
  7. +

    Install the Verrazzano CLI tool using the instructions at CLI Setup.

    +
  8. +
  9. +

    Install Verrazzano on the cluster using either the dev or prod installation profile. Follow the instructions at Install with CLI. The certManager and clusterAPI components are required and must remain enabled.

    +
  10. +
  11. +

    On the cluster, set environment variables for the following Azure resource IDs from your Azure account and from the service principal you created:

    +
      +
    • Subscription ID
    • +
    • Tenant ID
    • +
    • Client ID
    • +
    • Client Secret
    • +
    +

    For example: + + +

    +
    +
    # Azure resource  IDs
    +$ export AZURE_SUBSCRIPTION_ID="<SubscriptionId>"
    +$ export AZURE_TENANT_ID="<Tenant>"
    +$ export AZURE_CLIENT_ID="<AppId>"
    +$ export AZURE_CLIENT_SECRET="<Password>"
    +
    +# Base64 encode the Azure Resource IDs
    +$ export AZURE_SUBSCRIPTION_ID_B64="$(echo -n "$AZURE_SUBSCRIPTION_ID" | base64 | tr -d '\n')"
    +$ export AZURE_TENANT_ID_B64="$(echo -n "$AZURE_TENANT_ID" | base64 | tr -d '\n')"
    +$ export AZURE_CLIENT_ID_B64="$(echo -n "$AZURE_CLIENT_ID" | base64 | tr -d '\n')"
    +$ export AZURE_CLIENT_SECRET_B64="$(echo -n "$AZURE_CLIENT_SECRET" | base64 | tr -d '\n')"
    +
    +# Settings needed for AzureClusterIdentity used by the AzureCluster
    +$ export AZURE_CLUSTER_IDENTITY_SECRET_NAME="<cluster-identity-secret>"
    +$ export CLUSTER_IDENTITY_NAME="<cluster-identity>"
    +$ export AZURE_CLUSTER_IDENTITY_SECRET_NAMESPACE="default"
    +
    + +
    + +

    +
  12. +
  13. +

    Create a secret that includes the password of the service principal identity created in Azure. This secret is referenced by the AzureClusterIdentity used by the AzureCluster. + + +

    +
    +
    $ kubectl create secret generic "${AZURE_CLUSTER_IDENTITY_SECRET_NAME}" --from-literal=clientSecret="${AZURE_CLIENT_SECRET}" --namespace "${AZURE_CLUSTER_IDENTITY_SECRET_NAMESPACE}"
    +
    + +
    + +

    +
  14. +
  15. +

    Install the Cluster API Azure infrastructure provider. + + +

    +
    +
    $ clusterctl init -n verrazzano-capi -i azure
    +
    + +
    + +

    +

    clusterctl will report when the admin cluster was successfully initialized.

    +
  16. +
+

Create a managed cluster

+

The Cluster API uses a cluster template to deploy a predefined set of Cluster API objects and create a managed cluster.

+
    +
  1. +

    Set the following environment variables so they are available to the cluster template. Update the values to reflect your own environment. + + +

    +
    +
    # Base64 encoded SSH key for node access
    +$ export AZURE_SSH_PUBLIC_KEY_B64="<sshKey>"
    +  
    +# Select VM types.
    +$ export AZURE_CONTROL_PLANE_MACHINE_TYPE="Standard_D2s_v3"
    +$ export AZURE_NODE_MACHINE_TYPE="Standard_D2s_v3"
    + 
    +# [Optional] Select resource group. The default value is ${CLUSTER_NAME}.
    +$ export AZURE_RESOURCE_GROUP="<resourceGroupName>
    + 
    +# Name of the Azure datacenter location. Change this value to your desired location.
    +$ export AZURE_LOCATION="<location>"
    + 
    +# Cluster name info
    +$ export CLUSTER_NAME="capi-quickstart"
    +$ export KUBERNETES_VERSION="<k8sVersion>"
    +$ export NAMESPACE="default"
    +$ export CONTROL_PLANE_MACHINE_COUNT="1"
    +$ export WORKER_MACHINE_COUNT="1"
    +
    + +
    + +

    +
  2. +
  3. +

    Copy the cluster template and save it locally as azure-capi.yaml.

    +
    + Click here for the cluster template + + +
    +
    +
    apiVersion: cluster.x-k8s.io/v1beta1
    +kind: Cluster
    +metadata:
    +  name: ${CLUSTER_NAME}
    +  namespace: default
    +spec:
    +  clusterNetwork:
    +    pods:
    +      cidrBlocks:
    +        - 192.168.0.0/16
    +  controlPlaneRef:
    +    apiVersion: controlplane.cluster.x-k8s.io/v1beta1
    +    kind: OCNEControlPlane
    +    name: ${CLUSTER_NAME}-control-plane
    +  infrastructureRef:
    +    apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    +    kind: AzureCluster
    +    name: ${CLUSTER_NAME}
    +---
    +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    +kind: AzureCluster
    +metadata:
    +  name: ${CLUSTER_NAME}
    +  namespace: default
    +spec:
    +  identityRef:
    +    apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    +    kind: AzureClusterIdentity
    +    name: ${CLUSTER_IDENTITY_NAME}
    +  location: ${AZURE_LOCATION}
    +  networkSpec:
    +    subnets:
    +      - name: control-plane-subnet
    +        role: control-plane
    +      - name: node-subnet
    +        role: node
    +    vnet:
    +      name: ${AZURE_VNET_NAME:=${CLUSTER_NAME}-vnet}
    +  resourceGroup: ${AZURE_RESOURCE_GROUP:=${CLUSTER_NAME}}
    +  subscriptionID: ${AZURE_SUBSCRIPTION_ID}
    +---
    +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    +kind: AzureMachineTemplate
    +metadata:
    +  name: ${CLUSTER_NAME}-control-plane
    +  namespace: default
    +spec:
    +  template:
    +    spec:
    +      image:
    +        marketplace:
    +          publisher: "Oracle"
    +          offer: "Oracle-Linux"
    +          sku: "ol88-lvm-gen2"
    +          version: "8.8.3"
    +      dataDisks:
    +        - diskSizeGB: 256
    +          lun: 0
    +          nameSuffix: etcddisk
    +      osDisk:
    +        diskSizeGB: 128
    +        osType: Linux
    +      sshPublicKey: ${AZURE_SSH_PUBLIC_KEY_B64:=""}
    +      vmSize: ${AZURE_CONTROL_PLANE_MACHINE_TYPE}
    +---
    +apiVersion: cluster.x-k8s.io/v1beta1
    +kind: MachineDeployment
    +metadata:
    +  name: ${CLUSTER_NAME}-md-0
    +  namespace: default
    +spec:
    +  clusterName: ${CLUSTER_NAME}
    +  replicas: ${WORKER_MACHINE_COUNT}
    +  selector:
    +    matchLabels: null
    +  template:
    +    spec:
    +      bootstrap:
    +        configRef:
    +          apiVersion: bootstrap.cluster.x-k8s.io/v1beta1
    +          kind: OCNEConfigTemplate
    +          name: ${CLUSTER_NAME}-md-0
    +      clusterName: ${CLUSTER_NAME}
    +      infrastructureRef:
    +        apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    +        kind: AzureMachineTemplate
    +        name: ${CLUSTER_NAME}-md-0
    +      version: ${KUBERNETES_VERSION}
    +---
    +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    +kind: AzureMachineTemplate
    +metadata:
    +  name: ${CLUSTER_NAME}-md-0
    +  namespace: default
    +spec:
    +  template:
    +    spec:
    +      image:
    +        marketplace:
    +          publisher: "Oracle"
    +          offer: "Oracle-Linux"
    +          sku: "ol88-lvm-gen2"
    +          version: "8.8.3"
    +      osDisk:
    +        diskSizeGB: 128
    +        osType: Linux
    +      sshPublicKey: ${AZURE_SSH_PUBLIC_KEY_B64:=""}
    +      vmSize: ${AZURE_NODE_MACHINE_TYPE}
    +---
    +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    +kind: AzureClusterIdentity
    +metadata:
    +  labels:
    +    clusterctl.cluster.x-k8s.io/move-hierarchy: "true"
    +  name: ${CLUSTER_IDENTITY_NAME}
    +  namespace: default
    +spec:
    +  allowedNamespaces: {}
    +  clientID: ${AZURE_CLIENT_ID}
    +  clientSecret:
    +    name: ${AZURE_CLUSTER_IDENTITY_SECRET_NAME}
    +    namespace: ${AZURE_CLUSTER_IDENTITY_SECRET_NAMESPACE}
    +  tenantID: ${AZURE_TENANT_ID}
    +  type: ServicePrincipal
    +---
    +apiVersion: controlplane.cluster.x-k8s.io/v1alpha1
    +kind: OCNEControlPlane
    +metadata:
    +  name: ${CLUSTER_NAME}-control-plane
    +  namespace: default
    +spec:
    +  moduleOperator:
    +    enabled: true
    +  verrazzanoPlatformOperator:
    +    enabled: true
    +  controlPlaneConfig:
    +    clusterConfiguration:
    +      apiServer:
    +        extraArgs:
    +          cloud-provider: external
    +        certSANs:
    +          - localhost
    +          - 127.0.0.1
    +      dns:
    +        imageRepository: ${OCNE_IMAGE_REPOSITORY=container-registry.oracle.com}/${OCNE_IMAGE_PATH=olcne}
    +        imageTag: ${DNS_TAG=v1.9.3}
    +      etcd:
    +        local:
    +          imageRepository: ${OCNE_IMAGE_REPOSITORY=container-registry.oracle.com}/${OCNE_IMAGE_PATH=olcne}
    +          imageTag: ${ETCD_TAG=3.5.6}
    +      controllerManager:
    +        extraArgs:
    +          cloud-provider: external
    +      networking: {}
    +      scheduler: {}
    +      imageRepository: ${OCNE_IMAGE_REPOSITORY=container-registry.oracle.com}/${OCNE_IMAGE_PATH=olcne}
    +    files:
    +      - contentFrom:
    +          secret:
    +            key: control-plane-azure.json
    +            name: ${CLUSTER_NAME}-control-plane-azure-json
    +        owner: root:root
    +        path: /etc/kubernetes/azure.json
    +        permissions: "0644"
    +    initConfiguration:
    +      nodeRegistration:
    +        criSocket: /var/run/crio/crio.sock
    +        kubeletExtraArgs:
    +          cloud-provider: external
    +        name: '{{ local_hostname }}'
    +    joinConfiguration:
    +      discovery: {}
    +      nodeRegistration:
    +        criSocket: /var/run/crio/crio.sock
    +        kubeletExtraArgs:
    +          cloud-provider: external
    +        name: '{{ local_hostname }}'
    +    preOCNECommands:
    +      - hostnamectl set-hostname "{{ ds.meta_data.hostname }}"
    +      - echo "::1         ipv6-localhost ipv6-loopback localhost6 localhost6.localdomain6"
    +        >/etc/hosts
    +      - echo "127.0.0.1   {{ ds.meta_data.hostname }} {{ local_hostname }} localhost
    +        localhost.localdomain localhost4 localhost4.localdomain4" >>/etc/hosts
    +    users:
    +      - name: opc
    +        sudo: ALL=(ALL) NOPASSWD:ALL
    +  machineTemplate:
    +    infrastructureRef:
    +      apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    +      kind: AzureMachineTemplate
    +      name: ${CLUSTER_NAME}-control-plane
    +      namespace: default
    +  replicas: ${CONTROL_PLANE_MACHINE_COUNT}
    +  version: ${KUBERNETES_VERSION}
    +---
    +apiVersion: bootstrap.cluster.x-k8s.io/v1alpha1
    +kind: OCNEConfigTemplate
    +metadata:
    +  name: ${CLUSTER_NAME}-md-0
    +  namespace: default
    +spec:
    +  template:
    +    spec:
    +      clusterConfiguration:
    +        imageRepository: ${OCNE_IMAGE_REPOSITORY=container-registry.oracle.com}/${OCNE_IMAGE_PATH=olcne}
    +      joinConfiguration:
    +        nodeRegistration:
    +          kubeletExtraArgs:
    +            cloud-provider: external
    +          name: '{{ local_hostname }}'
    +      preOCNECommands:
    +        - hostnamectl set-hostname "{{ ds.meta_data.hostname }}"
    +        - echo "::1         ipv6-localhost ipv6-loopback localhost6 localhost6.localdomain6"
    +          >/etc/hosts
    +        - echo "127.0.0.1   {{ ds.meta_data.hostname }} {{ local_hostname }} localhost
    +          localhost.localdomain localhost4 localhost4.localdomain4" >>/etc/hosts
    +      users:
    +        - name: opc
    +          sudo: ALL=(ALL) NOPASSWD:ALL
    +
    + +
    + + +
    +
  4. +
  5. +

    Generate and apply the template by running the following command: + + +

    +
    +
    $ clusterctl generate yaml --from azure-capi.yaml | kubectl apply -f -
    +
    + +
    + +

    +
  6. +
+

To view the status of the cluster and its resources, run: + + +

+
+
$ clusterctl describe cluster $CLUSTER_NAME
+
+ +
+ +

+

To get the kubeconfig file, run: + + +

+
+
$ clusterctl get kubeconfig ${CLUSTER_NAME} > ${CLUSTER_NAME}.kubeconfig
+
+ +
+ +

+

Finish cluster configuration

+

After the cluster resources are created, you must perform some additional steps to finish the configuration of the cluster.

+
    +
  1. Install a cloud controller manager (CCM). A CCM is necessary when deploying cloud resources such as load balancers. + + +
    +
    +
    $ helm install --kubeconfig=./${CLUSTER_NAME}.kubeconfig --repo https://raw.githubusercontent.com/kubernetes-sigs/cloud-provider-azure/master/helm/repo cloud-provider-azure --generate-name --set infra.clusterName=clusterName --set cloudControllerManager.clusterCIDR="192.168.0.0/16" --set cloudControllerManager.caCertDir=/etc/pki/ca-trust
    +
    + +
    + +
  2. +
  3. Install a container network interface (CNI). The following example uses the Calico CNI. + + +
    +
    +
    $ helm repo add projectcalico https://docs.tigera.io/calico/charts --kubeconfig=./${CLUSTER_NAME}.kubeconfig && \
    +$ helm install calico projectcalico/tigera-operator --kubeconfig=./${CLUSTER_NAME}.kubeconfig -f https://raw.githubusercontent.com/kubernetes-sigs/cluster-api-provider-azure/main/templates/addons/calico/values.yaml --namespace tigera-operator --create-namespace
    +
    + +
    + +
  4. +
+

Your admin cluster and first managed cluster are now up and running and ready to deploy applications. You can add more managed clusters as needed.

+

For more information, refer to the documentation for Cluster API and Cluster API Azure:

+ +

Troubleshoot the deployment

+

If the deployment of the Azure resources fails, then you can check the following log files to diagnose the issue:

+

The Azure cluster controller provider logs: + + +

+
+
$ kubectl logs -n verrazzano-capi -l cluster.x-k8s.io/provider=infrastructure-azure
+
+ +
+ + +The OCNE control plane provider logs: + + +
+
+
$ kubectl logs -n verrazzano-capi -l cluster.x-k8s.io/provider=control-plane-ocne
+
+ +
+ +

+

NOTE: If a pod enters a CrashLoopBackOff state, then you can either restart the deployment or wait for the state to run its course. This is a known issue that should not affect the deployment of your cluster.

+

Delete the clusters

+
    +
  1. Delete the managed clusters. + + +
    +
    +
    $ kubectl delete cluster $CLUSTER_NAME
    +
    + +
    + +
  2. +
  3. Delete the admin cluster. + + +
    +
    +
    $ kind delete cluster
    +
    + +
    + +
  4. +
+

Do not use kubectl delete -f capi-quickstart.yaml to delete the entire cluster template at once because it might leave behind pending resources that you need to clean up manually.

+ + +
+ + + + + + +
+ + +
+ +
+ + +
+
+
+ +
+ + + + + + + + + \ No newline at end of file diff --git a/devel/docs/advanced/ocne-vsphere/index.html b/devel/docs/advanced/ocne-vsphere/index.html new file mode 100644 index 0000000000..d24af4d86e --- /dev/null +++ b/devel/docs/advanced/ocne-vsphere/index.html @@ -0,0 +1,4443 @@ + + + + + + + + + + + + + + + + + + + + +Create OCNE Clusters Running on VMware vSphere | Verrazzano Enterprise Container Platform + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+
+ + +
+ + + + + +
+

Create OCNE Clusters Running on VMware vSphere

+
Configure Oracle Cloud Native Environment self-managed clusters to run on VMware vSphere
+ + + + + +

The Cluster API project provides a standard set of Kubernetes-style APIs for cluster management. Officially, Verrazzano currently only supports using Cluster API to provision OCNE and OKE clusters on OCI.

+

However, you can also experiment with using the features of the Cluster API project directly to deploy OCNE clusters on VMware vSphere.

+

For more information on Cluster API or Cluster API with vSphere, see:

+ + + + + +

Before you begin

+

If you have an existing vSphere environment, you can ignore Set up a VMware Software-Defined Data Center and start from Prepare the VM environment. Confirm that your environment meets the requirements as specified at Cluster API Provider vSphere: Install Requirements.

+

Otherwise, create a vSphere environment. We recommend using the Oracle Cloud VMware Solution as described in Set up a VMware Software-Defined Data Center. It deploys a VMware software-defined data center (SDDC) on Oracle Cloud Infrastructure (OCI) and then integrates it with other Oracle services running on Oracle Cloud. This solution was developed in partnership with VMware to provide an environment that adheres to best practices recommended by VMware.

+

For more information on the Oracle Cloud VMware Solution, see Deploy a highly available VMware-based SDDC to the cloud in the Oracle Help Architecture Center.

+

Set up a VMware Software-Defined Data Center

+ + + + +

Use the Oracle Cloud VMware Solution to rapidly create a VMware SDDC.

+
    +
  1. +

    Set up a virtual cloud network (VCN). You can choose to use an existing VCN or let the Oracle Cloud VMware Solution create its own VCN as part of the SDDC provisioning process. If you use an existing VCN, then make sure it meets the requirements defined in Prepare Your Deployment in the Oracle Help Architecture Center.

    +
  2. +
  3. +

    Deploy the SDDC. To request a new VMware SDDC on OCI, follow the instructions at Deploy the SDDC in the Oracle Help Architecture Center.

    +
  4. +
  5. +

    Ensure that the various components were created successfully. Follow the instructions at Monitor the SDDC Creation Process in the Oracle Help Architecture Center.

    +
  6. +
+

Prepare the VM environment

+
    +
  1. +

    Download an Oracle Linux 8 ISO image from Oracle Linux Installation Media.

    +
  2. +
  3. +

    Upload the Oracle Linux 8 ISO image to vSphere. Use the steps at Upload ISO Image Installation Media for a Guest Operating System in the vSphere documentation.

    +
  4. +
  5. +

    Deploy a VM by following the instructions at Create a Virtual Machine with the New Virtual Machine Wizard in the vSphere documentation.

    +
  6. +
  7. +

    Install cloud-init on the VM. + + +

    +
    +
    $ sudo yum install -y cloud-init
    +
    + +
    + +

    +
  8. +
  9. +

    Initialize cloud-init. + + +

    +
    +
    $ cloud-init init --local
    +
    + +
    + + +When cloud-init is successfully configured, it returns a message similar to the following: + + +
    +
    +
    $ cloud-init v. 20.1.0011 running 'init-local' at Fri, 01 Apr 2022 01:26:11 +0000. Up 38.70 seconds.
    +
    + +
    + +

    +
  10. +
  11. +

    Shut down the VM.

    +
  12. +
  13. +

    Convert the VM into a template and name it OL8-Base-Template. Follow the instructions at Clone a Virtual Machine to a Template in the vSphere documentation.

    +
  14. +
+

Set up the admin cluster

+

The Cluster API requires an initial cluster as a starting point to deploy its resources.

+
    +
  1. +

    Install kind. Follow the instructions at Installation in the kind documentation.

    +
  2. +
  3. +

    Create a Kubernetes cluster using kind. This cluster must be accessible by the VMware SDDC. Follow the instructions at Quick Start: Install and/or configure a Kubernetes cluster in The Cluster API Book.

    +
  4. +
  5. +

    Install the clusterctl CLI tool. clusterctl manages the lifecycle operations of a cluster API admin cluster. Follow instructions at Quick Start: Install clusterctl in the Cluster API Book.

    +
  6. +
  7. +

    Install the Verrazzano CLI tool using the instructions at CLI Setup.

    +
  8. +
  9. +

    Install Verrazzano on the cluster using either the dev or prod profile. Follow the instructions at Install with CLI.

    +
  10. +
  11. +

    On the cluster, set the following vSphere environment variables. Update the values to reflect your own environment. + + +

    +
    +
    $ export VSPHERE_PASSWORD="<vmware-password>"
    +$ export VSPHERE_USERNAME="administrator@vsphere.local"
    +$ export VSPHERE_SERVER="<IP address or FQDN>"
    +$ export VSPHERE_DATACENTER="<SDDC-Datacenter>"
    +$ export VSPHERE_DATASTORE="<vSAN-Datastore>"	
    +$ export VSPHERE_NETWORK="workload"
    +$ export VSPHERE_RESOURCE_POOL="*/Resources/Workload"
    +$ export VSPHERE_FOLDER="<folder-name>"
    +$ export VSPHERE_TEMPLATE="OL8-Base-Template"
    +$ export VSPHERE_SSH_AUTHORIZED_KEY="<Public-SSH-Authorized-Key>"
    +$ export VSPHERE_TLS_THUMBPRINT="<SHA1 thumbprint of vCenter certificate>"
    +$ export VSPHERE_STORAGE_POLICY=""
    +$ export CONTROL_PLANE_ENDPOINT_IP="<IP address or FQDN>"
    +
    + +
    + + +For information on the values of the environment variables, see Configuring and installing Cluster API Provider vSphere in a management cluster in the Cluster API Provider vSphere documentation.

    +
  12. +
  13. +

    Install the Cluster API Provider vSphere to initialize the admin cluster. + + +

    +
    +
    $ clusterctl init -n verrazzano-capi -i vsphere
    +
    + +
    + +

    +

    clusterctl will report when the admin cluster was successfully initialized.

    +
  14. +
+

Create a managed cluster

+

The Cluster API uses a cluster template to deploy a predefined set of Cluster API objects and create a managed cluster.

+
    +
  1. +

    Copy the cluster template and save it locally as vsphere-capi.yaml.

    +
    + Click here for the cluster template + + +
    +
    +
    apiVersion: cluster.x-k8s.io/v1beta1
    +kind: Cluster
    +metadata:
    +  labels:
    +    cluster.x-k8s.io/cluster-name: ${CLUSTER_NAME}
    +  name: ${CLUSTER_NAME}
    +  namespace: ${NAMESPACE}
    +spec:
    +  clusterNetwork:
    +    pods:
    +      cidrBlocks:
    +        - ${POD_CIDR=192.168.0.0/16}
    +    serviceDomain: cluster.local
    +    services:
    +      cidrBlocks:
    +        - ${CLUSTER_CIDR=10.128.0.0/12}
    +  controlPlaneRef:
    +    apiVersion: controlplane.cluster.x-k8s.io/v1alpha1
    +    kind: OCNEControlPlane
    +    name: ${CLUSTER_NAME}-control-plane
    +    namespace: ${NAMESPACE}
    +  infrastructureRef:
    +    apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    +    kind: VSphereCluster
    +    name: ${CLUSTER_NAME}
    +    namespace: ${NAMESPACE}
    +---
    +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    +kind: VSphereCluster
    +metadata:
    +  name: ${CLUSTER_NAME}
    +  namespace: ${NAMESPACE}
    +spec:
    +  controlPlaneEndpoint:
    +    host: ${CONTROL_PLANE_ENDPOINT_IP}
    +    port: 6443
    +  identityRef:
    +    kind: Secret
    +    name: ${CLUSTER_NAME}
    +  server: ${VSPHERE_SERVER}
    +  thumbprint: '${VSPHERE_TLS_THUMBPRINT}'
    +---
    +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    +kind: VSphereMachineTemplate
    +metadata:
    +  name: ${CLUSTER_NAME}-control-plane
    +  namespace: ${NAMESPACE}
    +spec:
    +  template:
    +    spec:
    +      cloneMode: linkedClone
    +      datacenter: ${VSPHERE_DATACENTER=oci-w01dc}
    +      datastore: ${VSPHERE_DATASTORE=vsanDatastore}
    +      diskGiB: ${VSPHERE_DISK=200}
    +      folder: ${VSPHERE_FOLDER=CAPI}
    +      memoryMiB: ${VSPHERE_MEMORY=32384}
    +      network:
    +        devices:
    +          - dhcp4: true
    +            networkName: "${VSPHERE_NETWORK=workload}"
    +      numCPUs: ${VSPHERE_CPU=4}
    +      os: Linux
    +      resourcePool: '${VSPHERE_RESOURCE_POOL=*/Resources/Workload}'
    +      server: '${VSPHERE_SERVER=11.0.11.130}'
    +      storagePolicyName: ${VSPHERE_STORAGE_POLICY=""}
    +      template: ${VSPHERE_TEMPLATE=OL8-Base-Template}
    +      thumbprint: '${VSPHERE_TLS_THUMBPRINT}'
    +---
    +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    +kind: VSphereMachineTemplate
    +metadata:
    +  name: ${CLUSTER_NAME}-md-0
    +  namespace: ${NAMESPACE}
    +spec:
    +  template:
    +    spec:
    +      cloneMode: linkedClone
    +      datacenter: ${VSPHERE_DATACENTER=oci-w01dc}
    +      datastore: ${VSPHERE_DATASTORE=vsanDatastore}
    +      diskGiB: ${VSPHERE_DISK=200}
    +      folder: ${VSPHERE_FOLDER=CAPI}
    +      memoryMiB: ${VSPHERE_MEMORY=32384}
    +      network:
    +        devices:
    +          - dhcp4: true
    +            networkName: "${VSPHERE_NETWORK=workload}"
    +      numCPUs: ${VSPHERE_CPU=4}
    +      os: Linux
    +      resourcePool: '${VSPHERE_RESOURCE_POOL=*/Resources/Workload}'
    +      server: '${VSPHERE_SERVER=11.0.11.130}'
    +      storagePolicyName: ${VSPHERE_STORAGE_POLICY=""}
    +      template: ${VSPHERE_TEMPLATE=OL8-Base-Template}
    +      thumbprint: '${VSPHERE_TLS_THUMBPRINT}'
    +---
    +apiVersion: controlplane.cluster.x-k8s.io/v1alpha1
    +kind: OCNEControlPlane
    +metadata:
    +  name: ${CLUSTER_NAME}-control-plane
    +  namespace: ${NAMESPACE}
    +spec:
    +  moduleOperator:
    +    enabled: true
    +  verrazzanoPlatformOperator:
    +    enabled: true
    +  controlPlaneConfig:
    +    clusterConfiguration:
    +      apiServer:
    +        extraArgs:
    +          cloud-provider: external
    +        certSANs:
    +          - localhost
    +          - 127.0.0.1
    +      dns:
    +        imageRepository: ${OCNE_IMAGE_REPOSITORY=container-registry.oracle.com}/${OCNE_IMAGE_PATH=olcne}
    +        imageTag: ${DNS_TAG=v1.9.3}
    +      etcd:
    +        local:
    +          imageRepository: ${OCNE_IMAGE_REPOSITORY=container-registry.oracle.com}/${OCNE_IMAGE_PATH=olcne}
    +          imageTag: ${ETCD_TAG=3.5.6}
    +      controllerManager:
    +        extraArgs:
    +          cloud-provider: external
    +      networking: {}
    +      scheduler: {}
    +      imageRepository: ${OCNE_IMAGE_REPOSITORY=container-registry.oracle.com}/${OCNE_IMAGE_PATH=olcne}
    +    files:
    +      - content: |
    +          apiVersion: v1
    +          kind: Pod
    +          metadata: 
    +            creationTimestamp: null
    +            name: kube-vip
    +            namespace: kube-system
    +          spec: 
    +            containers: 
    +            - args: 
    +              - manager
    +              env: 
    +              - name: cp_enable
    +                value: "true"
    +              - name: vip_interface
    +                value: ""
    +              - name: address
    +                value: ${CONTROL_PLANE_ENDPOINT_IP}
    +              - name: port
    +                value: "6443"
    +              - name: vip_arp
    +                value: "true"
    +              - name: vip_leaderelection
    +                value: "true"
    +              - name: vip_leaseduration
    +                value: "15"
    +              - name: vip_renewdeadline
    +                value: "10"
    +              - name: vip_retryperiod
    +                value: "2"
    +              image: ghcr.io/kube-vip/kube-vip:v0.5.11
    +              imagePullPolicy: IfNotPresent
    +              name: kube-vip
    +              resources: {}
    +              securityContext: 
    +                capabilities: 
    +                  add: 
    +                  - NET_ADMIN
    +                  - NET_RAW
    +              volumeMounts: 
    +              - mountPath: /etc/kubernetes/admin.conf
    +                name: kubeconfig
    +            hostAliases: 
    +            - hostnames: 
    +              - kubernetes
    +              ip: 127.0.0.1
    +            hostNetwork: true
    +            volumes: 
    +            - hostPath: 
    +                path: /etc/kubernetes/admin.conf
    +                type: FileOrCreate
    +              name: kubeconfig
    +          status: {}
    +        owner: root:root
    +        path: /etc/kubernetes/manifests/kube-vip.yaml
    +    initConfiguration:
    +      nodeRegistration:
    +        criSocket: /var/run/crio/crio.sock
    +        kubeletExtraArgs:
    +          cloud-provider: external
    +        name: '{{ local_hostname }}'
    +    joinConfiguration:
    +      discovery: {}
    +      nodeRegistration:
    +        criSocket: /var/run/crio/crio.sock
    +        kubeletExtraArgs:
    +          cloud-provider: external
    +        name: '{{ local_hostname }}'
    +    verbosity: 9
    +    preOCNECommands:
    +      - hostnamectl set-hostname "{{ ds.meta_data.hostname }}"
    +      - echo "::1         ipv6-localhost ipv6-loopback localhost6 localhost6.localdomain6"
    +        >/etc/hosts
    +      - echo "127.0.0.1   {{ ds.meta_data.hostname }} {{ local_hostname }} localhost
    +        localhost.localdomain localhost4 localhost4.localdomain4" >>/etc/hosts
    +    users:
    +      - name: opc
    +        sshAuthorizedKeys:
    +          - ${VSPHERE_SSH_AUTHORIZED_KEY}
    +        sudo: ALL=(ALL) NOPASSWD:ALL
    +  machineTemplate:
    +    infrastructureRef:
    +      apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    +      kind: VSphereMachineTemplate
    +      name: ${CLUSTER_NAME}-control-plane
    +      namespace: ${NAMESPACE}
    +  replicas: ${CONTROL_PLANE_MACHINE_COUNT=1}
    +  version: ${KUBERNETES_VERSION=v1.26.6}
    +---
    +apiVersion: bootstrap.cluster.x-k8s.io/v1alpha1
    +kind: OCNEConfigTemplate
    +metadata:
    +  name: ${CLUSTER_NAME}-md-0
    +  namespace: ${NAMESPACE}
    +spec:
    +  template:
    +    spec:
    +      clusterConfiguration:
    +        imageRepository: ${OCNE_IMAGE_REPOSITORY=container-registry.oracle.com}/${OCNE_IMAGE_PATH=olcne}
    +      joinConfiguration:
    +        nodeRegistration:
    +          kubeletExtraArgs:
    +            cloud-provider: external
    +          name: '{{ local_hostname }}'
    +      verbosity: 9
    +      preOCNECommands:
    +        - hostnamectl set-hostname "{{ ds.meta_data.hostname }}"
    +        - echo "::1         ipv6-localhost ipv6-loopback localhost6 localhost6.localdomain6"
    +          >/etc/hosts
    +        - echo "127.0.0.1   {{ ds.meta_data.hostname }} {{ local_hostname }} localhost
    +          localhost.localdomain localhost4 localhost4.localdomain4" >>/etc/hosts
    +      users:
    +        - name: opc
    +          sshAuthorizedKeys:
    +            - ${VSPHERE_SSH_AUTHORIZED_KEY}
    +          sudo: ALL=(ALL) NOPASSWD:ALL
    +---
    +apiVersion: cluster.x-k8s.io/v1beta1
    +kind: MachineDeployment
    +metadata:
    +  labels:
    +    cluster.x-k8s.io/cluster-name: ${CLUSTER_NAME}
    +  name: ${CLUSTER_NAME}-md-0
    +  namespace: ${NAMESPACE}
    +spec:
    +  clusterName: ${CLUSTER_NAME}
    +  replicas: ${NODE_MACHINE_COUNT=3}
    +  selector:
    +    matchLabels: {}
    +  template:
    +    metadata:
    +      labels:
    +        cluster.x-k8s.io/cluster-name: ${CLUSTER_NAME}
    +    spec:
    +      bootstrap:
    +        configRef:
    +          apiVersion: bootstrap.cluster.x-k8s.io/v1alpha1
    +          kind: OCNEConfigTemplate
    +          name: ${CLUSTER_NAME}-md-0
    +      clusterName: ${CLUSTER_NAME}
    +      infrastructureRef:
    +        apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    +        kind: VSphereMachineTemplate
    +        name: ${CLUSTER_NAME}-md-0
    +      version: ${KUBERNETES_VERSION=v1.26.6}
    +---
    +apiVersion: addons.cluster.x-k8s.io/v1beta1
    +kind: ClusterResourceSet
    +metadata:
    +  name: ${CLUSTER_NAME}-crs-0
    +  namespace: ${NAMESPACE}
    +spec:
    +  clusterSelector:
    +    matchLabels:
    +      cluster.x-k8s.io/cluster-name: ${CLUSTER_NAME}
    +  resources:
    +    - kind: Secret
    +      name: ${CLUSTER_NAME}-vsphere-csi-controller
    +    - kind: ConfigMap
    +      name: ${CLUSTER_NAME}-vsphere-csi-controller-role
    +    - kind: ConfigMap
    +      name: ${CLUSTER_NAME}-vsphere-csi-controller-binding
    +    - kind: Secret
    +      name: ${CLUSTER_NAME}-csi-vsphere-config
    +    - kind: ConfigMap
    +      name: csi.vsphere.vmware.com
    +    - kind: ConfigMap
    +      name: vsphere-csi-controller-sa
    +    - kind: ConfigMap
    +      name: vsphere-csi-node-sa
    +    - kind: ConfigMap
    +      name: ${CLUSTER_NAME}-vsphere-csi-node-cluster-role
    +    - kind: ConfigMap
    +      name: ${CLUSTER_NAME}-vsphere-csi-node-cluster-role-binding
    +    - kind: ConfigMap
    +      name: ${CLUSTER_NAME}-vsphere-csi-node-role
    +    - kind: ConfigMap
    +      name: ${CLUSTER_NAME}-vsphere-csi-node-binding
    +    - kind: ConfigMap
    +      name: ${CLUSTER_NAME}-internal-feature-states.csi.vsphere.vmware.com
    +    - kind: ConfigMap
    +      name: ${CLUSTER_NAME}-vsphere-csi-controller-service
    +    - kind: ConfigMap
    +      name: ${CLUSTER_NAME}-vsphere-csi-controller
    +    - kind: ConfigMap
    +      name: ${CLUSTER_NAME}-vsphere-csi-node
    +    - kind: ConfigMap
    +      name: ${CLUSTER_NAME}-vsphere-csi-node-windows
    +    - kind: Secret
    +      name: ${CLUSTER_NAME}-cloud-controller-manager
    +    - kind: Secret
    +      name: ${CLUSTER_NAME}-cloud-provider-vsphere-credentials
    +    - kind: ConfigMap
    +      name: ${CLUSTER_NAME}-cpi-manifests
    +  strategy: Reconcile
    +---
    +apiVersion: v1
    +kind: Secret
    +metadata:
    +  name: ${CLUSTER_NAME}
    +  namespace: ${NAMESPACE}
    +stringData:
    +  password: ${VSPHERE_PASSWORD}
    +  username: ${VSPHERE_USERNAME}
    +---
    +apiVersion: v1
    +kind: ConfigMap
    +metadata:
    +  name: ${CLUSTER_NAME}-vsphere-csi-controller
    +  namespace: ${NAMESPACE}
    +data:
    +  data: |
    +    apiVersion: v1
    +    kind: ServiceAccount
    +    metadata: 
    +      name: vsphere-csi-controller
    +      namespace: kube-system
    +---
    +apiVersion: v1
    +data:
    +  data: |
    +    apiVersion: rbac.authorization.k8s.io/v1
    +    kind: ClusterRole
    +    metadata: 
    +      name: vsphere-csi-controller-role
    +    rules: 
    +    - apiGroups: [""]
    +      resources: ["nodes", "pods", "configmaps"]
    +      verbs: ["get", "list", "watch"]
    +    - apiGroups: [""]
    +      resources: ["persistentvolumeclaims"]
    +      verbs: ["get", "list", "watch", "update"]
    +    - apiGroups: [""]
    +      resources: ["persistentvolumeclaims/status"]
    +      verbs: ["patch"]
    +    - apiGroups: [""]
    +      resources: ["persistentvolumes"]
    +      verbs: ["get", "list", "watch", "create", "update", "delete", "patch"]
    +    - apiGroups: [""]
    +      resources: ["events"]
    +      verbs: ["get", "list", "watch", "create", "update", "patch"]
    +    - apiGroups: ["coordination.k8s.io"]
    +      resources: ["leases"]
    +      verbs: ["get", "watch", "list", "delete", "update", "create"]
    +    - apiGroups: ["storage.k8s.io"]
    +      resources: ["storageclasses", "csinodes"]
    +      verbs: ["get", "list", "watch"]
    +    - apiGroups: ["storage.k8s.io"]
    +      resources: ["volumeattachments"]
    +      verbs: ["get", "list", "watch", "patch"]
    +    - apiGroups: ["cns.vmware.com"]
    +      resources: ["triggercsifullsyncs"]
    +      verbs: ["create", "get", "update", "watch", "list"]
    +    - apiGroups: ["cns.vmware.com"]
    +      resources: ["cnsvspherevolumemigrations"]
    +      verbs: ["create", "get", "list", "watch", "update", "delete"]
    +    - apiGroups: ["apiextensions.k8s.io"]
    +      resources: ["customresourcedefinitions"]
    +      verbs: ["get", "create", "update"]
    +    - apiGroups: ["storage.k8s.io"]
    +      resources: ["volumeattachments/status"]
    +      verbs: ["patch"]
    +    - apiGroups: ["cns.vmware.com"]
    +      resources: ["cnsvolumeoperationrequests"]
    +      verbs: ["create", "get", "list", "update", "delete"]
    +    - apiGroups: [ "snapshot.storage.k8s.io" ]
    +      resources: [ "volumesnapshots" ]
    +      verbs: [ "get", "list" ]
    +    - apiGroups: [ "snapshot.storage.k8s.io" ]
    +      resources: [ "volumesnapshotclasses" ]
    +      verbs: [ "watch", "get", "list" ]
    +    - apiGroups: [ "snapshot.storage.k8s.io" ]
    +      resources: [ "volumesnapshotcontents" ]
    +      verbs: [ "create", "get", "list", "watch", "update", "delete", "patch"]
    +    - apiGroups: [ "snapshot.storage.k8s.io" ]
    +      resources: [ "volumesnapshotcontents/status" ]
    +      verbs: [ "update", "patch" ]
    +    - apiGroups: [ "cns.vmware.com" ]
    +      resources: [ "csinodetopologies" ]
    +      verbs: ["get", "update", "watch", "list"]
    +kind: ConfigMap
    +metadata:
    +  name: ${CLUSTER_NAME}-vsphere-csi-controller-role
    +  namespace: ${NAMESPACE}
    +---
    +apiVersion: v1
    +data:
    +  data: |
    +    apiVersion: rbac.authorization.k8s.io/v1
    +    kind: ClusterRoleBinding
    +    metadata: 
    +      name: vsphere-csi-controller-binding
    +    roleRef: 
    +      apiGroup: rbac.authorization.k8s.io
    +      kind: ClusterRole
    +      name: vsphere-csi-controller-role
    +    subjects: 
    +    - kind: ServiceAccount
    +      name: vsphere-csi-controller
    +      namespace: kube-system
    +kind: ConfigMap
    +metadata:
    +  name: ${CLUSTER_NAME}-vsphere-csi-controller-binding
    +  namespace: ${NAMESPACE}
    +---
    +apiVersion: v1
    +kind: Secret
    +metadata:
    +  name: ${CLUSTER_NAME}-csi-vsphere-config
    +  namespace: ${NAMESPACE}
    +stringData:
    +  data: |
    +    apiVersion: v1
    +    kind: Secret
    +    metadata: 
    +      name: csi-vsphere-config
    +      namespace: kube-system
    +    stringData: 
    +      csi-vsphere.conf: |+
    +        [Global]
    +        thumbprint = "${VSPHERE_TLS_THUMBPRINT}"
    +        cluster-id = "${NAMESPACE}/${CLUSTER_NAME}"
    +
    +        [VirtualCenter "${VSPHERE_SERVER}"]
    +        insecure-flag = "true"
    +        user = "${VSPHERE_USERNAME}"
    +        password = "${VSPHERE_PASSWORD}"
    +        datacenters = "${VSPHERE_DATACENTER}"
    +        targetvSANFileShareDatastoreURLs = "${VSPHERE_DATASTORE_URL_SAN}"
    +
    +        [Network]
    +        public-network = "${VSPHERE_NETWORK=workload}"
    +
    +    type: Opaque
    +type: addons.cluster.x-k8s.io/resource-set
    +---
    +apiVersion: v1
    +data:
    +  data: |
    +    apiVersion: storage.k8s.io/v1
    +    kind: CSIDriver
    +    metadata:
    +      name: csi.vsphere.vmware.com
    +    spec:
    +      attachRequired: true
    +      podInfoOnMount: false
    +kind: ConfigMap
    +metadata:
    +  name: csi.vsphere.vmware.com
    +  namespace: ${NAMESPACE}
    +---
    +apiVersion: v1
    +data:
    +  data: |
    +    kind: ServiceAccount
    +    apiVersion: v1
    +    metadata:
    +      name: vsphere-csi-controller
    +      namespace: kube-system
    +kind: ConfigMap
    +metadata:
    +  name: vsphere-csi-controller-sa
    +  namespace: ${NAMESPACE}
    +---
    +apiVersion: v1
    +data:
    +  data: |
    +    kind: ServiceAccount
    +    apiVersion: v1
    +    metadata:
    +      name: vsphere-csi-node
    +      namespace: kube-system
    +kind: ConfigMap
    +metadata:
    +  name: vsphere-csi-node-sa
    +  namespace: ${NAMESPACE}
    +---
    +apiVersion: v1
    +data:
    +  data: |
    +    apiVersion: rbac.authorization.k8s.io/v1
    +    kind: ClusterRole
    +    metadata: 
    +      name: vsphere-csi-node-cluster-role
    +    rules: 
    +      - apiGroups: ["cns.vmware.com"]
    +        resources: ["csinodetopologies"]
    +        verbs: ["create", "watch", "get", "patch"]
    +      - apiGroups: [""]
    +        resources: ["nodes"]
    +        verbs: ["get"]
    +kind: ConfigMap
    +metadata:
    +  name: ${CLUSTER_NAME}-vsphere-csi-node-cluster-role
    +  namespace: ${NAMESPACE}
    +---
    +apiVersion: v1
    +data:
    +  data: |
    +    kind: ClusterRoleBinding
    +    apiVersion: rbac.authorization.k8s.io/v1
    +    metadata:
    +      name: vsphere-csi-node-cluster-role-binding
    +    subjects:
    +      - kind: ServiceAccount
    +        name: vsphere-csi-node
    +        namespace: kube-system
    +    roleRef:
    +      kind: ClusterRole
    +      name: vsphere-csi-node-cluster-role
    +      apiGroup: rbac.authorization.k8s.io
    +kind: ConfigMap
    +metadata:
    +  name: ${CLUSTER_NAME}-vsphere-csi-node-cluster-role-binding
    +  namespace: ${NAMESPACE}
    +---
    +apiVersion: v1
    +data:
    +  data: |
    +    kind: Role
    +    apiVersion: rbac.authorization.k8s.io/v1
    +    metadata:
    +      name: vsphere-csi-node-role
    +      namespace: kube-system
    +    rules:
    +      - apiGroups: [""]
    +        resources: ["configmaps"]
    +        verbs: ["get", "list", "watch"]
    +kind: ConfigMap
    +metadata:
    +  name: ${CLUSTER_NAME}-vsphere-csi-node-role
    +  namespace: ${NAMESPACE}
    +---
    +apiVersion: v1
    +data:
    +  data: |
    +    kind: RoleBinding
    +    apiVersion: rbac.authorization.k8s.io/v1
    +    metadata:
    +      name: vsphere-csi-node-binding
    +      namespace: kube-system
    +    subjects:
    +      - kind: ServiceAccount
    +        name: vsphere-csi-node
    +        namespace: kube-system
    +    roleRef:
    +      kind: Role
    +      name: vsphere-csi-node-role
    +      apiGroup: rbac.authorization.k8s.io
    +kind: ConfigMap
    +metadata:
    +  name: ${CLUSTER_NAME}-vsphere-csi-node-binding
    +  namespace: ${NAMESPACE}
    +---
    +apiVersion: v1
    +data:
    +  data: |
    +    apiVersion: v1
    +    data:
    +      "csi-migration": "true"
    +      "csi-auth-check": "true"
    +      "online-volume-extend": "true"
    +      "trigger-csi-fullsync": "false"
    +      "async-query-volume": "true"
    +      "improved-csi-idempotency": "true"
    +      "improved-volume-topology": "true"
    +      "block-volume-snapshot": "true"
    +      "csi-windows-support": "false"
    +      "use-csinode-id": "true"
    +      "list-volumes": "false"
    +      "pv-to-backingdiskobjectid-mapping": "false"
    +      "cnsmgr-suspend-create-volume": "true"
    +      "topology-preferential-datastores": "true"
    +      "max-pvscsi-targets-per-vm": "true"
    +    kind: ConfigMap
    +    metadata:
    +      name: internal-feature-states.csi.vsphere.vmware.com
    +      namespace: kube-system
    +kind: ConfigMap
    +metadata:
    +  name: ${CLUSTER_NAME}-internal-feature-states.csi.vsphere.vmware.com
    +  namespace: ${NAMESPACE}
    +---
    +apiVersion: v1
    +data:
    +  data: |
    +    apiVersion: v1
    +    kind: Service
    +    metadata:
    +      name: vsphere-csi-controller
    +      namespace: kube-system
    +      labels:
    +        app: vsphere-csi-controller
    +    spec:
    +      ports:
    +        - name: ctlr
    +          port: 2112
    +          targetPort: 2112
    +          protocol: TCP
    +        - name: syncer
    +          port: 2113
    +          targetPort: 2113
    +          protocol: TCP
    +      selector:
    +        app: vsphere-csi-controller
    +kind: ConfigMap
    +metadata:
    +  name: ${CLUSTER_NAME}-vsphere-csi-controller-service
    +  namespace: ${NAMESPACE}
    +---
    +apiVersion: v1
    +data:
    +  data: |
    +    kind: Deployment
    +    apiVersion: apps/v1
    +    metadata:
    +      name: vsphere-csi-controller
    +      namespace: kube-system
    +    spec:
    +      replicas: 1
    +      strategy:
    +        type: RollingUpdate
    +        rollingUpdate:
    +          maxUnavailable: 1
    +          maxSurge: 0
    +      selector:
    +        matchLabels:
    +          app: vsphere-csi-controller
    +      template:
    +        metadata:
    +          labels:
    +            app: vsphere-csi-controller
    +            role: vsphere-csi
    +        spec:
    +          affinity:
    +            podAntiAffinity:
    +              requiredDuringSchedulingIgnoredDuringExecution:
    +                - labelSelector:
    +                    matchExpressions:
    +                      - key: "app"
    +                        operator: In
    +                        values:
    +                          - vsphere-csi-controller
    +                  topologyKey: "kubernetes.io/hostname"
    +          serviceAccountName: vsphere-csi-controller
    +          nodeSelector:
    +            node-role.kubernetes.io/control-plane: ""
    +          tolerations:
    +            - key: node-role.kubernetes.io/master
    +              operator: Exists
    +              effect: NoSchedule
    +            - key: node-role.kubernetes.io/control-plane
    +              operator: Exists
    +              effect: NoSchedule
    +            # uncomment below toleration if you need an aggressive pod eviction in case when
    +            # node becomes not-ready or unreachable. Default is 300 seconds if not specified.
    +            #- key: node.kubernetes.io/not-ready
    +            #  operator: Exists
    +            #  effect: NoExecute
    +            #  tolerationSeconds: 30
    +            #- key: node.kubernetes.io/unreachable
    +            #  operator: Exists
    +            #  effect: NoExecute
    +            #  tolerationSeconds: 30
    +          dnsPolicy: "Default"
    +          containers:
    +            - name: csi-attacher
    +              image: k8s.gcr.io/sig-storage/csi-attacher:v3.5.0
    +              args:
    +                - "--v=4"
    +                - "--timeout=300s"
    +                - "--csi-address=$(ADDRESS)"
    +                - "--leader-election"
    +                - "--kube-api-qps=100"
    +                - "--kube-api-burst=100"
    +              env:
    +                - name: ADDRESS
    +                  value: /csi/csi.sock
    +              volumeMounts:
    +                - mountPath: /csi
    +                  name: socket-dir
    +            - name: csi-resizer
    +              image: k8s.gcr.io/sig-storage/csi-resizer:v1.5.0
    +              args:
    +                - "--v=4"
    +                - "--timeout=300s"
    +                - "--handle-volume-inuse-error=false"
    +                - "--csi-address=$(ADDRESS)"
    +                - "--kube-api-qps=100"
    +                - "--kube-api-burst=100"
    +                - "--leader-election"
    +              env:
    +                - name: ADDRESS
    +                  value: /csi/csi.sock
    +              volumeMounts:
    +                - mountPath: /csi
    +                  name: socket-dir
    +            - name: vsphere-csi-controller
    +              image: gcr.io/cloud-provider-vsphere/csi/release/driver:v2.7.0
    +              args:
    +                - "--fss-name=internal-feature-states.csi.vsphere.vmware.com"
    +                - "--fss-namespace=$(CSI_NAMESPACE)"
    +              imagePullPolicy: "Always"
    +              env:
    +                - name: CSI_ENDPOINT
    +                  value: unix:///csi/csi.sock
    +                - name: X_CSI_MODE
    +                  value: "controller"
    +                - name: X_CSI_SPEC_DISABLE_LEN_CHECK
    +                  value: "true"
    +                - name: X_CSI_SERIAL_VOL_ACCESS_TIMEOUT
    +                  value: 3m
    +                - name: VSPHERE_CSI_CONFIG
    +                  value: "/etc/cloud/csi-vsphere.conf"
    +                - name: LOGGER_LEVEL
    +                  value: "PRODUCTION" # Options: DEVELOPMENT, PRODUCTION
    +                - name: INCLUSTER_CLIENT_QPS
    +                  value: "100"
    +                - name: INCLUSTER_CLIENT_BURST
    +                  value: "100"
    +                - name: CSI_NAMESPACE
    +                  valueFrom:
    +                    fieldRef:
    +                      fieldPath: metadata.namespace
    +              volumeMounts:
    +                - mountPath: /etc/cloud
    +                  name: vsphere-config-volume
    +                  readOnly: true
    +                - mountPath: /csi
    +                  name: socket-dir
    +              ports:
    +                - name: healthz
    +                  containerPort: 9808
    +                  protocol: TCP
    +                - name: prometheus
    +                  containerPort: 2112
    +                  protocol: TCP
    +              livenessProbe:
    +                httpGet:
    +                  path: /healthz
    +                  port: healthz
    +                initialDelaySeconds: 10
    +                timeoutSeconds: 3
    +                periodSeconds: 5
    +                failureThreshold: 3
    +            - name: liveness-probe
    +              image: k8s.gcr.io/sig-storage/livenessprobe:v2.7.0
    +              args:
    +                - "--v=4"
    +                - "--csi-address=/csi/csi.sock"
    +              volumeMounts:
    +                - name: socket-dir
    +                  mountPath: /csi
    +            - name: vsphere-syncer
    +              image: gcr.io/cloud-provider-vsphere/csi/release/syncer:v2.7.0
    +              args:
    +                - "--leader-election"
    +                - "--fss-name=internal-feature-states.csi.vsphere.vmware.com"
    +                - "--fss-namespace=$(CSI_NAMESPACE)"
    +              imagePullPolicy: "Always"
    +              ports:
    +                - containerPort: 2113
    +                  name: prometheus
    +                  protocol: TCP
    +              env:
    +                - name: FULL_SYNC_INTERVAL_MINUTES
    +                  value: "30"
    +                - name: VSPHERE_CSI_CONFIG
    +                  value: "/etc/cloud/csi-vsphere.conf"
    +                - name: LOGGER_LEVEL
    +                  value: "PRODUCTION" # Options: DEVELOPMENT, PRODUCTION
    +                - name: INCLUSTER_CLIENT_QPS
    +                  value: "100"
    +                - name: INCLUSTER_CLIENT_BURST
    +                  value: "100"
    +                - name: GODEBUG
    +                  value: x509sha1=1
    +                - name: CSI_NAMESPACE
    +                  valueFrom:
    +                    fieldRef:
    +                      fieldPath: metadata.namespace
    +              volumeMounts:
    +                - mountPath: /etc/cloud
    +                  name: vsphere-config-volume
    +                  readOnly: true
    +            - name: csi-provisioner
    +              image: k8s.gcr.io/sig-storage/csi-provisioner:v3.2.1
    +              args:
    +                - "--v=4"
    +                - "--timeout=300s"
    +                - "--csi-address=$(ADDRESS)"
    +                - "--kube-api-qps=100"
    +                - "--kube-api-burst=100"
    +                - "--leader-election"
    +                - "--default-fstype=ext4"
    +                # needed only for topology aware setup
    +                #- "--feature-gates=Topology=true"
    +                #- "--strict-topology"
    +              env:
    +                - name: ADDRESS
    +                  value: /csi/csi.sock
    +              volumeMounts:
    +                - mountPath: /csi
    +                  name: socket-dir
    +            - name: csi-snapshotter
    +              image: k8s.gcr.io/sig-storage/csi-snapshotter:v6.0.1
    +              args:
    +                - "--v=4"
    +                - "--kube-api-qps=100"
    +                - "--kube-api-burst=100"
    +                - "--timeout=300s"
    +                - "--csi-address=$(ADDRESS)"
    +                - "--leader-election"
    +              env:
    +                - name: ADDRESS
    +                  value: /csi/csi.sock
    +              volumeMounts:
    +                - mountPath: /csi
    +                  name: socket-dir
    +          volumes:
    +            - name: vsphere-config-volume
    +              secret:
    +                secretName: csi-vsphere-config
    +            - name: socket-dir
    +              emptyDir: {}
    +
    +kind: ConfigMap
    +metadata:
    +  name: ${CLUSTER_NAME}-vsphere-csi-controller
    +  namespace: ${NAMESPACE}
    +---
    +apiVersion: v1
    +data:
    +  data: |
    +    kind: DaemonSet
    +    apiVersion: apps/v1
    +    metadata:
    +      name: vsphere-csi-node
    +      namespace: kube-system
    +    spec:
    +      selector:
    +        matchLabels:
    +          app: vsphere-csi-node
    +      updateStrategy:
    +        type: "RollingUpdate"
    +        rollingUpdate:
    +          maxUnavailable: 1
    +      template:
    +        metadata:
    +          labels:
    +            app: vsphere-csi-node
    +            role: vsphere-csi
    +        spec:
    +          nodeSelector:
    +            kubernetes.io/os: linux
    +          serviceAccountName: vsphere-csi-node
    +          hostNetwork: true
    +          dnsPolicy: "ClusterFirstWithHostNet"
    +          containers:
    +            - name: node-driver-registrar
    +              image: k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.5.1
    +              args:
    +                - "--v=5"
    +                - "--csi-address=$(ADDRESS)"
    +                - "--kubelet-registration-path=$(DRIVER_REG_SOCK_PATH)"
    +              env:
    +                - name: ADDRESS
    +                  value: /csi/csi.sock
    +                - name: DRIVER_REG_SOCK_PATH
    +                  value: /var/lib/kubelet/plugins/csi.vsphere.vmware.com/csi.sock
    +              volumeMounts:
    +                - name: plugin-dir
    +                  mountPath: /csi
    +                - name: registration-dir
    +                  mountPath: /registration
    +              livenessProbe:
    +                exec:
    +                  command:
    +                    - /csi-node-driver-registrar
    +                    - --kubelet-registration-path=/var/lib/kubelet/plugins/csi.vsphere.vmware.com/csi.sock
    +                    - --mode=kubelet-registration-probe
    +                initialDelaySeconds: 3
    +            - name: vsphere-csi-node
    +              image: gcr.io/cloud-provider-vsphere/csi/release/driver:v2.7.0
    +              args:
    +                - "--fss-name=internal-feature-states.csi.vsphere.vmware.com"
    +                - "--fss-namespace=$(CSI_NAMESPACE)"
    +              imagePullPolicy: "Always"
    +              env:
    +                - name: NODE_NAME
    +                  valueFrom:
    +                    fieldRef:
    +                      fieldPath: spec.nodeName
    +                - name: CSI_ENDPOINT
    +                  value: unix:///csi/csi.sock
    +                - name: MAX_VOLUMES_PER_NODE
    +                  value: "59" # Maximum number of volumes that controller can publish to the node. If value is not set or zero Kubernetes decide how many volumes can be published by the controller to the node.
    +                - name: X_CSI_MODE
    +                  value: "node"
    +                - name: X_CSI_SPEC_REQ_VALIDATION
    +                  value: "false"
    +                - name: X_CSI_SPEC_DISABLE_LEN_CHECK
    +                  value: "true"
    +                - name: LOGGER_LEVEL
    +                  value: "PRODUCTION" # Options: DEVELOPMENT, PRODUCTION
    +                - name: GODEBUG
    +                  value: x509sha1=1
    +                - name: CSI_NAMESPACE
    +                  valueFrom:
    +                    fieldRef:
    +                      fieldPath: metadata.namespace
    +                - name: NODEGETINFO_WATCH_TIMEOUT_MINUTES
    +                  value: "1"
    +              securityContext:
    +                privileged: true
    +                capabilities:
    +                  add: ["SYS_ADMIN"]
    +                allowPrivilegeEscalation: true
    +              volumeMounts:
    +                - name: plugin-dir
    +                  mountPath: /csi
    +                - name: pods-mount-dir
    +                  mountPath: /var/lib/kubelet
    +                  # needed so that any mounts setup inside this container are
    +                  # propagated back to the host machine.
    +                  mountPropagation: "Bidirectional"
    +                - name: device-dir
    +                  mountPath: /dev
    +                - name: blocks-dir
    +                  mountPath: /sys/block
    +                - name: sys-devices-dir
    +                  mountPath: /sys/devices
    +              ports:
    +                - name: healthz
    +                  containerPort: 9808
    +                  protocol: TCP
    +              livenessProbe:
    +                httpGet:
    +                  path: /healthz
    +                  port: healthz
    +                initialDelaySeconds: 10
    +                timeoutSeconds: 5
    +                periodSeconds: 5
    +                failureThreshold: 3
    +            - name: liveness-probe
    +              image: k8s.gcr.io/sig-storage/livenessprobe:v2.7.0
    +              args:
    +                - "--v=4"
    +                - "--csi-address=/csi/csi.sock"
    +              volumeMounts:
    +                - name: plugin-dir
    +                  mountPath: /csi
    +          volumes:
    +            - name: registration-dir
    +              hostPath:
    +                path: /var/lib/kubelet/plugins_registry
    +                type: Directory
    +            - name: plugin-dir
    +              hostPath:
    +                path: /var/lib/kubelet/plugins/csi.vsphere.vmware.com
    +                type: DirectoryOrCreate
    +            - name: pods-mount-dir
    +              hostPath:
    +                path: /var/lib/kubelet
    +                type: Directory
    +            - name: device-dir
    +              hostPath:
    +                path: /dev
    +            - name: blocks-dir
    +              hostPath:
    +                path: /sys/block
    +                type: Directory
    +            - name: sys-devices-dir
    +              hostPath:
    +                path: /sys/devices
    +                type: Directory
    +          tolerations:
    +            - effect: NoExecute
    +              operator: Exists
    +            - effect: NoSchedule
    +              operator: Exists
    +kind: ConfigMap
    +metadata:
    +  name: ${CLUSTER_NAME}-vsphere-csi-node
    +  namespace: ${NAMESPACE}
    +---
    +apiVersion: v1
    +data:
    +  data: |
    +    kind: DaemonSet
    +    apiVersion: apps/v1
    +    metadata:
    +      name: vsphere-csi-node-windows
    +      namespace: kube-system
    +    spec:
    +      selector:
    +        matchLabels:
    +          app: vsphere-csi-node-windows
    +      updateStrategy:
    +        type: RollingUpdate
    +        rollingUpdate:
    +          maxUnavailable: 1
    +      template:
    +        metadata:
    +          labels:
    +            app: vsphere-csi-node-windows
    +            role: vsphere-csi-windows
    +        spec:
    +          nodeSelector:
    +            kubernetes.io/os: windows
    +          serviceAccountName: vsphere-csi-node
    +          containers:
    +            - name: node-driver-registrar
    +              image: k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.5.1
    +              args:
    +                - "--v=5"
    +                - "--csi-address=$(ADDRESS)"
    +                - "--kubelet-registration-path=$(DRIVER_REG_SOCK_PATH)"
    +              env:
    +                - name: ADDRESS
    +                  value: 'unix://C:\\csi\\csi.sock'
    +                - name: DRIVER_REG_SOCK_PATH
    +                  value: 'C:\\var\\lib\\kubelet\\plugins\\csi.vsphere.vmware.com\\csi.sock'
    +              volumeMounts:
    +                - name: plugin-dir
    +                  mountPath: /csi
    +                - name: registration-dir
    +                  mountPath: /registration
    +              livenessProbe:
    +                exec:
    +                  command:
    +                    - /csi-node-driver-registrar.exe
    +                    - --kubelet-registration-path=C:\\var\\lib\\kubelet\\plugins\\csi.vsphere.vmware.com\\csi.sock
    +                    - --mode=kubelet-registration-probe
    +                initialDelaySeconds: 3
    +            - name: vsphere-csi-node
    +              image: gcr.io/cloud-provider-vsphere/csi/release/driver:v2.7.0
    +              args:
    +                - "--fss-name=internal-feature-states.csi.vsphere.vmware.com"
    +                - "--fss-namespace=$(CSI_NAMESPACE)"
    +              imagePullPolicy: "Always"
    +              env:
    +                - name: NODE_NAME
    +                  valueFrom:
    +                    fieldRef:
    +                      apiVersion: v1
    +                      fieldPath: spec.nodeName
    +                - name: CSI_ENDPOINT
    +                  value: 'unix://C:\\csi\\csi.sock'
    +                - name: MAX_VOLUMES_PER_NODE
    +                  value: "59" # Maximum number of volumes that controller can publish to the node. If value is not set or zero Kubernetes decide how many volumes can be published by the controller to the node.
    +                - name: X_CSI_MODE
    +                  value: node
    +                - name: X_CSI_SPEC_REQ_VALIDATION
    +                  value: 'false'
    +                - name: X_CSI_SPEC_DISABLE_LEN_CHECK
    +                  value: "true"
    +                - name: LOGGER_LEVEL
    +                  value: "PRODUCTION" # Options: DEVELOPMENT, PRODUCTION
    +                - name: X_CSI_LOG_LEVEL
    +                  value: DEBUG
    +                - name: CSI_NAMESPACE
    +                  valueFrom:
    +                    fieldRef:
    +                      fieldPath: metadata.namespace
    +                - name: NODEGETINFO_WATCH_TIMEOUT_MINUTES
    +                  value: "1"
    +              volumeMounts:
    +                - name: plugin-dir
    +                  mountPath: 'C:\csi'
    +                - name: pods-mount-dir
    +                  mountPath: 'C:\var\lib\kubelet'
    +                - name: csi-proxy-volume-v1
    +                  mountPath: \\.\pipe\csi-proxy-volume-v1
    +                - name: csi-proxy-filesystem-v1
    +                  mountPath: \\.\pipe\csi-proxy-filesystem-v1
    +                - name: csi-proxy-disk-v1
    +                  mountPath: \\.\pipe\csi-proxy-disk-v1
    +                - name: csi-proxy-system-v1alpha1
    +                  mountPath: \\.\pipe\csi-proxy-system-v1alpha1
    +              ports:
    +                - name: healthz
    +                  containerPort: 9808
    +                  protocol: TCP
    +              livenessProbe:
    +                httpGet:
    +                  path: /healthz
    +                  port: healthz
    +                initialDelaySeconds: 10
    +                timeoutSeconds: 5
    +                periodSeconds: 5
    +                failureThreshold: 3
    +            - name: liveness-probe
    +              image: k8s.gcr.io/sig-storage/livenessprobe:v2.7.0
    +              args:
    +                - "--v=4"
    +                - "--csi-address=/csi/csi.sock"
    +              volumeMounts:
    +                - name: plugin-dir
    +                  mountPath: /csi
    +          volumes:
    +            - name: registration-dir
    +              hostPath:
    +                path: 'C:\var\lib\kubelet\plugins_registry\'
    +                type: Directory
    +            - name: plugin-dir
    +              hostPath:
    +                path: 'C:\var\lib\kubelet\plugins\csi.vsphere.vmware.com\'
    +                type: DirectoryOrCreate
    +            - name: pods-mount-dir
    +              hostPath:
    +                path: \var\lib\kubelet
    +                type: Directory
    +            - name: csi-proxy-disk-v1
    +              hostPath:
    +                path: \\.\pipe\csi-proxy-disk-v1
    +                type: ''
    +            - name: csi-proxy-volume-v1
    +              hostPath:
    +                path: \\.\pipe\csi-proxy-volume-v1
    +                type: ''
    +            - name: csi-proxy-filesystem-v1
    +              hostPath:
    +                path: \\.\pipe\csi-proxy-filesystem-v1
    +                type: ''
    +            - name: csi-proxy-system-v1alpha1
    +              hostPath:
    +                path: \\.\pipe\csi-proxy-system-v1alpha1
    +                type: ''
    +          tolerations:
    +            - effect: NoExecute
    +              operator: Exists
    +            - effect: NoSchedule
    +              operator: Exists
    +kind: ConfigMap
    +metadata:
    +  name: ${CLUSTER_NAME}-vsphere-csi-node-windows
    +  namespace: ${NAMESPACE}
    +---
    +apiVersion: v1
    +kind: Secret
    +metadata:
    +  name: ${CLUSTER_NAME}-cloud-controller-manager
    +  namespace: ${NAMESPACE}
    +stringData:
    +  data: |
    +    apiVersion: v1
    +    kind: ServiceAccount
    +    metadata: 
    +      labels: 
    +        component: cloud-controller-manager
    +        vsphere-cpi-infra: service-account
    +      name: cloud-controller-manager
    +      namespace: kube-system
    +type: addons.cluster.x-k8s.io/resource-set
    +---
    +apiVersion: v1
    +kind: Secret
    +metadata:
    +  name: ${CLUSTER_NAME}-cloud-provider-vsphere-credentials
    +  namespace: ${NAMESPACE}
    +stringData:
    +  data: |
    +    apiVersion: v1
    +    kind: Secret
    +    metadata: 
    +      labels: 
    +        component: cloud-controller-manager
    +        vsphere-cpi-infra: secret
    +      name: cloud-provider-vsphere-credentials
    +      namespace: kube-system
    +    stringData: 
    +      ${VSPHERE_SERVER}.password: ${VSPHERE_PASSWORD}
    +      ${VSPHERE_SERVER}.username: ${VSPHERE_USERNAME}
    +    type: Opaque
    +type: addons.cluster.x-k8s.io/resource-set
    +---
    +apiVersion: v1
    +data:
    +  data: |
    +    ---
    +    apiVersion: rbac.authorization.k8s.io/v1
    +    kind: ClusterRole
    +    metadata: 
    +      labels: 
    +        component: cloud-controller-manager
    +        vsphere-cpi-infra: role
    +      name: system:cloud-controller-manager
    +    rules: 
    +    - apiGroups: 
    +      - ""
    +      resources: 
    +      - events
    +      verbs: 
    +      - create
    +      - patch
    +      - update
    +    - apiGroups: 
    +      - ""
    +      resources: 
    +      - nodes
    +      verbs: 
    +      - '*'
    +    - apiGroups: 
    +      - ""
    +      resources: 
    +      - nodes/status
    +      verbs: 
    +      - patch
    +    - apiGroups: 
    +      - ""
    +      resources: 
    +      - services
    +      verbs: 
    +      - list
    +      - patch
    +      - update
    +      - watch
    +    - apiGroups: 
    +      - ""
    +      resources: 
    +      - services/status
    +      verbs: 
    +      - patch
    +    - apiGroups: 
    +      - ""
    +      resources: 
    +      - serviceaccounts
    +      verbs: 
    +      - create
    +      - get
    +      - list
    +      - watch
    +      - update
    +    - apiGroups: 
    +      - ""
    +      resources: 
    +      - persistentvolumes
    +      verbs: 
    +      - get
    +      - list
    +      - watch
    +      - update
    +    - apiGroups: 
    +      - ""
    +      resources: 
    +      - endpoints
    +      verbs: 
    +      - create
    +      - get
    +      - list
    +      - watch
    +      - update
    +    - apiGroups: 
    +      - ""
    +      resources: 
    +      - secrets
    +      verbs: 
    +      - get
    +      - list
    +      - watch
    +    - apiGroups: 
    +      - coordination.k8s.io
    +      resources: 
    +      - leases
    +      verbs: 
    +      - get
    +      - watch
    +      - list
    +      - update
    +      - create
    +    ---
    +    apiVersion: rbac.authorization.k8s.io/v1
    +    kind: ClusterRoleBinding
    +    metadata: 
    +      labels: 
    +        component: cloud-controller-manager
    +        vsphere-cpi-infra: cluster-role-binding
    +      name: system:cloud-controller-manager
    +    roleRef: 
    +      apiGroup: rbac.authorization.k8s.io
    +      kind: ClusterRole
    +      name: system:cloud-controller-manager
    +    subjects: 
    +    - kind: ServiceAccount
    +      name: cloud-controller-manager
    +      namespace: kube-system
    +    - kind: User
    +      name: cloud-controller-manager
    +    ---
    +    apiVersion: v1
    +    data: 
    +      vsphere.conf: |
    +        global: 
    +          port: 443
    +          secretName: cloud-provider-vsphere-credentials
    +          secretNamespace: kube-system
    +          thumbprint: '${VSPHERE_TLS_THUMBPRINT}'
    +        vcenter: 
    +          ${VSPHERE_SERVER}:
    +            datacenters: 
    +            - '${VSPHERE_DATACENTER}'
    +            server: '${VSPHERE_SERVER}'
    +    kind: ConfigMap
    +    metadata: 
    +      name: vsphere-cloud-config
    +      namespace: kube-system
    +    ---
    +    apiVersion: rbac.authorization.k8s.io/v1
    +    kind: RoleBinding
    +    metadata: 
    +      labels: 
    +        component: cloud-controller-manager
    +        vsphere-cpi-infra: role-binding
    +      name: servicecatalog.k8s.io:apiserver-authentication-reader
    +      namespace: kube-system
    +    roleRef: 
    +      apiGroup: rbac.authorization.k8s.io
    +      kind: Role
    +      name: extension-apiserver-authentication-reader
    +    subjects: 
    +    - kind: ServiceAccount
    +      name: cloud-controller-manager
    +      namespace: kube-system
    +    - kind: User
    +      name: cloud-controller-manager
    +    ---
    +    apiVersion: apps/v1
    +    kind: DaemonSet
    +    metadata: 
    +      labels: 
    +        component: cloud-controller-manager
    +        tier: control-plane
    +      name: vsphere-cloud-controller-manager
    +      namespace: kube-system
    +    spec: 
    +      selector: 
    +        matchLabels: 
    +          name: vsphere-cloud-controller-manager
    +      template: 
    +        metadata: 
    +          labels: 
    +            component: cloud-controller-manager
    +            name: vsphere-cloud-controller-manager
    +            tier: control-plane
    +        spec: 
    +          affinity: 
    +            nodeAffinity: 
    +              requiredDuringSchedulingIgnoredDuringExecution: 
    +                nodeSelectorTerms: 
    +                - matchExpressions: 
    +                  - key: node-role.kubernetes.io/control-plane
    +                    operator: Exists
    +                - matchExpressions: 
    +                  - key: node-role.kubernetes.io/master
    +                    operator: Exists
    +          containers: 
    +          - args: 
    +            - --v=2
    +            - --cloud-provider=vsphere
    +            - --cloud-config=/etc/cloud/vsphere.conf
    +            image: gcr.io/cloud-provider-vsphere/cpi/release/manager:v1.25.3
    +            name: vsphere-cloud-controller-manager
    +            resources: 
    +              requests: 
    +                cpu: 200m
    +            volumeMounts: 
    +            - mountPath: /etc/cloud
    +              name: vsphere-config-volume
    +              readOnly: true
    +          hostNetwork: true
    +          priorityClassName: system-node-critical
    +          securityContext: 
    +            runAsUser: 1001
    +          serviceAccountName: cloud-controller-manager
    +          tolerations: 
    +          - effect: NoSchedule
    +            key: node.cloudprovider.kubernetes.io/uninitialized
    +            value: "true"
    +          - effect: NoSchedule
    +            key: node-role.kubernetes.io/master
    +            operator: Exists
    +          - effect: NoSchedule
    +            key: node-role.kubernetes.io/control-plane
    +            operator: Exists
    +          - effect: NoSchedule
    +            key: node.kubernetes.io/not-ready
    +            operator: Exists
    +          volumes: 
    +          - configMap: 
    +              name: vsphere-cloud-config
    +            name: vsphere-config-volume
    +      updateStrategy: 
    +        type: RollingUpdate
    +kind: ConfigMap
    +metadata:
    +  name: ${CLUSTER_NAME}-cpi-manifests
    +  namespace: ${NAMESPACE}
    +
    +
    +
    +
    +---
    +apiVersion: addons.cluster.x-k8s.io/v1beta1
    +kind: ClusterResourceSet
    +metadata:
    +  name: ${CLUSTER_NAME}-calico-module-resource
    +  namespace: ${NAMESPACE}
    +spec:
    +  clusterSelector:
    +    matchLabels:
    +      cluster.x-k8s.io/cluster-name: ${CLUSTER_NAME}
    +  resources:
    +    - kind: ConfigMap
    +      name: ${CLUSTER_NAME}-calico-module-cr
    +  strategy: Reconcile
    +---
    +apiVersion: v1
    +data:
    +  calico.yaml: |
    +    apiVersion: platform.verrazzano.io/v1alpha1
    +    kind: Module
    +    metadata:
    +      name: calico
    +      namespace: default
    +    spec:
    +      moduleName: calico
    +      targetNamespace: default
    +      values:
    +        tigeraOperator:
    +          version: ${TIGERA_TAG=v1.29.0}
    +        installation:
    +          cni:
    +            type: Calico
    +          calicoNetwork:
    +            bgp: Disabled
    +            ipPools:
    +              - cidr: ${POD_CIDR=192.168.0.0/16}
    +                encapsulation: VXLAN
    +          registry: ${OCNE_IMAGE_REPOSITORY=container-registry.oracle.com}
    +          imagePath: ${OCNE_IMAGE_PATH=olcne}
    +kind: ConfigMap
    +metadata:
    +  annotations:
    +    note: generated
    +  labels:
    +    type: generated
    +  name: ${CLUSTER_NAME}-calico-module-cr
    +  namespace: ${NAMESPACE}
    +
    + +
    + + +
    +
  2. +
  3. +

    Generate and apply the template by running the following command: + + +

    +
    +
    $ clusterctl generate yaml --from vsphere-capi.yaml | kubectl apply -f -
    +
    + +
    + +

    +
  4. +
+

To get the kubeconfig file, run: + + +

+
+
$ clusterctl get kubeconfig kluster1 -n kluster1 > kluster1
+
+ +
+ +

+

Finish cluster configuration

+

After the cluster resources are created, you must perform some additional steps to finish the configuration of the cluster.

+
    +
  1. +

    If vSphere does not have a load balancer, then you can deploy MetalLB. + + +

    +
    +
    $ export KUBECONFIG=kluster1
    + 
    +ADDRESS_RANGE=${1:-"subnet-from-vSphere-network"};
    + 
    +$ kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.7/config/manifests/metallb-native.yaml --wait=true;
    +$ kubectl rollout status deployment -n metallb-system controller -w;
    +$ kubectl apply -f -  <<EOF1
    +  apiVersion: metallb.io/v1beta1
    +  kind: IPAddressPool
    +  metadata:
    +    name: vzlocalpool
    +    namespace: metallb-system
    +  spec:
    +    addresses:
    +    - ${ADDRESS_RANGE}
    +EOF1
    + 
    +$ kubectl apply -f -  <<-EOF2
    +  apiVersion: metallb.io/v1beta1
    +  kind: L2Advertisement
    +  metadata:
    +    name: vzmetallb
    +    namespace: metallb-system
    +  spec:
    +    ipAddressPools:
    +    - vzlocalpool
    +EOF2
    + 
    +$ sleep 10;
    +$ kubectl wait --namespace metallb-system --for=condition=ready pod --all --timeout=300s
    +
    + +
    + +

    +
  2. +
  3. +

    Create a default storage class on the cluster. + + +

    +
    +
    $ export KUBECONFIG=kluster1
    +$ kubectl apply -f -  <<-EOF
    +  kind: StorageClass
    +  apiVersion: storage.k8s.io/v1
    +  metadata:
    +    name: vmware-sc
    +    annotations:
    +      storageclass.kubernetes.io/is-default-class: "true"
    +  provisioner: csi.vsphere.vmware.com
    +  volumeBindingMode: WaitForFirstConsumer
    +EOF
    +
    + +
    + +

    +
  4. +
  5. +

    Install Verrazzano on the managed cluster. + + +

    +
    +
    $ export KUBECONFIG=kluster1 
    +
    +$ vz install -f - <<EOF
    +  apiVersion: install.verrazzano.io/v1beta1
    +  kind: Verrazzano
    +  metadata:
    +    name: example-verrazzano
    +  spec:
    +    profile: dev
    +    defaultVolumeSource:
    +      persistentVolumeClaim:
    +        claimName: verrazzano-storage
    +    volumeClaimSpecTemplates:
    +      - metadata:
    +          name: verrazzano-storage
    +        spec:
    +          resources:
    +            requests:
    +              storage: 2Gi
    +EOF
    +
    + +
    + +

    +
  6. +
+

Your admin cluster and first managed cluster are now up and running and ready to deploy applications. You can also add more managed clusters.

+

For more information, refer to the documentation for Cluster API and Cluster API vSphere:

+ +

Troubleshoot the deployment

+

If the deployment of the vSphere resources fails, then you can check the log files to diagnose the issue.

+

The vSphere cluster controller provider logs: + + +

+
+
$ kubectl logs -n verrazzano-capi -l cluster.x-k8s.io/provider=infrastructure-vsphere
+
+ +
+ +

+

The OCNE control plane provider logs: + + +

+
+
$ kubectl logs -n verrazzano-capi -l cluster.x-k8s.io/provider=control-plane-ocne
+
+ +
+ +

+

NOTE: If the CSI pod deploys before Calico, then the pod may enter a CrashLoop state. Restart the pod to fix the issue.

+ + +
+
+
$ kubectl --kubeconfig kluster1 scale deploy  -n kube-system vsphere-csi-controller --replicas=0
+$ kubectl --kubeconfig kluster1 scale deploy  -n kube-system vsphere-csi-controller --replicas=1
+
+ +
+ + +

Delete the clusters

+
    +
  1. Delete the managed clusters. + + +
    +
    +
    $ kubectl delete cluster $CLUSTER_NAME
    +
    + +
    + +
  2. +
  3. Delete the admin cluster. + + +
    +
    +
    $ kind delete cluster
    +
    + +
    + +
  4. +
+

Do not use kubectl delete -f capi-quickstart.yaml to delete the entire cluster template at once because it might leave behind pending resources that you need to clean up manually.

+ + +
+ + + + + + +
+ + +
+ +
+ + +
+
+
+ +
+ + + + + + + + + \ No newline at end of file diff --git a/devel/docs/applications/about-applications/index.html b/devel/docs/applications/about-applications/index.html index 9b50aa0b80..91e638d854 100644 --- a/devel/docs/applications/about-applications/index.html +++ b/devel/docs/applications/about-applications/index.html @@ -103,7 +103,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -129,7 +129,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -821,7 +821,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/applications/delivery/deploy/index.html b/devel/docs/applications/delivery/deploy/index.html index e2a927fb2f..c4f7b5f7c9 100644 --- a/devel/docs/applications/delivery/deploy/index.html +++ b/devel/docs/applications/delivery/deploy/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/applications/delivery/enable/index.html b/devel/docs/applications/delivery/enable/index.html index 57623b40ff..cf84990437 100644 --- a/devel/docs/applications/delivery/enable/index.html +++ b/devel/docs/applications/delivery/enable/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/applications/delivery/index.html b/devel/docs/applications/delivery/index.html index 454b3708c7..7d33d8f736 100644 --- a/devel/docs/applications/delivery/index.html +++ b/devel/docs/applications/delivery/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/applications/index.html b/devel/docs/applications/index.html index b6fb48b1ea..e689934214 100644 --- a/devel/docs/applications/index.html +++ b/devel/docs/applications/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/applications/kubernetes/auth_policy/index.html b/devel/docs/applications/kubernetes/auth_policy/index.html index 711fe49340..ca2ba273f0 100644 --- a/devel/docs/applications/kubernetes/auth_policy/index.html +++ b/devel/docs/applications/kubernetes/auth_policy/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/applications/kubernetes/certificate/index.html b/devel/docs/applications/kubernetes/certificate/index.html index fc1cf3d52f..803876d5ed 100644 --- a/devel/docs/applications/kubernetes/certificate/index.html +++ b/devel/docs/applications/kubernetes/certificate/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/applications/kubernetes/create_kubernetes/index.html b/devel/docs/applications/kubernetes/create_kubernetes/index.html index d76b594f31..7dcc1fc464 100644 --- a/devel/docs/applications/kubernetes/create_kubernetes/index.html +++ b/devel/docs/applications/kubernetes/create_kubernetes/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/applications/kubernetes/gateway_virtual_service/index.html b/devel/docs/applications/kubernetes/gateway_virtual_service/index.html index ae8f2cb4a2..0a01ea74ad 100644 --- a/devel/docs/applications/kubernetes/gateway_virtual_service/index.html +++ b/devel/docs/applications/kubernetes/gateway_virtual_service/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/applications/kubernetes/index.html b/devel/docs/applications/kubernetes/index.html index aa331a4be4..88cce6b65d 100644 --- a/devel/docs/applications/kubernetes/index.html +++ b/devel/docs/applications/kubernetes/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/applications/kubernetes/wiring-metrics/index.html b/devel/docs/applications/kubernetes/wiring-metrics/index.html index a96824dc42..4c621c9860 100644 --- a/devel/docs/applications/kubernetes/wiring-metrics/index.html +++ b/devel/docs/applications/kubernetes/wiring-metrics/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/applications/multicluster/index.html b/devel/docs/applications/multicluster/index.html index 3dc27d4ee7..5edc7eea73 100644 --- a/devel/docs/applications/multicluster/index.html +++ b/devel/docs/applications/multicluster/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/applications/multicluster/intro/index.html b/devel/docs/applications/multicluster/intro/index.html index 345a0003cd..55e359c2dd 100644 --- a/devel/docs/applications/multicluster/intro/index.html +++ b/devel/docs/applications/multicluster/intro/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/applications/multicluster/mcresources/index.html b/devel/docs/applications/multicluster/mcresources/index.html index 365d4a02c3..7a20fed452 100644 --- a/devel/docs/applications/multicluster/mcresources/index.html +++ b/devel/docs/applications/multicluster/mcresources/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/applications/multicluster/mcresources/managedcluster/verrazzanomanagedcluster/index.html b/devel/docs/applications/multicluster/mcresources/managedcluster/verrazzanomanagedcluster/index.html index 19314606cd..9462db7333 100644 --- a/devel/docs/applications/multicluster/mcresources/managedcluster/verrazzanomanagedcluster/index.html +++ b/devel/docs/applications/multicluster/mcresources/managedcluster/verrazzanomanagedcluster/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/applications/multicluster/mcresources/multiclusterapplicationconfiguration/multiclusterapplicationconfiguration/index.html b/devel/docs/applications/multicluster/mcresources/multiclusterapplicationconfiguration/multiclusterapplicationconfiguration/index.html index 8713a49a39..ae6ce6785b 100644 --- a/devel/docs/applications/multicluster/mcresources/multiclusterapplicationconfiguration/multiclusterapplicationconfiguration/index.html +++ b/devel/docs/applications/multicluster/mcresources/multiclusterapplicationconfiguration/multiclusterapplicationconfiguration/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/applications/multicluster/mcresources/multiclusterresourcestatus/multiclusterresourcestatus/index.html b/devel/docs/applications/multicluster/mcresources/multiclusterresourcestatus/multiclusterresourcestatus/index.html index f597f85040..1e58e4758f 100644 --- a/devel/docs/applications/multicluster/mcresources/multiclusterresourcestatus/multiclusterresourcestatus/index.html +++ b/devel/docs/applications/multicluster/mcresources/multiclusterresourcestatus/multiclusterresourcestatus/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/applications/multicluster/mcresources/placement/placement/index.html b/devel/docs/applications/multicluster/mcresources/placement/placement/index.html index d15c4a7e86..5aa3c400b3 100644 --- a/devel/docs/applications/multicluster/mcresources/placement/placement/index.html +++ b/devel/docs/applications/multicluster/mcresources/placement/placement/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/applications/multicluster/mcresources/project/verrazzanoproject/index.html b/devel/docs/applications/multicluster/mcresources/project/verrazzanoproject/index.html index 40154df5d9..1ccbcac56f 100644 --- a/devel/docs/applications/multicluster/mcresources/project/verrazzanoproject/index.html +++ b/devel/docs/applications/multicluster/mcresources/project/verrazzanoproject/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/applications/oam/deploy-app/index.html b/devel/docs/applications/oam/deploy-app/index.html index d00b2ab974..0d90322d4e 100644 --- a/devel/docs/applications/oam/deploy-app/index.html +++ b/devel/docs/applications/oam/deploy-app/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/applications/oam/index.html b/devel/docs/applications/oam/index.html index 1deeba1c0a..be3cb73ee2 100644 --- a/devel/docs/applications/oam/index.html +++ b/devel/docs/applications/oam/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/applications/oam/traits/about-traits/index.html b/devel/docs/applications/oam/traits/about-traits/index.html index 9f5433e769..3515561e8b 100644 --- a/devel/docs/applications/oam/traits/about-traits/index.html +++ b/devel/docs/applications/oam/traits/about-traits/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/applications/oam/traits/index.html b/devel/docs/applications/oam/traits/index.html index b9e16c28e4..26d1a0ef9b 100644 --- a/devel/docs/applications/oam/traits/index.html +++ b/devel/docs/applications/oam/traits/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/applications/oam/traits/ingress/ingress/index.html b/devel/docs/applications/oam/traits/ingress/ingress/index.html index 875cd0a6a8..f7e53f3a3b 100644 --- a/devel/docs/applications/oam/traits/ingress/ingress/index.html +++ b/devel/docs/applications/oam/traits/ingress/ingress/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/applications/oam/traits/logging/logging/index.html b/devel/docs/applications/oam/traits/logging/logging/index.html index ae19968849..b68fb9562a 100644 --- a/devel/docs/applications/oam/traits/logging/logging/index.html +++ b/devel/docs/applications/oam/traits/logging/logging/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/applications/oam/traits/metrics/metrics/index.html b/devel/docs/applications/oam/traits/metrics/metrics/index.html index 595dcd4700..e3110adbc2 100644 --- a/devel/docs/applications/oam/traits/metrics/metrics/index.html +++ b/devel/docs/applications/oam/traits/metrics/metrics/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/applications/oam/verrazzanoproject/index.html b/devel/docs/applications/oam/verrazzanoproject/index.html index bdc7cc77f0..43a807f414 100644 --- a/devel/docs/applications/oam/verrazzanoproject/index.html +++ b/devel/docs/applications/oam/verrazzanoproject/index.html @@ -99,7 +99,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -125,7 +125,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -817,7 +817,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/applications/oam/workloads/about-workloads/index.html b/devel/docs/applications/oam/workloads/about-workloads/index.html index 3f9eb0ba18..b5d5c35d58 100644 --- a/devel/docs/applications/oam/workloads/about-workloads/index.html +++ b/devel/docs/applications/oam/workloads/about-workloads/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/applications/oam/workloads/coherence/coherence/index.html b/devel/docs/applications/oam/workloads/coherence/coherence/index.html index ebe6f38953..eba8b4ca47 100644 --- a/devel/docs/applications/oam/workloads/coherence/coherence/index.html +++ b/devel/docs/applications/oam/workloads/coherence/coherence/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/applications/oam/workloads/helidon/helidon/index.html b/devel/docs/applications/oam/workloads/helidon/helidon/index.html index de99c6addb..befac6edb6 100644 --- a/devel/docs/applications/oam/workloads/helidon/helidon/index.html +++ b/devel/docs/applications/oam/workloads/helidon/helidon/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/applications/oam/workloads/index.html b/devel/docs/applications/oam/workloads/index.html index 9e0e193b08..5747a5817c 100644 --- a/devel/docs/applications/oam/workloads/index.html +++ b/devel/docs/applications/oam/workloads/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/applications/oam/workloads/weblogic/index.html b/devel/docs/applications/oam/workloads/weblogic/index.html index 6eaf993272..d9c1375f96 100644 --- a/devel/docs/applications/oam/workloads/weblogic/index.html +++ b/devel/docs/applications/oam/workloads/weblogic/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/applications/troubleshooting-application-deployment/index.html b/devel/docs/applications/troubleshooting-application-deployment/index.html index f7eff65551..5944cab105 100644 --- a/devel/docs/applications/troubleshooting-application-deployment/index.html +++ b/devel/docs/applications/troubleshooting-application-deployment/index.html @@ -103,7 +103,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -129,7 +129,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -821,7 +821,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/backup/argocd/index.html b/devel/docs/backup/argocd/index.html index b6d6cf2359..ddcaf6c242 100644 --- a/devel/docs/backup/argocd/index.html +++ b/devel/docs/backup/argocd/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/backup/index.html b/devel/docs/backup/index.html index a9c7a1630d..a9c285ce64 100644 --- a/devel/docs/backup/index.html +++ b/devel/docs/backup/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/backup/keycloak/index.html b/devel/docs/backup/keycloak/index.html index 89403fadd0..273356f216 100644 --- a/devel/docs/backup/keycloak/index.html +++ b/devel/docs/backup/keycloak/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/backup/opensearch/index.html b/devel/docs/backup/opensearch/index.html index 06c494259b..c77511f4de 100644 --- a/devel/docs/backup/opensearch/index.html +++ b/devel/docs/backup/opensearch/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/backup/rancher/index.html b/devel/docs/backup/rancher/index.html index a2371ef9a6..c1ecc5e7a3 100644 --- a/devel/docs/backup/rancher/index.html +++ b/devel/docs/backup/rancher/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/examples/argo-cd/index.html b/devel/docs/examples/argo-cd/index.html index 6d5a4c2453..1d7b81587c 100644 --- a/devel/docs/examples/argo-cd/index.html +++ b/devel/docs/examples/argo-cd/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/examples/helidon-config/index.html b/devel/docs/examples/helidon-config/index.html index e0a511575e..852c92d1bf 100644 --- a/devel/docs/examples/helidon-config/index.html +++ b/devel/docs/examples/helidon-config/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/examples/hello-helidon/index.html b/devel/docs/examples/hello-helidon/index.html index 456d0f3ed6..17171ae4ea 100644 --- a/devel/docs/examples/hello-helidon/index.html +++ b/devel/docs/examples/hello-helidon/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/examples/index.html b/devel/docs/examples/index.html index 8b52638980..083cb2aba7 100644 --- a/devel/docs/examples/index.html +++ b/devel/docs/examples/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/examples/microservices/hello-world/index.html b/devel/docs/examples/microservices/hello-world/index.html index 148bd7c679..a6303241e4 100644 --- a/devel/docs/examples/microservices/hello-world/index.html +++ b/devel/docs/examples/microservices/hello-world/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/examples/microservices/index.html b/devel/docs/examples/microservices/index.html index b8300e6e76..b721bc126d 100644 --- a/devel/docs/examples/microservices/index.html +++ b/devel/docs/examples/microservices/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/examples/microservices/sock-shop/index.html b/devel/docs/examples/microservices/sock-shop/index.html index 37d0d137c7..9f3fdd7e21 100644 --- a/devel/docs/examples/microservices/sock-shop/index.html +++ b/devel/docs/examples/microservices/sock-shop/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/examples/microservices/spring-boot/index.html b/devel/docs/examples/microservices/spring-boot/index.html index 643aba1416..7a9f4579f2 100644 --- a/devel/docs/examples/microservices/spring-boot/index.html +++ b/devel/docs/examples/microservices/spring-boot/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/examples/multicluster/hello-helidon/index.html b/devel/docs/examples/multicluster/hello-helidon/index.html index 560f8a5f5b..1bd87fd5e3 100644 --- a/devel/docs/examples/multicluster/hello-helidon/index.html +++ b/devel/docs/examples/multicluster/hello-helidon/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/examples/multicluster/index.html b/devel/docs/examples/multicluster/index.html index 1e3219ffd1..a601b66b67 100644 --- a/devel/docs/examples/multicluster/index.html +++ b/devel/docs/examples/multicluster/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/examples/multicluster/sock-shop/index.html b/devel/docs/examples/multicluster/sock-shop/index.html index 5c790332e2..66d1bc1404 100644 --- a/devel/docs/examples/multicluster/sock-shop/index.html +++ b/devel/docs/examples/multicluster/sock-shop/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/examples/multicluster/todo-list/index.html b/devel/docs/examples/multicluster/todo-list/index.html index 604c7ca2b7..65f71229fc 100644 --- a/devel/docs/examples/multicluster/todo-list/index.html +++ b/devel/docs/examples/multicluster/todo-list/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/examples/wls-coh/bobs-books/index.html b/devel/docs/examples/wls-coh/bobs-books/index.html index 90f3f1fe47..732a4398d9 100644 --- a/devel/docs/examples/wls-coh/bobs-books/index.html +++ b/devel/docs/examples/wls-coh/bobs-books/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/examples/wls-coh/index.html b/devel/docs/examples/wls-coh/index.html index b470c405de..0bf13f0b4c 100644 --- a/devel/docs/examples/wls-coh/index.html +++ b/devel/docs/examples/wls-coh/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/examples/wls-coh/todo-list/index.html b/devel/docs/examples/wls-coh/todo-list/index.html index 86ed666a26..e08eacfeb0 100644 --- a/devel/docs/examples/wls-coh/todo-list/index.html +++ b/devel/docs/examples/wls-coh/todo-list/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/guides/ha/ha/index.html b/devel/docs/guides/ha/ha/index.html index 6f5f388f44..b2f3c3a367 100644 --- a/devel/docs/guides/ha/ha/index.html +++ b/devel/docs/guides/ha/ha/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/guides/ha/index.html b/devel/docs/guides/ha/index.html index 728837b587..df4f492463 100644 --- a/devel/docs/guides/ha/index.html +++ b/devel/docs/guides/ha/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/guides/ha/node-failure/index.html b/devel/docs/guides/ha/node-failure/index.html index 2ca37ae40b..37e35b1c41 100644 --- a/devel/docs/guides/ha/node-failure/index.html +++ b/devel/docs/guides/ha/node-failure/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/guides/ha/prod-upgrade/index.html b/devel/docs/guides/ha/prod-upgrade/index.html index bfcfb64577..06c2e20adc 100644 --- a/devel/docs/guides/ha/prod-upgrade/index.html +++ b/devel/docs/guides/ha/prod-upgrade/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/guides/index.html b/devel/docs/guides/index.html index 3c1b26aa01..c5714cf6d9 100644 --- a/devel/docs/guides/index.html +++ b/devel/docs/guides/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/guides/lift-and-shift/lift-and-shift/index.html b/devel/docs/guides/lift-and-shift/lift-and-shift/index.html index ebd1ec8d33..85c2154ab1 100644 --- a/devel/docs/guides/lift-and-shift/lift-and-shift/index.html +++ b/devel/docs/guides/lift-and-shift/lift-and-shift/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/guides/sidecar/index.html b/devel/docs/guides/sidecar/index.html index c1c553f0f9..f936a47a82 100644 --- a/devel/docs/guides/sidecar/index.html +++ b/devel/docs/guides/sidecar/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/index.html b/devel/docs/index.html index c18c100b7f..2187386a0e 100644 --- a/devel/docs/index.html +++ b/devel/docs/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/index.xml b/devel/docs/index.xml index 90ff6de27d..8e2a5a11d1 100644 --- a/devel/docs/index.xml +++ b/devel/docs/index.xml @@ -3302,7 +3302,12 @@ $ kubectl delete -f https://raw.githubusercontent.com/verrazzano/verrazzano/mast <div class="alert alert-primary" role="alert"> <h4 class="alert-heading">NOTE</h4> - The terminology around clusters differs between CAPI and Verrazzano though the underlying concepts are the same. What CAPI calls Management and Workload clusters are equivalent to admin and managed clusters, respectively, in Verrazzano. + <p>Verrazzano and Cluster API use slightly different terminology for the same concepts:</p> +<ul> +<li>Admin cluster (Verrazzano) = management cluster (Cluster API)</li> +<li>Managed cluster (Verrazzano) = workload cluster (Cluster API)</li> +</ul> + </div> @@ -3323,6 +3328,15 @@ $ kubectl delete -f https://raw.githubusercontent.com/verrazzano/verrazzano/mast <p>Next, a CAPI infrastructure provider will provision the first instance on the cloud provider and generate a provider ID, a unique identifier that any future nodes and clusters will use to associate with the instance. It will also create a kubeconfig file. The first control plane node is ready after these are created.</p> <p>After the admin cluster is up and running, you can use the clusterAPI component to create additional managed clusters.</p> + +<div class="alert alert-primary" role="alert"> +<h4 class="alert-heading">NOTE</h4> + + The Cluster API provides its own command line tool, <code>clusterctl</code>, to manage the lifecycle operations of a cluster API admin cluster. Do not use <code>clusterctl</code> to manage any OCNE or OKE clusters on OCI that you created in the console. You will create conflicts between changes made in the console and changes made with <code>clusterctl</code>. + +</div> + + @@ -8972,47 +8986,1964 @@ Velero documentation.</p> document .querySelectorAll(".highlight") .forEach((highlightDiv) => createCopyButton(highlightDiv)); -</script> -<pre tabindex="0"><code># Sample output showing just the status portion of the restore -status: - completionTimestamp: ... - phase: Completed - progress: - itemsRestored: 75 - totalItems: 75 - startTimestamp: ... -</code></pre></details> - - - - - - Docs: CLI Setup - /docs/setup/install/prepare/cli-setup/ - Mon, 01 Jan 0001 00:00:00 +0000 - - /docs/setup/install/prepare/cli-setup/ - - - - <p>The Verrazzano command-line tool, <code>vz</code>, is available for Linux and Mac systems. -Download the binary you want from the <a href="https://github.com/verrazzano/verrazzano/releases/">Releases</a> page.</p> - - -<div class="alert alert-primary" role="alert"> -<h4 class="alert-heading">NOTE</h4> - - <ul> -<li>Installing the command-line tool, <code>vz</code>, is optional.</li> -<li>For optimal functionality, install or upgrade the CLI version to match the desired Verrazzano version.</li> -</ul> - - -</div> - -<h2 id="install-the-vz-cli">Install the vz CLI</h2> -<p>These instructions demonstrate installing the CLI on Linux AMD64 machines.</p> -<h3 id="download-the-latest-release">Download the latest release</h3> +</script> +<pre tabindex="0"><code># Sample output showing just the status portion of the restore +status: + completionTimestamp: ... + phase: Completed + progress: + itemsRestored: 75 + totalItems: 75 + startTimestamp: ... +</code></pre></details> + + + + + + Docs: CLI Setup + /docs/setup/install/prepare/cli-setup/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/setup/install/prepare/cli-setup/ + + + + <p>The Verrazzano command-line tool, <code>vz</code>, is available for Linux and Mac systems. +Download the binary you want from the <a href="https://github.com/verrazzano/verrazzano/releases/">Releases</a> page.</p> + + +<div class="alert alert-primary" role="alert"> +<h4 class="alert-heading">NOTE</h4> + + <ul> +<li>Installing the command-line tool, <code>vz</code>, is optional.</li> +<li>For optimal functionality, install or upgrade the CLI version to match the desired Verrazzano version.</li> +</ul> + + +</div> + +<h2 id="install-the-vz-cli">Install the vz CLI</h2> +<p>These instructions demonstrate installing the CLI on Linux AMD64 machines.</p> +<h3 id="download-the-latest-release">Download the latest release</h3> +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre><code> $ curl -LO https://github.com/verrazzano/verrazzano/releases/download/master/verrazzano-1.7.0-linux-amd64.tar.gz +</code></pre> +</div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script> +<h3 id="validate-the-binary-optional">Validate the binary (optional)</h3> +<p>Download the <code>vz</code> checksum file. +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre><code> $ curl -LO https://github.com/verrazzano/verrazzano/releases/download/master/verrazzano-1.7.0-linux-amd64.tar.gz.sha256 +</code></pre> +</div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script></p> +<p>Validate the <code>vz</code> binary against the checksum file. +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre><code>$ sha256sum -c verrazzano-2.0.0-linux-amd64.tar.gz.sha256 +</code></pre> +</div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script></p> +<h3 id="unpack-and-copy-the-vz-binary">Unpack and copy the vz binary</h3> +<div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span> $ tar xvf verrazzano-2.0.0-linux-amd64.tar.gz +</span></span></code></pre></div><p>The following command needs to be run as root.</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span> $ sudo cp verrazzano-2.0.0/bin/vz /usr/local/bin +</span></span></code></pre></div><h3 id="test-to-ensure-that-the-version-you-installed-is-up-to-date">Test to ensure that the version you installed is up-to-date</h3> +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre><code> $ vz version +</code></pre> +</div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script> +<p>The resulting output should be similar to the following. +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre><code>Version: master +BuildDate: 2023-02-12T21:07:26Z +GitCommit: cb0778bbf7a2cd90e1ae8458abd242f9da27a100 +</code></pre> +</div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script></p> +<h2 id="use-the-vz-cli">Use the vz CLI</h2> +<p>Verrazzano provides a command-line tool for managing a Verrazzano environment using the Verrazzano and Kubernetes API.</p> +<p>Common use cases include installing, upgrading, and uninstalling Verrazzano, +as well as analyzing failures in a running Verrazzano environment.</p> +<h3 id="usage-information">Usage information</h3> +<p>Use the following syntax to run <code>vz</code> commands from your terminal window. +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre><code>vz [command] [flags] +</code></pre> +</div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script></p> +<h3 id="available-commands">Available commands</h3> +<table> +<thead> +<tr> +<th>Command</th> +<th>Definition</th> +</tr> +</thead> +<tbody> +<tr> +<td><code>analyze</code></td> +<td>Analyze cluster</td> +</tr> +<tr> +<td><code>bug-report</code></td> +<td>Collect information from the cluster to report an issue</td> +</tr> +<tr> +<td><code>completion</code></td> +<td>Generate the autocompletion script for the specified shell</td> +</tr> +<tr> +<td><code>help</code></td> +<td>Help about any command</td> +</tr> +<tr> +<td><code>install</code></td> +<td>Install Verrazzano</td> +</tr> +<tr> +<td><code>status</code></td> +<td>Status of the Verrazzano installation and access endpoints</td> +</tr> +<tr> +<td><code>uninstall</code></td> +<td>Uninstall Verrazzano</td> +</tr> +<tr> +<td><code>upgrade</code></td> +<td>Upgrade Verrazzano</td> +</tr> +<tr> +<td><code>version</code></td> +<td>Verrazzano version information</td> +</tr> +</tbody> +</table> +<h3 id="available-flags">Available Flags</h3> +<p>These flags apply to all the commands.</p> +<table> +<thead> +<tr> +<th>Flag</th> +<th>Definition</th> +</tr> +</thead> +<tbody> +<tr> +<td><code>--context string</code></td> +<td>The name of the kubeconfig file context to use.</td> +</tr> +<tr> +<td><code>-h</code>, <code>--help</code></td> +<td>Help for <code>vz</code>.</td> +</tr> +<tr> +<td><code>--kubeconfig string</code></td> +<td>Path to the kubeconfig file to use.</td> +</tr> +</tbody> +</table> + + + + + + Docs: Create OCNE Clusters Running on Microsoft Azure + /docs/advanced/ocne-azure/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/advanced/ocne-azure/ + + + + + +<div class="alert alert-danger" role="alert"> +<h4 class="alert-heading">NOTE</h4> + + This feature is experimental. It has not been thoroughly tested and is provided for informational purposes only. We make no guarantees about its safety or stability and do not recommend implementing this feature in production environments. + +</div> + +<p>The Cluster API project provides a standard set of Kubernetes-style APIs for cluster management. Officially, Verrazzano currently only supports using Cluster API to <a href="../docs/setup/provision-cluster/">provision OCNE and OKE clusters on OCI</a>.</p> +<p>However, you can also experiment with using the features of the Cluster API project directly to deploy OCNE clusters on Microsoft Azure.</p> +<p>For more information on Cluster API or Cluster API with Azure, see:</p> +<ul> +<li><a href="https://cluster-api.sigs.k8s.io/introduction.html">Kubernetes Cluster API Documentation</a></li> +<li><a href="https://capz.sigs.k8s.io/introduction">The Cluster API Provider Azure Book</a> +<ul> +<li><a href="https://capz.sigs.k8s.io/topics/getting-started">Getting started with cluster-api-provider-azure</a></li> +</ul> +</li> +</ul> + + +<div class="alert alert-primary" role="alert"> +<h4 class="alert-heading">NOTE</h4> + + <p>Verrazzano and Cluster API use slightly different terminology for the same concepts:</p> +<ul> +<li>Admin cluster (Verrazzano) = management cluster (Cluster API)</li> +<li>Managed cluster (Verrazzano) = workload cluster (Cluster API)</li> +</ul> + + +</div> + +<h2 id="prepare-azure-resources">Prepare Azure resources</h2> +<p>Before you can deploy a Cluster API cluster, you need to set up a few resources in Azure.</p> +<ol> +<li>Install the Azure command-line interface (CLI) tool. For instructions, see <a href="https://learn.microsoft.com/en-us/cli/azure/install-azure-cli">How to install the Azure CLI</a> in the Microsoft Azure documentation.</li> +<li>Create an Azure resource group. In the Azure CLI, run the following command: +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre tabindex="0"><code>$ az group create --name &lt;ResourceGroupName&gt; --location &lt;location&gt; +</code></pre></div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script> +For more detailed instructions, see <a href="https://learn.microsoft.com/en-us/azure/azure-resource-manager/management/manage-resource-groups-cli">Manage Azure Resource Groups by using Azure CLI</a> in the Microsoft Azure documentation.</li> +<li>Create a service principal. Make sure it has the privileges it needs to create resources. This means a contributor role at minimum. The following example creates a service principal, assigns it the contributor role, and defines its scope. +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre tabindex="0"><code>$ az ad sp create-for-rbac --name myServicePrincipalName \ + --role Contributor \ + --scopes /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName +</code></pre></div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script> +For more detailed instructions, see <a href="https://learn.microsoft.com/en-us/cli/azure/azure-cli-sp-tutorial-1">Create an Azure service principal with Azure CLI</a> in the Microsoft Azure documentation.</li> +</ol> +<h2 id="set-up-the-admin-cluster">Set up the admin cluster</h2> +<p>The Cluster API requires an initial cluster as a starting point to deploy its resources.</p> +<ol> +<li> +<p>Install kind. Follow the instructions at <a href="https://kind.sigs.k8s.io/docs/user/quick-start/#installation">Installation</a> in the kind documentation.</p> +</li> +<li> +<p>Create a Kubernetes cluster using kind. Follow the instructions at <a href="https://cluster-api.sigs.k8s.io/user/quick-start#install-andor-configure-a-kubernetes-cluster">Quick Start: Install and/or configure a Kubernetes cluster</a> in The Cluster API Book.</p> +</li> +<li> +<p>Install the clusterctl CLI tool. clusterctl manages the lifecycle operations of a cluster API admin cluster. Follow the instructions at <a href="https://cluster-api.sigs.k8s.io/user/quick-start.html#install-clusterctl">Quick Start: Install clusterctl</a> in the Cluster API Book.</p> +</li> +<li> +<p>Install the Verrazzano CLI tool using the instructions at <a href="../docs/setup/install/prepare/cli-setup/">CLI Setup</a>.</p> +</li> +<li> +<p>Install Verrazzano on the cluster using either the <code>dev</code> or <code>prod</code> installation profile. Follow the instructions at <a href="../docs/setup/install/perform/cli-installation/">Install with CLI</a>. The <code>certManager</code> and <code>clusterAPI</code> components are required and must remain enabled.</p> +</li> +<li> +<p>On the cluster, set environment variables for the following Azure resource IDs from your Azure account and from the service principal you created:</p> +<ul> +<li>Subscription ID</li> +<li>Tenant ID</li> +<li>Client ID</li> +<li>Client Secret</li> +</ul> +<p>For example: +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre tabindex="0"><code># Azure resource IDs +$ export AZURE_SUBSCRIPTION_ID=&#34;&lt;SubscriptionId&gt;&#34; +$ export AZURE_TENANT_ID=&#34;&lt;Tenant&gt;&#34; +$ export AZURE_CLIENT_ID=&#34;&lt;AppId&gt;&#34; +$ export AZURE_CLIENT_SECRET=&#34;&lt;Password&gt;&#34; + +# Base64 encode the Azure Resource IDs +$ export AZURE_SUBSCRIPTION_ID_B64=&#34;$(echo -n &#34;$AZURE_SUBSCRIPTION_ID&#34; | base64 | tr -d &#39;\n&#39;)&#34; +$ export AZURE_TENANT_ID_B64=&#34;$(echo -n &#34;$AZURE_TENANT_ID&#34; | base64 | tr -d &#39;\n&#39;)&#34; +$ export AZURE_CLIENT_ID_B64=&#34;$(echo -n &#34;$AZURE_CLIENT_ID&#34; | base64 | tr -d &#39;\n&#39;)&#34; +$ export AZURE_CLIENT_SECRET_B64=&#34;$(echo -n &#34;$AZURE_CLIENT_SECRET&#34; | base64 | tr -d &#39;\n&#39;)&#34; + +# Settings needed for AzureClusterIdentity used by the AzureCluster +$ export AZURE_CLUSTER_IDENTITY_SECRET_NAME=&#34;&lt;cluster-identity-secret&gt;&#34; +$ export CLUSTER_IDENTITY_NAME=&#34;&lt;cluster-identity&gt;&#34; +$ export AZURE_CLUSTER_IDENTITY_SECRET_NAMESPACE=&#34;default&#34; +</code></pre></div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script></p> +</li> +<li> +<p>Create a secret that includes the password of the service principal identity created in Azure. This secret is referenced by the AzureClusterIdentity used by the AzureCluster. +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre tabindex="0"><code>$ kubectl create secret generic &#34;${AZURE_CLUSTER_IDENTITY_SECRET_NAME}&#34; --from-literal=clientSecret=&#34;${AZURE_CLIENT_SECRET}&#34; --namespace &#34;${AZURE_CLUSTER_IDENTITY_SECRET_NAMESPACE}&#34; +</code></pre></div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script></p> +</li> +<li> +<p>Install the Cluster API Azure infrastructure provider. +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre tabindex="0"><code>$ clusterctl init -n verrazzano-capi -i azure +</code></pre></div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script></p> +<p>clusterctl will report when the admin cluster was successfully initialized.</p> +</li> +</ol> +<h2 id="create-a-managed-cluster">Create a managed cluster</h2> +<p>The Cluster API uses a cluster template to deploy a predefined set of Cluster API objects and create a managed cluster.</p> +<ol> +<li> +<p>Set the following environment variables so they are available to the cluster template. Update the values to reflect your own environment. +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre tabindex="0"><code># Base64 encoded SSH key for node access +$ export AZURE_SSH_PUBLIC_KEY_B64=&#34;&lt;sshKey&gt;&#34; + +# Select VM types. +$ export AZURE_CONTROL_PLANE_MACHINE_TYPE=&#34;Standard_D2s_v3&#34; +$ export AZURE_NODE_MACHINE_TYPE=&#34;Standard_D2s_v3&#34; + +# [Optional] Select resource group. The default value is ${CLUSTER_NAME}. +$ export AZURE_RESOURCE_GROUP=&#34;&lt;resourceGroupName&gt; + +# Name of the Azure datacenter location. Change this value to your desired location. +$ export AZURE_LOCATION=&#34;&lt;location&gt;&#34; + +# Cluster name info +$ export CLUSTER_NAME=&#34;capi-quickstart&#34; +$ export KUBERNETES_VERSION=&#34;&lt;k8sVersion&gt;&#34; +$ export NAMESPACE=&#34;default&#34; +$ export CONTROL_PLANE_MACHINE_COUNT=&#34;1&#34; +$ export WORKER_MACHINE_COUNT=&#34;1&#34; +</code></pre></div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script></p> +</li> +<li> +<p>Copy the cluster template and save it locally as <code>azure-capi.yaml</code>.</p> + <details> + <summary><b>Click here for the cluster template</b></summary> + <style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre tabindex="0"><code>apiVersion: cluster.x-k8s.io/v1beta1 +kind: Cluster +metadata: + name: ${CLUSTER_NAME} + namespace: default +spec: + clusterNetwork: + pods: + cidrBlocks: + - 192.168.0.0/16 + controlPlaneRef: + apiVersion: controlplane.cluster.x-k8s.io/v1beta1 + kind: OCNEControlPlane + name: ${CLUSTER_NAME}-control-plane + infrastructureRef: + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + kind: AzureCluster + name: ${CLUSTER_NAME} +--- +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +kind: AzureCluster +metadata: + name: ${CLUSTER_NAME} + namespace: default +spec: + identityRef: + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + kind: AzureClusterIdentity + name: ${CLUSTER_IDENTITY_NAME} + location: ${AZURE_LOCATION} + networkSpec: + subnets: + - name: control-plane-subnet + role: control-plane + - name: node-subnet + role: node + vnet: + name: ${AZURE_VNET_NAME:=${CLUSTER_NAME}-vnet} + resourceGroup: ${AZURE_RESOURCE_GROUP:=${CLUSTER_NAME}} + subscriptionID: ${AZURE_SUBSCRIPTION_ID} +--- +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +kind: AzureMachineTemplate +metadata: + name: ${CLUSTER_NAME}-control-plane + namespace: default +spec: + template: + spec: + image: + marketplace: + publisher: &#34;Oracle&#34; + offer: &#34;Oracle-Linux&#34; + sku: &#34;ol88-lvm-gen2&#34; + version: &#34;8.8.3&#34; + dataDisks: + - diskSizeGB: 256 + lun: 0 + nameSuffix: etcddisk + osDisk: + diskSizeGB: 128 + osType: Linux + sshPublicKey: ${AZURE_SSH_PUBLIC_KEY_B64:=&#34;&#34;} + vmSize: ${AZURE_CONTROL_PLANE_MACHINE_TYPE} +--- +apiVersion: cluster.x-k8s.io/v1beta1 +kind: MachineDeployment +metadata: + name: ${CLUSTER_NAME}-md-0 + namespace: default +spec: + clusterName: ${CLUSTER_NAME} + replicas: ${WORKER_MACHINE_COUNT} + selector: + matchLabels: null + template: + spec: + bootstrap: + configRef: + apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 + kind: OCNEConfigTemplate + name: ${CLUSTER_NAME}-md-0 + clusterName: ${CLUSTER_NAME} + infrastructureRef: + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + kind: AzureMachineTemplate + name: ${CLUSTER_NAME}-md-0 + version: ${KUBERNETES_VERSION} +--- +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +kind: AzureMachineTemplate +metadata: + name: ${CLUSTER_NAME}-md-0 + namespace: default +spec: + template: + spec: + image: + marketplace: + publisher: &#34;Oracle&#34; + offer: &#34;Oracle-Linux&#34; + sku: &#34;ol88-lvm-gen2&#34; + version: &#34;8.8.3&#34; + osDisk: + diskSizeGB: 128 + osType: Linux + sshPublicKey: ${AZURE_SSH_PUBLIC_KEY_B64:=&#34;&#34;} + vmSize: ${AZURE_NODE_MACHINE_TYPE} +--- +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +kind: AzureClusterIdentity +metadata: + labels: + clusterctl.cluster.x-k8s.io/move-hierarchy: &#34;true&#34; + name: ${CLUSTER_IDENTITY_NAME} + namespace: default +spec: + allowedNamespaces: {} + clientID: ${AZURE_CLIENT_ID} + clientSecret: + name: ${AZURE_CLUSTER_IDENTITY_SECRET_NAME} + namespace: ${AZURE_CLUSTER_IDENTITY_SECRET_NAMESPACE} + tenantID: ${AZURE_TENANT_ID} + type: ServicePrincipal +--- +apiVersion: controlplane.cluster.x-k8s.io/v1alpha1 +kind: OCNEControlPlane +metadata: + name: ${CLUSTER_NAME}-control-plane + namespace: default +spec: + moduleOperator: + enabled: true + verrazzanoPlatformOperator: + enabled: true + controlPlaneConfig: + clusterConfiguration: + apiServer: + extraArgs: + cloud-provider: external + certSANs: + - localhost + - 127.0.0.1 + dns: + imageRepository: ${OCNE_IMAGE_REPOSITORY=container-registry.oracle.com}/${OCNE_IMAGE_PATH=olcne} + imageTag: ${DNS_TAG=v1.9.3} + etcd: + local: + imageRepository: ${OCNE_IMAGE_REPOSITORY=container-registry.oracle.com}/${OCNE_IMAGE_PATH=olcne} + imageTag: ${ETCD_TAG=3.5.6} + controllerManager: + extraArgs: + cloud-provider: external + networking: {} + scheduler: {} + imageRepository: ${OCNE_IMAGE_REPOSITORY=container-registry.oracle.com}/${OCNE_IMAGE_PATH=olcne} + files: + - contentFrom: + secret: + key: control-plane-azure.json + name: ${CLUSTER_NAME}-control-plane-azure-json + owner: root:root + path: /etc/kubernetes/azure.json + permissions: &#34;0644&#34; + initConfiguration: + nodeRegistration: + criSocket: /var/run/crio/crio.sock + kubeletExtraArgs: + cloud-provider: external + name: &#39;{{ local_hostname }}&#39; + joinConfiguration: + discovery: {} + nodeRegistration: + criSocket: /var/run/crio/crio.sock + kubeletExtraArgs: + cloud-provider: external + name: &#39;{{ local_hostname }}&#39; + preOCNECommands: + - hostnamectl set-hostname &#34;{{ ds.meta_data.hostname }}&#34; + - echo &#34;::1 ipv6-localhost ipv6-loopback localhost6 localhost6.localdomain6&#34; + &gt;/etc/hosts + - echo &#34;127.0.0.1 {{ ds.meta_data.hostname }} {{ local_hostname }} localhost + localhost.localdomain localhost4 localhost4.localdomain4&#34; &gt;&gt;/etc/hosts + users: + - name: opc + sudo: ALL=(ALL) NOPASSWD:ALL + machineTemplate: + infrastructureRef: + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + kind: AzureMachineTemplate + name: ${CLUSTER_NAME}-control-plane + namespace: default + replicas: ${CONTROL_PLANE_MACHINE_COUNT} + version: ${KUBERNETES_VERSION} +--- +apiVersion: bootstrap.cluster.x-k8s.io/v1alpha1 +kind: OCNEConfigTemplate +metadata: + name: ${CLUSTER_NAME}-md-0 + namespace: default +spec: + template: + spec: + clusterConfiguration: + imageRepository: ${OCNE_IMAGE_REPOSITORY=container-registry.oracle.com}/${OCNE_IMAGE_PATH=olcne} + joinConfiguration: + nodeRegistration: + kubeletExtraArgs: + cloud-provider: external + name: &#39;{{ local_hostname }}&#39; + preOCNECommands: + - hostnamectl set-hostname &#34;{{ ds.meta_data.hostname }}&#34; + - echo &#34;::1 ipv6-localhost ipv6-loopback localhost6 localhost6.localdomain6&#34; + &gt;/etc/hosts + - echo &#34;127.0.0.1 {{ ds.meta_data.hostname }} {{ local_hostname }} localhost + localhost.localdomain localhost4 localhost4.localdomain4&#34; &gt;&gt;/etc/hosts + users: + - name: opc + sudo: ALL=(ALL) NOPASSWD:ALL +</code></pre></div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script> + </details> +</li> +<li> +<p>Generate and apply the template by running the following command: +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre tabindex="0"><code>$ clusterctl generate yaml --from azure-capi.yaml | kubectl apply -f - +</code></pre></div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script></p> +</li> +</ol> +<p>To view the status of the cluster and its resources, run: +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre tabindex="0"><code>$ clusterctl describe cluster $CLUSTER_NAME +</code></pre></div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script></p> +<p>To get the <code>kubeconfig</code> file, run: +<style type="text/css"> + code { + margin: 0; + padding: 0; + } + + .copy-code-button { + position: absolute; + right: 0; + top: -29px; + font-size: 12px; + line-height: 14px; + width: 65px; + color: white; + background-color: #30638E; + border: 1px solid #30638E; + white-space: nowrap; + padding: 6px 6px 7px 6px; + } + + .copy-code-button:hover, + .copy-code-button:focus{ + background-color: gray; + opacity: 1; + } + +</style> + +<div class="clipboard"> + <div class="highlight"> +<pre tabindex="0"><code>$ clusterctl get kubeconfig ${CLUSTER_NAME} &gt; ${CLUSTER_NAME}.kubeconfig +</code></pre></div> + +</div> + +<script> + function createCopyButton(highlightDiv) { + const button = document.createElement("button"); + button.innerText = "Copy"; + button.className = "copy-code-button"; + button.addEventListener("click", () => + copyCodeToClipboard(button, highlightDiv) + ); + addCopyButton(button, highlightDiv); + } + + function addCopyButton(button, highlightDiv) { + highlightDiv.insertBefore(button, highlightDiv.firstChild); + const wrapper = document.createElement("div"); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + async function copyCodeToClipboard(button, highlightDiv) { + let codeToCopy = highlightDiv.querySelector(":last-child > code, pre").innerText; + + let codeBlock = codeToCopy.split("\n"); + let expectedLine = codeBlock.findIndex(line => line.toLowerCase().startsWith("# expected response") || line.toLowerCase().startsWith("# sample output")); + if (expectedLine !== -1) { + codeBlock.splice(expectedLine); + } + codeToCopy = codeBlock.join("\n"); + + codeToCopy = codeToCopy.replace(/^#(.*)$/gm, '').trim(); + + codeToCopy = codeToCopy.replace(/\$\s+/gm, '').trim(); + codeToCopy = codeToCopy.replace(/\n{2,}/g,'\n'); + console.log(codeToCopy); + try { + await navigator.clipboard.writeText(codeToCopy); + } catch (err) { + + const textarea = document.createElement('textarea'); + textarea.value = codeToCopy; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + textarea.remove(); + } + button.blur(); + button.innerText = "Copied"; + setTimeout(function () { + button.innerText = "Copy"; + }, 2000); + } + + + document + .querySelectorAll(".highlight") + .forEach((highlightDiv) => createCopyButton(highlightDiv)); +</script></p> +<h2 id="finish-cluster-configuration">Finish cluster configuration</h2> +<p>After the cluster resources are created, you must perform some additional steps to finish the configuration of the cluster.</p> +<ol> +<li>Install a cloud controller manager (CCM). A CCM is necessary when deploying cloud resources such as load balancers. <style type="text/css"> code { margin: 0; @@ -9043,9 +10974,8 @@ Download the binary you want from the <a href="https://github.com/verrazz <div class="clipboard"> <div class="highlight"> -<pre><code> $ curl -LO https://github.com/verrazzano/verrazzano/releases/download/master/verrazzano-1.7.0-linux-amd64.tar.gz -</code></pre> -</div> +<pre tabindex="0"><code>$ helm install --kubeconfig=./${CLUSTER_NAME}.kubeconfig --repo https://raw.githubusercontent.com/kubernetes-sigs/cloud-provider-azure/master/helm/repo cloud-provider-azure --generate-name --set infra.clusterName=clusterName --set cloudControllerManager.clusterCIDR=&#34;192.168.0.0/16&#34; --set cloudControllerManager.caCertDir=/etc/pki/ca-trust +</code></pre></div> </div> @@ -9104,9 +11034,8 @@ Download the binary you want from the <a href="https://github.com/verrazz document .querySelectorAll(".highlight") .forEach((highlightDiv) => createCopyButton(highlightDiv)); -</script> -<h3 id="validate-the-binary-optional">Validate the binary (optional)</h3> -<p>Download the <code>vz</code> checksum file. +</script></li> +<li>Install a container network interface (CNI). The following example uses the Calico CNI. <style type="text/css"> code { margin: 0; @@ -9137,9 +11066,9 @@ Download the binary you want from the <a href="https://github.com/verrazz <div class="clipboard"> <div class="highlight"> -<pre><code> $ curl -LO https://github.com/verrazzano/verrazzano/releases/download/master/verrazzano-1.7.0-linux-amd64.tar.gz.sha256 -</code></pre> -</div> +<pre tabindex="0"><code>$ helm repo add projectcalico https://docs.tigera.io/calico/charts --kubeconfig=./${CLUSTER_NAME}.kubeconfig &amp;&amp; \ +$ helm install calico projectcalico/tigera-operator --kubeconfig=./${CLUSTER_NAME}.kubeconfig -f https://raw.githubusercontent.com/kubernetes-sigs/cluster-api-provider-azure/main/templates/addons/calico/values.yaml --namespace tigera-operator --create-namespace +</code></pre></div> </div> @@ -9198,8 +11127,17 @@ Download the binary you want from the <a href="https://github.com/verrazz document .querySelectorAll(".highlight") .forEach((highlightDiv) => createCopyButton(highlightDiv)); -</script></p> -<p>Validate the <code>vz</code> binary against the checksum file. +</script></li> +</ol> +<p>Your admin cluster and first managed cluster are now up and running and ready to deploy applications. You can add more managed clusters as needed.</p> +<p>For more information, refer to the documentation for Cluster API and Cluster API Azure:</p> +<ul> +<li><a href="https://cluster-api.sigs.k8s.io/introduction.html">Kubernetes Cluster API Documentation</a></li> +<li><a href="https://capz.sigs.k8s.io/introduction">The Cluster API Provider Azure Book</a></li> +</ul> +<h2 id="troubleshoot-the-deployment">Troubleshoot the deployment</h2> +<p>If the deployment of the Azure resources fails, then you can check the following log files to diagnose the issue:</p> +<p>The Azure cluster controller provider logs: <style type="text/css"> code { margin: 0; @@ -9230,9 +11168,8 @@ Download the binary you want from the <a href="https://github.com/verrazz <div class="clipboard"> <div class="highlight"> -<pre><code>$ sha256sum -c verrazzano-2.0.0-linux-amd64.tar.gz.sha256 -</code></pre> -</div> +<pre tabindex="0"><code>$ kubectl logs -n verrazzano-capi -l cluster.x-k8s.io/provider=infrastructure-azure +</code></pre></div> </div> @@ -9291,12 +11228,8 @@ Download the binary you want from the <a href="https://github.com/verrazz document .querySelectorAll(".highlight") .forEach((highlightDiv) => createCopyButton(highlightDiv)); -</script></p> -<h3 id="unpack-and-copy-the-vz-binary">Unpack and copy the vz binary</h3> -<div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span> $ tar xvf verrazzano-2.0.0-linux-amd64.tar.gz -</span></span></code></pre></div><p>The following command needs to be run as root.</p> -<div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span> $ sudo cp verrazzano-2.0.0/bin/vz /usr/local/bin -</span></span></code></pre></div><h3 id="test-to-ensure-that-the-version-you-installed-is-up-to-date">Test to ensure that the version you installed is up-to-date</h3> +</script> +The OCNE control plane provider logs: <style type="text/css"> code { margin: 0; @@ -9327,9 +11260,8 @@ Download the binary you want from the <a href="https://github.com/verrazz <div class="clipboard"> <div class="highlight"> -<pre><code> $ vz version -</code></pre> -</div> +<pre tabindex="0"><code>$ kubectl logs -n verrazzano-capi -l cluster.x-k8s.io/provider=control-plane-ocne +</code></pre></div> </div> @@ -9388,8 +11320,11 @@ Download the binary you want from the <a href="https://github.com/verrazz document .querySelectorAll(".highlight") .forEach((highlightDiv) => createCopyButton(highlightDiv)); -</script> -<p>The resulting output should be similar to the following. +</script></p> +<p><strong>NOTE</strong>: If a pod enters a <code>CrashLoopBackOff</code> state, then you can either restart the deployment or wait for the state to run its course. This is a known issue that should not affect the deployment of your cluster.</p> +<h2 id="delete-the-clusters">Delete the clusters</h2> +<ol> +<li>Delete the managed clusters. <style type="text/css"> code { margin: 0; @@ -9420,11 +11355,8 @@ Download the binary you want from the <a href="https://github.com/verrazz <div class="clipboard"> <div class="highlight"> -<pre><code>Version: master -BuildDate: 2023-02-12T21:07:26Z -GitCommit: cb0778bbf7a2cd90e1ae8458abd242f9da27a100 -</code></pre> -</div> +<pre tabindex="0"><code>$ kubectl delete cluster $CLUSTER_NAME +</code></pre></div> </div> @@ -9483,13 +11415,8 @@ GitCommit: cb0778bbf7a2cd90e1ae8458abd242f9da27a100 document .querySelectorAll(".highlight") .forEach((highlightDiv) => createCopyButton(highlightDiv)); -</script></p> -<h2 id="use-the-vz-cli">Use the vz CLI</h2> -<p>Verrazzano provides a command-line tool for managing a Verrazzano environment using the Verrazzano and Kubernetes API.</p> -<p>Common use cases include installing, upgrading, and uninstalling Verrazzano, -as well as analyzing failures in a running Verrazzano environment.</p> -<h3 id="usage-information">Usage information</h3> -<p>Use the following syntax to run <code>vz</code> commands from your terminal window. +</script></li> +<li>Delete the admin cluster. <style type="text/css"> code { margin: 0; @@ -9520,9 +11447,8 @@ as well as analyzing failures in a running Verrazzano environment.</p> <div class="clipboard"> <div class="highlight"> -<pre><code>vz [command] [flags] -</code></pre> -</div> +<pre tabindex="0"><code>$ kind delete cluster +</code></pre></div> </div> @@ -9581,78 +11507,9 @@ as well as analyzing failures in a running Verrazzano environment.</p> document .querySelectorAll(".highlight") .forEach((highlightDiv) => createCopyButton(highlightDiv)); -</script></p> -<h3 id="available-commands">Available commands</h3> -<table> -<thead> -<tr> -<th>Command</th> -<th>Definition</th> -</tr> -</thead> -<tbody> -<tr> -<td><code>analyze</code></td> -<td>Analyze cluster</td> -</tr> -<tr> -<td><code>bug-report</code></td> -<td>Collect information from the cluster to report an issue</td> -</tr> -<tr> -<td><code>completion</code></td> -<td>Generate the autocompletion script for the specified shell</td> -</tr> -<tr> -<td><code>help</code></td> -<td>Help about any command</td> -</tr> -<tr> -<td><code>install</code></td> -<td>Install Verrazzano</td> -</tr> -<tr> -<td><code>status</code></td> -<td>Status of the Verrazzano installation and access endpoints</td> -</tr> -<tr> -<td><code>uninstall</code></td> -<td>Uninstall Verrazzano</td> -</tr> -<tr> -<td><code>upgrade</code></td> -<td>Upgrade Verrazzano</td> -</tr> -<tr> -<td><code>version</code></td> -<td>Verrazzano version information</td> -</tr> -</tbody> -</table> -<h3 id="available-flags">Available Flags</h3> -<p>These flags apply to all the commands.</p> -<table> -<thead> -<tr> -<th>Flag</th> -<th>Definition</th> -</tr> -</thead> -<tbody> -<tr> -<td><code>--context string</code></td> -<td>The name of the kubeconfig file context to use.</td> -</tr> -<tr> -<td><code>-h</code>, <code>--help</code></td> -<td>Help for <code>vz</code>.</td> -</tr> -<tr> -<td><code>--kubeconfig string</code></td> -<td>Path to the kubeconfig file to use.</td> -</tr> -</tbody> -</table> +</script></li> +</ol> +<p>Do not use <code>kubectl delete -f capi-quickstart.yaml</code> to delete the entire cluster template at once because it might leave behind pending resources that you need to clean up manually.</p> @@ -27865,133 +29722,5 @@ spec: - - Docs: Create OCNE Clusters Running on OCI - /docs/setup/provision-cluster/ocne-oci/ - Mon, 01 Jan 0001 00:00:00 +0000 - - /docs/setup/provision-cluster/ocne-oci/ - - - - <h3 id="before-you-begin">Before you begin</h3> -<p>You&rsquo;ll need to:</p> -<ul> -<li>Set up an Oracle Cloud Infrastructure (OCI) account with -<ul> -<li>A compartment</li> -<li>An <a href="https://docs.oracle.com/en-us/iaas/Content/API/Concepts/apisigningkey.htm#two">API signing key</a></li> -</ul> -</li> -<li>Generate an SSH key pair to use for cluster authentication</li> -</ul> -<h3 id="create-a-new-ocne-cluster-on-oci">Create a new OCNE cluster on OCI</h3> -<p>To provision new Oracle Cloud Native Environment (OCNE) managed clusters on OCI, complete the following steps:</p> -<ol> -<li> -<p>Log in to the console. To find the console URL for your cluster, refer to <a href="../docs/setup/access/console-urls/">Get console URLs</a> and use the <code>rancherURL</code> value.</p> -</li> -<li> -<p>Open the navigation menu and select <strong>Cluster Management</strong>.</p> -</li> -<li> -<p>From the left menu, select <strong>Cloud Credentials</strong>, and then click <strong>Create</strong>. Cloud credentials store the credentials for your cloud infrastructure provider.</p> -</li> -<li> -<p>Choose <strong>Oracle</strong>.</p> -</li> -<li> -<p>Provide a name for the cloud credential and then fill in the rest of the fields with information from your OCI account and its API signing key.</p> -<ul> -<li> -<p><strong>fingerprint</strong>: The fingerprint of the public API key. <a href="https://docs.oracle.com/en-us/iaas/Content/API/Concepts/apisigningkey.htm#four">Find your key&rsquo;s fingerprint</a>.</p> -</li> -<li> -<p><strong>passphrase</strong>: The passphrase used for the API key, if it was encrypted.</p> -</li> -<li> -<p><strong>privateKeyContents</strong>: Copy the contents of the private key portion of the API key pair. <a href="https://docs.oracle.com/en-us/iaas/Content/API/Concepts/apisigningkey.htm#two">Generate an API Signing Key</a>.</p> -</li> -<li> -<p><strong>region</strong>: Enter the identifier for the current region of your tenancy. <a href="https://docs.oracle.com/en-us/iaas/Content/General/Concepts/regions.htm#About">Find your region identifier</a>.</p> -</li> -<li> -<p><strong>tenancyId</strong>: Enter the OCID of your tenancy. <a href="https://docs.oracle.com/en-us/iaas/Content/API/Concepts/apisigningkey.htm#five">Find your tenancy OCID</a>.</p> -</li> -<li> -<p><strong>userId</strong>: Enter the OCID of the user. <a href="https://docs.oracle.com/en-us/iaas/Content/API/Concepts/apisigningkey.htm#five">Find your user OCID</a>.</p> -</li> -</ul> -</li> -<li> -<p>Click <strong>Create</strong> to save the new cloud credential.</p> -</li> -<li> -<p>From the left menu, select <strong>Clusters</strong>, and then click <strong>Create</strong>.</p> -</li> -<li> -<p>Select <strong>Oracle OCNE on OCI</strong> and provide a name for the cluster.</p> -</li> -<li> -<p>Expand <strong>Member Roles</strong> to add any users that you want grant access to this cluster and their permissions.</p> -</li> -<li> -<p>Expand <strong>Labels and Annotations</strong> to configure Kubernetes <a href="https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/">labels</a> and <a href="https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/">annotations</a> for the cluster.</p> -</li> -<li> -<p>Select the cloud credentials that you created. Ensure that the appropriate Region and Compartment are selected from their drop-down menus.</p> -</li> -<li> -<p>Click <strong>Next</strong>.</p> -</li> -<li> -<p>Set up your network. Choose <strong>Quick Create</strong> to create a new virtual cloud network (VCN) configured to the specifications required for an OCNE cluster or <strong>Existing Infrastructure</strong> to use a VCN that&rsquo;s already configured in your OCI account.</p> -<ul> -<li> -<p>If you choose the <strong>Existing Infrastructure</strong> option, then select the compartment where your VCN is located from the <strong>VCN Compartment</strong> drop-down menu, then the VCN itself from the <strong>Virtual Cloud Network</strong> drop-down menu. Next, select subnets within the VCN for each of the <strong>Cloud Plane Subnet</strong>, <strong>Load Balancer Subnet</strong>, and <strong>Worker Node Subnet</strong> drop-down menus. See <a href="../docs/setup/install/prepare/platforms/vcn-oci/">Configure a VCN in OCI</a> for requirements.</p> -</li> -<li> -<p>The VCN compartment does not need to match the compartment specified in the cloud credential.</p> -</li> -</ul> -</li> -<li> -<p>Click <strong>Next</strong>.</p> -</li> -<li> -<p>Choose a Node Image from the drop-down menu.</p> -<p>You can choose to override the default Node Image. Expand <strong>OCNE Image Configuration</strong> and provide a custom image OCID. If your custom image includes OCNE binaries, then you can select <strong>Skip OCNE Dependency Installation</strong> to avoid duplicates.</p> -</li> -<li> -<p>Copy or upload an SSH public key to manage authentication of the cluster. Your SSH public key is installed on the cluster nodes, enabling SSH after the cluster is created.</p> -</li> -<li> -<p>Configure the cluster control plane. Select the <strong>OCNE Version</strong> first because it determines which Kubernetes versions are available, then choose a <strong>Kubernetes Version</strong> and a <strong>Control Plane Shape</strong>. You can leave the rest of the options at their default setting or modify them as needed.</p> -<p>Under <strong>Advanced</strong>, you can choose to edit image tags for <strong>ETCD</strong>, <strong>CoreDNS</strong>, and <strong>Calico</strong>, or whether to install <strong>OCI CCM/CSI</strong> and <strong>Calico</strong>.</p> -</li> -<li> -<p>Add node pools to your cluster. Clusters without node pools will schedule pods on control plane nodes.</p> -</li> -<li> -<p>(Optional) Install Verrazzano on the cluster. Choose a <strong>Verrazzano version</strong> from the drop-down menu. You can also expand <strong>Advanced</strong> to make changes to the Verrazzano Resource YAML. By default, Verrazzano is installed using the <code>managed-cluster</code> profile which enables a limited set of components on the cluster.</p> -</li> -<li> -<p>Expand <strong>Advanced Settings</strong> to make additional modifications to the default settings of your new cluster.</p> -<ul> -<li><strong>YAML Manifests</strong>: Supply additional YAML manifests that are automatically installed after cluster creation. The total size of all additional YAML manifests may not exceed 500 KB.</li> -<li><strong>Cluster Networking</strong>: Configure cluster IP ranges and proxy settings.</li> -<li><strong>Container Registry</strong>: Specify a private registry for your container.</li> -</ul> -</li> -<li> -<p>Click <strong>Create</strong>. It can take up to 30 minutes to provision all of the resources for your cluster, particularly for multi-node clusters.</p> -</li> -</ol> -<p>When your cluster finishes provisioning, you can access it from the main <strong>Cluster Management</strong> page.</p> -<p>For help troubleshooting cluster creation, see <a href="../docs/troubleshooting/troubleshooting-clusterapi/">Cluster Creation Issues</a>.</p> - - - - diff --git a/devel/docs/introduction/architecture/index.html b/devel/docs/introduction/architecture/index.html index 1b64da98b3..763bd4b5c7 100644 --- a/devel/docs/introduction/architecture/index.html +++ b/devel/docs/introduction/architecture/index.html @@ -99,7 +99,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -125,7 +125,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -817,7 +817,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/introduction/features/index.html b/devel/docs/introduction/features/index.html index b22c1b017c..c6bc343622 100644 --- a/devel/docs/introduction/features/index.html +++ b/devel/docs/introduction/features/index.html @@ -103,7 +103,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -129,7 +129,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -821,7 +821,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/introduction/index.html b/devel/docs/introduction/index.html index c346bb0c0f..7da2c70a66 100644 --- a/devel/docs/introduction/index.html +++ b/devel/docs/introduction/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/introduction/verrazzanomulticluster/index.html b/devel/docs/introduction/verrazzanomulticluster/index.html index 29f0c3737c..60298436eb 100644 --- a/devel/docs/introduction/verrazzanomulticluster/index.html +++ b/devel/docs/introduction/verrazzanomulticluster/index.html @@ -99,7 +99,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -125,7 +125,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -817,7 +817,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/introduction/verrazzanooam/index.html b/devel/docs/introduction/verrazzanooam/index.html index c2e8821e34..2aee057349 100644 --- a/devel/docs/introduction/verrazzanooam/index.html +++ b/devel/docs/introduction/verrazzanooam/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/networking/index.html b/devel/docs/networking/index.html index 1954cf691e..7e8fa44bd8 100644 --- a/devel/docs/networking/index.html +++ b/devel/docs/networking/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/networking/istio/index.html b/devel/docs/networking/istio/index.html index 965f254761..af9eb9cf05 100644 --- a/devel/docs/networking/istio/index.html +++ b/devel/docs/networking/istio/index.html @@ -103,7 +103,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -129,7 +129,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -821,7 +821,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/networking/security/certificates/index.html b/devel/docs/networking/security/certificates/index.html index 5918dddc76..2d205838dc 100644 --- a/devel/docs/networking/security/certificates/index.html +++ b/devel/docs/networking/security/certificates/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/networking/security/index.html b/devel/docs/networking/security/index.html index b2766fd91f..6d15c4f85f 100644 --- a/devel/docs/networking/security/index.html +++ b/devel/docs/networking/security/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/networking/traffic/dns/index.html b/devel/docs/networking/traffic/dns/index.html index c075c8779b..8c57701ce8 100644 --- a/devel/docs/networking/traffic/dns/index.html +++ b/devel/docs/networking/traffic/dns/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/networking/traffic/externallbs/index.html b/devel/docs/networking/traffic/externallbs/index.html index ce3d3f9a9f..e616d52c6d 100644 --- a/devel/docs/networking/traffic/externallbs/index.html +++ b/devel/docs/networking/traffic/externallbs/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/networking/traffic/index.html b/devel/docs/networking/traffic/index.html index e793ff5e56..80f0991e68 100644 --- a/devel/docs/networking/traffic/index.html +++ b/devel/docs/networking/traffic/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/networking/traffic/ingress/index.html b/devel/docs/networking/traffic/ingress/index.html index 588bfb6655..e2e0e169e9 100644 --- a/devel/docs/networking/traffic/ingress/index.html +++ b/devel/docs/networking/traffic/ingress/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/networking/traffic/ociloadbalancerips/index.html b/devel/docs/networking/traffic/ociloadbalancerips/index.html index 536d085aba..d72a549431 100644 --- a/devel/docs/networking/traffic/ociloadbalancerips/index.html +++ b/devel/docs/networking/traffic/ociloadbalancerips/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/observability/index.html b/devel/docs/observability/index.html index 29b199ef0a..828246ff74 100644 --- a/devel/docs/observability/index.html +++ b/devel/docs/observability/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/observability/logging/configure-opensearch/index.html b/devel/docs/observability/logging/configure-opensearch/index.html index 465db2be60..cbb6814cd7 100644 --- a/devel/docs/observability/logging/configure-opensearch/index.html +++ b/devel/docs/observability/logging/configure-opensearch/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/observability/logging/configure-opensearch/opensearch/index.html b/devel/docs/observability/logging/configure-opensearch/opensearch/index.html index d4b1cc166e..6cf906dd3a 100644 --- a/devel/docs/observability/logging/configure-opensearch/opensearch/index.html +++ b/devel/docs/observability/logging/configure-opensearch/opensearch/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/observability/logging/fluent-operator/index.html b/devel/docs/observability/logging/fluent-operator/index.html index 426f98d3f5..8276a82c5b 100644 --- a/devel/docs/observability/logging/fluent-operator/index.html +++ b/devel/docs/observability/logging/fluent-operator/index.html @@ -103,7 +103,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -129,7 +129,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -821,7 +821,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/observability/logging/fluentd/fluentd/index.html b/devel/docs/observability/logging/fluentd/fluentd/index.html index f1be9f5d74..49260f5749 100644 --- a/devel/docs/observability/logging/fluentd/fluentd/index.html +++ b/devel/docs/observability/logging/fluentd/fluentd/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/observability/logging/fluentd/index.html b/devel/docs/observability/logging/fluentd/index.html index b6bb917fcd..5b608ef551 100644 --- a/devel/docs/observability/logging/fluentd/index.html +++ b/devel/docs/observability/logging/fluentd/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/observability/logging/index.html b/devel/docs/observability/logging/index.html index 9b6f081624..fea1604a3d 100644 --- a/devel/docs/observability/logging/index.html +++ b/devel/docs/observability/logging/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/observability/logging/logs/index.html b/devel/docs/observability/logging/logs/index.html index e523ccd2ea..a6a4334d8a 100644 --- a/devel/docs/observability/logging/logs/index.html +++ b/devel/docs/observability/logging/logs/index.html @@ -99,7 +99,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -125,7 +125,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -817,7 +817,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/observability/logging/oci-logging/index.html b/devel/docs/observability/logging/oci-logging/index.html index 8d212ae7d5..0e863fd109 100644 --- a/devel/docs/observability/logging/oci-logging/index.html +++ b/devel/docs/observability/logging/oci-logging/index.html @@ -99,7 +99,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -125,7 +125,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -817,7 +817,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/observability/logging/search/index.html b/devel/docs/observability/logging/search/index.html index 886e592974..c2e693f3a8 100644 --- a/devel/docs/observability/logging/search/index.html +++ b/devel/docs/observability/logging/search/index.html @@ -99,7 +99,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -125,7 +125,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -817,7 +817,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/observability/logging/troubleshoot/index.html b/devel/docs/observability/logging/troubleshoot/index.html index 4d7e26930e..37e922e3fe 100644 --- a/devel/docs/observability/logging/troubleshoot/index.html +++ b/devel/docs/observability/logging/troubleshoot/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/observability/monitoring/configure-metrics/index.html b/devel/docs/observability/monitoring/configure-metrics/index.html index a39c450695..20afdf7f5c 100644 --- a/devel/docs/observability/monitoring/configure-metrics/index.html +++ b/devel/docs/observability/monitoring/configure-metrics/index.html @@ -107,7 +107,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -133,7 +133,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -825,7 +825,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/observability/monitoring/configure/alertmanager/index.html b/devel/docs/observability/monitoring/configure/alertmanager/index.html index ce3fae2d97..231e72fdc5 100644 --- a/devel/docs/observability/monitoring/configure/alertmanager/index.html +++ b/devel/docs/observability/monitoring/configure/alertmanager/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/observability/monitoring/configure/grafana/grafana/index.html b/devel/docs/observability/monitoring/configure/grafana/grafana/index.html index 87bf5834c5..7d8e8e49f6 100644 --- a/devel/docs/observability/monitoring/configure/grafana/grafana/index.html +++ b/devel/docs/observability/monitoring/configure/grafana/grafana/index.html @@ -103,7 +103,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../../" data-offline-search-max-results="10" > @@ -129,7 +129,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../../" data-offline-search-max-results="10" > @@ -821,7 +821,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/observability/monitoring/configure/grafana/index.html b/devel/docs/observability/monitoring/configure/grafana/index.html index 2a1174f675..c9fda548e0 100644 --- a/devel/docs/observability/monitoring/configure/grafana/index.html +++ b/devel/docs/observability/monitoring/configure/grafana/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/observability/monitoring/configure/index.html b/devel/docs/observability/monitoring/configure/index.html index 05254bf9ff..34372ad299 100644 --- a/devel/docs/observability/monitoring/configure/index.html +++ b/devel/docs/observability/monitoring/configure/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/observability/monitoring/configure/prometheus/index.html b/devel/docs/observability/monitoring/configure/prometheus/index.html index 0be21a37ab..1e42c6f2a9 100644 --- a/devel/docs/observability/monitoring/configure/prometheus/index.html +++ b/devel/docs/observability/monitoring/configure/prometheus/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/observability/monitoring/configure/thanos/index.html b/devel/docs/observability/monitoring/configure/thanos/index.html index d44de074a4..1d0a23d7c0 100644 --- a/devel/docs/observability/monitoring/configure/thanos/index.html +++ b/devel/docs/observability/monitoring/configure/thanos/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/observability/monitoring/index.html b/devel/docs/observability/monitoring/index.html index 5710f7dff8..308e28f1e7 100644 --- a/devel/docs/observability/monitoring/index.html +++ b/devel/docs/observability/monitoring/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/observability/monitoring/multicluster-metrics/index.html b/devel/docs/observability/monitoring/multicluster-metrics/index.html index be73889f1e..f57277e8a3 100644 --- a/devel/docs/observability/monitoring/multicluster-metrics/index.html +++ b/devel/docs/observability/monitoring/multicluster-metrics/index.html @@ -99,7 +99,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -125,7 +125,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -817,7 +817,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/observability/monitoring/troubleshooting-prometheus/index.html b/devel/docs/observability/monitoring/troubleshooting-prometheus/index.html index 4ae1f1c3f0..1b8fa16ae9 100644 --- a/devel/docs/observability/monitoring/troubleshooting-prometheus/index.html +++ b/devel/docs/observability/monitoring/troubleshooting-prometheus/index.html @@ -99,7 +99,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -125,7 +125,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -817,7 +817,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/observability/storage/index.html b/devel/docs/observability/storage/index.html index c80387fdd0..c9fe7eafaa 100644 --- a/devel/docs/observability/storage/index.html +++ b/devel/docs/observability/storage/index.html @@ -103,7 +103,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -129,7 +129,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -821,7 +821,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/observability/tracing/application-tracing/index.html b/devel/docs/observability/tracing/application-tracing/index.html index 5dbb057aa7..7a99b44670 100644 --- a/devel/docs/observability/tracing/application-tracing/index.html +++ b/devel/docs/observability/tracing/application-tracing/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/observability/tracing/capture-traces/index.html b/devel/docs/observability/tracing/capture-traces/index.html index 933404a903..e2441ad497 100644 --- a/devel/docs/observability/tracing/capture-traces/index.html +++ b/devel/docs/observability/tracing/capture-traces/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/observability/tracing/configure-tracing/index.html b/devel/docs/observability/tracing/configure-tracing/index.html index 22811c32b3..dc9bba3a4b 100644 --- a/devel/docs/observability/tracing/configure-tracing/index.html +++ b/devel/docs/observability/tracing/configure-tracing/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/observability/tracing/index.html b/devel/docs/observability/tracing/index.html index 7c6200b0b3..bf8ae91817 100644 --- a/devel/docs/observability/tracing/index.html +++ b/devel/docs/observability/tracing/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/observability/tracing/view-traces/index.html b/devel/docs/observability/tracing/view-traces/index.html index b36f02bf32..880963e69c 100644 --- a/devel/docs/observability/tracing/view-traces/index.html +++ b/devel/docs/observability/tracing/view-traces/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/reference/index.html b/devel/docs/reference/index.html index 842744591f..e02bf54b4b 100644 --- a/devel/docs/reference/index.html +++ b/devel/docs/reference/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/reference/migration/index.html b/devel/docs/reference/migration/index.html index 8cb0848317..2c2d85d2e9 100644 --- a/devel/docs/reference/migration/index.html +++ b/devel/docs/reference/migration/index.html @@ -103,7 +103,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -129,7 +129,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -821,7 +821,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/reference/vao-clusters-v1alpha1/index.html b/devel/docs/reference/vao-clusters-v1alpha1/index.html index 2e3136a6ee..7da46c1db4 100644 --- a/devel/docs/reference/vao-clusters-v1alpha1/index.html +++ b/devel/docs/reference/vao-clusters-v1alpha1/index.html @@ -103,7 +103,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -129,7 +129,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -821,7 +821,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/reference/vao-oam-v1alpha1/index.html b/devel/docs/reference/vao-oam-v1alpha1/index.html index bc116c7c14..f1d2c9a63c 100644 --- a/devel/docs/reference/vao-oam-v1alpha1/index.html +++ b/devel/docs/reference/vao-oam-v1alpha1/index.html @@ -103,7 +103,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -129,7 +129,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -821,7 +821,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/reference/vco-clusters-v1alpha1/index.html b/devel/docs/reference/vco-clusters-v1alpha1/index.html index 895187f315..c7eaa64b11 100644 --- a/devel/docs/reference/vco-clusters-v1alpha1/index.html +++ b/devel/docs/reference/vco-clusters-v1alpha1/index.html @@ -103,7 +103,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -129,7 +129,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -821,7 +821,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/reference/vpo-verrazzano-v1alpha1/index.html b/devel/docs/reference/vpo-verrazzano-v1alpha1/index.html index 66932f3268..967ed3217f 100644 --- a/devel/docs/reference/vpo-verrazzano-v1alpha1/index.html +++ b/devel/docs/reference/vpo-verrazzano-v1alpha1/index.html @@ -103,7 +103,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -129,7 +129,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -821,7 +821,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/reference/vpo-verrazzano-v1beta1/index.html b/devel/docs/reference/vpo-verrazzano-v1beta1/index.html index d04e57a576..60e390b331 100644 --- a/devel/docs/reference/vpo-verrazzano-v1beta1/index.html +++ b/devel/docs/reference/vpo-verrazzano-v1beta1/index.html @@ -103,7 +103,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -129,7 +129,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -821,7 +821,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/releasenotes/index.html b/devel/docs/releasenotes/index.html index a18af51f33..1d5c3a5ca2 100644 --- a/devel/docs/releasenotes/index.html +++ b/devel/docs/releasenotes/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • @@ -1188,7 +1203,6 @@

    Features

  • Added OKEQuickCreate custom resource to support ease-of-use when creating OKE clusters on OCI.
  • Added OCNEOCIQuickCreate custom resource to support ease-of-use when creating Oracle Cloud Native Environment clusters on OCI.
  • Added support for Thanos Ruler and Compactor.
  • -
  • Added support for Oracle Cloud Native Environment managed clusters on Azure.
  • Decoupled the Cluster Management API from Rancher.
  • Enabled lifecycle management of OKE clusters.
  • @@ -1203,6 +1217,7 @@

    Enhancements:

  • Added support for Oracle Cloud Native Environment v1.7.
  • Added the ability to enable security plug-ins in OpenSearch clusters.
  • Now, Verrazzano uses OpenSearch operator-managed OpenSearch. To avoid any data loss during an upgrade, we advise you to make a backup before upgrading.
  • +
  • Described trial method for using Cluster API to configure OCNE clusters on Microsoft Azure or VMware vSphere.
  • Component version updates:

  • - + +
  • + + + +
  • diff --git a/devel/docs/security/appsec/appsec/index.html b/devel/docs/security/appsec/appsec/index.html index 223d309b95..2be496a10e 100644 --- a/devel/docs/security/appsec/appsec/index.html +++ b/devel/docs/security/appsec/appsec/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/security/index.html b/devel/docs/security/index.html index a6facdbf24..7c8d7dd3bb 100644 --- a/devel/docs/security/index.html +++ b/devel/docs/security/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/security/keycloak/index.html b/devel/docs/security/keycloak/index.html index dd24602d01..e2f27c7f20 100644 --- a/devel/docs/security/keycloak/index.html +++ b/devel/docs/security/keycloak/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/security/keycloak/keycloak/index.html b/devel/docs/security/keycloak/keycloak/index.html index 8c5458583e..e719f89cd0 100644 --- a/devel/docs/security/keycloak/keycloak/index.html +++ b/devel/docs/security/keycloak/keycloak/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/security/proxies/authproxy/index.html b/devel/docs/security/proxies/authproxy/index.html index ffd94c4ce5..b2fd8bf276 100644 --- a/devel/docs/security/proxies/authproxy/index.html +++ b/devel/docs/security/proxies/authproxy/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/security/proxies/index.html b/devel/docs/security/proxies/index.html index 67df066a2d..f62115dc5e 100644 --- a/devel/docs/security/proxies/index.html +++ b/devel/docs/security/proxies/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/security/rbac/rbac/index.html b/devel/docs/security/rbac/rbac/index.html index 93134eeaec..e6dddb6ba3 100644 --- a/devel/docs/security/rbac/rbac/index.html +++ b/devel/docs/security/rbac/rbac/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/setup/access/console-credentials/index.html b/devel/docs/setup/access/console-credentials/index.html index d326da860f..1030bd13cf 100644 --- a/devel/docs/setup/access/console-credentials/index.html +++ b/devel/docs/setup/access/console-credentials/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/setup/access/console-urls/index.html b/devel/docs/setup/access/console-urls/index.html index 3318120bf6..812d69a0de 100644 --- a/devel/docs/setup/access/console-urls/index.html +++ b/devel/docs/setup/access/console-urls/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/setup/access/index.html b/devel/docs/setup/access/index.html index e226eb8265..5e8b95f431 100644 --- a/devel/docs/setup/access/index.html +++ b/devel/docs/setup/access/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/setup/access/password/index.html b/devel/docs/setup/access/password/index.html index 0c3228a717..7200c0ecde 100644 --- a/devel/docs/setup/access/password/index.html +++ b/devel/docs/setup/access/password/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/setup/index.html b/devel/docs/setup/index.html index 3046349fa0..61faea6ebf 100644 --- a/devel/docs/setup/index.html +++ b/devel/docs/setup/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/setup/install/index.html b/devel/docs/setup/install/index.html index a54a9945c5..91c13aed53 100644 --- a/devel/docs/setup/install/index.html +++ b/devel/docs/setup/install/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/setup/install/perform/cli-installation/index.html b/devel/docs/setup/install/perform/cli-installation/index.html index 6ab76b5ffc..45e1466577 100644 --- a/devel/docs/setup/install/perform/cli-installation/index.html +++ b/devel/docs/setup/install/perform/cli-installation/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/setup/install/perform/helm-installation/index.html b/devel/docs/setup/install/perform/helm-installation/index.html index 1ebb26e5cf..b1f7d3b373 100644 --- a/devel/docs/setup/install/perform/helm-installation/index.html +++ b/devel/docs/setup/install/perform/helm-installation/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/setup/install/perform/index.html b/devel/docs/setup/install/perform/index.html index ebea0a0f69..5c81a8e2dd 100644 --- a/devel/docs/setup/install/perform/index.html +++ b/devel/docs/setup/install/perform/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/setup/install/perform/kubectl-installation/index.html b/devel/docs/setup/install/perform/kubectl-installation/index.html index 982caa39ba..7be74a475d 100644 --- a/devel/docs/setup/install/perform/kubectl-installation/index.html +++ b/devel/docs/setup/install/perform/kubectl-installation/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/setup/install/perform/profiles/index.html b/devel/docs/setup/install/perform/profiles/index.html index 5a71b694d5..7bc87a8d29 100644 --- a/devel/docs/setup/install/perform/profiles/index.html +++ b/devel/docs/setup/install/perform/profiles/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/setup/install/prepare/cli-setup/index.html b/devel/docs/setup/install/prepare/cli-setup/index.html index e20eb2e311..6e5881ff38 100644 --- a/devel/docs/setup/install/prepare/cli-setup/index.html +++ b/devel/docs/setup/install/prepare/cli-setup/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/setup/install/prepare/index.html b/devel/docs/setup/install/prepare/index.html index dbc6dd182f..6c8e4bb1b1 100644 --- a/devel/docs/setup/install/prepare/index.html +++ b/devel/docs/setup/install/prepare/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/setup/install/prepare/platforms/generic/generic/index.html b/devel/docs/setup/install/prepare/platforms/generic/generic/index.html index 6a05fc5c1b..749a9d2629 100644 --- a/devel/docs/setup/install/prepare/platforms/generic/generic/index.html +++ b/devel/docs/setup/install/prepare/platforms/generic/generic/index.html @@ -99,7 +99,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../../../" data-offline-search-max-results="10" > @@ -125,7 +125,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../../../" data-offline-search-max-results="10" > @@ -817,7 +817,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/setup/install/prepare/platforms/index.html b/devel/docs/setup/install/prepare/platforms/index.html index 50b953baff..522d99e305 100644 --- a/devel/docs/setup/install/prepare/platforms/index.html +++ b/devel/docs/setup/install/prepare/platforms/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/setup/install/prepare/platforms/kind/kind/index.html b/devel/docs/setup/install/prepare/platforms/kind/kind/index.html index ef808fbed6..dc27466ced 100644 --- a/devel/docs/setup/install/prepare/platforms/kind/kind/index.html +++ b/devel/docs/setup/install/prepare/platforms/kind/kind/index.html @@ -99,7 +99,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../../../" data-offline-search-max-results="10" > @@ -125,7 +125,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../../../" data-offline-search-max-results="10" > @@ -817,7 +817,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/setup/install/prepare/platforms/oci/oci/index.html b/devel/docs/setup/install/prepare/platforms/oci/oci/index.html index 66ece6d6ec..94eeabd795 100644 --- a/devel/docs/setup/install/prepare/platforms/oci/oci/index.html +++ b/devel/docs/setup/install/prepare/platforms/oci/oci/index.html @@ -99,7 +99,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../../../" data-offline-search-max-results="10" > @@ -125,7 +125,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../../../" data-offline-search-max-results="10" > @@ -817,7 +817,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/setup/install/prepare/platforms/olcne/index.html b/devel/docs/setup/install/prepare/platforms/olcne/index.html index ee83e7e1d8..0fdcadfed8 100644 --- a/devel/docs/setup/install/prepare/platforms/olcne/index.html +++ b/devel/docs/setup/install/prepare/platforms/olcne/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/setup/install/prepare/platforms/olcne/nfs/index.html b/devel/docs/setup/install/prepare/platforms/olcne/nfs/index.html index 52908f7711..cab4e31038 100644 --- a/devel/docs/setup/install/prepare/platforms/olcne/nfs/index.html +++ b/devel/docs/setup/install/prepare/platforms/olcne/nfs/index.html @@ -111,7 +111,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../../../" data-offline-search-max-results="10" > @@ -137,7 +137,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../../../" data-offline-search-max-results="10" > @@ -829,7 +829,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/setup/install/prepare/platforms/olcne/private-registry/index.html b/devel/docs/setup/install/prepare/platforms/olcne/private-registry/index.html index 144b612642..762e0ef308 100644 --- a/devel/docs/setup/install/prepare/platforms/olcne/private-registry/index.html +++ b/devel/docs/setup/install/prepare/platforms/olcne/private-registry/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/setup/install/prepare/platforms/vcn-oci/index.html b/devel/docs/setup/install/prepare/platforms/vcn-oci/index.html index ae5e1b4925..7d262e669c 100644 --- a/devel/docs/setup/install/prepare/platforms/vcn-oci/index.html +++ b/devel/docs/setup/install/prepare/platforms/vcn-oci/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/setup/install/prepare/prereqs/index.html b/devel/docs/setup/install/prepare/prereqs/index.html index 6f8cf2cc48..7733a16e56 100644 --- a/devel/docs/setup/install/prepare/prereqs/index.html +++ b/devel/docs/setup/install/prepare/prereqs/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/setup/install/verify/cli-verify/index.html b/devel/docs/setup/install/verify/cli-verify/index.html index 5011d4abc0..165594cd11 100644 --- a/devel/docs/setup/install/verify/cli-verify/index.html +++ b/devel/docs/setup/install/verify/cli-verify/index.html @@ -99,7 +99,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -125,7 +125,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -817,7 +817,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/setup/install/verify/index.html b/devel/docs/setup/install/verify/index.html index 3b93117e25..55b879b71e 100644 --- a/devel/docs/setup/install/verify/index.html +++ b/devel/docs/setup/install/verify/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/setup/install/verify/kubectl-verify/index.html b/devel/docs/setup/install/verify/kubectl-verify/index.html index e4cffdeceb..5ec2ad0825 100644 --- a/devel/docs/setup/install/verify/kubectl-verify/index.html +++ b/devel/docs/setup/install/verify/kubectl-verify/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/setup/install/verify/softwares/index.html b/devel/docs/setup/install/verify/softwares/index.html index 8255b80108..d05a50ba65 100644 --- a/devel/docs/setup/install/verify/softwares/index.html +++ b/devel/docs/setup/install/verify/softwares/index.html @@ -99,7 +99,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -125,7 +125,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -817,7 +817,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/setup/installationoverrides/index.html b/devel/docs/setup/installationoverrides/index.html index 80400e7954..094ed2770a 100644 --- a/devel/docs/setup/installationoverrides/index.html +++ b/devel/docs/setup/installationoverrides/index.html @@ -103,7 +103,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -129,7 +129,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -821,7 +821,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/setup/mc-install/advanced-mc-install/index.html b/devel/docs/setup/mc-install/advanced-mc-install/index.html index 6dfd6064ae..a3941d29d9 100644 --- a/devel/docs/setup/mc-install/advanced-mc-install/index.html +++ b/devel/docs/setup/mc-install/advanced-mc-install/index.html @@ -103,7 +103,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -129,7 +129,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -821,7 +821,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/setup/mc-install/deregister-install/index.html b/devel/docs/setup/mc-install/deregister-install/index.html index 4929a18167..cc3547c9db 100644 --- a/devel/docs/setup/mc-install/deregister-install/index.html +++ b/devel/docs/setup/mc-install/deregister-install/index.html @@ -99,7 +99,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -125,7 +125,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -817,7 +817,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/setup/mc-install/index.html b/devel/docs/setup/mc-install/index.html index a2c15adc4a..e8b636b839 100644 --- a/devel/docs/setup/mc-install/index.html +++ b/devel/docs/setup/mc-install/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/setup/mc-install/multicluster/index.html b/devel/docs/setup/mc-install/multicluster/index.html index a4ba985740..5dc0888ce1 100644 --- a/devel/docs/setup/mc-install/multicluster/index.html +++ b/devel/docs/setup/mc-install/multicluster/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/setup/mc-install/register/index.html b/devel/docs/setup/mc-install/register/index.html index 3b972f21aa..5ab5fbc195 100644 --- a/devel/docs/setup/mc-install/register/index.html +++ b/devel/docs/setup/mc-install/register/index.html @@ -91,7 +91,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -117,7 +117,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -809,7 +809,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/setup/mc-install/register/register-kubectl/index.html b/devel/docs/setup/mc-install/register/register-kubectl/index.html index a2ce24924e..a25c11dbbb 100644 --- a/devel/docs/setup/mc-install/register/register-kubectl/index.html +++ b/devel/docs/setup/mc-install/register/register-kubectl/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/setup/mc-install/register/syncclusters/index.html b/devel/docs/setup/mc-install/register/syncclusters/index.html index e644bec1f7..52b4a4fd98 100644 --- a/devel/docs/setup/mc-install/register/syncclusters/index.html +++ b/devel/docs/setup/mc-install/register/syncclusters/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/setup/mc-install/register/ui-register/index.html b/devel/docs/setup/mc-install/register/ui-register/index.html index cba8ec8612..48487aff0d 100644 --- a/devel/docs/setup/mc-install/register/ui-register/index.html +++ b/devel/docs/setup/mc-install/register/ui-register/index.html @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/setup/mc-install/troubleshooting-multicluster/index.html b/devel/docs/setup/mc-install/troubleshooting-multicluster/index.html index 3a99f7a094..e16c48b333 100644 --- a/devel/docs/setup/mc-install/troubleshooting-multicluster/index.html +++ b/devel/docs/setup/mc-install/troubleshooting-multicluster/index.html @@ -103,7 +103,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -129,7 +129,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -821,7 +821,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/setup/mc-install/verify-install/index.html b/devel/docs/setup/mc-install/verify-install/index.html index 1126765a6e..22643c1b31 100644 --- a/devel/docs/setup/mc-install/verify-install/index.html +++ b/devel/docs/setup/mc-install/verify-install/index.html @@ -99,7 +99,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -125,7 +125,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -817,7 +817,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/setup/modify-installation/index.html b/devel/docs/setup/modify-installation/index.html index de52d26c2f..49ed3c7741 100644 --- a/devel/docs/setup/modify-installation/index.html +++ b/devel/docs/setup/modify-installation/index.html @@ -103,7 +103,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -129,7 +129,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../" data-offline-search-max-results="10" > @@ -821,7 +821,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/setup/private-registry/private-registry/index.html b/devel/docs/setup/private-registry/private-registry/index.html index 6110d14f40..f940c76421 100644 --- a/devel/docs/setup/private-registry/private-registry/index.html +++ b/devel/docs/setup/private-registry/private-registry/index.html @@ -99,7 +99,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -125,7 +125,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -817,7 +817,7 @@
  • - + +
  • + + + +
  • diff --git a/devel/docs/setup/provision-cluster/capi/index.html b/devel/docs/setup/provision-cluster/capi/index.html index 324bede7c3..64b598e400 100644 --- a/devel/docs/setup/provision-cluster/capi/index.html +++ b/devel/docs/setup/provision-cluster/capi/index.html @@ -25,12 +25,12 @@ - + - - + + @@ -95,7 +95,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -121,7 +121,7 @@ aria-label="Search this site…" autocomplete="off" - data-offline-search-index-json-src="../../../../offline-search-index.3c58c7f9af246c3d1cfd9cb4bf29a97d.json" + data-offline-search-index-json-src="../../../../offline-search-index.4c17a71f6bbc29d5126c199cc268d79c.json" data-offline-search-base-href="../../../../" data-offline-search-max-results="10" > @@ -813,7 +813,7 @@
  • - + +
  • + + + +
  • @@ -1118,7 +1133,12 @@

    Cluster API

    @@ -1139,6 +1159,15 @@

    NOTE

    Next, a CAPI infrastructure provider will provision the first instance on the cloud provider and generate a provider ID, a unique identifier that any future nodes and clusters will use to associate with the instance. It will also create a kubeconfig file. The first control plane node is ready after these are created.

    After the admin cluster is up and running, you can use the clusterAPI component to create additional managed clusters.

    + + + +