build 7bbbddf7 | content blog-content@c8490fa · 338 posts | profiles 20 · corpus 267 | 0 skipped | | format
apiVersion: soultec.ch/v1kind: Postmetadata: name: how-to-vsphere-supervisor-services locale: en labels: author: yannick-gerber series: how-to capability/containers: 2.39 vendor/vmware: 0.88 annotations: source: blog-content/posts/en/how-to-vsphere-supervisor-services.md route: /en/insights/how-to-vsphere-supervisor-services/ schema: /nerd/schema/posts.json markdown: /en/insights/how-to-vsphere-supervisor-services.mdspec: title: vSphere Supervisor Services date: 2024-12-22 author: yannick-gerber locale: en summary: >- Supervisor Services run Kubernetes deployments directly on a vSphere namespace, so no Kubernetes guest cluster is needed and the pods run on the ESXi host through the vSphere CRX runtime. capabilities: [containers] vendors: [vmware] series: how-to hero: /blog-assets/how-to-vsphere-supervisor-services/hero.webp migrated: 2026-08-24 translationReviewed: false draft: false sections: - body: | vSphere IaaS Control Plane, formerly vSphere with Tanzu, has Supervisor Services. They let you run Kubernetes deployments directly on the vSphere namespace, so no Kubernetes guest cluster is needed and the pods run on the ESXi host itself through the vSphere CRX runtime. Active by default is the TKG Service, used to provision Kubernetes guest clusters on a vSphere namespace. The other Supervisor Services: - [Consumption Interface](https://github.com/vsphere-tmm/Supervisor-Services#consumption-interface) - [vSAN Data Persistence Platform (vDPP) services](https://github.com/vsphere-tmm/Supervisor-Services#vsan-data-persistence-platform-vdpp-services) - [Backup & Recovery Service](https://github.com/vsphere-tmm/Supervisor-Services#backup--recovery-service) - [Certificate Management Service](https://github.com/vsphere-tmm/Supervisor-Services#certificate-management-service) - [Cloud Native Registry Service](https://github.com/vsphere-tmm/Supervisor-Services#cloud-native-registry-service) - [Kubernetes Ingress Controller Service](https://github.com/vsphere-tmm/Supervisor-Services#kubernetes-ingress-controller-service) - [External DNS Service](https://github.com/vsphere-tmm/Supervisor-Services#external-dns-service) - [NSX Management Proxy](https://github.com/vsphere-tmm/Supervisor-Services#nsx-management-proxy) - [Data Services Manager Consumption Operator](https://github.com/vsphere-tmm/Supervisor-Services#data-services-manager-consumption-operator) # Installing a Supervisor Service A Supervisor Service consists of two YAML manifests: - An installation manifest, which registers the Supervisor Service - A configuration manifest, which installs the service on the Supervisor (the values file) > This guide uses NSX and Antrea as the CNI. > > Some Supervisor Services require NSX, Velero for example. - heading:

Contour ingress controller

body: | - Download the Contour service: [Contour v1.28.2](https://vmwaresaas.jfrog.io/ui/api/v1/download?repoKey=supervisor-services&path=contour/v1.28.2/contour.yml) - Download the Contour values: [values for all versions](https://vmwaresaas.jfrog.io/ui/api/v1/download?repoKey=supervisor-services&path=contour/v1.24.4/contour-data-values.yml) (with Contour the values file needs no changes) The service is added under *Workload Management*: ![](/blog-assets/how-to-vsphere-supervisor-services/01.webp) For the service registration you give it Contour's YAML file, unchanged. Here that is the [Contour v1.28.2](https://vmwaresaas.jfrog.io/ui/api/v1/download?repoKey=supervisor-services&path=contour/v1.28.2/contour.yml) file: ![](/blog-assets/how-to-vsphere-supervisor-services/02.webp) The service is now registered: - heading: "

![](/blog-assets/how-to-vsphere-supervisor-services/03.webp)

"
body: | After registration the service still has to be installed on the Supervisor. The "0" under Supervisors shows that Contour is not yet installed on any of them. *Actions > Install on Supervisors* ![](/blog-assets/how-to-vsphere-supervisor-services/04.webp) Now give it *contour-data-values.yml*: ![](/blog-assets/how-to-vsphere-supervisor-services/05.webp) As soon as Contour gets an external IP on the envoy service, the ingress controller is installed correctly: ![](/blog-assets/how-to-vsphere-supervisor-services/06.webp) - heading:

Harbor container registry as a Supervisor Service

body: | Harbor requires Contour to be installed first. - Download the Harbor service: [Harbor v2.9.1](https://vmwaresaas.jfrog.io/ui/api/v1/download?repoKey=supervisor-services&path=harbor/v2.9.1/harbor.yml) - Download the Harbor values file: [v2.9.1](https://vmwaresaas.jfrog.io/ui/api/v1/download?repoKey=supervisor-services&path=harbor/v2.9.1/harbor-data-values.yml) Registering Harbor as a Supervisor Service: ![](/blog-assets/how-to-vsphere-supervisor-services/07.webp) Here you enter this YAML: [Harbor v2.9.1](https://vmwaresaas.jfrog.io/ui/api/v1/download?repoKey=supervisor-services&path=harbor/v2.9.1/harbor.yml) ![](/blog-assets/how-to-vsphere-supervisor-services/08.webp) Installing on the Supervisor: ![](/blog-assets/how-to-vsphere-supervisor-services/09.webp) With Harbor the values YAML ([v2.9.1](https://vmwaresaas.jfrog.io/ui/api/v1/download?repoKey=supervisor-services&path=harbor/v2.9.1/harbor-data-values.yml)) has to be adjusted: - Hostname - StorageClass - Passwords and secrets ![](/blog-assets/how-to-vsphere-supervisor-services/10.webp) After installing on the Supervisor, a dedicated vSphere namespace is created for Harbor: ![](/blog-assets/how-to-vsphere-supervisor-services/11.webp) Because Harbor needs Contour as its ingress controller, create a DNS record pointing the hostname from the Harbor values file at the envoy service's IP. In our case: *10.177.4.12 -> registry.soultec.lab* ![](/blog-assets/how-to-vsphere-supervisor-services/12.webp) ![](/blog-assets/how-to-vsphere-supervisor-services/06.webp) The Harbor UI is now reachable. Log in with the password specified in harbor-values.yaml; that file is also where the TLS certificate is changed. ![](/blog-assets/how-to-vsphere-supervisor-services/13.webp) ### Installing the ArgoCD operator as a Supervisor Service The ArgoCD operator installs ArgoCD instances as vSphere pods in a vSphere namespace. First the ArgoCD operator has to be installed as a Supervisor Service. - Download the Supervisor Service: [ArgoCD Operator v0.12.0](https://github.com/vsphere-tmm/Supervisor-Services/blob/main/supervisor-services-labs/argocd-operator/v0.12.0/argocd-operator.yaml) - Download the values file: [values.yaml](https://github.com/vsphere-tmm/Supervisor-Services/blob/main/supervisor-services-labs/argocd-operator/v0.12.0/values.yaml) (no changes needed, as long as quay.io is reachable from the vSphere namespace) Once registered and installed on the Supervisor, a vSphere namespace with one pod is created. That is only the ArgoCD operator, not an ArgoCD instance yet: ![](/blog-assets/how-to-vsphere-supervisor-services/14.webp) ### Installing an ArgoCD instance in a vSphere namespace ArgoCD deployment: [argocd-instance.yaml](https://github.com/vsphere-tmm/Supervisor-Services/blob/main/supervisor-services-labs/argocd-operator/argocd-instance.yaml) The ArgoCD instance is installed directly in a vSphere namespace. Log in to the vSphere namespace with kubectl and set the kubectl context: ```bash kubectl vsphere login --server <Supervisor-VIP> -u [email protected] kubectl config use-context <vSphere-Namespace> ``` Then create the deployment from [argocd-instance.yaml](https://github.com/vsphere-tmm/Supervisor-Services/blob/main/supervisor-services-labs/argocd-operator/argocd-instance.yaml). The file needs no changes: ```bash kubectl apply -f argocd-instance.yaml ``` Check the vSphere pods: ```bash kubectl get pods --watch ``` Once all the pods are running, an external IP should be available for the load balancer: ```bash kubectl get svc --watch ``` ![](/blog-assets/how-to-vsphere-supervisor-services/15.webp) Now create a DNS record pointing at that IP. In our case: *10.177.4.18 -> argocd.soultec.lab* #### The initial ArgoCD admin login The initial ArgoCD password for the "admin" user is in a Kubernetes secret: ```bash kubectl get secret stlab-argocd-cluster -o jsonpath='{.data.admin\.password}' | base64 -d ``` ArgoCD can now be managed through its UI. ![](/blog-assets/how-to-vsphere-supervisor-services/16.webp) ArgoCD's configuration, SSO, RBAC and the rest, is done through [ConfigMaps](https://ygerber.online/post/argocd-configuration/). Those ConfigMaps can be rolled out through ArgoCD itself, so ArgoCD manages itself. Default Kubernetes services such as cert-manager or an in-guest-cluster ingress controller can be rolled out the same way. The "ArgoCD app of apps" approach is interesting here. More on that in another post. # Conclusion Supervisor Services are an intuitive, straightforward way to install a Kubernetes deployment directly on a vSphere namespace. With Harbor as the container registry and ArgoCD in place, the groundwork for continuous deployment is done.status: corpus: 267 alsoLike: - {ref: posts/how-to-authenticate-with-the-vsphere-supervisor-api, score: 1.00} - {ref: posts/vvf-9-0-supervisor-mit-foundation-load-balancer, score: 1.00} - {ref: services/virtualization-container, score: 0.74}
{ "apiVersion": "soultec.ch/v1", "kind": "Post", "metadata": { "name": "how-to-vsphere-supervisor-services", "locale": "en", "labels": { "author": "yannick-gerber", "series": "how-to", "capability/containers": "2.39", "vendor/vmware": "0.88" }, "annotations": { "source": "blog-content/posts/en/how-to-vsphere-supervisor-services.md", "route": "/en/insights/how-to-vsphere-supervisor-services/", "schema": "/nerd/schema/posts.json", "markdown": "/en/insights/how-to-vsphere-supervisor-services.md" } }, "spec": { "title": "vSphere Supervisor Services", "date": "2024-12-22", "author": "yannick-gerber", "locale": "en", "summary": "Supervisor Services run Kubernetes deployments directly on a vSphere namespace, so no Kubernetes guest cluster is needed and the pods run on the ESXi host through the vSphere CRX runtime.", "capabilities": [ "containers" ], "vendors": [ "vmware" ], "series": "how-to", "hero": "/blog-assets/how-to-vsphere-supervisor-services/hero.webp", "migrated": "2026-08-24", "translationReviewed": false, "draft": false }, "sections": [ { "body": "vSphere IaaS Control Plane, formerly vSphere with Tanzu, has Supervisor Services. They let you run Kubernetes deployments directly on the vSphere namespace, so no Kubernetes guest cluster is needed and the pods run on the ESXi host itself through the vSphere CRX runtime.\n\nActive by default is the TKG Service, used to provision Kubernetes guest clusters on a vSphere namespace.\n\nThe other Supervisor Services:\n\n- [Consumption Interface](https://github.com/vsphere-tmm/Supervisor-Services#consumption-interface)\n- [vSAN Data Persistence Platform (vDPP) services](https://github.com/vsphere-tmm/Supervisor-Services#vsan-data-persistence-platform-vdpp-services)\n- [Backup & Recovery Service](https://github.com/vsphere-tmm/Supervisor-Services#backup--recovery-service)\n- [Certificate Management Service](https://github.com/vsphere-tmm/Supervisor-Services#certificate-management-service)\n- [Cloud Native Registry Service](https://github.com/vsphere-tmm/Supervisor-Services#cloud-native-registry-service)\n- [Kubernetes Ingress Controller Service](https://github.com/vsphere-tmm/Supervisor-Services#kubernetes-ingress-controller-service)\n- [External DNS Service](https://github.com/vsphere-tmm/Supervisor-Services#external-dns-service)\n- [NSX Management Proxy](https://github.com/vsphere-tmm/Supervisor-Services#nsx-management-proxy)\n- [Data Services Manager Consumption Operator](https://github.com/vsphere-tmm/Supervisor-Services#data-services-manager-consumption-operator)\n\n# Installing a Supervisor Service\n\nA Supervisor Service consists of two YAML manifests:\n\n- An installation manifest, which registers the Supervisor Service\n- A configuration manifest, which installs the service on the Supervisor (the values file)\n\n> This guide uses NSX and Antrea as the CNI.\n>\n> Some Supervisor Services require NSX, Velero for example." }, { "heading": "

Contour ingress controller

",
"body": "- Download the Contour service: [Contour v1.28.2](https://vmwaresaas.jfrog.io/ui/api/v1/download?repoKey=supervisor-services&path=contour/v1.28.2/contour.yml)\n- Download the Contour values: [values for all versions](https://vmwaresaas.jfrog.io/ui/api/v1/download?repoKey=supervisor-services&path=contour/v1.24.4/contour-data-values.yml) (with Contour the values file needs no changes)\n\nThe service is added under *Workload Management*:\n\n![](/blog-assets/how-to-vsphere-supervisor-services/01.webp)\n\nFor the service registration you give it Contour's YAML file, unchanged.\n\nHere that is the [Contour v1.28.2](https://vmwaresaas.jfrog.io/ui/api/v1/download?repoKey=supervisor-services&path=contour/v1.28.2/contour.yml) file:\n\n![](/blog-assets/how-to-vsphere-supervisor-services/02.webp)\n\nThe service is now registered:" }, { "heading": "

![](/blog-assets/how-to-vsphere-supervisor-services/03.webp)

",
"body": "After registration the service still has to be installed on the Supervisor. The \"0\" under Supervisors shows that Contour is not yet installed on any of them.\n\n*Actions > Install on Supervisors*\n\n![](/blog-assets/how-to-vsphere-supervisor-services/04.webp)\n\nNow give it *contour-data-values.yml*:\n\n![](/blog-assets/how-to-vsphere-supervisor-services/05.webp)\n\nAs soon as Contour gets an external IP on the envoy service, the ingress controller is installed correctly:\n\n![](/blog-assets/how-to-vsphere-supervisor-services/06.webp)" }, { "heading": "

Harbor container registry as a Supervisor Service

",
"body": "Harbor requires Contour to be installed first.\n\n- Download the Harbor service: [Harbor v2.9.1](https://vmwaresaas.jfrog.io/ui/api/v1/download?repoKey=supervisor-services&path=harbor/v2.9.1/harbor.yml)\n- Download the Harbor values file: [v2.9.1](https://vmwaresaas.jfrog.io/ui/api/v1/download?repoKey=supervisor-services&path=harbor/v2.9.1/harbor-data-values.yml)\n\nRegistering Harbor as a Supervisor Service:\n\n![](/blog-assets/how-to-vsphere-supervisor-services/07.webp)\n\nHere you enter this YAML: [Harbor v2.9.1](https://vmwaresaas.jfrog.io/ui/api/v1/download?repoKey=supervisor-services&path=harbor/v2.9.1/harbor.yml)\n\n![](/blog-assets/how-to-vsphere-supervisor-services/08.webp)\n\nInstalling on the Supervisor:\n\n![](/blog-assets/how-to-vsphere-supervisor-services/09.webp)\n\nWith Harbor the values YAML ([v2.9.1](https://vmwaresaas.jfrog.io/ui/api/v1/download?repoKey=supervisor-services&path=harbor/v2.9.1/harbor-data-values.yml)) has to be adjusted:\n\n- Hostname\n- StorageClass\n- Passwords and secrets\n\n![](/blog-assets/how-to-vsphere-supervisor-services/10.webp)\n\nAfter installing on the Supervisor, a dedicated vSphere namespace is created for Harbor:\n\n![](/blog-assets/how-to-vsphere-supervisor-services/11.webp)\n\nBecause Harbor needs Contour as its ingress controller, create a DNS record pointing the hostname from the Harbor values file at the envoy service's IP.\n\nIn our case: *10.177.4.12 -> registry.soultec.lab*\n\n![](/blog-assets/how-to-vsphere-supervisor-services/12.webp)\n\n![](/blog-assets/how-to-vsphere-supervisor-services/06.webp)\n\nThe Harbor UI is now reachable. Log in with the password specified in harbor-values.yaml; that file is also where the TLS certificate is changed.\n\n![](/blog-assets/how-to-vsphere-supervisor-services/13.webp)\n\n### Installing the ArgoCD operator as a Supervisor Service\n\nThe ArgoCD operator installs ArgoCD instances as vSphere pods in a vSphere namespace.\n\nFirst the ArgoCD operator has to be installed as a Supervisor Service.\n\n- Download the Supervisor Service: [ArgoCD Operator v0.12.0](https://github.com/vsphere-tmm/Supervisor-Services/blob/main/supervisor-services-labs/argocd-operator/v0.12.0/argocd-operator.yaml)\n- Download the values file: [values.yaml](https://github.com/vsphere-tmm/Supervisor-Services/blob/main/supervisor-services-labs/argocd-operator/v0.12.0/values.yaml) (no changes needed, as long as quay.io is reachable from the vSphere namespace)\n\nOnce registered and installed on the Supervisor, a vSphere namespace with one pod is created. That is only the ArgoCD operator, not an ArgoCD instance yet:\n\n![](/blog-assets/how-to-vsphere-supervisor-services/14.webp)\n\n### Installing an ArgoCD instance in a vSphere namespace\n\nArgoCD deployment: [argocd-instance.yaml](https://github.com/vsphere-tmm/Supervisor-Services/blob/main/supervisor-services-labs/argocd-operator/argocd-instance.yaml)\n\nThe ArgoCD instance is installed directly in a vSphere namespace. Log in to the vSphere namespace with kubectl and set the kubectl context:\n\n```bash\n\nkubectl vsphere login --server <Supervisor-VIP> -u [email protected]\n\nkubectl config use-context <vSphere-Namespace>\n```\n\nThen create the deployment from [argocd-instance.yaml](https://github.com/vsphere-tmm/Supervisor-Services/blob/main/supervisor-services-labs/argocd-operator/argocd-instance.yaml). The file needs no changes:\n\n```bash\n\nkubectl apply -f argocd-instance.yaml\n```\n\nCheck the vSphere pods:\n\n```bash\n\nkubectl get pods --watch\n```\n\nOnce all the pods are running, an external IP should be available for the load balancer:\n\n```bash\n kubectl get svc --watch \n```\n\n![](/blog-assets/how-to-vsphere-supervisor-services/15.webp)\n\nNow create a DNS record pointing at that IP.\n\nIn our case: *10.177.4.18 -> argocd.soultec.lab*\n\n#### The initial ArgoCD admin login\n\nThe initial ArgoCD password for the \"admin\" user is in a Kubernetes secret:\n\n```bash\n\nkubectl get secret stlab-argocd-cluster -o jsonpath='{.data.admin\\.password}' | base64 -d\n```\n\nArgoCD can now be managed through its UI.\n\n![](/blog-assets/how-to-vsphere-supervisor-services/16.webp)\n\nArgoCD's configuration, SSO, RBAC and the rest, is done through [ConfigMaps](https://ygerber.online/post/argocd-configuration/). Those ConfigMaps can be rolled out through ArgoCD itself, so ArgoCD manages itself. Default Kubernetes services such as cert-manager or an in-guest-cluster ingress controller can be rolled out the same way. The \"ArgoCD app of apps\" approach is interesting here. More on that in another post.\n\n# Conclusion\n\nSupervisor Services are an intuitive, straightforward way to install a Kubernetes deployment directly on a vSphere namespace. With Harbor as the container registry and ArgoCD in place, the groundwork for continuous deployment is done." } ], "status": { "corpus": 267, "alsoLike": [ { "ref": "posts/how-to-authenticate-with-the-vsphere-supervisor-api", "score": "1.00" }, { "ref": "posts/vvf-9-0-supervisor-mit-foundation-load-balancer", "score": "1.00" }, { "ref": "services/virtualization-container", "score": "0.74" } ] }}
apiVersion = "soultec.ch/v1"kind = "Post"[metadata]name = "how-to-vsphere-supervisor-services"locale = "en"[metadata.labels]author = "yannick-gerber"series = "how-to""capability/containers" = "2.39""vendor/vmware" = "0.88"[metadata.annotations]source = "blog-content/posts/en/how-to-vsphere-supervisor-services.md"route = "/en/insights/how-to-vsphere-supervisor-services/"schema = "/nerd/schema/posts.json"markdown = "/en/insights/how-to-vsphere-supervisor-services.md"[spec]title = "vSphere Supervisor Services"date = 2024-12-22author = "yannick-gerber"locale = "en"summary = "Supervisor Services run Kubernetes deployments directly on a vSphere namespace, so no Kubernetes guest cluster is needed and the pods run on the ESXi host through the vSphere CRX runtime."capabilities = ["containers"]vendors = ["vmware"]series = "how-to"hero = "/blog-assets/how-to-vsphere-supervisor-services/hero.webp"migrated = 2026-08-24translationReviewed = falsedraft = false[[sections]]body = '''vSphere IaaS Control Plane, formerly vSphere with Tanzu, has Supervisor Services. They let you run Kubernetes deployments directly on the vSphere namespace, so no Kubernetes guest cluster is needed and the pods run on the ESXi host itself through the vSphere CRX runtime.Active by default is the TKG Service, used to provision Kubernetes guest clusters on a vSphere namespace.The other Supervisor Services:- [Consumption Interface](https://github.com/vsphere-tmm/Supervisor-Services#consumption-interface)- [vSAN Data Persistence Platform (vDPP) services](https://github.com/vsphere-tmm/Supervisor-Services#vsan-data-persistence-platform-vdpp-services)- [Backup & Recovery Service](https://github.com/vsphere-tmm/Supervisor-Services#backup--recovery-service)- [Certificate Management Service](https://github.com/vsphere-tmm/Supervisor-Services#certificate-management-service)- [Cloud Native Registry Service](https://github.com/vsphere-tmm/Supervisor-Services#cloud-native-registry-service)- [Kubernetes Ingress Controller Service](https://github.com/vsphere-tmm/Supervisor-Services#kubernetes-ingress-controller-service)- [External DNS Service](https://github.com/vsphere-tmm/Supervisor-Services#external-dns-service)- [NSX Management Proxy](https://github.com/vsphere-tmm/Supervisor-Services#nsx-management-proxy)- [Data Services Manager Consumption Operator](https://github.com/vsphere-tmm/Supervisor-Services#data-services-manager-consumption-operator)# Installing a Supervisor ServiceA Supervisor Service consists of two YAML manifests:- An installation manifest, which registers the Supervisor Service- A configuration manifest, which installs the service on the Supervisor (the values file)> This guide uses NSX and Antrea as the CNI.>> Some Supervisor Services require NSX, Velero for example.'''[[sections]]heading = "

Contour ingress controller

"
body = '''- Download the Contour service: [Contour v1.28.2](https://vmwaresaas.jfrog.io/ui/api/v1/download?repoKey=supervisor-services&path=contour/v1.28.2/contour.yml)- Download the Contour values: [values for all versions](https://vmwaresaas.jfrog.io/ui/api/v1/download?repoKey=supervisor-services&path=contour/v1.24.4/contour-data-values.yml) (with Contour the values file needs no changes)The service is added under *Workload Management*:![](/blog-assets/how-to-vsphere-supervisor-services/01.webp)For the service registration you give it Contour's YAML file, unchanged.Here that is the [Contour v1.28.2](https://vmwaresaas.jfrog.io/ui/api/v1/download?repoKey=supervisor-services&path=contour/v1.28.2/contour.yml) file:![](/blog-assets/how-to-vsphere-supervisor-services/02.webp)The service is now registered:'''[[sections]]heading = "

![](/blog-assets/how-to-vsphere-supervisor-services/03.webp)

"
body = '''After registration the service still has to be installed on the Supervisor. The "0" under Supervisors shows that Contour is not yet installed on any of them.*Actions > Install on Supervisors*![](/blog-assets/how-to-vsphere-supervisor-services/04.webp)Now give it *contour-data-values.yml*:![](/blog-assets/how-to-vsphere-supervisor-services/05.webp)As soon as Contour gets an external IP on the envoy service, the ingress controller is installed correctly:![](/blog-assets/how-to-vsphere-supervisor-services/06.webp)'''[[sections]]heading = "

Harbor container registry as a Supervisor Service

"
body = '''Harbor requires Contour to be installed first.- Download the Harbor service: [Harbor v2.9.1](https://vmwaresaas.jfrog.io/ui/api/v1/download?repoKey=supervisor-services&path=harbor/v2.9.1/harbor.yml)- Download the Harbor values file: [v2.9.1](https://vmwaresaas.jfrog.io/ui/api/v1/download?repoKey=supervisor-services&path=harbor/v2.9.1/harbor-data-values.yml)Registering Harbor as a Supervisor Service:![](/blog-assets/how-to-vsphere-supervisor-services/07.webp)Here you enter this YAML: [Harbor v2.9.1](https://vmwaresaas.jfrog.io/ui/api/v1/download?repoKey=supervisor-services&path=harbor/v2.9.1/harbor.yml)![](/blog-assets/how-to-vsphere-supervisor-services/08.webp)Installing on the Supervisor:![](/blog-assets/how-to-vsphere-supervisor-services/09.webp)With Harbor the values YAML ([v2.9.1](https://vmwaresaas.jfrog.io/ui/api/v1/download?repoKey=supervisor-services&path=harbor/v2.9.1/harbor-data-values.yml)) has to be adjusted:- Hostname- StorageClass- Passwords and secrets![](/blog-assets/how-to-vsphere-supervisor-services/10.webp)After installing on the Supervisor, a dedicated vSphere namespace is created for Harbor:![](/blog-assets/how-to-vsphere-supervisor-services/11.webp)Because Harbor needs Contour as its ingress controller, create a DNS record pointing the hostname from the Harbor values file at the envoy service's IP.In our case: *10.177.4.12 -> registry.soultec.lab*![](/blog-assets/how-to-vsphere-supervisor-services/12.webp)![](/blog-assets/how-to-vsphere-supervisor-services/06.webp)The Harbor UI is now reachable. Log in with the password specified in harbor-values.yaml; that file is also where the TLS certificate is changed.![](/blog-assets/how-to-vsphere-supervisor-services/13.webp)### Installing the ArgoCD operator as a Supervisor ServiceThe ArgoCD operator installs ArgoCD instances as vSphere pods in a vSphere namespace.First the ArgoCD operator has to be installed as a Supervisor Service.- Download the Supervisor Service: [ArgoCD Operator v0.12.0](https://github.com/vsphere-tmm/Supervisor-Services/blob/main/supervisor-services-labs/argocd-operator/v0.12.0/argocd-operator.yaml)- Download the values file: [values.yaml](https://github.com/vsphere-tmm/Supervisor-Services/blob/main/supervisor-services-labs/argocd-operator/v0.12.0/values.yaml) (no changes needed, as long as quay.io is reachable from the vSphere namespace)Once registered and installed on the Supervisor, a vSphere namespace with one pod is created. That is only the ArgoCD operator, not an ArgoCD instance yet:![](/blog-assets/how-to-vsphere-supervisor-services/14.webp)### Installing an ArgoCD instance in a vSphere namespaceArgoCD deployment: [argocd-instance.yaml](https://github.com/vsphere-tmm/Supervisor-Services/blob/main/supervisor-services-labs/argocd-operator/argocd-instance.yaml)The ArgoCD instance is installed directly in a vSphere namespace. Log in to the vSphere namespace with kubectl and set the kubectl context:```bashkubectl vsphere login --server <Supervisor-VIP> -u [email protected]kubectl config use-context <vSphere-Namespace>```Then create the deployment from [argocd-instance.yaml](https://github.com/vsphere-tmm/Supervisor-Services/blob/main/supervisor-services-labs/argocd-operator/argocd-instance.yaml). The file needs no changes:```bashkubectl apply -f argocd-instance.yaml```Check the vSphere pods:```bashkubectl get pods --watch```Once all the pods are running, an external IP should be available for the load balancer:```bash kubectl get svc --watch ```![](/blog-assets/how-to-vsphere-supervisor-services/15.webp)Now create a DNS record pointing at that IP.In our case: *10.177.4.18 -> argocd.soultec.lab*#### The initial ArgoCD admin loginThe initial ArgoCD password for the "admin" user is in a Kubernetes secret:```bashkubectl get secret stlab-argocd-cluster -o jsonpath='{.data.admin\.password}' | base64 -d```ArgoCD can now be managed through its UI.![](/blog-assets/how-to-vsphere-supervisor-services/16.webp)ArgoCD's configuration, SSO, RBAC and the rest, is done through [ConfigMaps](https://ygerber.online/post/argocd-configuration/). Those ConfigMaps can be rolled out through ArgoCD itself, so ArgoCD manages itself. Default Kubernetes services such as cert-manager or an in-guest-cluster ingress controller can be rolled out the same way. The "ArgoCD app of apps" approach is interesting here. More on that in another post.# ConclusionSupervisor Services are an intuitive, straightforward way to install a Kubernetes deployment directly on a vSphere namespace. With Harbor as the container registry and ArgoCD in place, the groundwork for continuous deployment is done.'''[status]corpus = 267[[status.alsoLike]]ref = "posts/how-to-authenticate-with-the-vsphere-supervisor-api"score = "1.00"[[status.alsoLike]]ref = "posts/vvf-9-0-supervisor-mit-foundation-load-balancer"score = "1.00"[[status.alsoLike]]ref = "services/virtualization-container"score = "0.74"
<?xml version="1.0" encoding="UTF-8"?><manifest kind="Post"> <apiVersion>soultec.ch/v1</apiVersion> <metadata> <name>how-to-vsphere-supervisor-services</name> <locale>en</locale> <labels> <author>yannick-gerber</author> <series>how-to</series> <entry key="capability/containers">2.39</entry> <entry key="vendor/vmware">0.88</entry> </labels> <annotations> <source>blog-content/posts/en/how-to-vsphere-supervisor-services.md</source> <route>/en/insights/how-to-vsphere-supervisor-services/</route> <schema>/nerd/schema/posts.json</schema> <markdown>/en/insights/how-to-vsphere-supervisor-services.md</markdown> </annotations> </metadata> <spec> <title>vSphere Supervisor Services</title> <date>2024-12-22</date> <author>yannick-gerber</author> <locale>en</locale> <summary>Supervisor Services run Kubernetes deployments directly on a vSphere namespace, so no Kubernetes guest cluster is needed and the pods run on the ESXi host through the vSphere CRX runtime.</summary> <capabilities> <item>containers</item> </capabilities> <vendors> <item>vmware</item> </vendors> <series>how-to</series> <hero>/blog-assets/how-to-vsphere-supervisor-services/hero.webp</hero> <migrated>2026-08-24</migrated> <translationReviewed>false</translationReviewed> <draft>false</draft> </spec> <sections> <section> <body>vSphere IaaS Control Plane, formerly vSphere with Tanzu, has Supervisor Services. They let you run Kubernetes deployments directly on the vSphere namespace, so no Kubernetes guest cluster is needed and the pods run on the ESXi host itself through the vSphere CRX runtime.Active by default is the TKG Service, used to provision Kubernetes guest clusters on a vSphere namespace.The other Supervisor Services:- [Consumption Interface](https://github.com/vsphere-tmm/Supervisor-Services#consumption-interface)- [vSAN Data Persistence Platform (vDPP) services](https://github.com/vsphere-tmm/Supervisor-Services#vsan-data-persistence-platform-vdpp-services)- [Backup &amp; Recovery Service](https://github.com/vsphere-tmm/Supervisor-Services#backup--recovery-service)- [Certificate Management Service](https://github.com/vsphere-tmm/Supervisor-Services#certificate-management-service)- [Cloud Native Registry Service](https://github.com/vsphere-tmm/Supervisor-Services#cloud-native-registry-service)- [Kubernetes Ingress Controller Service](https://github.com/vsphere-tmm/Supervisor-Services#kubernetes-ingress-controller-service)- [External DNS Service](https://github.com/vsphere-tmm/Supervisor-Services#external-dns-service)- [NSX Management Proxy](https://github.com/vsphere-tmm/Supervisor-Services#nsx-management-proxy)- [Data Services Manager Consumption Operator](https://github.com/vsphere-tmm/Supervisor-Services#data-services-manager-consumption-operator)# Installing a Supervisor ServiceA Supervisor Service consists of two YAML manifests:- An installation manifest, which registers the Supervisor Service- A configuration manifest, which installs the service on the Supervisor (the values file)&gt; This guide uses NSX and Antrea as the CNI.&gt;&gt; Some Supervisor Services require NSX, Velero for example. </body> </section> <section> <heading>

Contour ingress controller

</heading>
<body>- Download the Contour service: [Contour v1.28.2](https://vmwaresaas.jfrog.io/ui/api/v1/download?repoKey=supervisor-services&amp;path=contour/v1.28.2/contour.yml)- Download the Contour values: [values for all versions](https://vmwaresaas.jfrog.io/ui/api/v1/download?repoKey=supervisor-services&amp;path=contour/v1.24.4/contour-data-values.yml) (with Contour the values file needs no changes)The service is added under *Workload Management*:![](/blog-assets/how-to-vsphere-supervisor-services/01.webp)For the service registration you give it Contour's YAML file, unchanged.Here that is the [Contour v1.28.2](https://vmwaresaas.jfrog.io/ui/api/v1/download?repoKey=supervisor-services&amp;path=contour/v1.28.2/contour.yml) file:![](/blog-assets/how-to-vsphere-supervisor-services/02.webp)The service is now registered: </body> </section> <section> <heading>

![](/blog-assets/how-to-vsphere-supervisor-services/03.webp)

</heading>
<body>After registration the service still has to be installed on the Supervisor. The "0" under Supervisors shows that Contour is not yet installed on any of them.*Actions &gt; Install on Supervisors*![](/blog-assets/how-to-vsphere-supervisor-services/04.webp)Now give it *contour-data-values.yml*:![](/blog-assets/how-to-vsphere-supervisor-services/05.webp)As soon as Contour gets an external IP on the envoy service, the ingress controller is installed correctly:![](/blog-assets/how-to-vsphere-supervisor-services/06.webp) </body> </section> <section> <heading>

Harbor container registry as a Supervisor Service

</heading>
<body>Harbor requires Contour to be installed first.- Download the Harbor service: [Harbor v2.9.1](https://vmwaresaas.jfrog.io/ui/api/v1/download?repoKey=supervisor-services&amp;path=harbor/v2.9.1/harbor.yml)- Download the Harbor values file: [v2.9.1](https://vmwaresaas.jfrog.io/ui/api/v1/download?repoKey=supervisor-services&amp;path=harbor/v2.9.1/harbor-data-values.yml)Registering Harbor as a Supervisor Service:![](/blog-assets/how-to-vsphere-supervisor-services/07.webp)Here you enter this YAML: [Harbor v2.9.1](https://vmwaresaas.jfrog.io/ui/api/v1/download?repoKey=supervisor-services&amp;path=harbor/v2.9.1/harbor.yml)![](/blog-assets/how-to-vsphere-supervisor-services/08.webp)Installing on the Supervisor:![](/blog-assets/how-to-vsphere-supervisor-services/09.webp)With Harbor the values YAML ([v2.9.1](https://vmwaresaas.jfrog.io/ui/api/v1/download?repoKey=supervisor-services&amp;path=harbor/v2.9.1/harbor-data-values.yml)) has to be adjusted:- Hostname- StorageClass- Passwords and secrets![](/blog-assets/how-to-vsphere-supervisor-services/10.webp)After installing on the Supervisor, a dedicated vSphere namespace is created for Harbor:![](/blog-assets/how-to-vsphere-supervisor-services/11.webp)Because Harbor needs Contour as its ingress controller, create a DNS record pointing the hostname from the Harbor values file at the envoy service's IP.In our case: *10.177.4.12 -&gt; registry.soultec.lab*![](/blog-assets/how-to-vsphere-supervisor-services/12.webp)![](/blog-assets/how-to-vsphere-supervisor-services/06.webp)The Harbor UI is now reachable. Log in with the password specified in harbor-values.yaml; that file is also where the TLS certificate is changed.![](/blog-assets/how-to-vsphere-supervisor-services/13.webp)### Installing the ArgoCD operator as a Supervisor ServiceThe ArgoCD operator installs ArgoCD instances as vSphere pods in a vSphere namespace.First the ArgoCD operator has to be installed as a Supervisor Service.- Download the Supervisor Service: [ArgoCD Operator v0.12.0](https://github.com/vsphere-tmm/Supervisor-Services/blob/main/supervisor-services-labs/argocd-operator/v0.12.0/argocd-operator.yaml)- Download the values file: [values.yaml](https://github.com/vsphere-tmm/Supervisor-Services/blob/main/supervisor-services-labs/argocd-operator/v0.12.0/values.yaml) (no changes needed, as long as quay.io is reachable from the vSphere namespace)Once registered and installed on the Supervisor, a vSphere namespace with one pod is created. That is only the ArgoCD operator, not an ArgoCD instance yet:![](/blog-assets/how-to-vsphere-supervisor-services/14.webp)### Installing an ArgoCD instance in a vSphere namespaceArgoCD deployment: [argocd-instance.yaml](https://github.com/vsphere-tmm/Supervisor-Services/blob/main/supervisor-services-labs/argocd-operator/argocd-instance.yaml)The ArgoCD instance is installed directly in a vSphere namespace. Log in to the vSphere namespace with kubectl and set the kubectl context:```bashkubectl vsphere login --server &lt;Supervisor-VIP&gt; -u [email protected]kubectl config use-context &lt;vSphere-Namespace&gt;```Then create the deployment from [argocd-instance.yaml](https://github.com/vsphere-tmm/Supervisor-Services/blob/main/supervisor-services-labs/argocd-operator/argocd-instance.yaml). The file needs no changes:```bashkubectl apply -f argocd-instance.yaml```Check the vSphere pods:```bashkubectl get pods --watch```Once all the pods are running, an external IP should be available for the load balancer:```bash kubectl get svc --watch ```![](/blog-assets/how-to-vsphere-supervisor-services/15.webp)Now create a DNS record pointing at that IP.In our case: *10.177.4.18 -&gt; argocd.soultec.lab*#### The initial ArgoCD admin loginThe initial ArgoCD password for the "admin" user is in a Kubernetes secret:```bashkubectl get secret stlab-argocd-cluster -o jsonpath='{.data.admin\.password}' | base64 -d```ArgoCD can now be managed through its UI.![](/blog-assets/how-to-vsphere-supervisor-services/16.webp)ArgoCD's configuration, SSO, RBAC and the rest, is done through [ConfigMaps](https://ygerber.online/post/argocd-configuration/). Those ConfigMaps can be rolled out through ArgoCD itself, so ArgoCD manages itself. Default Kubernetes services such as cert-manager or an in-guest-cluster ingress controller can be rolled out the same way. The "ArgoCD app of apps" approach is interesting here. More on that in another post.# ConclusionSupervisor Services are an intuitive, straightforward way to install a Kubernetes deployment directly on a vSphere namespace. With Harbor as the container registry and ArgoCD in place, the groundwork for continuous deployment is done. </body> </section> </sections> <status> <corpus>267</corpus> <alsoLike> <item> <ref>posts/how-to-authenticate-with-the-vsphere-supervisor-api</ref> <score>1.00</score> </item> <item> <ref>posts/vvf-9-0-supervisor-mit-foundation-load-balancer</ref> <score>1.00</score> </item> <item> <ref>services/virtualization-container</ref> <score>0.74</score> </item> </alsoLike> </status></manifest>
How-To · 2024-12-22

vSphere Supervisor Services

Supervisor Services run Kubernetes deployments directly on a vSphere namespace, so no Kubernetes guest cluster is needed and the pods run on the ESXi host through the vSphere CRX runtime.

2024-12-22Date
Yannick GerberAuthor
4Min read
Topics Containers 2.39
Vendors VMware 0.88

vSphere IaaS Control Plane, formerly vSphere with Tanzu, has Supervisor Services. They let you run Kubernetes deployments directly on the vSphere namespace, so no Kubernetes guest cluster is needed and the pods run on the ESXi host itself through the vSphere CRX runtime.

Active by default is the TKG Service, used to provision Kubernetes guest clusters on a vSphere namespace.

The other Supervisor Services:

Installing a Supervisor Service

A Supervisor Service consists of two YAML manifests:

  • An installation manifest, which registers the Supervisor Service
  • A configuration manifest, which installs the service on the Supervisor (the values file)

This guide uses NSX and Antrea as the CNI.

Some Supervisor Services require NSX, Velero for example.

Contour ingress controller

The service is added under Workload Management:

For the service registration you give it Contour’s YAML file, unchanged.

Here that is the Contour v1.28.2 file:

The service is now registered:

After registration the service still has to be installed on the Supervisor. The “0” under Supervisors shows that Contour is not yet installed on any of them.

Actions > Install on Supervisors

Now give it contour-data-values.yml:

As soon as Contour gets an external IP on the envoy service, the ingress controller is installed correctly:

Harbor container registry as a Supervisor Service

Harbor requires Contour to be installed first.

Registering Harbor as a Supervisor Service:

Here you enter this YAML: Harbor v2.9.1

Installing on the Supervisor:

With Harbor the values YAML (v2.9.1) has to be adjusted:

  • Hostname
  • StorageClass
  • Passwords and secrets

After installing on the Supervisor, a dedicated vSphere namespace is created for Harbor:

Because Harbor needs Contour as its ingress controller, create a DNS record pointing the hostname from the Harbor values file at the envoy service’s IP.

In our case: 10.177.4.12 -> registry.soultec.lab

The Harbor UI is now reachable. Log in with the password specified in harbor-values.yaml; that file is also where the TLS certificate is changed.

Installing the ArgoCD operator as a Supervisor Service

The ArgoCD operator installs ArgoCD instances as vSphere pods in a vSphere namespace.

First the ArgoCD operator has to be installed as a Supervisor Service.

  • Download the Supervisor Service: ArgoCD Operator v0.12.0
  • Download the values file: values.yaml (no changes needed, as long as quay.io is reachable from the vSphere namespace)

Once registered and installed on the Supervisor, a vSphere namespace with one pod is created. That is only the ArgoCD operator, not an ArgoCD instance yet:

Installing an ArgoCD instance in a vSphere namespace

ArgoCD deployment: argocd-instance.yaml

The ArgoCD instance is installed directly in a vSphere namespace. Log in to the vSphere namespace with kubectl and set the kubectl context:


kubectl vsphere login --server <Supervisor-VIP> -u [email protected]

kubectl config use-context <vSphere-Namespace>

Then create the deployment from argocd-instance.yaml. The file needs no changes:


kubectl apply -f argocd-instance.yaml

Check the vSphere pods:


kubectl get pods --watch

Once all the pods are running, an external IP should be available for the load balancer:

 kubectl get svc --watch 

Now create a DNS record pointing at that IP.

In our case: 10.177.4.18 -> argocd.soultec.lab

The initial ArgoCD admin login

The initial ArgoCD password for the “admin” user is in a Kubernetes secret:


kubectl get secret stlab-argocd-cluster -o jsonpath='{.data.admin\.password}' | base64 -d

ArgoCD can now be managed through its UI.

ArgoCD’s configuration, SSO, RBAC and the rest, is done through ConfigMaps. Those ConfigMaps can be rolled out through ArgoCD itself, so ArgoCD manages itself. Default Kubernetes services such as cert-manager or an in-guest-cluster ingress controller can be rolled out the same way. The “ArgoCD app of apps” approach is interesting here. More on that in another post.

Conclusion

Supervisor Services are an intuitive, straightforward way to install a Kubernetes deployment directly on a vSphere namespace. With Harbor as the container registry and ArgoCD in place, the groundwork for continuous deployment is done.

You might also like