1"use strict";(self.webpackChunkvcluster_docs=self.webpackChunkvcluster_docs||[]).push([["12280"],{55317(e,t,r){r.d(t,{Ay:()=>o,RM:()=>i});var n=r(74848),s=r(28453),l=r(95310);let i=[];function a(e){let t={admonition:"admonition",...(0,s.R)(),...e.components};return(0,n.jsxs)(t.admonition,{title:"Supported Configurations",type:"info",children:[(e.hostNodes||e.privateNodes)&&(0,n.jsxs)("div",{children:["Running the control plane as a container with:",(0,n.jsxs)("ul",{className:"tenancy-list",children:[e.hostNodes&&(0,n.jsx)("li",{children:(0,n.jsx)("b",{children:(0,n.jsx)(l.A,{to:"/docs/vcluster/introduction/architecture#shared-nodes",children:"Shared Nodes"})})}),e.privateNodes&&(0,n.jsx)("li",{children:(0,n.jsx)("b",{children:(0,n.jsx)(l.A,{to:"/docs/vcluster/introduction/architecture#private-nodes",children:"Private Nodes"})})})]})]}),e.standalone&&(0,n.jsxs)("div",{children:["Running the control plane as a binary with ",(0,n.jsx)("b",{children:(0,n.jsx)(l.A,{to:"/docs/vcluster/deploy/control-plane/binary",children:"vCluster Standalone"})}),". When scaling with additional worker nodes, they are joined as ",(0,n.jsx)("b",{children:(0,n.jsx)(l.A,{to:"/docs/vcluster/introduction/architecture#private-nodes",children:"private nodes"})}),"."]})]})}function o(e={}){let{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(a,{...e})}):a(e)}},9164(e,t,r){r.r(t),r.d(t,{metadata:()=>n,default:()=>u,frontMatter:()=>a,contentTitle:()=>o,toc:()=>d,assets:()=>c});var n=JSON.parse('{"id":"learn-how-to/airgapped-vcluster-deployment","title":"Deploy vCluster in an air-gapped environment using a private web server","description":"Deploy vCluster in an air-gapped environment without an internal Helm repository.","source":"@site/vcluster_versioned_docs/version-0.37.0/learn-how-to/airgapped-vcluster-deployment.mdx","sourceDirName":"learn-how-to","slug":"/learn-how-to/airgapped-vcluster-deployment","permalink":"/docs/vcluster/learn-how-to/airgapped-vcluster-deployment","draft":false,"unlisted":false,"editUrl":"https://github.com/loft-sh/vcluster-docs/edit/main/vcluster_versioned_docs/version-0.37.0/learn-how-to/airgapped-vcluster-deployment.mdx","tags":[],"version":"0.37.0","frontMatter":{"title":"Deploy vCluster in an air-gapped environment using a private web server","sidebar_label":"Deploy using a private web server","description":"Deploy vCluster in an air-gapped environment without an internal Helm repository.","sidebar_class_name":"host-nodes"},"sidebar":"siteSidebar","previous":{"title":"Calico network policies","permalink":"/docs/vcluster/learn-how-to/sync-calico-network-policies"},"next":{"title":"In-cluster registry access","permalink":"/docs/vcluster/learn-how-to/in-cluster-registry"}}'),s=r(74848),l=r(28453),i=r(55317);let a={title:"Deploy vCluster in an air-gapped environment using a private web server",sidebar_label:"Deploy using a private web server",description:"Deploy vCluster in an air-gapped environment without an internal Helm repository.",sidebar_class_name:"host-nodes"},o,c={},d=[...i.RM,{value:"Prerequisites",id:"prerequisites",level:2},{value:"Procedure",id:"procedure",level:2},{value:"Download and host the Helm chart",id:"download-and-host-the-helm-chart",level:3},{value:"Deploy vCluster using the private Helm chart",id:"deploy-vcluster-using-the-private-helm-chart",level:3},{value:"Use the Helm CLI",id:"use-the-helm-cli",level:4},{value:"Use the platform",id:"use-the-platform",level:4},{value:"Use a template",id:"use-a-template",level:5},{value:"Use directly in the VirtualClusterInstance resource",id:"use-directly-in-the-virtualclusterinstance-resource",level:5}];function h(e){let t={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",h4:"h4",h5:"h5",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,l.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.Ay,{hostNodes:"true"}),"\n",(0,s.jsx)(t.p,{children:"For installing vCluster Standalone or Private Nodes in air-gapped environments, follow these tutorials:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"/docs/vcluster/deploy/control-plane/binary/security/air-gapped",children:"vCluster Standalone Air-gapped"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"/docs/vcluster/deploy/worker-nodes/private-nodes/security/air-gapped",children:"Private Nodes Air-gapped"})}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"The standard method for installing vCluster is using Helm with the vCluster Labs charts repository. For air-gapped environments without internet access, you'll need to host the Helm chart locally. This guide demonstrates how to use a private GitLab instance as a web server to host the vCluster Helm chart."}),"\n",(0,s.jsx)(t.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["A web server accessible through HTTP or HTTPS to store the Helm chart and ",(0,s.jsx)(t.code,{children:"index.yaml"})]}),"\n",(0,s.jsx)(t.li,{children:"A private GitLab instance (used in this example)"}),"\n",(0,s.jsx)(t.li,{children:"A machine with internet access that has the Helm CLI installed"}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"procedure",children:"Procedure"}),"\n",(0,s.jsx)(t.h3,{id:"download-and-host-the-helm-chart",children:"Download and host the Helm chart"}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:"Add and update the vCluster Helm repository on a machine with internet access:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"helm repo add loft https://charts.loft.sh\nhelm repo update\n"})}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:"Download the Helm chart to your local disk:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"helm pull loft/vcluster --version 0.23.0\n"})}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:"Store the chart on your web server:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"git clone <gitlab-repo-url>\ncd <gitlab-repo>\nmkdir vcluster\nmv vcluster-0.23.0.tgz vcluster/\n"})}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["Create an ",(0,s.jsx)(t.code,{children:"index.yaml"})," file and push it to the GitLab repository:"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:'helm repo index vcluster --url https://your-private-server.com/your-username/your-private-project/path-to-vcluster-chart\ngit add -A\ngit commit -m "Add vCluster Helm chart"\ngit push\n'})}),"\n",(0,s.jsx)(t.admonition,{type:"note",children:(0,s.jsxs)(t.p,{children:["Ensure the URL you specify points to the location where ",(0,s.jsx)(t.code,{children:"vcluster-0.23.0.tgz"})," can be accessible to the target cluster."]})}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"deploy-vcluster-using-the-private-helm-chart",children:"Deploy vCluster using the private Helm chart"}),"\n",(0,s.jsx)(t.p,{children:"After hosting the chart, deploy vCluster using either the Helm CLI or the vCluster platform"}),"\n",(0,s.jsx)(t.h4,{id:"use-the-helm-cli",children:"Use the Helm CLI"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"helm upgrade --install my-vcluster vcluster \\\n --values vcluster.yaml \\\n --repo https://your-private-server.com/your-username/your-private-project/path-to-vcluster-chart-directory \\\n --version 0.23.0 \\\n --namespace my-namespace \\\n --repository-config=''\n"})}),"\n",(0,s.jsx)(t.h4,{id:"use-the-platform",children:"Use the platform"}),"\n",(0,s.jsx)(t.p,{children:"You can specify the private repository in your vCluster configuration:"}),"\n",(0,s.jsx)(t.h5,{id:"use-a-template",children:"Use a template"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-yaml",children:"kind: VirtualClusterTemplate\napiVersion: management.loft.sh/v1\nmetadata:\n name: my-template\nspec:\n template:\n helmRelease:\n chart:\n repo: https://your-private-server.com/your-username/your-private-project/path-to-vcluster-chart-directory\n version: 0.23.0\n"})}),"\n",(0,s.jsx)(t.h5,{id:"use-directly-in-the-virtualclusterinstance-resource",children:"Use directly in the VirtualClusterInstance resource"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-yaml",children:"kind: VirtualClusterInstance\napiVersion: management.loft.sh/v1\nmetadata:\n name: my-vcluster\nspec:\n template:\n helmRelease:\n chart:\n repo: https://your-private-server.com/your-username/your-private-project/path-to-vcluster-chart-directory\n version: 0.23.0\n"})}),"\n",(0,s.jsx)(t.p,{children:"After creating the configuration, verify the deployment by creating the tenant cluster through the platform UI."})]})}function u(e={}){let{wrapper:t}={...(0,l.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},28453(e,t,r){r.d(t,{R:()=>i,x:()=>a});var n=r(96540);let s={},l=n.createContext(s);function i(e){let t=n.useContext(l);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),n.createElement(l.Provider,{value:t},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.