diff --git a/app/views/layouts/nav/sidebar/_group_menus.html.haml b/app/views/layouts/nav/sidebar/_group_menus.html.haml
index 42114287cdff8d56f9dfcd7d4285cd6f80155816..4f171f2777ae221e0b9fe2a9a95f512da66aaf1d 100644
--- a/app/views/layouts/nav/sidebar/_group_menus.html.haml
+++ b/app/views/layouts/nav/sidebar/_group_menus.html.haml
@@ -1,16 +1,3 @@
-- if group_sidebar_link?(:kubernetes)
-  = nav_link(controller: [:clusters]) do
-    = link_to group_clusters_path(@group) do
-      .nav-icon-container
-        = sprite_icon('cloud-gear')
-      %span.nav-item-name
-        = _('Kubernetes')
-    %ul.sidebar-sub-level-items.is-fly-out-only
-      = nav_link(controller: [:clusters], html_options: { class: "fly-out-top-item" } ) do
-        = link_to group_clusters_path(@group), title: _('Kubernetes'), class: 'shortcuts-kubernetes' do
-          %strong.fly-out-top-item-name
-            = _('Kubernetes')
-
 = render 'groups/sidebar/packages'
 
 = render 'layouts/nav/sidebar/analytics_links', links: group_analytics_navbar_links(@group, current_user)
diff --git a/lib/sidebars/groups/menus/kubernetes_menu.rb b/lib/sidebars/groups/menus/kubernetes_menu.rb
new file mode 100644
index 0000000000000000000000000000000000000000..4ea294a4837f1e6b77d9e400f1da577e5a7212eb
--- /dev/null
+++ b/lib/sidebars/groups/menus/kubernetes_menu.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+module Sidebars
+  module Groups
+    module Menus
+      class KubernetesMenu < ::Sidebars::Menu
+        override :link
+        def link
+          group_clusters_path(context.group)
+        end
+
+        override :title
+        def title
+          _('Kubernetes')
+        end
+
+        override :sprite_icon
+        def sprite_icon
+          'cloud-gear'
+        end
+
+        override :render?
+        def render?
+          can?(context.current_user, :read_cluster, context.group)
+        end
+
+        override :extra_container_html_options
+        def extra_container_html_options
+          {
+            class: 'shortcuts-kubernetes'
+          }
+        end
+
+        override :active_routes
+        def active_routes
+          { controller: :clusters }
+        end
+      end
+    end
+  end
+end
diff --git a/lib/sidebars/groups/panel.rb b/lib/sidebars/groups/panel.rb
index 398cbd73b2a26252c7461418af500189e0f90d74..e3fe1e0ea3b7247a8d93891951231116b30b9f85 100644
--- a/lib/sidebars/groups/panel.rb
+++ b/lib/sidebars/groups/panel.rb
@@ -11,6 +11,7 @@ def configure_menus
         add_menu(Sidebars::Groups::Menus::IssuesMenu.new(context))
         add_menu(Sidebars::Groups::Menus::MergeRequestsMenu.new(context))
         add_menu(Sidebars::Groups::Menus::CiCdMenu.new(context))
+        add_menu(Sidebars::Groups::Menus::KubernetesMenu.new(context))
       end
 
       override :render_raw_menus_partial
diff --git a/spec/lib/sidebars/groups/menus/kubernetes_menu_spec.rb b/spec/lib/sidebars/groups/menus/kubernetes_menu_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..76e58367c9d2223f2a5f140a08e8e392b5c5d73d
--- /dev/null
+++ b/spec/lib/sidebars/groups/menus/kubernetes_menu_spec.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Sidebars::Groups::Menus::KubernetesMenu do
+  let_it_be(:owner) { create(:user) }
+  let_it_be(:group) do
+    build(:group, :private).tap do |g|
+      g.add_owner(owner)
+    end
+  end
+
+  let(:user) { owner }
+  let(:context) { Sidebars::Groups::Context.new(current_user: user, container: group) }
+  let(:menu) { described_class.new(context) }
+
+  describe '#render?' do
+    context 'when user can read clusters' do
+      it 'returns true' do
+        expect(menu.render?).to eq true
+      end
+    end
+
+    context 'when user cannot read clusters rules' do
+      let(:user) { nil }
+
+      it 'returns false' do
+        expect(menu.render?).to eq false
+      end
+    end
+  end
+end
diff --git a/spec/views/layouts/nav/sidebar/_group.html.haml_spec.rb b/spec/views/layouts/nav/sidebar/_group.html.haml_spec.rb
index fc62fbda2cc2bb8d705ad9a690f50bc8dee42fdc..f4e681b70ff69f9fc9876de93a133f26c176b256 100644
--- a/spec/views/layouts/nav/sidebar/_group.html.haml_spec.rb
+++ b/spec/views/layouts/nav/sidebar/_group.html.haml_spec.rb
@@ -100,4 +100,12 @@
       expect(rendered).to have_link('Runners', href: group_runners_path(group))
     end
   end
+
+  describe 'Kubernetes menu' do
+    it 'has a link to the group cluster list path' do
+      render
+
+      expect(rendered).to have_link('Kubernetes', href: group_clusters_path(group))
+    end
+  end
 end