1"use strict";(self.webpackChunkvcluster_docs=self.webpackChunkvcluster_docs||[]).push([["11717"],{6364(e,t,s){s.d(t,{Ay:()=>i,RM:()=>l});var n=s(74848),r=s(28453);s(77444);let l=[];function o(e){let t={a:"a",admonition:"admonition",p:"p",...(0,r.R)(),...e.components};return(0,n.jsx)("div",{className:"enterprise-feature",children:(0,n.jsx)(t.admonition,{title:"Enterprise-Only Feature",type:"info",children:(0,n.jsxs)(t.p,{children:["This feature is an Enterprise feature. See our ",(0,n.jsx)(t.a,{href:"https://www.vcluster.com/pricing",children:"pricing plans"})," or ",(0,n.jsx)(t.a,{href:"https://www.vcluster.com/enterprise-demo",children:"contact our sales team"})," for more information."]})})})}function i(e={}){let{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(o,{...e})}):o(e)}},48832(e,t,s){s.d(t,{Ay:()=>c,RM:()=>i});var n=s(74848),r=s(28453),l=s(50773),o=s(57250);let i=[];function a(e){let t={a:"a",admonition:"admonition",code:"code",p:"p",pre:"pre",strong:"strong",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(l.A,{groupId:"install-cli",defaultValue:"brew",values:[{label:"Homebrew",value:"brew"},{label:"Mac (Intel/AMD)",value:"mac"},{label:"Mac (Silicon/ARM)",value:"mac-arm"},{label:"Linux (AMD)",value:"linux"},{label:"Linux (ARM)",value:"linux-arm"},{label:"Download Binary",value:"download-binary"},{label:"Windows Powershell",value:"windows"}],children:[(0,n.jsxs)(o.A,{value:"brew",children:[(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"brew install loft-sh/tap/vcluster\n"})}),(0,n.jsxs)(t.p,{children:["The binaries in the tap are signed using the ",(0,n.jsx)(t.a,{href:"https://docs.sigstore.dev/",children:"Sigstore"})," framework for enhanced security."]})]}),(0,n.jsx)(o.A,{value:"mac",children:(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:'curl -L -o vcluster "https://github.com/loft-sh/vcluster/releases/latest/download/vcluster-darwin-amd64" && sudo install -c -m 0755 vcluster /usr/local/bin && rm -f vcluster\n'})})}),(0,n.jsx)(o.A,{value:"mac-arm",children:(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:'curl -L -o vcluster "https://github.com/loft-sh/vcluster/releases/latest/download/vcluster-darwin-arm64" && sudo install -c -m 0755 vcluster /usr/local/bin && rm -f vcluster\n'})})}),(0,n.jsx)(o.A,{value:"linux",children:(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:'curl -L -o vcluster "https://github.com/loft-sh/vcluster/releases/latest/download/vcluster-linux-amd64" && sudo install -c -m 0755 vcluster /usr/local/bin && rm -f vcluster\n'})})}),(0,n.jsx)(o.A,{value:"linux-arm",children:(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:'curl -L -o vcluster "https://github.com/loft-sh/vcluster/releases/latest/download/vcluster-linux-arm64" && sudo install -c -m 0755 vcluster /usr/local/bin && rm -f vcluster\n'})})}),(0,n.jsx)(o.A,{value:"download-binary",children:(0,n.jsxs)(t.p,{children:["Download the binary for your platform from the ",(0,n.jsx)(t.a,{href:"https://github.com/loft-sh/vcluster/releases",children:"GitHub Releases"})," page and add this binary to your $PATH."]})}),(0,n.jsxs)(o.A,{value:"windows",children:[(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-powershell",metastring:"{4}",children:'md -Force "$Env:APPDATA\\vcluster"; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]\'Tls,Tls11,Tls12\';\nInvoke-WebRequest -URI "https://github.com/loft-sh/vcluster/releases/latest/download/vcluster-windows-amd64.exe" -o $Env:APPDATA\\vcluster\\vcluster.exe;\n$env:Path += ";" + $Env:APPDATA + "\\vcluster";\n[Environment]::SetEnvironmentVariable("Path", $env:Path, [System.EnvironmentVariableTarget]::User);\n'})}),(0,n.jsx)(t.admonition,{title:"Reboot Required",type:"caution",children:(0,n.jsx)(t.p,{children:"You may need to reboot your computer to use the CLI due to changes to the PATH variable (see below)."})}),(0,n.jsxs)(t.admonition,{title:"Check Environment Variable $PATH",type:"info",children:[(0,n.jsxs)(t.p,{children:["Line 4 of this install script adds the install directory ",(0,n.jsx)(t.code,{children:"%APPDATA%\\vcluster"})," to the ",(0,n.jsx)(t.code,{children:"$PATH"}),"environment variable. This is only effective for the current Powershell session, i.e. when opening a new terminal window,",(0,n.jsx)(t.code,{children:"vcluster"}
1)," may not be found."]}),(0,n.jsx)(t.p,{children:(0,n.jsxs)(t.strong,{children:["Make sure to add the folder ",(0,n.jsx)(t.code,{children:"%APPDATA%\\vcluster"})," to the ",(0,n.jsx)(t.code,{children:"PATH"})," environment variable after installing vcluster CLI via Powershell. Afterward, a reboot might be necessary."]})})]})]})]}),"\n",(0,n.jsx)(t.p,{children:"Verify the CLI installed successfully."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"vcluster --version\n"})}),"\n",(0,n.jsx)(t.p,{children:"Output is similar to:"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"vCluster version 0.x.x\n"})})]})}function c(e={}){let{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(a,{...e})}):a(e)}},36336(e,t,s){s.d(t,{Ay:()=>a,RM:()=>o});var n=s(74848),r=s(28453),l=s(52980);let o=[];function i(e){let t={a:"a",admonition:"admonition",code:"code",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["Administrator access to a Kubernetes cluster: See ",(0,n.jsx)(t.a,{href:"https://kubernetes.io/docs/tasks/tools/#kubectl",children:"Accessing Clusters with kubectl"})," for more information.\nYour current kube-context must have administrative privileges, which you can verify with ",(0,n.jsx)(t.code,{children:"kubectl auth can-i create clusterrole -A"})]}),"\n",(0,n.jsx)(t.admonition,{type:"info",children:(0,n.jsxs)(t.p,{children:["To obtain a kube-context with admin access, ensure you have the necessary credentials and permissions for your Kubernetes cluster. This typically involves using ",(0,n.jsx)(t.code,{children:"kubectl config"})," commands or authenticating through your cloud provider's CLI tools."]})}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.code,{children:"helm"})," installed: Helm ",(0,n.jsx)(l.A,{children:"v3.10.0+"})," is required for deploying the platform. Refer to the ",(0,n.jsx)(t.a,{href:"https://helm.sh/docs/intro/install/",children:"Helm Installation Guide"})," if you need to install it."]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.code,{children:"kubectl"})," installed: Kubernetes command-line tool for interacting with the cluster. See ",(0,n.jsx)(t.a,{href:"https://kubernetes.io/docs/tasks/tools/#kubectl",children:"Install and Set Up kubectl"})," for installation instructions."]}),"\n"]}),"\n"]})}function a(e={}){let{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(i,{...e})}):i(e)}},3914(e,t,s){s.d(t,{Ay:()=>i,RM:()=>l});var n=s(74848),r=s(28453);let l=[];function o(e){let t={a:"a",admonition:"admonition",code:"code",li:"li",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(t.p,{children:["After logging into the UI, you'll be able to start creating virtual clusters immediately. You're automatically part of a ",(0,n.jsx)(t.a,{href:"/docs/platform/4.9.0/understand/what-are-projects",children:"project"})," called ",(0,n.jsx)(t.code,{children:"Default Project"}),"."]}),"\n",(0,n.jsxs)(t.p,{children:["Click ",(0,n.jsx)(t.strong,{children:"New Virtual Cluster"})," and ",(0,n.jsx)(t.strong,{children:"Create"})," to spin one up to try out."]}),"\n",(0,n.jsx)(t.admonition,{type:"tip",children:(0,n.jsxs)(t.p,{children:["Find more information about creating virtual clusters in the ",(0,n.jsx)(t.a,{href:"/docs/platform/4.9.0/use-platform/virtual-clusters/create/create-no-template",children:"create virtual\nclusters"})," section."]})}),"\n",(0,n.jsx)(t.p,{children:"Otherwise, read more about some primary concepts:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.a,{href:"/docs/platform/4.9.0/understand/what-are-projects",children:"Projects"})," - How resources can be grouped together into different projects."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.a,{href:"/docs/platform/4.9.0/introduction/vcluster_intro",children:"Tenant cluster
1s"})," - What tenant clusters are and how Platform manages them."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.a,{href:"/docs/platform/4.9.0/understand/what-are-templates",children:"Templates"})," - How to use templates to control what type of resources that can be made."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.a,{href:"/docs/platform/4.9.0/understand/what-are-clusters",children:"Connected clusters"})," - How to connect Control Plane Clusters to the platform."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.a,{href:"/vcluster/manage/sleep-wakeup",children:"Auto sleep and wakeup"})," - How to temporarily scale down unused virtual clusters and bring them back up."]}),"\n"]})]})}function i(e={}){let{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(o,{...e})}):o(e)}},99583(e,t,s){s.d(t,{Ay:()=>i,RM:()=>l});var n=s(74848),r=s(28453);let l=[];function o(e){let t={admonition:"admonition",code:"code",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,n.jsxs)(t.admonition,{type:"tip",children:[(0,n.jsx)(t.p,{children:"To retrieve all available versions of the platform Helm chart, run the following command:"}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="List available platform versions"',children:"helm search repo loft/vcluster-platform\n"})})]})}function i(e={}){let{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(o,{...e})}):o(e)}},94893(e,t,s){s.r(t),s.d(t,{metadata:()=>n,default:()=>x,frontMatter:()=>h,contentTitle:()=>p,toc:()=>g,assets:()=>m});var n=JSON.parse('{"id":"install/environments/gcp","title":"Install vCluster Platform on Google Cloud using GKE","description":"Learn how to install and configure vCluster Platform on Google Cloud with GKE.","source":"@site/platform_versioned_docs/version-4.9.0/install/environments/gcp.mdx","sourceDirName":"install/environments","slug":"/install/environments/gcp","permalink":"/docs/platform/4.9.0/install/environments/gcp","draft":false,"unlisted":false,"editUrl":"https://github.com/loft-sh/vcluster-docs/edit/main/platform_versioned_docs/version-4.9.0/install/environments/gcp.mdx","tags":[],"version":"4.9.0","sidebarPosition":4,"frontMatter":{"title":"Install vCluster Platform on Google Cloud using GKE","sidebar_label":"GKE","sidebar_position":4,"description":"Learn how to install and configure vCluster Platform on Google Cloud with GKE."},"sidebar":"siteSidebar","previous":{"title":"AKS","permalink":"/docs/platform/4.9.0/install/environments/azure"},"next":{"title":"With Offline License Key","permalink":"/docs/platform/4.9.0/install/air-gapped"}}'),r=s(74848),l=s(28453);s(10702);var o=s(3914);s(99583);var i=s(36336),a=s(48832),c=s(39540);s(6364);var d=s(16355),u=s(71066);s(2900);let h={title:"Install vCluster Platform on Google Cloud using GKE",sidebar_label:"GKE",sidebar_position:4,description:"Learn how to install and configure vCluster Platform on Google Cloud with GKE."},p,m={},g=[{value:"Prerequisites",id:"prerequisites",level:2},...i.RM,{value:"Create a GKE cluster",id:"create-a-gke-cluster",level:2},...c.RM,{value:"Set up the platform",id:"set-up-the-platform",level:2},{value:"Install the platform",id:"install-the-platform",level:3},{value:"Expose the platform UI using load balancer",id:"load-balancer",level:3},{value:"Set up custom domain and configure DNS",id:"setup-domain-dns",level:3},{value:"Next steps",id:"post-install-steps",level:2},...o.RM,{value:"Cleanup",id:"cleanup",level:2}];function f(e){let t={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,l.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(t.p,{children:["This guide provides instructions for installing the platform on Google Cloud using ",(0,r.jsx)(t.a,{href:"https://cloud.google.com/kubernetes-engine",children:"Google Kubernetes Engine (GKE)"}),"."]}),"\n",(0,r.jsx)(t.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,r.jsx)(t.p,{children:"Ensure you have the following:"}),"\n",(0,r.jsx)(i.Ay,{}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:["vCluster CLI installed: ",(0,r.jsx)(a.Ay,{})]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsxs)(t.a,{href:"https://cloud.google.com/sdk/docs/install",children:["Google Cloud SDK (",(0,r.jsx)(t.code,{children:"gcloud"})," CLI)"]})," installed."]}),"\n"]}),"\n",(0,r.jsx)(t.admonition,{type:"note",children:(0,r.jsx)(t.p,{children:"Ensure you have the necessary IAM permissions to create cluster
1s and manage cloud services."})}),"\n",(0,r.jsx)(t.h2,{id:"create-a-gke-cluster",children:"Create a GKE cluster"}),"\n",(0,r.jsxs)(u.A,{id:"create-gke-cluster",children:[(0,r.jsxs)(u.p,{children:[(0,r.jsx)(t.p,{children:"Prepare the environment."}),(0,r.jsxs)(t.p,{children:["Start by creating a zonal GKE cluster using the ",(0,r.jsx)(t.code,{children:"gcloud"})," CLI. Set up your environment variables:"]}),(0,r.jsx)(t.admonition,{type:"tip",children:(0,r.jsxs)(t.p,{children:["Project ID can be found in the Google Cloud Console under the project name.\nAlternatively use ",(0,r.jsx)(t.code,{children:"gcloud project list"})," to list all projects and their IDs.\nTo check which project is active, use ",(0,r.jsx)(t.code,{children:"gcloud config get-value project"}),"."]})}),(0,r.jsx)(d.A,{code:`export PROJECT_ID=[[VAR:PROJECT_ID:development]] 2export CLUSTER_NAME=[[VAR:CLUSTER_NAME:vcluster-demo]] 3export ZONE=[[VAR:ZONE:europe-west1-b]] 4export MACHINE_TYPE=[[VAR:MACHINE_TYPE:e2-standard-4]]`,language:"bash",title:"Set environment variables"}),(0,r.jsxs)(t.p,{children:["Configure ",(0,r.jsx)(t.code,{children:"gcloud"}),", enable the required APIs, and set the default project:"]}),(0,r.jsx)(d.A,{code:`gcloud config set project=[[VAR:PROJECT_ID:your-project-id]] 5gcloud services enable container.googleapis.com`,language:"bash",title:"Configure gcloud"})]}),(0,r.jsxs)(u.p,{children:[(0,r.jsx)(t.p,{children:"Create the cluster."}),(0,r.jsx)(d.A,{code:`gcloud container clusters create=[[VAR:CLUSTER_NAME:vcluster-demo]] \\ 6 --zone=[[VAR:ZONE:europe-west1-b]] \\ 7 --machine-type=[[VAR:MACHINE_TYPE:e2-standard-4]] \\ 8 --num-nodes=2`,language:"bash",title:"Create GKE cluster"}),(0,r.jsx)(t.admonition,{type:"info",children:(0,r.jsx)(t.p,{children:"This process typically takes about 10-15 minutes."})}),(0,r.jsxs)(t.p,{children:["Using the default values, this command creates a GKE cluster named ",(0,r.jsx)(t.code,{children:"vcluster-demo"})," in the ",(0,r.jsx)(t.code,{children:"europe-west1-b"}),"\nzone with two nodes of type ",(0,r.jsx)(t.code,{children:"e2-standard-4"}),"."]}),(0,r.jsx)(c.Ay,{})]}),(0,r.jsxs)(u.p,{children:[(0,r.jsx)(t.p,{children:"Verify the cluster creation."}),(0,r.jsx)(t.p,{children:"Verify that GKE was created successfully by listing the nodes:"}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",metastring:'title="List cluster nodes"',children:"kubectl get nodes\n"})}),(0,r.jsx)(t.p,{children:"You should see an output similar to the following:"}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",metastring:'title="Example output"',children:"NAME STATUS ROLES AGE VERSION\ngke-vcluster-demo-default-pool-a1b2c3d4-e5f6 Ready <none> 5m v1.30.5-gke.1443001\ngke-vcluster-demo-default-pool-a1b2c3d4-g7h8 Ready <none> 5m v1.30.5-gke.1443001\n"})})]})]}),"\n",(0,r.jsx)(t.h2,{id:"set-up-the-platform",children:"Set up the platform"}),"\n",(0,r.jsx)(t.p,{children:"After the GKE cluster is running, install the platform."}),"\n",(0,r.jsx)(t.h3,{id:"install-the-platform",children:"Install the platform"}),"\n",(0,r.jsxs)(u.A,{children:[(0,r.jsxs)(u.p,{children:[(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.a,{href:"/docs/platform/install/quick-start-guide",children:"Install the platform"})," using the vCluster CLI."]}),(0,r.jsx)(t.admonition,{title:"idempotency",type:"note",children:(0,r.jsxs)(t.p,{children:["The following command is ",(0,r.jsx)(t.em,{children:"idempotent"}),", meaning that running it again does\nnot result it creating another cluster with the same name."]})}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",metastring:'title="Install the platform using vCluster CLI',children:"vcluster platform start\n"})}),(0,r.jsx)(t.p,{children:"The command prompts you to enter the email address for the admin user:"}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",metastring:'title="Expected installation output"',children:"By providing your email, you accept our Terms of Service and Privacy Statement:\nTerms of Service: https://www.loft.sh/legal/terms\nPrivacy Statement: https://www.loft.sh/legal/privacy\n? Please specify an email address for the admin user\n"})}),(0,r.jsx)(t.admonition,{type:"tip",children:(0,r.jsx)(t.p,{children:"If the command takes too long to execute\u2014such as when other cluster operations are in progress\u2014rerun the command."})})]}),(0,r.jsxs)(u.p,{children:[(0,r.jsx)(t.p,{children:"Connect to the platform."}),(0,r.jsx)(t.p,{children:"After the platform is installed, your default browser opens with the platform UI, and you should see output similar to the following:"}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",metastring:'title="platform installation output"',children:"########################## LOGIN ############################\n\nUsername: admin\nPassword: 9758c908-b931-4edd-b3cb-3f034e50651a # Change via UI or via: vcluster platform reset password\n\nLogin via UI: https://hyx4907.loft.host\nLogin via CLI: vcluster platform login https://hyx4907.loft.host\n\n#################################################################\n\nvCluster Platform was successfully installed and can now be reached at: https://hyx4907.loft.host\n\nThanks for using vCluster Platform!\n19:34:46 done You are successfully logged into vCluster Platform!\n- Use `vcluster platform create vcluster` to create a new virtual cluster\n- Use `vcluster platform add vcluster` to add an existing virtual cluster to a vCluster platform instance\n"})}),(0,r.jsx)(t.p,{children:"When logging in using the UI, provide the following details:"}),(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.strong,{children:"First Name"})}),"\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.strong,{children:"Last Name"})}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Email"})," (pre-filled with the address you supplied earlier)"]}),"\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.strong,{children:"Organization"})}),"\n"]}),(0,r.jsxs)(t.p,{children:["To log in using the CLI, run the ",(0,r.jsx)(t.code,{children:"Login via CLI"})," command provided above."]}),(0,r.jsxs)(t.p,{children:["This completes the basic platform installation. For additional configuration and available features, see the ",(0,r.jsx)(t.a,{href:"#post-install-steps",children:"Next steps section"}),"."]}),(0,r.jsxs)(t.p,{children:["You can ",(0,r.jsx)(t.em,{children:"optionally"})," perform additional configuration steps:"]}),(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.a,{href:"#load-balancer",children:"Expose the platform UI using the load balancer"})}),"\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.a,{href:"#setup-domain-dns",children:"Set up a custom domain and configure DNS"})}),"\n"]})]})]}),"\n",(0,r.jsx)(t.h3,{id:"load-balancer",children:"Expose the platform UI using load balancer"}),"\n",(0,r.jsxs)(u.A,{children:[(0,r.jsxs)(u.p,{children:[(0,r.jsx)(t.p,{children:"Optionally, you can expose the platform UI using a LoadB
8alancer service to make it accessible outside the cluster."}),(0,r.jsx)(t.admonition,{type:"note",children:(0,r.jsxs)(t.p,{children:["This assumes the platform is installed in the ",(0,r.jsx)(t.code,{children:"vcluster-platform"})," namespace which is a\ndefault installation namespace."]})}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"cat <<EOF | kubectl apply -f -\napiVersion: v1\nkind: Service\nmetadata:\n name: vcluster-platform-loadbalancer\n namespace: vcluster-platform\nspec:\n type: LoadBalancer\n externalTrafficPolicy: Cluster\n selector:\n app: loft\n ports:\n - name: https\n protocol: TCP\n port: 443\n targetPort: 10443\nEOF\n"})})]}),(0,r.jsxs)(u.p,{children:[(0,r.jsx)(t.p,{children:"After the service is active, obtain the external IP address:"}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"kubectl get svc vcluster-platform-loadbalancer -n vcluster-platform\n"})}),(0,r.jsxs)(t.p,{children:["Navigate to the IP address in your browser ",(0,r.jsx)(t.code,{children:"https://<EXTERNAL_IP>"}),"."]}),(0,r.jsx)(t.admonition,{type:"tip",children:(0,r.jsxs)(t.p,{children:["The platform uses a self-signed certificate, so you should\naccept the warning in your browser. For production use, replace the default self-signed certificate with a valid ",(0,r.jsx)(t.a,{href:"/docs/platform/4.9.0/configure/installation-options/domain#configure-tls",children:"TLS certificate"}),"."]})})]})]}),"\n",(0,r.jsx)(t.h3,{id:"setup-domain-dns",children:"Set up custom domain and configure DNS"}),"\n",(0,r.jsx)(t.p,{children:"Optionally, you can set up a custom domain and configure DNS to provide a secure URL for accessing the platform."}),"\n",(0,r.jsxs)(u.A,{children:[(0,r.jsxs)(u.p,{children:[(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.a,{href:"https://cloud.google.com/dns/docs/set-up-dns-records-domain-name",children:"Configure DNS in Google Cloud DNS"}),"."]}),(0,r.jsx)(t.p,{children:"To use a custom domain, you must configure the DNS to point to the LoadBalancer IP address."}),(0,r.jsx)(d.A,{code:`EXTERNAL_IP=[[VAR:EXTERNAL_IP:load-balancer-external-IP]] 9 10gcloud dns managed-zones create [[VAR:DNS_ZONE_NAME:vcluster-platform]] --dns-name="[[VAR:DOMAIN:yourdomain.tld.]]" 11 12gcloud dns record-sets transaction start --zone=[[VAR:DNS_ZONE_NAME:vcluster-platform]] 13 14gcloud dns record-sets transaction add "\${EXTERNAL_IP}" \\ 15--name="[[VAR:FQDN:vcluster-platform.yourdomain.tld.]]" \\ 16--ttl=300 \\ 17--type=A \\ 18--zone=[[VAR:DNS_ZONE_NAME:vcluster-platform]] 19 20gcloud dns record-sets transaction execute --zone=[[VAR:DNS_ZONE_NAME:vcluster-platform]]`,language:"bash",title:"Configure DNS"})]}),(0,r.jsxs)(u.p,{children:[(0,r.jsx)(t.p,{children:"Connect the platform to the custom domain."}),(0,r.jsx)(t.p,{children:"After DNS is set up, you can start the platform using the following command:\n`vcluster platform start --host=vcluster-platform.yourdomain.tld"}),(0,r.jsxs)(t.admonition,{type:"info",children:[(0,r.jsxs)(t.p,{children:["For more information on how to configure a custom domain, see the ",(0,r.jsx)(t.a,{href:"/docs/platform/4.9.0/configure/installation-options/domain",children:"Configure external acess and TLS documentation"}),"."]}),(0,r.jsxs)(t.p,{children:["If you do not have a custom domain setup, follow the ",(0,r.jsx)(t.a,{href:"https://cloud.google.com/dns/docs/tutorials/create-domain-tutorial",children:"Set up a domain by using Cloud DNS\ntutorial"}),"."]})]})]})]}),"\n",(0,r.jsx)(t.h2,{id:"post-install-steps",children:"Next steps"}),"\n",(0,r.jsx)(o.Ay,{}),"\n",(0,r.jsxs)(t.p,{children:["You can also use Google as an identity provider and ",(0,r.jsx)(t.a,{href:"/docs/platform/4.9.0/configure/platform-configs/single-sign-on",children:"configure SSO"})," to enable user\nauthentication to the platform."]}),"\n",(0,r.jsx)(t.h2,{id:"cleanup",children:"Cleanup"}),"\n",(0,r.jsx)(t.p,{children:"If you installed the GKE cluster with this tutorial, and want to clean up the resources, run the\nfollowing command:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",metastring:'title="Clean up resources"',children:"gcloud container cluster
20s delete $CLUSTER_NAME --zone $ZONE --quiet\n"})})]})}function x(e={}){let{wrapper:t}={...(0,l.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(f,{...e})}):f(e)}},39540(e,t,s){s.d(t,{Ay:()=>i,RM:()=>l});var n=s(74848),r=s(28453);let l=[];function o(e){let t={admonition:"admonition",code:"code",p:"p",...(0,r.R)(),...e.components};return(0,n.jsx)(t.admonition,{title:"kubeconfig update",type:"tip",children:(0,n.jsxs)(t.p,{children:["This command automatically updates your ",(0,n.jsx)(t.code,{children:"kubeconfig"})," file with the new\ncluster configuration."]})})}function i(e={}){let{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(o,{...e})}):o(e)}},71066(e,t,s){s.d(t,{A:()=>i,p:()=>a});var n=s(74848),r=s(96540),l=s(10702),o=s(91289);class i extends r.Component{constructor(e){super(),this.state={localStoragePrefix:"docs_flow_",inTransition:!1,currentStep:0,imageStyle:e.imageStyle},o.default.canUseDOM&&(this.state.localStoragePrefix+=(e=>{let t=0;for(let s=0;s<e.length;s++)t=(t<<5)-t+e.charCodeAt(s),t&=t;return new Uint32Array([t])[0].toString(36)})(window?.location.pathname||"")+"_",this.state.currentStep=parseInt(window?.localStorage.getItem(this.state.localStoragePrefix+e.id)||0))}getCurrentImage(e,t){let s=null,n={};return e.some((e,r)=>(e.props?.image?(s=e,n={src:e.props.image,style:this.state.imageStyle,imageStyle:e.props.imageStyle,hoverStyle:e.props.hoverStyle}):(e.props?.imageStyle&&(n.imageStyle=e.props.imageStyle),e.props?.hoverStyle&&(n.hoverStyle=e.props.hoverStyle)),r===(Number.isInteger(t)?t:this.state.currentStep))),{child:s,props:n}}render(){let e=this.props.children;!1===Array.isArray(e)&&(e=[e]);let t=this.getCurrentImage(e);return(0,n.jsxs)("div",{className:"flow_KFs_",children:[t.child&&(0,n.jsx)("div",{className:"imageWrapper_sbzi",children:(0,n.jsx)("div",{className:"image_Lei8",children:(0,n.jsx)(l.A,{...t.props,onMouseEnter:()=>{this.setState({imageStyle:t.props?.hoverStyle||t.props?.imageStyle})},onMouseLeave:()=>{setTimeout(()=>{!1===this.state.inTransition&&this.setState({imageStyle:t.props?.imageStyle})},100)},onMouseDown:()=>{this.setState({imageStyle:{transition:"none",transform:"none"}},()=>{this.setState({imageStyle:{}})})}})})}),(0,n.jsx)("ol",{children:r.Children.map(e,(s,n)=>r.cloneElement(s,{current:n===this.state.currentStep,onClick:()=>{if(this.state.currentStep!==n){let s=this.getCurrentImage(e,n),r={inTransition:!0};t.props.src!=s.props.src&&(r.imageStyle=Object.assign({},this.state?.imageStyle,{transition:"opacity 0.2s",opacity:0})),t.props.src!=s.props.src||t.props.imageStyle!=s.props.imageStyle||t.props.hoverStyle!=s.props.hoverStyle?this.setState(r,()=>{setTimeout(()=>{window?.localStorage.setItem(this.state.localStoragePrefix+this.props.id,n),this.setState({currentStep:n},()=>{setTimeout(()=>{this.setState({inTransition:!1,imageStyle:{transition:"opacity 0.2s",opacity:1}},()=>{setTimeout(()=>{let t=this.getCurrentImage(e);this.setState({imageStyle:t.props?.hoverStyle||t.props?.imageStyle})},800)})},100)})},100)}):this.setState({currentStep:n})}else if(!1===this.state.inTransition){let t=this.getCurrentImage(e);this.state.imageStyle===t.props?.hoverStyle?this.setState({imageStyle:t.props?.imageStyle}):this.setState({imageStyle:t.props?.hoverStyle||t.props?.imageStyle})}},onMouseLeave:()=>{}}))})]})}}class a extends r.Component{constructor(e){super()}render(){return(0,n.jsx)("li",{className:`step_ph6F flow-step ${this.props.current?"current_hZhj":""} `,onClick:this.props.onClick,style:this.props.style,children:this.props.children})}}},10702(e,t,s){s.d(t,{A:()=>l});var n=s(74848),r=s(96540);class l extends r.Component{constructor(e){super()}render(){return(0,n.jsxs)("figure",{children:[(0,n.jsx)("img",{alt:this.props?.caption,...this.props}),this.props?.caption&&(0,n.jsx)("figcaption",{children:this.props.caption})]})}}},16355(e,t,s){s.d(t,{A:()=>h});var n=s(74848),r=s(96540),l=s(16151),o=s.n(l),i=s(56347),a=s(80698),c=s(23652),d=JSON.parse('{"iD":"4.11.3","FQ":"0.36.2"}');let u=(e,t)=>`var-${e}-${t.toLowerCase().replace(/[^a-z0-9]/g,"-")}`,h=({code:e="",language:t="bash",title:s})=>{let l,h=(0,r.useId)(),p=(0,c.kb)(),m=(0,i.zy)(),g=d.iD,f=d.FQ;try{if(m.pathname.includes("/platform/")){let e=(0,a.zK)("platform");e?.activeVersion?.name&&"current"!==e.activeVersion.name&&(g=e.activeVersion.name)}}catch(e){}try{if(m.pathname.includes("/vcluster/")){let e=(0,a.zK)("vcluster");e?.activeVersion?.name&&"current"!==e.activeVersion.name&&(f=e.activeVersion.name)}}catch(e){}let x="string"==typeof e?e.replace(/__PLATFORM_VERSION__/g,g).replace(/__PLATFORM_VERSION_MINOR__/g,g.split(".").slice(0,2).join(".")).replace(/__VCLUSTER_VERSION__/g,f).replace(/__VCLUSTER_VERSION_MINOR__/g,f.split(".").slice(0,2).join(".")):e,j=/\[\[VAR:([^:]+):([^\]]*)\]\]/g,v={},y=new RegExp(j);if("string"==typeof x)for(;null!==(l=y.exec(x));)v[l[1]]=l[2];let[b,w]=(0,r.useState)(v),S="string"==typeof x?x.replace(/\[\[GLOBAL:([^\]]+)\]\]/g,(e,t)=>p[t]||`[[GLOBAL:${t}]]`).replace(j,(e,t)=>b[t]||v[t]||""):x;return 0===Object.keys(v).length?(0,n.jsx)(o(),{language:t,title:s,children:S}):(0,n.jsxs)("div",{className:"interpolated-code-wrapper",style:{marginBottom:"var(--ifm-leading)",border:"1px solid var(--ifm-color-emphasis-300)",borderRadius:"var(--ifm-code-border-radius)",backgroundColor:"rgba(0, 0, 0, 0.02)",padding:"1rem"},children:[(0,n.jsxs)("div",{className:"interpolated-code-inputs",style:{marginBottom:"1rem"},children:[(0,n.jsx)("div",{style:{fontSize:"0.8rem",color:"var(--ifm-color-emphasis-600)",marginBottom:"8px",fontStyle:"italic"},children:"Modify the following with your specific values to generate a copyable command:"}),Object.entries(v).map(([e,t])=>(0,n.jsxs)("div",{style:{display:"flex",alignItems:"center",marginBottom:"0.5rem",fontFamily:"var(--ifm-font-family-monospace)"},children:[(0,n.jsx)("label",{htmlFor:u(h,e),style:{minWidth:"150px",color:"var(--ifm-font-color-base)",fontSize:"0.9rem",fontWeight:"600",marginRight:"10px"},children:e}),(0,n.jsx)("input",{id:u(h,e),type:"text",value:b[e]||"",onChange:t=>w(s=>({...s,[e]:t.target.value})),placeholder:t,style:{backgroundColor:"rgba(255, 255, 255, 0.7)",border:"1px solid var(--ifm-color-emphasis-300)",borderRadius:"var(--ifm-global-radius)",padding:"0.3rem 0.5rem",color:"var(--ifm-font-color-base)",fontFamily:"var(--ifm-font-family-monospace)",fontSize:"0.9rem",width:"100%",outline:"none",transition:"all 0.2s ease"},onFocus:e=>{e.target.style.borderColor="var(--ifm-color-primary)",e.target.style.boxShadow="0 0 0 1px var(--ifm-color-primary)"},onBlur:e=>{e.target.style.borderColor="var(--ifm-color-emphasis-300)",e.target.style.boxShadow="none"}})]},e))]}),(0,n.jsx)("div",{children:(0,n.jsx)(o(),{language:t,title:s,children:S})})]})}},2900(e,t,s){s.d(t,{A:()=>r});var n=s(74848);s(96540);function r({children:e}){return(0,n.jsx)("span",{className:"label_jc5f",children:e})}},52980(e,t,s){s.d(t,{A:()=>r});var n=s(74848);function r({children:e}){return(0,n.jsx)("span",{style:{backgroundColor:"rgb(246, 247, 248)",border:"0.1rem solid rgba(0, 0, 0, 0.1)",borderRadius:"0.4rem",color:"#050b24",padding:"0.2rem"},children:e})}s(96540)},23652(e,t,s){s.d(t,{Lg:()=>a,di:()=>i,kb:()=>c});var n=s(96540);let r={},l=[],o=()=>
20{l.forEach(e=>e(r))},i=e=>{r={...r,...e},o()},a=(e,t)=>{r={...r,[e]:t},o()},c=()=>{let[e,t]=(0,n.useState)({...r});return(0,n.useEffect)(()=>{var e;return e=e=>{t({...e})},l.push(e),()=>{l=l.filter(t=>t!==e)}},[]),e}}}]);
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.