diff --git a/app/models/clusters/applications/knative.rb b/app/models/clusters/applications/knative.rb
index 1093efee85a8d4105476a4fdc22619198e2458d8..6ad086211fb9a8f7beecb47f756c986870e72e44 100644
--- a/app/models/clusters/applications/knative.rb
+++ b/app/models/clusters/applications/knative.rb
@@ -7,7 +7,7 @@ class Knative < ApplicationRecord
       REPOSITORY = 'https://storage.googleapis.com/triggermesh-charts'
       METRICS_CONFIG = 'https://storage.googleapis.com/triggermesh-charts/istio-metrics.yaml'
       FETCH_IP_ADDRESS_DELAY = 30.seconds
-      API_RESOURCES_PATH = 'config/knative/api_resources.yml'
+      API_GROUPS_PATH = 'config/knative/api_groups.yml'
 
       self.table_name = 'clusters_applications_knative'
 
@@ -109,15 +109,15 @@ def delete_knative_namespaces
       end
 
       def delete_knative_and_istio_crds
-        api_resources.map do |crd|
-          Gitlab::Kubernetes::KubectlCmd.delete("--ignore-not-found", "crd", "#{crd}")
+        api_groups.map do |group|
+          Gitlab::Kubernetes::KubectlCmd.delete_crds_from_group(group)
         end
       end
 
       # returns an array of CRDs to be postdelete since helm does not
       # manage the CRDs it creates.
-      def api_resources
-        @api_resources ||= YAML.safe_load(File.read(Rails.root.join(API_RESOURCES_PATH)))
+      def api_groups
+        @api_groups ||= YAML.safe_load(File.read(Rails.root.join(API_GROUPS_PATH)))
       end
 
       def install_knative_metrics
diff --git a/config/knative/api_groups.yml b/config/knative/api_groups.yml
new file mode 100644
index 0000000000000000000000000000000000000000..4697086eb5a4365cc5eb7361e1e992ab12e09566
--- /dev/null
+++ b/config/knative/api_groups.yml
@@ -0,0 +1,11 @@
+---
+
+- networking.istio.io
+- rbac.istio.io
+- authentication.istio.io
+- config.istio.io
+
+- networking.internal.knative.dev
+- serving.knative.dev
+- caching.internal.knative.dev
+- autoscaling.internal.knative.dev
\ No newline at end of file
diff --git a/config/knative/api_resources.yml b/config/knative/api_resources.yml
deleted file mode 100644
index 095f44ed799d9376c56851ac5aad9922dd267c0c..0000000000000000000000000000000000000000
--- a/config/knative/api_resources.yml
+++ /dev/null
@@ -1,70 +0,0 @@
----
-
-- meshpolicies.authentication.istio.io
-- policies.authentication.istio.io
-- adapters.config.istio.io
-- apikeys.config.istio.io
-- attributemanifests.config.istio.io
-- authorizations.config.istio.io
-- bypasses.config.istio.io
-- podautoscalers.autoscaling.internal.knative.dev
-- builds.build.knative.dev
-- buildtemplates.build.knative.dev
-- clusterbuildtemplates.build.knative.dev
-- images.caching.internal.knative.dev
-- certificates.networking.internal.knative.dev
-- clusteringresses.networking.internal.knative.dev
-- serverlessservices.networking.internal.knative.dev
-- configurations.serving.knative.dev
-- revisions.serving.knative.dev
-- routes.serving.knative.dev
-- services.serving.knative.dev
-- checknothings.config.istio.io
-- circonuses.config.istio.io
-- deniers.config.istio.io
-- edges.config.istio.io
-- fluentds.config.istio.io
-- handlers.config.istio.io
-- httpapispecbindings.config.istio.io
-- httpapispecs.config.istio.io
-- instances.config.istio.io
-- kubernetesenvs.config.istio.io
-- kuberneteses.config.istio.io
-- listcheckers.config.istio.io
-- listentries.config.istio.io
-- logentries.config.istio.io
-- memquotas.config.istio.io
-- metrics.config.istio.io
-- noops.config.istio.io
-- opas.config.istio.io
-- prometheuses.config.istio.io
-- quotas.config.istio.io
-- quotaspecbindings.config.istio.io
-- quotaspecs.config.istio.io
-- rbacs.config.istio.io
-- redisquotas.config.istio.io
-- reportnothings.config.istio.io
-- rules.config.istio.io
-- servicecontrolreports.config.istio.io
-- servicecontrols.config.istio.io
-- signalfxs.config.istio.io
-- solarwindses.config.istio.io
-- stackdrivers.config.istio.io
-- statsds.config.istio.io
-- stdios.config.istio.io
-- templates.config.istio.io
-- tracespans.config.istio.io
-- destinationrules.networking.istio.io
-- envoyfilters.networking.istio.io
-- gateways.networking.istio.io
-- serviceentries.networking.istio.io
-- virtualservices.networking.istio.io
-- rbacconfigs.rbac.istio.io
-- servicerolebindings.rbac.istio.io
-- serviceroles.rbac.istio.io
-- cloudwatches.config.istio.io
-- clusterrbacconfigs.rbac.istio.io
-- dogstatsds.config.istio.io
-- ingresses.networking.internal.knative.dev
-- sidecars.networking.istio.io
-- zipkins.config.istio.io
diff --git a/lib/gitlab/kubernetes/kubectl_cmd.rb b/lib/gitlab/kubernetes/kubectl_cmd.rb
index 981eb5681dcf95b592e08d3a8776ed97d7587290..e8fde28b44d379de6e33ca0c49db9d93340daa74 100644
--- a/lib/gitlab/kubernetes/kubectl_cmd.rb
+++ b/lib/gitlab/kubernetes/kubectl_cmd.rb
@@ -13,6 +13,16 @@ def apply_file(filename, *args)
 
           %w(kubectl apply -f).concat([filename], args).shelljoin
         end
