PageSourceSearch

https://docs-spectrocloud.netlify.app/assets/js/6aa663f3.a7919bc2.js

js docs-spectrocloud.netlify.app collected 2026-10-03 10:42:11 UTC 33,543 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunkspectro_cloud_docs=self.webpackChunkspectro_cloud_docs||[]).push([["13506"],{876385:function(e,n,r){r.r(n),r.d(n,{frontMatter:()=>o,toc:()=>c,default:()=>h,metadata:()=>s,assets:()=>a,contentTitle:()=>l});var s=JSON.parse('{"id":"vm-management/create-vmo-profile","title":"Create a VMO Profile","description":"Learn how to create a cluster profile to utilize Palette Virtual Machine Orchestrator capabilities.","source":"@site/docs/docs-content/vm-management/create-vmo-profile.md","sourceDirName":"vm-management","slug":"/vm-management/create-vmo-profile","permalink":"/vm-management/create-vmo-profile","draft":false,"unlisted":false,"editUrl":"https://github.com/spectrocloud/librarium/blob/master/docs/docs-content/vm-management/create-vmo-profile.md","tags":[{"inline":true,"label":"vmo","permalink":"/tags/vmo"}],"version":"current","lastUpdatedAt":1777826507000,"sidebarPosition":20,"frontMatter":{"sidebar_label":"Create a VMO Profile","title":"Create a VMO Profile","description":"Learn how to create a cluster profile to utilize Palette Virtual Machine Orchestrator capabilities.","icon":" ","hide_table_of_contents":false,"sidebar_position":20,"tags":["vmo"]},"sidebar":"docSidebar","previous":{"title":"Install VMO in Airgap Environments","permalink":"/vm-management/install-vmo-in-airgap"},"next":{"title":"Configure Private CA Certificate","permalink":"/vm-management/configure-private-ca-certificate"}}'),t=r(474848),i=r(884429);let o={sidebar_label:"Create a VMO Profile",title:"Create a VMO Profile",description:"Learn how to create a cluster profile to utilize Palette Virtual Machine Orchestrator capabilities.",icon:" ",hide_table_of_contents:!1,sidebar_position:20,tags:["vmo"]},l,a={},c=[{value:"Limitations",id:"limitations",level:2},{value:"Prerequisites",id:"prerequisites",level:2},{value:"Create the Profile",id:"create-the-profile",level:2},{value:"Validate",id:"validate",level:2},{value:"Next Steps",id:"next-steps",level:2},{value:"Resources",id:"resources",level:2}];function d(e){let n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components},{Details:r,TabItem:s,Tabs:o,VersionedLink:l}=n;return r||p("Details",!0),s||p("TabItem",!0),o||p("Tabs",!0),l||p("VersionedLink",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.strong,{children:"Virtual Machine Orchestrator"})," pack conveniently includes several components and automatically installs the ",(0,t.jsx)(l,{text:"Spectro Proxy",url:"/integrations/packs/?pack=spectro-proxy"})," pack when you use the default\nprofile configuration. To learn about pack components, refer to ",(0,t.jsx)(n.a,{href:"/vm-management/",children:"Palette VMO"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"limitations",children:"Limitations"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["If you are updating the profile of an existing cluster that already has the ",(0,t.jsx)(n.strong,{children:"Spectro Proxy"})," pack. You must restart\nthe Spectro Proxy pod for the proxy to work as expected."]}),"\n",(0,t.jsx)(n.p,{children:"To restart the Spectro Proxy pod, delete the pod and it will restart automatically. You can issue the following\ncommand to delete the pod:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:"kubectl delete pods --selector app=spectro-proxy --all-namespaces\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Ensure the cluster that you are using with the Virtual Machine Orchestrator pack does not have the\n",(0,t.jsx)(l,{text:" Volume Snapshot Controller",url:"/integrations/packs/?pack=volume-snapshot-controller"})," pack\nalready present in its cluster profile. The Virtual Machine Orchestrator will configure snapshots."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,t.jsxs)(o,{groupId:"environment",children:[(0,t.jsx)(s,{value:"non-edge",label:"Non-edge",children:(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["A Palette permission key ",(0,t.jsx)(n.code,{children:"create"})," for the resource ",(0,t.jsx)(n.code,{children:"clusterProfile"}),"."]}),"\n"]})}),(0,t.jsxs)(s,{value:"edge",label:"Edge",children:[(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["A Palette permission key ",(0,t.jsx)(n.code,{children:"create"})," for the resource ",(0,t.jsx)(n.code,{children:"clusterProfile"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Your Edge cluster profile must have a Container Storage Interface (CSI) pack."}),"\n"]}),"\n"]}),(0,t.jsx)(n.admonition,{type:"warning",children:(0,t.jsxs)(n.p,{children:["We recommend using Ubuntu 22.04 as the OS image for Edge cluster
1s deployed in\n",(0,t.jsx)(n.a,{href:"/deployment-modes/appliance-mode/",children:"appliance mode"}),". Refer to\n",(0,t.jsx)(n.a,{href:"/tutorials/getting-started/palette-edge/introduction-edge",children:"Palette Edge Getting Started"})," for further guidance."]})})]}),(0,t.jsx)(s,{value:"airgap",label:"Airgap",children:(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["A Palette permission key ",(0,t.jsx)(n.code,{children:"create"})," for the resource ",(0,t.jsx)(n.code,{children:"clusterProfile"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Ensure the VMO pack is installed in your airgap environment. Refer to the\n",(0,t.jsx)(n.a,{href:"/vm-management/install-vmo-in-airgap",children:"Install VMO in Airgap Environments"})," guide for further information."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Ensure the Spectro Proxy pack is installed in your airgap environment. Refer to the\n",(0,t.jsx)(n.a,{href:"/vm-management/install-vmo-in-airgap",children:"Install VMO in Airgap Environments"})," guide for further information."]}),"\n"]}),"\n"]})})]}),"\n",(0,t.jsx)(n.h2,{id:"create-the-profile",children:"Create the Profile"}),"\n",(0,t.jsxs)(o,{groupId:"environment",children:[(0,t.jsxs)(s,{value:"non-edge",label:"Non-edge",children:[(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Log in to ",(0,t.jsx)(n.a,{href:"https://console.spectrocloud.com",children:"Palette"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Select ",(0,t.jsx)(n.strong,{children:"Profiles"})," in the left ",(0,t.jsx)(n.strong,{children:"Main Menu"})," and click the ",(0,t.jsx)(n.strong,{children:"Add Cluster Profile"})," button."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Enter basic information for the profile: name, version if desired, and optional description."}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Select type ",(0,t.jsx)(n.strong,{children:"Add-on"}),", and click ",(0,t.jsx)(n.strong,{children:"Next"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["In the following screen, click ",(0,t.jsx)(n.strong,{children:"Add New Pack"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Locate the ",(0,t.jsx)(n.strong,{children:"Virtual Machine Orchestrator"})," pack and add it to your profile."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Review the ",(0,t.jsx)(n.strong,{children:"Access"})," configuration panel at right. The pack provides three access modes."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"charts.virtual-machine-orchestrator.service.type"})," field configures how the Virtual Machine Orchestrator is\nexposed and accessed."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Proxied"})," mode automatically adds the ",(0,t.jsx)(n.strong,{children:"Spectro Proxy"})," pack when you create the cluster, allowing access to the\nSpectro VM Dashboard from anywhere. Check out the\n",(0,t.jsx)(l,{text:"Spectro Proxy",url:"/integrations/packs/?pack=spectro-proxy"})," guide to learn more. This is\nthe default selection. This mode configures the ",(0,t.jsx)(n.code,{children:"ClusterIP"})," service type, which cannot be overridden."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Direct"})," mode is intended for a private configuration where a proxy is not implemented or not desired. Ensure\nthat you configure the ",(0,t.jsx)(l,{text:"Spectro Proxy",url:"/integrations/packs/?pack=spectro-proxy"})," pack\nseparately in your cluster profile if you select this option. This mode configures the ",(0,t.jsx)(n.code,{children:"LoadBalancer"})," service type,\nwhich cannot be overridden."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Custom"})," mode allows you to provide your own access configuration. You can provide your own service type and\ncustom configuration according to your environment."]}),"\n"]}),"\n",(0,t.jsx)(n.admonition,{type:"warning",children:(0,t.jsx)(n.p,{children:"We recommend using the pack defaults. Default settings provide best practices for your cluster
1s. Changing the default\nsettings can introduce misconfigurations. Carefully review the changes you make to a pack."})}),"\n"]}),"\n"]}),(0,t.jsxs)(n.ol,{start:"8",children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["If you are using a Container Storage Interface (CSI) that installs its own Custom Resource Definitions (CRDs) for\nVolumeSnapshotClass, VolumeSnapshot, and VolumeSnapshotContent, you need to disable the equivalent CRDs from being\ninstalled by the VMO pack. An example of such a CSI is the\n",(0,t.jsx)(l,{text:"Portworx with Operator",url:"/integrations/packs/?pack=csi-portworx-generic"})," pack."]}),"\n",(0,t.jsxs)(n.p,{children:["To do this, click ",(0,t.jsx)(n.strong,{children:"Values"})," in the ",(0,t.jsx)(n.strong,{children:"Pack Details"})," section. The pack manifest editor appears. Locate the\n",(0,t.jsx)(n.code,{children:"charts.virtual-machine-orchestrator.snapshotController.installCRDs"})," parameter in the manifest and set its value to\n",(0,t.jsx)(n.code,{children:"false"}),"."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"{6}",children:"charts:\n  virtual-machine-orchestrator:\n    ...\n    snapshotController:\n      ...\n      installCRDs: false\n"})}),"\n"]}),"\n"]}),(0,t.jsxs)(n.ol,{start:"9",children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Click ",(0,t.jsx)(n.strong,{children:"Confirm & Create"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["In the following screen, click ",(0,t.jsx)(n.strong,{children:"Next"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Review the profile and click ",(0,t.jsx)(n.strong,{children:"Finish Configuration"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Apply the profile to your cluster. For more information, refer to the ",(0,t.jsx)(n.a,{href:"/getting-started/",children:"Getting Started"}),"\ntutorials."]}),"\n"]}),"\n"]})]}),(0,t.jsxs)(s,{value:"edge",label:"Edge",children:[(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Log in to ",(0,t.jsx)(n.a,{href:"https://console.spectrocloud.com",children:"Palette"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Select ",(0,t.jsx)(n.strong,{children:"Profiles"})," in the left ",(0,t.jsx)(n.strong,{children:"Main Menu"})," and click the ",(0,t.jsx)(n.strong,{children:"Add Cluster Profile"})," button."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Enter basic information for the profile: name, version if desired, and optional description."}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Select type ",(0,t.jsx)(n.strong,{children:"Add-on"}),", and click ",(0,t.jsx)(n.strong,{children:"Next"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["In the following screen, click ",(0,t.jsx)(n.strong,{children:"Add New Pack"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Locate the ",(0,t.jsx)(n.strong,{children:"Virtual Machine Orchestrator"})," pack and add it to your profile."]}),"\n"]}),"\n"]}),(0,t.jsxs)(n.ol,{start:"7",children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Review the ",(0,t.jsx)(n.strong,{children:"Access"})," configuration panel at right. The pack provides three access modes."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"charts.virtual-machine-orchestrator.service.type"})," field configures how the Virtual Machine Orchestrator is exposed and accessed."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Proxied"})," mode automatically adds the ",(0,t.jsx)(n.strong,{children:"Spectro Proxy"})," pack when you create the cluster, allowing access to the\nSpectro VM Dashboard from anywhere. Check out the\n",(0,t.jsx)(l,{text:"Spectro Proxy",url:"/integrations/packs/?pack=spectro-proxy"})," guide to learn more. This is\nthe default selection. This mode configures the ",(0,t.jsx)(n.code,{children:"ClusterIP"})," service type, which cannot be overridden."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Direct"})," mode is intended for a private configuration where a proxy is not implemented or not desired. Ensure\nthat you configure the ",(0,t.jsx)(l,{text:"Spectro Proxy",url:"/integrations/packs/?pack=spectro-proxy"})," pack\nseparately in your cluster profile if you select this option. This mode configures the ",(0,t.jsx)(n.code,{children:"LoadBalancer"})," service type,\nwhich cannot be overridden."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Custom"})," mode allows you to provide your own access configuration. You can provide your own service type and\ncustom configuration according to your environment."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"If you are using PKX-E, no change is required and you can skip this 
1step."}),"\n",(0,t.jsxs)(n.p,{children:["If you are using K3s or RKE2 as the Kubernetes layer in your cluster profile, you need to update the\n",(0,t.jsx)(n.code,{children:"charts.virtual-machine-orchestrator.multus.networkController"})," parameter in the ",(0,t.jsx)(n.code,{children:"values.yaml"})," for the VMO pack. Add\na line for the parameter ",(0,t.jsx)(n.code,{children:"enableK3SHostPath"})," and set its value to ",(0,t.jsx)(n.code,{children:"true"}),". In addition, change\n",(0,t.jsx)(n.code,{children:"criSocketContainerPath"})," to ",(0,t.jsx)(n.code,{children:"/host/run/containerd/containerd.sock"}),"."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"{3-4}",children:"networkController:\n  criSocket:\n    enableK3SHostPath: true\n    criSocketContainerPath: /host/run/containerd/containerd.sock\n"})}),"\n"]}),"\n"]}),(0,t.jsxs)(n.ol,{start:"9",children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["If your cluster profile does include a load balancer such as MetalLB, no changes are required and you can skip this\nstep. For more information about MetalLB, refer to the ",(0,t.jsx)(l,{text:"MetalLB pack documentation",url:"/integrations/packs/?pack=lb-metallb-helm"})]}),"\n",(0,t.jsxs)(n.p,{children:["If your cluster profile does not include a load balancer, update the services\n",(0,t.jsx)(n.code,{children:"charts.virtual-machine-orchestrator.kubevirt"})," and ",(0,t.jsx)(n.code,{children:"charts.virtual-machine-orchestrator.cdi"})," to type ClusterIP in\n",(0,t.jsx)(n.strong,{children:"values.yaml"})," for the VMO pack:"]}),"\n",(0,t.jsxs)(o,{children:[(0,t.jsx)(s,{value:"cdi",label:"cdi",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"{10}",children:'cdi:\n  enabled: true\n  replicas: 1\n  image:\n    repository: quay.io/kubevirt/cdi-operator\n    pullPolicy: IfNotPresent\n    # Overrides the image tag whose default is the chart appVersion.\n    tag: "v1.56.0"\n  service:\n    type: ClusterIP\n    port: 443\n    targetPort: 8443\n'})})}),(0,t.jsx)(s,{value:"kubevirt",label:"kubevirt",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"{7}",children:"kubevirt:\n  enabled: true\n  # defaults to kubevirt\n  namespace: kubevirt\n  replicas: 1\n  service:\n    type: ClusterIP\n    port: 443\n    targetPort: 8443\n"})})})]}),"\n"]}),"\n"]}),(0,t.jsxs)(n.ol,{start:"10",children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["If you are using a Container Storage Interface (CSI) that installs its own Custom Resource Definitions (CRDs) for\nVolumeSnapshotClass, VolumeSnapshot, and VolumeSnapshotContent, you need to disable the equivalent CRDs from being\ninstalled by the VMO pack. An example of such a CSI is the\n",(0,t.jsx)(l,{text:"Portworx with Operator",url:"/integrations/packs/?pack=csi-portworx-generic"})," pack."]}),"\n",(0,t.jsxs)(n.p,{children:["To do this, click ",(0,t.jsx)(n.strong,{children:"Values"})," in the ",(0,t.jsx)(n.strong,{children:"Pack Details"})," section. The pack manifest editor appears. Locate the\n",(0,t.jsx)(n.code,{children:"charts.virtual-machine-orchestrator.snapshotController.installCRDs"})," parameter in the manifest and set its value to\n",(0,t.jsx)(n.code,{children:"false"}),"."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"{6}",children:"charts:\n  virtual-machine-orchestrator:\n    ...\n    snapshotController:\n      ...\n      installCRDs: false\n"})}),"\n"]}),"\n"]}),(0,t.jsxs)(n.ol,{start:"11",children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Click ",(0,t.jsx)(n.strong,{children:"Confirm & Create"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["In the following screen, click ",(0,t.jsx)(n.strong,{children:"Next"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Review the profile and click ",(0,t.jsx)(n.strong,{children:"Finish Configuration"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Add the add-on profile when you create a cluster. For more information, refer to\n",(0,t.jsx)(n.a,{href:"/clusters/edge/site-deployment/cluster-deployment",children:"Create Cluster Definition"}),"."]}),"\n"]}),"\n"]})]}),(0,t.jsxs)(s,{value:"airgap",label:"Airgap",children:[(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Log in to a tenant that belongs to your instance of Palette or Palette VerteX."}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["In the left ",(0,t.jsx)(n.strong,{children:"Main Menu"}),", select ",(0,t.jsx)(n.strong,{children:"Profiles"})," and click ",(0,t.jsx)(n.strong,{children:"Add Cluster Profile"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Enter basic 
1information for the profile: name, version if desired, and optional description."}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Select type ",(0,t.jsx)(n.strong,{children:"Add-on"}),", and click ",(0,t.jsx)(n.strong,{children:"Next"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["In the following screen, click ",(0,t.jsx)(n.strong,{children:"Add New Pack"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Locate the ",(0,t.jsx)(n.strong,{children:"Virtual Machine Orchestrator"})," pack and add it to your profile."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Review the ",(0,t.jsx)(n.strong,{children:"Access"})," configuration panel at right. The pack provides three access modes."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"charts.virtual-machine-orchestrator.service.type"})," field configures how the Virtual Machine Orchestrator is\nexposed and accessed."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Proxied"})," mode automatically adds the ",(0,t.jsx)(n.strong,{children:"Spectro Proxy"})," pack when you create the cluster, allowing access to the\nSpectro VM Dashboard from anywhere. Check out the\n",(0,t.jsx)(l,{text:"Spectro Proxy",url:"/integrations/packs/?pack=spectro-proxy"})," guide to learn more. This is\nthe default selection. This mode configures the ",(0,t.jsx)(n.code,{children:"ClusterIP"})," service type, which cannot be overridden."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Direct"})," mode is intended for a private configuration where a proxy is not implemented or not desired. Ensure\nthat you configure the ",(0,t.jsx)(l,{text:"Spectro Proxy",url:"/integrations/packs/?pack=spectro-proxy"})," pack\nseparately in your cluster profile if you select this option. This mode configures the ",(0,t.jsx)(n.code,{children:"LoadBalancer"})," service\ntype, which cannot be overridden."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Custom"})," mode allows you to provide your own access configuration. You can provide your own service type and\ncustom configuration according to your environment."]}),"\n"]}),"\n",(0,t.jsx)(n.admonition,{type:"warning",children:(0,t.jsx)(n.p,{children:"We recommend using the pack defaults. Default settings provide best practices for your clusters. Changing the\ndefault settings can introduce misconfigurations. Carefully review the changes you make to a pack."})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Click ",(0,t.jsx)(n.strong,{children:"Values"})," in the ",(0,t.jsx)(n.strong,{children:"Pack Details"})," section. The pack manifest editor appears. Locate the\n",(0,t.jsx)(n.code,{children:"pack.cdi.privateRegistry"})," section in the manifest. The table below contains a brief description of each field\nexposed by the private registry. Set the ",(0,t.jsx)(n.code,{children:"pack.cdi.privateRegistry.enabled"})," field to true and fill in the registry\nIP address and base path according to your environment. This configures the VMO pack to pull images from your airgap\nenvironment private registry."]}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Field"}),(0,t.jsx)(n.th,{children:"Description"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"pack.cdi.privateRegistry.enabled"})}),(0,t.jsx)(n.td,{children:"Flag to enable the profile to use the airgap private image registry."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"pack.cdi.privateRegistry.registryIP"})}),(0,t.jsx)(n.td,{children:"The IP address the private image registry."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"pack.cdi.privateRegistry.registryBasePath"})}),(0,t.jsx)(n.td,{children:"The base path of the private image registry."})]})]})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"cdi:\n  privateRegistry:\n    enabled: true\n    registryIP: <REPLACE ME>\n    registryBasePath: <REPLACE ME>\n"})}),"\n"]}),"\n"]}),(0,t.jsxs)(n.ol,{start:"9",children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["If you are using a Container Storage Interface (CSI) that installs its own Custom Resource Definitions (CRDs) for\nVolumeSnapshotClass, VolumeSnapshot, and VolumeSnapshotContent, you need to disable the equivalent CRDs from being\ninstalled by the VMO pack. An example of such a CSI is the\n",(0,t.jsx)(l,{text:"Portworx with Operator",url:"/integrations/packs/?pack=csi-portworx-generic"})," pack."]}),"\n",(0,t.jsxs)(n.p,{children:["To do this, click ",(0,t.jsx)(n.strong,{children:"Values"})," in the ",(0,t.jsx)(n.strong,{children:"Pack Details"})," section. The pack manifest editor appears. Locate the\n",(0,t.jsx)(n.code,{children:"charts.virtual-machine-orchestrator.snapshotController.installCRDs"})," parameter in the manifest and set its value to\n",(0,t.jsx)(n.code,{children:"false"}),"."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",metastring:"{6}",children:"charts:\n  virtual-machine-orchestrator:\n    ...\n    snapshotController:\n      ...\n      installCRDs: false\n"})}),"\n"]}),"\n"]}),(0,t.jsxs)(n.ol,{start:"10",children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Click ",(0,t.jsx)(n.strong,{children:"Confirm & Create"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["On the following screen, click ",(0,t.jsx)(n.strong,{children:"Next"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Review the profile and click ",(0,t.jsx)(n.strong,{children:"Finish Configuration"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Apply the profile to your cluster. For more information, refer to the ",(0,t.jsx)(n.a,{href:"/getting-started/",children:"Getting Started"}),"\ntutorials."]}),"\n"]}),"\n"]}),(0,t.jsxs)(n.admonition,{type:"info",children:[(0,t.jsxs)(n.p,{children:["If you want to use direct access in an environment c
1onfigured to use an external proxy, you must exclude your cluster's\nload balancer IP range from proxy routing. Expand the following section to learn how you can configure your\nenvironment's ",(0,t.jsx)(n.strong,{children:"No Proxy"})," list."]}),(0,t.jsxs)(r,{children:[(0,t.jsxs)("summary",{children:["Configure the ",(0,t.jsx)(n.strong,{children:"No Proxy"})," list"]}),(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Download the ",(0,t.jsx)(n.a,{href:"/clusters/cluster-management/kubeconfig",children:"Kubeconfig"})," file of the airgap support VM."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Open a terminal window and set the environment variable ",(0,t.jsx)(n.code,{children:"KUBECONFIG"})," to point to the file you downloaded."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:"export KUBECONFIG=<path-to-downloaded-kubeconfig-file>\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Execute the following command to find the namespace which contains your environment proxy configuration. Make a note of the namespace."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:"kubectl get podpreset --all-namespaces --field-selector=metadata.name=proxy\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Issue following command to edit the pod preset. Replace the placeholder with the namespace you identified previously."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:"kubectl edit podpreset proxy --namespace <namespace>\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Add your load balancer IP range to the ",(0,t.jsx)(n.code,{children:"NO_PROXY"})," configuration under the ",(0,t.jsx)(n.code,{children:"spec.env"})," section."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'env:\n  - name: NO_PROXY\n    value: "REPLACE ME"\n'})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Save your changes and close the editor."}),"\n"]}),"\n"]}),(0,t.jsx)(n.p,{children:"Your configuration changes are automatically applied."})]})]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"validate",children:"Validate"}),"\n",(0,t.jsx)(n.p,{children:"You can validate the profile is created."}),"\n",(0,t.jsxs)(o,{groupId:"environment",children:[(0,t.jsx)(s,{value:"non-edge",label:"Non-edge",children:(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Log in to ",(0,t.jsx)(n.a,{href:"https://console.spectrocloud.com",children:"Palette"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Navigate to ",(0,t.jsx)(n.strong,{children:"Profiles"})," from the left ",(0,t.jsx)(n.strong,{children:"Main Menu"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Locate the newly created profile in the list."}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["From the left ",(0,t.jsx)(n.strong,{children:"Main Menu"}),", click ",(0,t.jsx)(n.strong,{children:"Clusters"})," and select your cluster."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Based on your Single Sign-On (SSO) settings, the ",(0,t.jsx)(n.strong,{children:"Virtual Machines"})," tab may display on the ",(0,t.jsx)(n.strong,{children:"Cluster Overview"}),"\npage, or the ",(0,t.jsx)(n.strong,{children:"Connect"})," button may display next to ",(0,t.jsx)(n.strong,{children:"Virtual Machines Dashboard"})," in cluster details."]}),"\n"]}),"\n"]})}),(0,t.jsx)(s,{value:"edge",label:"Edge",children:(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Log in to ",(0,t.jsx)(n.a,{href:"https://console.spectrocloud.com",children:"Palette"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Navigate to ",(0,t.jsx)(n.strong,{children:"Profiles"})," from the left ",(0,t.jsx)(n.strong,{children:"Main Menu"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Locate the newly created profile in the list."}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["From the left ",(0,t.jsx)(n.strong,{children:"Main Menu"}
1),", click ",(0,t.jsx)(n.strong,{children:"Clusters"})," and select your cluster."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Based on your Single Sign-On (SSO) settings, the ",(0,t.jsx)(n.strong,{children:"Virtual Machines"})," tab may display on the ",(0,t.jsx)(n.strong,{children:"Cluster Overview"}),"\npage, or the ",(0,t.jsx)(n.strong,{children:"Connect"})," button may display next to ",(0,t.jsx)(n.strong,{children:"Virtual Machines Dashboard"})," in cluster details."]}),"\n"]}),"\n"]})}),(0,t.jsx)(s,{value:"airgap",label:"Airgap",children:(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Log in to a tenant that belongs to your instance of Palette or Palette VerteX."}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Navigate to ",(0,t.jsx)(n.strong,{children:"Profiles"})," from the left ",(0,t.jsx)(n.strong,{children:"Main Menu"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Locate the newly created profile in the list."}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["From the left ",(0,t.jsx)(n.strong,{children:"Main Menu"}),", click ",(0,t.jsx)(n.strong,{children:"Clusters"})," and select your cluster."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Based on your Single Sign-On (SSO) settings, the ",(0,t.jsx)(n.strong,{children:"Virtual Machines"})," tab may display on the ",(0,t.jsx)(n.strong,{children:"Cluster Overview"}),"\npage, or the ",(0,t.jsx)(n.strong,{children:"Connect"})," button may display next to ",(0,t.jsx)(n.strong,{children:"Virtual Machines Dashboard"})," in cluster details."]}),"\n"]}),"\n"]})})]}),"\n",(0,t.jsx)(n.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,t.jsxs)(n.p,{children:["You will need to configure roles and role bindings to give users access to clusters. You can use VM user roles and\npermissions or standard Kubernetes roles. For configuration guidance, refer to\n",(0,t.jsx)(n.a,{href:"/vm-management/rbac/add-roles-and-role-bindings",children:"Add Roles and Role Bindings"}),". The\n",(0,t.jsx)(n.a,{href:"/vm-management/rbac/vm-roles-permissions",children:"VM User Roles and Permissions"})," reference lists Cluster Roles and equivalent Palette\nRoles."]}),"\n",(0,t.jsxs)(n.p,{children:["If you have OpenID Connect (OIDC) configured at the Kubernetes layer of your cluster profile, you can create a role\nbinding that maps individual users or groups assigned within the OIDC provider's configuration to a role. Refer to the ",(0,t.jsx)(l,{text:"Palette eXtended Kubernetes (PXK)",url:"/integrations/packs/?pack=kubernetes&tab=custom"})," pack additional guidance for more information."]}),"\n",(0,t.jsx)(n.h2,{id:"resources",children:"Resources"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"/vm-management/rbac/add-roles-and-role-bindings",children:"Add Roles and Role Bindings"})}),"\n"]})]})}function h(e={}){let{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}function p(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},884429:function(e,n,r){r.d(n,{R:()=>o,x:()=>l});var s=r(296540);let t={},i=s.createContext(t);function o(e){let n=s.useContext(i);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.