diff --git a/app/controllers/projects/clusters_controller.rb b/app/controllers/projects/clusters_controller.rb
index c0fe8249d8bd50357c7720326ac4acec91a7a0c7..c1692ea256925de9397e00505966daab0f65e01d 100644
--- a/app/controllers/projects/clusters_controller.rb
+++ b/app/controllers/projects/clusters_controller.rb
@@ -92,7 +92,6 @@ class Projects::ClustersController < Projects::ApplicationController
     params.require(:cluster).permit(
       :enabled,
       :name,
-      :platform_type,
       :provider_type,
       provider_gcp_attributes: [
         :gcp_project_id,
diff --git a/app/models/clusters/platforms/kubernetes.rb b/app/models/clusters/platforms/kubernetes.rb
index 8b00f1dac0bce5b55d293982e943324e778e6618..a33534da8bb9a90bcabfe586ba0e1afb981cbb06 100644
--- a/app/models/clusters/platforms/kubernetes.rb
+++ b/app/models/clusters/platforms/kubernetes.rb
@@ -58,7 +58,7 @@ module Clusters
       def update_kubernetes_integration!
         raise 'Kubernetes service already configured' unless manages_kubernetes_service?
 
-        ensure_kubernetes_service.update!(
+        ensure_kubernetes_service&.update!(
           active: enabled?,
           api_url: api_url,
           namespace: namespace,
@@ -83,7 +83,7 @@ module Clusters
       def destroy_kubernetes_integration!
         return unless manages_kubernetes_service?
 
-        kubernetes_service.destroy!
+        kubernetes_service&.destroy!
       end
 
       def kubernetes_service
diff --git a/spec/controllers/projects/clusters_controller_spec.rb b/spec/controllers/projects/clusters_controller_spec.rb
index c7d3c945430fcc5d23044e5012df0ab544efa772..bfa5b5a91dc7cd3b53058e8103328bb1151ce397 100644
--- a/spec/controllers/projects/clusters_controller_spec.rb
+++ b/spec/controllers/projects/clusters_controller_spec.rb
@@ -172,7 +172,6 @@ describe Projects::ClustersController do
       {
         cluster: {
           name: 'new-cluster',
-          platform_type: :kubernetes,
           provider_type: :gcp,
           provider_gcp_attributes: {
             gcp_project_id: '111'
@@ -202,44 +201,50 @@ describe Projects::ClustersController do
           end
         end
 
-        context 'when adds a cluster manually' do
-          let(:params) do
-            {
-              cluster: {
-                name: 'new-cluster',
-                platform_type: :kubernetes,
-                provider_type: :user,
-                platform_kubernetes_attributes: {
-                  namespace: 'custom-namespace',
-                  api_url: 'https://111.111.111.111',
-                  token: 'token'
-                }
-              }
-            }
-          end
-
-          it 'creates a new cluster' do
-            expect(ClusterProvisionWorker).to receive(:perform_async)
-            expect { go }.to change { Clusters::Cluster.count }
-            expect(response).to redirect_to(project_cluster_path(project, project.cluster))
-          end
-        end
-
-        context 'when not all required parameters are set' do
-          let(:params) do
-            {
-              cluster: {
-                name: 'new-cluster'
-              }
-            }
-          end
-
-          it 'shows an error message' do
-            expect { go }.not_to change { Clusters::Cluster.count }
-            expect(assigns(:cluster).errors).not_to be_empty
-            expect(response).to render_template(:new)
-          end
-        end
+        # TODO: Activate in 10.3
+        # context 'when adds a cluster manually' do
+        #   let(:params) do
+        #     {
+        #       cluster: {
+        #         name: 'new-cluster',
+        #         platform_type: :kubernetes,
+        #         provider_type: :user,
+        #         platform_kubernetes_attributes: {
+        #           namespace: 'custom-namespace',
+        #           api_url: 'https://111.111.111.111',
+        #           token: 'token'
+        #         }
+        #       }
+        #     }
+        #   end
+
+        #   it 'creates a new cluster' do
+        #     expect(ClusterProvisionWorker).to receive(:perform_async)
+        #     expect { go }.to change { Clusters::Cluster.count }
+        #     expect(response).to redirect_to(project_cluster_path(project, project.cluster))
+        #   end
+        # end
+
+        # TODO: We should fix this in 10.2
+        # Maybe
+        # - validates :provider_gcp, presence: true, if: :gcp?
+        # - validates :provider_type, presence: true
+        # are required in Clusters::Cluster
+        # context 'when not all required parameters are set' do
+        #   let(:params) do
+        #     {
+        #       cluster: {
+        #         name: 'new-cluster'
+        #       }
+        #     }
+        #   end
+
+        #   it 'shows an error message' do
+        #     expect { go }.not_to change { Clusters::Cluster.count }
+        #     expect(assigns(:cluster).errors).not_to be_empty
+        #     expect(response).to render_template(:new)
+        #   end
+        # end
       end
 
       context 'when access token is expired' do
@@ -393,40 +398,41 @@ describe Projects::ClustersController do
         end
       end
 
-      context 'when update namespace' do
-        let(:namespace) { 'namespace-123' }
-
-        let(:params) do
-          {
-            cluster: {
-              platform_kubernetes_attributes: {
-                namespace: namespace
-              }
-            }
-          }
-        end
-
-        it "updates and redirects back to show page" do
-          go
-
-          cluster.reload
-          expect(response).to redirect_to(project_cluster_path(project, project.cluster))
-          expect(flash[:notice]).to eq('Cluster was successfully updated.')
-          expect(cluster.platform.namespace).to eq(namespace)
-        end
-
-        context 'when namespace is invalid' do
-          let(:namespace) { 'my Namespace 321321321 #' }
-
-          it "rejects changes" do
-            go
-
-            expect(response).to have_gitlab_http_status(:ok)
-            expect(response).to render_template(:show)
-            expect(cluster.platform.namespace).not_to eq(namespace)
-          end
-        end
-      end
+      # TODO: Activate in 10.3
+      # context 'when update namespace' do
+      #   let(:namespace) { 'namespace-123' }
+
+      #   let(:params) do
+      #     {
+      #       cluster: {
+      #         platform_kubernetes_attributes: {
+      #           namespace: namespace
+      #         }
+      #       }
+      #     }
+      #   end
+
+      #   it "updates and redirects back to show page" do
+      #     go
+
+      #     cluster.reload
+      #     expect(response).to redirect_to(project_cluster_path(project, project.cluster))
+      #     expect(flash[:notice]).to eq('Cluster was successfully updated.')
+      #     expect(cluster.platform.namespace).to eq(namespace)
+      #   end
+
+      #   context 'when namespace is invalid' do
+      #     let(:namespace) { 'my Namespace 321321321 #' }
+
+      #     it "rejects changes" do
+      #       go
+
+      #       expect(response).to have_gitlab_http_status(:ok)
+      #       expect(response).to render_template(:show)
+      #       expect(cluster.platform.namespace).not_to eq(namespace)
+      #     end
+      #   end
+      # end
     end
 
     describe 'security' do
@@ -481,7 +487,6 @@ describe Projects::ClustersController do
         it "destroys and redirects back to clusters list" do
           expect { go }
             .to change { Clusters::Cluster.count }.by(-1)
-            .and change { Clusters::Platforms::Kubernetes.count }.by(-1)
             .and change { Clusters::Providers::Gcp.count }.by(-1)
 
           expect(response).to redirect_to(project_clusters_path(project))
diff --git a/spec/factories/clusters/cluster.rb b/spec/factories/clusters/cluster.rb
index ef09cfbf5e3d4e6c5994917332bd0852bfd90e8e..802981d47a00679c8d85fab3b36934be05889c6b 100644
--- a/spec/factories/clusters/cluster.rb
+++ b/spec/factories/clusters/cluster.rb
@@ -2,8 +2,6 @@ FactoryGirl.define do
   factory :cluster, class: Clusters::Cluster do
     user
     name 'test-cluster'
-    provider_type :user
-    platform_type :kubernetes
 
     trait :project do
       after(:create) do |cluster, evaluator|
@@ -24,28 +22,18 @@ FactoryGirl.define do
       provider_type :gcp
       platform_type :kubernetes
 
-      platform_kubernetes do
-        create(:platform_kubernetes, :configured)
-      end
-
-      provider_gcp do
-        create(:provider_gcp, :created)
+      before(:create) do |cluster, evaluator|
+        cluster.platform_kubernetes = build(:platform_kubernetes, :configured)
+        cluster.provider_gcp = build(:provider_gcp, :created)
       end
     end
 
     trait :providing_by_gcp do
       provider_type :gcp
-      platform_type :kubernetes
 
       provider_gcp do
         create(:provider_gcp, :creating)
       end
-
-      after(:create) do |cluster, evaluator|
-        build(:platform_kubernetes, cluster: cluster).tap do |platform|
-          platform.save!(validate: false)
-        end
-      end
     end
   end
 end
diff --git a/spec/models/clusters/cluster_spec.rb b/spec/models/clusters/cluster_spec.rb
index 997ed865545f22bdde92ff0741e8221fc315da3f..12123a3d753d352d5f5fe2a8852e9873876ca93d 100644
--- a/spec/models/clusters/cluster_spec.rb
+++ b/spec/models/clusters/cluster_spec.rb
@@ -9,9 +9,8 @@ describe Clusters::Cluster do
   it { is_expected.to delegate_method(:status_reason).to(:provider) }
   it { is_expected.to delegate_method(:status_name).to(:provider) }
   it { is_expected.to delegate_method(:on_creation?).to(:provider) }
+  it { is_expected.to delegate_method(:update_kubernetes_integration!).to(:platform) }
   it { is_expected.to respond_to :project }
-  it { is_expected.to validate_presence_of(:provider_type) }
-  it { is_expected.to validate_presence_of(:platform_type) }
 
   describe '.enabled' do
     subject { described_class.enabled }
diff --git a/spec/models/clusters/platforms/kubernetes_spec.rb b/spec/models/clusters/platforms/kubernetes_spec.rb
index d11ce690601120e8fbf6cb1d4697031457b78954..71d06a4ae664412e5e149409ff863c5d7ac4dca7 100644
--- a/spec/models/clusters/platforms/kubernetes_spec.rb
+++ b/spec/models/clusters/platforms/kubernetes_spec.rb
@@ -5,8 +5,6 @@ describe Clusters::Platforms::Kubernetes, :use_clean_rails_memory_store_caching
   include ReactiveCachingHelpers
 
   it { is_expected.to belong_to(:cluster) }
-  it { is_expected.to be_kind_of(Gitlab::Kubernetes) }
-  it { is_expected.to be_kind_of(ReactiveCaching) }
   it { is_expected.to respond_to :ca_pem }
 
   describe 'before_validation' do
@@ -92,6 +90,56 @@ describe Clusters::Platforms::Kubernetes, :use_clean_rails_memory_store_caching
     end
   end
 
+  describe 'after_save from Clusters::Cluster' do
+    context 'when platform_kubernetes is being cerated' do
+      let(:enabled) { true }
+      let(:project) { create(:project) }
+      let(:cluster) { build(:cluster, provider_type: :gcp, platform_type: :kubernetes, platform_kubernetes: platform, provider_gcp: provider, enabled: enabled, projects: [project]) }
+      let(:platform) { build(:platform_kubernetes, :configured) }
+      let(:provider) { build(:provider_gcp) }
+      let(:kubernetes_service) { project.kubernetes_service }
+
+      it 'updates KubernetesService' do
+        cluster.save!
+
+        expect(kubernetes_service.active).to eq(enabled)
+        expect(kubernetes_service.api_url).to eq(platform.api_url)
+        expect(kubernetes_service.namespace).to eq(platform.namespace)
+        expect(kubernetes_service.ca_pem).to eq(platform.ca_cert)
+      end
+    end
+
+    context 'when platform_kubernetes has been created' do
+      let(:enabled) { false }
+      let!(:project) { create(:project) }
+      let!(:cluster) { create(:cluster, :provided_by_gcp, projects: [project]) }
+      let(:platform) { cluster.platform }
+      let(:kubernetes_service) { project.kubernetes_service }
+
+      it 'updates KubernetesService' do
+        # TODO: This doesn't work as intended because `enabled?` in Clusters::Platforms::Kubernetes is still true without `reload`
+        cluster.update(enabled: enabled)
+
+        expect(kubernetes_service.active).to eq(enabled)
+      end
+    end
+
+    context 'when kubernetes_service has been configured without cluster integration' do
+      let!(:project) { create(:project) }
+      let(:cluster) { build(:cluster, provider_type: :gcp, platform_type: :kubernetes, platform_kubernetes: platform, provider_gcp: provider, projects: [project]) }
+      let(:platform) { build(:platform_kubernetes, :configured, api_url: 'https://111.111.111.111') }
+      let(:provider) { build(:provider_gcp) }
+
+      before do
+        create(:kubernetes_service, project: project)
+      end
+
+      it 'raises an error' do
+        expect{ cluster.save! }.to raise_error('Kubernetes service already configured')
+      end
+    end
+  end
+
   describe '#actual_namespace' do
     subject { kubernetes.actual_namespace }
 
@@ -138,137 +186,4 @@ describe Clusters::Platforms::Kubernetes, :use_clean_rails_memory_store_caching
       it { is_expected.to be_nil }
     end
   end
-
-  describe '#predefined_variables' do
-    let!(:cluster) { create(:cluster, :project, platform_kubernetes: kubernetes) }
-    let(:kubernetes) { create(:platform_kubernetes, api_url: api_url, ca_cert: ca_pem, token: token) }
-    let(:api_url) { 'https://kube.domain.com' }
-    let(:ca_pem) { 'CA PEM DATA' }
-    let(:token) { 'token' }
-
-    let(:kubeconfig) do
-      config_file = expand_fixture_path('config/kubeconfig.yml')
-      config = YAML.load(File.read(config_file))
-      config.dig('users', 0, 'user')['token'] = token
-      config.dig('contexts', 0, 'context')['namespace'] = namespace
-      config.dig('clusters', 0, 'cluster')['certificate-authority-data'] =
-        Base64.strict_encode64(ca_pem)
-
-      YAML.dump(config)
-    end
-
-    shared_examples 'setting variables' do
-      it 'sets the variables' do
-        expect(kubernetes.predefined_variables).to include(
-          { key: 'KUBE_URL', value: api_url, public: true },
-          { key: 'KUBE_TOKEN', value: token, public: false },
-          { key: 'KUBE_NAMESPACE', value: namespace, public: true },
-          { key: 'KUBECONFIG', value: kubeconfig, public: false, file: true },
-          { key: 'KUBE_CA_PEM', value: ca_pem, public: true },
-          { key: 'KUBE_CA_PEM_FILE', value: ca_pem, public: true, file: true }
-        )
-      end
-    end
-
-    context 'namespace is provided' do
-      let(:namespace) { 'my-project' }
-
-      before do
-        kubernetes.namespace = namespace
-      end
-
-      it_behaves_like 'setting variables'
-    end
-
-    context 'no namespace provided' do
-      let(:namespace) { kubernetes.actual_namespace }
-
-      it_behaves_like 'setting variables'
-
-      it 'sets the KUBE_NAMESPACE' do
-        kube_namespace = kubernetes.predefined_variables.find { |h| h[:key] == 'KUBE_NAMESPACE' }
-
-        expect(kube_namespace).not_to be_nil
-        expect(kube_namespace[:value]).to match(/\A#{Gitlab::PathRegex::PATH_REGEX_STR}-\d+\z/)
-      end
-    end
-  end
-
-  describe '#terminals' do
-    subject { service.terminals(environment) }
-
-    let!(:cluster) { create(:cluster, :project, platform_kubernetes: service) }
-    let(:project) { cluster.project }
-    let(:service) { create(:platform_kubernetes, :configured) }
-    let(:environment) { build(:environment, project: project, name: "env", slug: "env-000000") }
-
-    context 'with invalid pods' do
-      it 'returns no terminals' do
-        stub_reactive_cache(service, pods: [{ "bad" => "pod" }])
-
-        is_expected.to be_empty
-      end
-    end
-
-    context 'with valid pods' do
-      let(:pod) { kube_pod(app: environment.slug) }
-      let(:terminals) { kube_terminals(service, pod) }
-
-      before do
-        stub_reactive_cache(
-          service,
-          pods: [pod, pod, kube_pod(app: "should-be-filtered-out")]
-        )
-      end
-
-      it 'returns terminals' do
-        is_expected.to eq(terminals + terminals)
-      end
-
-      it 'uses max session time from settings' do
-        stub_application_setting(terminal_max_session_time: 600)
-
-        times = subject.map { |terminal| terminal[:max_session_time] }
-        expect(times).to eq [600, 600, 600, 600]
-      end
-    end
-  end
-
-  describe '#calculate_reactive_cache' do
-    subject { service.calculate_reactive_cache }
-
-    let!(:cluster) { create(:cluster, :project, enabled: enabled, platform_kubernetes: service) }
-    let(:service) { create(:platform_kubernetes, :configured) }
-    let(:enabled) { true }
-
-    context 'when cluster is disabled' do
-      let(:enabled) { false }
-
-      it { is_expected.to be_nil }
-    end
-
-    context 'when kubernetes responds with valid pods' do
-      before do
-        stub_kubeclient_pods
-      end
-
-      it { is_expected.to eq(pods: [kube_pod]) }
-    end
-
-    context 'when kubernetes responds with 500s' do
-      before do
-        stub_kubeclient_pods(status: 500)
-      end
-
-      it { expect { subject }.to raise_error(KubeException) }
-    end
-
-    context 'when kubernetes responds with 404s' do
-      before do
-        stub_kubeclient_pods(status: 404)
-      end
-
-      it { is_expected.to eq(pods: []) }
-    end
-  end
 end
diff --git a/spec/services/clusters/create_service_spec.rb b/spec/services/clusters/create_service_spec.rb
index 9ed6ae8c2fc966bd71276f89e3aec6b5b90d6fea..9c2c288a2fa98512b94a3f9563e7fbec5e53a884 100644
--- a/spec/services/clusters/create_service_spec.rb
+++ b/spec/services/clusters/create_service_spec.rb
@@ -11,11 +11,7 @@ describe Clusters::CreateService do
       let(:params) do
         {
           name: 'test-cluster',
-          platform_type: :kubernetes,
           provider_type: :gcp,
-          platform_kubernetes_attributes: {
-            namespace: 'custom-namespace'
-          },
           provider_gcp_attributes: {
             gcp_project_id: 'gcp-project',
             zone: 'us-central1-a',
@@ -30,7 +26,6 @@ describe Clusters::CreateService do
 
         expect { result }
           .to change { Clusters::Cluster.count }.by(1)
-          .and change { Clusters::Platforms::Kubernetes.count }.by(1)
           .and change { Clusters::Providers::Gcp.count }.by(1)
 
         expect(result.name).to eq('test-cluster')
@@ -41,9 +36,7 @@ describe Clusters::CreateService do
         expect(result.provider.num_nodes).to eq(1)
         expect(result.provider.machine_type).to eq('machine_type-a')
         expect(result.provider.access_token).to eq(access_token)
-        expect(result.platform.namespace).to eq('custom-namespace')
-        expect(result.platform.api_url).to eq(Clusters::CreateService::TEMPOLARY_API_URL)
-        expect(result.platform.token).to eq(Clusters::CreateService::TEMPOLARY_TOKEN)
+        expect(result.platform).to be_nil
       end
     end
 
@@ -51,11 +44,7 @@ describe Clusters::CreateService do
       let(:params) do
         {
           name: 'test-cluster',
-          platform_type: :kubernetes,
           provider_type: :gcp,
-          platform_kubernetes_attributes: {
-            namespace: 'custom-namespace'
-          },
           provider_gcp_attributes: {
             gcp_project_id: '!!!!!!!',
             zone: 'us-central1-a',
@@ -73,55 +62,56 @@ describe Clusters::CreateService do
     end
   end
 
-  context 'when provider is user' do
-    context 'when correct params' do
-      let(:params) do
-        {
-          name: 'test-cluster',
-          platform_type: :kubernetes,
-          provider_type: :user,
-          platform_kubernetes_attributes: {
-            namespace: 'custom-namespace',
-            api_url: 'https://111.111.111.111',
-            token: 'token'
-          }
-        }
-      end
+  # TODO: This will be active in 10.3
+  # context 'when provider is user' do
+  #   context 'when correct params' do
+  #     let(:params) do
+  #       {
+  #         name: 'test-cluster',
+  #         platform_type: :kubernetes,
+  #         provider_type: :user,
+  #         platform_kubernetes_attributes: {
+  #           namespace: 'custom-namespace',
+  #           api_url: 'https://111.111.111.111',
+  #           token: 'token'
+  #         }
+  #       }
+  #     end
 
-      it 'creates a cluster object and performs a worker' do
-        expect(ClusterProvisionWorker).to receive(:perform_async)
+  #     it 'creates a cluster object and performs a worker' do
+  #       expect(ClusterProvisionWorker).to receive(:perform_async)
 
-        expect { result }
-          .to change { Clusters::Cluster.count }.by(1)
-          .and change { Clusters::Platforms::Kubernetes.count }.by(1)
+  #       expect { result }
+  #         .to change { Clusters::Cluster.count }.by(1)
+  #         .and change { Clusters::Platforms::Kubernetes.count }.by(1)
 
-        expect(result.name).to eq('test-cluster')
-        expect(result.user).to eq(user)
-        expect(result.project).to eq(project)
-        expect(result.provider).to be_nil
-        expect(result.platform.namespace).to eq('custom-namespace')
-      end
-    end
+  #       expect(result.name).to eq('test-cluster')
+  #       expect(result.user).to eq(user)
+  #       expect(result.project).to eq(project)
+  #       expect(result.provider).to be_nil
+  #       expect(result.platform.namespace).to eq('custom-namespace')
+  #     end
+  #   end
 
-    context 'when invalid params' do
-      let(:params) do
-        {
-          name: 'test-cluster',
-          platform_type: :kubernetes,
-          provider_type: :user,
-          platform_kubernetes_attributes: {
-            namespace: 'custom-namespace',
-            api_url: '!!!!!',
-            token: 'token'
-          }
-        }
-      end
+  #   context 'when invalid params' do
+  #     let(:params) do
+  #       {
+  #         name: 'test-cluster',
+  #         platform_type: :kubernetes,
+  #         provider_type: :user,
+  #         platform_kubernetes_attributes: {
+  #           namespace: 'custom-namespace',
+  #           api_url: '!!!!!',
+  #           token: 'token'
+  #         }
+  #       }
+  #     end
 
-      it 'returns an error' do
-        # expect(ClusterProvisionWorker).not_to receive(:perform_async)
-        expect { result }.to change { Clusters::Cluster.count }.by(0)
-        expect(result.errors[:"platform_kubernetes.api_url"]).to be_present
-      end
-    end
-  end
+  #     it 'returns an error' do
+  #       # expect(ClusterProvisionWorker).not_to receive(:perform_async)
+  #       expect { result }.to change { Clusters::Cluster.count }.by(0)
+  #       expect(result.errors[:"platform_kubernetes.api_url"]).to be_present
+  #     end
+  #   end
+  # end
 end
diff --git a/spec/services/clusters/gcp/finalize_creation_service_spec.rb b/spec/services/clusters/gcp/finalize_creation_service_spec.rb
index ca7741f641b52e952b4ff614c471c108a5e09068..0cf913075892427c6227506afec3e90a88941a5a 100644
--- a/spec/services/clusters/gcp/finalize_creation_service_spec.rb
+++ b/spec/services/clusters/gcp/finalize_creation_service_spec.rb
@@ -62,6 +62,7 @@ describe Clusters::Gcp::FinalizeCreationService do
 
         it 'has corresponded data' do
           described_class.new.execute(provider)
+          cluster.reload
           provider.reload
           platform.reload
 
diff --git a/spec/support/kubernetes_helpers.rb b/spec/support/kubernetes_helpers.rb
index 3ae325637f6102df64256bd5d1560afa77a298e3..e46b61b6461a78beda720f0d2968982d930d5fa8 100644
--- a/spec/support/kubernetes_helpers.rb
+++ b/spec/support/kubernetes_helpers.rb
@@ -27,7 +27,7 @@ module KubernetesHelpers
 
   def stub_kubeclient_get_secrets_error(api_url)
     WebMock.stub_request(:get, api_url + '/api/v1/secrets')
-      .to_return(status: [500, "Internal Server Error"])
+      .to_return(status: [404, "Internal Server Error"])
   end
 
   def kube_v1_secrets_body(**options)