+
+        def delete_crds_from_group(group)
+          api_resources_args = %w(-o name --api-group).push(group)
+
+          api_resources(*api_resources_args) + " | xargs " + delete('--ignore-not-found', 'crd')
+        end
+
+        def api_resources(*args)
+          %w(kubectl api-resources).concat(args).shelljoin
+        end
       end
     end
   end
diff --git a/spec/lib/gitlab/kubernetes/kubectl_cmd_spec.rb b/spec/lib/gitlab/kubernetes/kubectl_cmd_spec.rb
index f24ab5579df320135bb537325ea5b8ae92031bfd..b65d7b9fdc6207ca67af36c0208b4cda984fcc7e 100644
--- a/spec/lib/gitlab/kubernetes/kubectl_cmd_spec.rb
+++ b/spec/lib/gitlab/kubernetes/kubectl_cmd_spec.rb
@@ -45,4 +45,20 @@
       end
     end
   end
+
+  describe '.api_resources' do
+    it 'constructs string properly' do
+      expected_command = 'kubectl api-resources -o name --api-group foo'
+
+      expect(described_class.api_resources("-o", "name", "--api-group", "foo")).to eq expected_command
+    end
+  end
+
+  describe '.delete_crds_from_group' do
+    it 'constructs string properly' do
+      expected_command = 'kubectl api-resources -o name --api-group foo | xargs kubectl delete --ignore-not-found crd'
+
+      expect(described_class.delete_crds_from_group("foo")).to eq expected_command
+    end
+  end
 end
diff --git a/spec/models/clusters/applications/knative_spec.rb b/spec/models/clusters/applications/knative_spec.rb
index 51c8a6bb68d707dae6d8d20096a00f526af45864..f1ce447a0d8c33cc64b0dd13699f17f81b884aa2 100644
--- a/spec/models/clusters/applications/knative_spec.rb
+++ b/spec/models/clusters/applications/knative_spec.rb
@@ -161,18 +161,19 @@
     end
 
     it "initializes command with all necessary postdelete script" do
-      api_resources = YAML.safe_load(File.read(Rails.root.join(Clusters::Applications::Knative::API_RESOURCES_PATH)))
+      api_groups = YAML.safe_load(File.read(Rails.root.join(Clusters::Applications::Knative::API_GROUPS_PATH)))
 
       remove_knative_istio_leftovers_script = [
         "kubectl delete --ignore-not-found ns knative-serving",
         "kubectl delete --ignore-not-found ns knative-build"
       ]
 
-      full_delete_commands_size = api_resources.size + remove_knative_istio_leftovers_script.size
+      full_delete_commands_size = api_groups.size + remove_knative_istio_leftovers_script.size
 
       expect(subject.postdelete).to include(*remove_knative_istio_leftovers_script)
       expect(subject.postdelete.size).to eq(full_delete_commands_size)
-      expect(subject.postdelete[2]).to eq("kubectl delete --ignore-not-found crd #{api_resources[0]}")
+      expect(subject.postdelete[2]).to eq("kubectl api-resources -o name --api-group #{api_groups[0]} | xargs kubectl delete --ignore-not-found crd")
+      expect(subject.postdelete[3]).to eq("kubectl api-resources -o name --api-group #{api_groups[1]} | xargs kubectl delete --ignore-not-found crd")
     end
   end