<p>I am just exploring and want to helm my k8dash, but got the weird error since I have been able to deploy on AWS EKS.</p>
<p>I am running them on my Minikube <code>V1.23.2</code></p>
<p>My helm version is <code>v3.6.2</code></p>
<p>Kubernetes kubectl version is <code>v1.22.3</code></p>
<p>Basically if I do helm template, the <code>VirtualServer</code> would be like this:</p>
<pre><code>apiVersion: k8s.nginx.org/v1
kind: VirtualServer
metadata:
  name: k8dash
  namespace: k8dash
spec:
  host: namahost.com
  routes:
  - action:
      pass: RELEASE-NAME
    path: /
  upstreams:
  - name: RELEASE-NAME
    port: 80
    service: RELEASE-NAME
</code></pre>
<p>and I got this error:</p>
<pre><code>Error: unable to build Kubernetes objects from release manifest: unable to recognize &quot;&quot;: no matches for kind &quot;VirtualServer&quot; in version &quot;k8s.nginx.org/v1&quot;
</code></pre>
<p>It's weird, deploying this one on AWS EKS just fine but locally got this error and I could not find any clue while Googling. Does it has something to do with my tools version?</p>

<p>You have to install additional CRDs as both <code>VirtualServer</code> and <code>VirtualServerRoute</code> are not oob, but nginx resources.</p>
<p><a href="https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/#customresourcedefinitions" rel="nofollow noreferrer">CustomResourceDefinitions</a>:</p>
<blockquote>
<p>The CustomResourceDefinition API resource allows you to define custom
resources. Defining a CRD object creates a new custom resource with a
name and schema that you specify. The Kubernetes API serves and
handles the storage of your custom resource. The name of a CRD object
must be a valid DNS subdomain name.</p>
<p>This frees you from writing your own API server to handle the custom
resource, but the generic nature of the implementation means you have
less flexibility than with API server aggregation.</p>
</blockquote>
<hr />
<p><a href="https://docs.nginx.com/nginx-ingress-controller/installation/installation-with-manifests/#create-custom-resources" rel="nofollow noreferrer">Nginx Create Custom Resources</a></p>
<blockquote>
<p>Note: <strong>By default, it is required to create custom resource definitions
for VirtualServer, VirtualServerRoute, TransportServer and Policy.</strong>
Otherwise, the Ingress Controller pods will not become Ready. If you’d
like to disable that requirement, configure -enable-custom-resources
command-line argument to false and skip this section.</p>
</blockquote>
<p>Create custom resource definitions for VirtualServer and VirtualServerRoute, TransportServer and Policy resources.</p>
<p>You can find crds under <a href="https://github.com/nginxinc/kubernetes-ingress/tree/master/deployments/common/crds" rel="nofollow noreferrer">https://github.com/nginxinc/kubernetes-ingress/tree/master/deployments/common/crds</a>:</p>
<pre><code>$ git clone https://github.com/nginxinc/kubernetes-ingress/
$ cd kubernetes-ingress/deployments
$ git checkout v2.0.3 (or latest, as you wish)

$ kubectl apply -f common/crds/k8s.nginx.org_virtualservers.yaml
$ kubectl apply -f common/crds/k8s.nginx.org_virtualserverroutes.yaml
$ kubectl apply -f common/crds/k8s.nginx.org_transportservers.yaml
$ kubectl apply -f common/crds/k8s.nginx.org_policies.yaml
</code></pre>
<p>After successful applying you will be able to create both <code>VirtualServer</code> and <code>VirtualServerRoute</code></p>
