diff --git a/assets/javascripts/templates/pages/about_tmpl.coffee b/assets/javascripts/templates/pages/about_tmpl.coffee
index 5c4b9ba8..7b00aee1 100644
--- a/assets/javascripts/templates/pages/about_tmpl.coffee
+++ b/assets/javascripts/templates/pages/about_tmpl.coffee
@@ -482,6 +482,11 @@ credits = [
'2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors',
'Apache',
'https://raw.githubusercontent.com/JetBrains/kotlin/master/license/LICENSE.txt'
+ ], [
+ 'Kubernetes',
+ '2022 The Kubernetes Authors and The Linux Foundation',
+ 'Apache License 2.0',
+ 'https://github.com/kubernetes/kubernetes/blob/master/LICENSE'
], [
'Laravel',
'Taylor Otwell',
diff --git a/assets/stylesheets/application.css.scss b/assets/stylesheets/application.css.scss
index 1d5da325..d00ce225 100644
--- a/assets/stylesheets/application.css.scss
+++ b/assets/stylesheets/application.css.scss
@@ -74,6 +74,8 @@
'pages/julia',
'pages/knockout',
'pages/kotlin',
+ 'pages/kubectl',
+ 'pages/kubernetes',
'pages/laravel',
'pages/liquid',
'pages/love',
diff --git a/assets/stylesheets/pages/_kubectl.scss b/assets/stylesheets/pages/_kubectl.scss
new file mode 100644
index 00000000..afd3090d
--- /dev/null
+++ b/assets/stylesheets/pages/_kubectl.scss
@@ -0,0 +1,4 @@
+._kubectl {
+ @extend %simple;
+
+}
diff --git a/assets/stylesheets/pages/_kubernetes.scss b/assets/stylesheets/pages/_kubernetes.scss
new file mode 100644
index 00000000..52791ba3
--- /dev/null
+++ b/assets/stylesheets/pages/_kubernetes.scss
@@ -0,0 +1,4 @@
+._kubernetes {
+ @extend %simple;
+
+}
diff --git a/lib/docs/filters/kubectl/clean_html.rb b/lib/docs/filters/kubectl/clean_html.rb
new file mode 100644
index 00000000..5fa05773
--- /dev/null
+++ b/lib/docs/filters/kubectl/clean_html.rb
@@ -0,0 +1,15 @@
+module Docs
+ class Kubectl
+ class CleanHtmlFilter < Filter
+
+ def call
+ css('pre').each do |node|
+ node.content = node.content.squish
+ node['data-language'] = 'bash'
+ end
+ doc
+ end
+
+ end
+ end
+end
diff --git a/lib/docs/filters/kubectl/entries.rb b/lib/docs/filters/kubectl/entries.rb
new file mode 100644
index 00000000..2a15d508
--- /dev/null
+++ b/lib/docs/filters/kubectl/entries.rb
@@ -0,0 +1,38 @@
+module Docs
+ class Kubectl
+ class EntriesFilter < Docs::EntriesFilter
+
+ def get_name
+ name
+ end
+
+ def get_type
+ name
+ end
+
+ def additional_entries
+ entries = []
+ group = 'kubectl'
+ commands = css('h1').to_a()
+ commands.map do |node|
+ # handle titles differnetly by converting them into sidebar groups (types)
+ new_group = at_css("##{node['id']} > strong")
+ if new_group
+ group = new_group.content.titleize
+ else
+ # prepend kubectl before every command
+ command_name = 'kubectl ' + node.content
+ entries << [command_name, node['id'], group]
+ end
+
+ end
+
+ entries
+ end
+
+ def include_default_entry?
+ false
+ end
+ end
+ end
+end
diff --git a/lib/docs/filters/kubernetes/clean_html.rb b/lib/docs/filters/kubernetes/clean_html.rb
new file mode 100644
index 00000000..33adb7ae
--- /dev/null
+++ b/lib/docs/filters/kubernetes/clean_html.rb
@@ -0,0 +1,22 @@
+module Docs
+ class Kubernetes
+ class CleanHtmlFilter < Filter
+
+ def call
+
+ # remove the API Operations section from the docs
+ # by removing the h2 of id=Opetations
+ # and all the preceding elements
+ css('#Operations ~ *').remove
+ css('#Operations').remove
+ # remove horizontal rules
+ css('hr').remove
+ # remove footer (1.20)
+ css('.pre-footer').remove
+
+ doc
+ end
+
+ end
+ end
+end
diff --git a/lib/docs/filters/kubernetes/entries.rb b/lib/docs/filters/kubernetes/entries.rb
new file mode 100644
index 00000000..5dfc0f3d
--- /dev/null
+++ b/lib/docs/filters/kubernetes/entries.rb
@@ -0,0 +1,37 @@
+module Docs
+ class Kubernetes
+ class EntriesFilter < Docs::EntriesFilter
+
+ def get_name
+ at_css('h1').content
+ end
+
+ def get_type
+ @doc.parent.css('nav .breadcrumb-item:not(.active)')[-1].content
+ end
+
+ def additional_entries
+ entries = css('h2').to_a()
+ # remove the Feedback section
+ entries.filter! {|node| node.content.strip != 'Feedback' }
+ # remove the Operations section
+ entries.filter! {|node| node['id'] != 'Operations' }
+ # remove the ObjectList section
+ entries.filter! {|node| node['id'] != name + 'List' }
+ # remove the Object section, most of the documents start with (h1.Pod => h2.Pod h2.PodSpec ...)
+ entries.filter! {|node| node['id'] != name }
+
+ entries.map do |node|
+ # split all names into YAML object notation (ConfigMapSpec) ==> (ConfigMap.Spec)
+ child_name = node.content
+ if child_name.starts_with?(name) && child_name.length > name.length
+ child_name = name + child_name.sub(name, '.')
+ end
+
+ [child_name, node['id']]
+ end
+ end
+
+ end
+ end
+end
diff --git a/lib/docs/scrapers/kubectl.rb b/lib/docs/scrapers/kubectl.rb
new file mode 100644
index 00000000..0f888ddf
--- /dev/null
+++ b/lib/docs/scrapers/kubectl.rb
@@ -0,0 +1,38 @@
+module Docs
+ class Kubectl < UrlScraper
+ self.name = 'Kubectl'
+ self.type = 'kubectl'
+ self.root_path = ''
+ self.links = {
+ home: 'https://kubernetes.io/docs/reference/kubectl/',
+ code: 'https://github.com/kubernetes/kubernetes'
+ }
+ self.release = "1.23"
+ self.base_url = "https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands"
+
+ html_filters.push 'kubectl/entries', 'kubectl/clean_html'
+
+ options[:container] = '#page-content-wrapper'
+
+ options[:attribution] = <<-HTML
+ © 2022 The Kubernetes Authors | Documentation Distributed under CC BY 4.0
+ Copyright © 2022 The Linux Foundation ®. All rights reserved.
+ HTML
+
+ # latest version has a special URL that does not include the version identifier
+ version do
+ self.release = "1.23"
+ self.base_url = "https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands"
+ end
+
+ version '1.20' do
+ self.release = "#{version}"
+ self.base_url = "https://v#{version.sub('.', '-')}.docs.kubernetes.io/docs/reference/generated/kubectl/kubectl-commands"
+ end
+
+ def get_latest_version(opts)
+ get_latest_github_release('kubernetes', 'kubernetes', opts)
+ end
+
+ end
+end
diff --git a/lib/docs/scrapers/kubernetes.rb b/lib/docs/scrapers/kubernetes.rb
new file mode 100644
index 00000000..143c16ae
--- /dev/null
+++ b/lib/docs/scrapers/kubernetes.rb
@@ -0,0 +1,37 @@
+module Docs
+ class Kubernetes < UrlScraper
+ self.name = 'Kubernetes'
+ self.type = 'kubernetes'
+ self.root_path = '/'
+ self.links = {
+ home: 'https://kubernetes.io/',
+ code: 'https://github.com/kubernetes/kubernetes'
+ }
+
+ # https://kubernetes.io/docs/reference/kubernetes-api/
+ html_filters.push 'kubernetes/entries', 'kubernetes/clean_html'
+
+ options[:container] = '.td-content'
+
+ options[:attribution] = <<-HTML
+ © 2022 The Kubernetes Authors | Documentation Distributed under CC BY 4.0
+ Copyright © 2022 The Linux Foundation ®. All rights reserved.
+ HTML
+
+ # latest version has a special URL that does not include the version identifier
+ version do
+ self.release = "1.23"
+ self.base_url = "https://kubernetes.io/docs/reference/kubernetes-api/"
+ end
+
+ version '1.20' do
+ self.release = "#{version}"
+ self.base_url = "https://v#{version.sub('.', '-')}.docs.kubernetes.io/docs/reference/kubernetes-api/"
+ end
+
+ def get_latest_version(opts)
+ get_latest_github_release('kubernetes', 'kubernetes', opts)
+ end
+
+ end
+end
diff --git a/public/icons/docs/kubectl/16.png b/public/icons/docs/kubectl/16.png
new file mode 100644
index 00000000..0dccf912
Binary files /dev/null and b/public/icons/docs/kubectl/16.png differ
diff --git a/public/icons/docs/kubectl/16@2x.png b/public/icons/docs/kubectl/16@2x.png
new file mode 100644
index 00000000..2261e8ec
Binary files /dev/null and b/public/icons/docs/kubectl/16@2x.png differ
diff --git a/public/icons/docs/kubectl/SOURCE b/public/icons/docs/kubectl/SOURCE
new file mode 100644
index 00000000..cedbe271
--- /dev/null
+++ b/public/icons/docs/kubectl/SOURCE
@@ -0,0 +1 @@
+https://cncf-branding.netlify.app/projects/kubernetes/
\ No newline at end of file
diff --git a/public/icons/docs/kubernetes/16.png b/public/icons/docs/kubernetes/16.png
new file mode 100644
index 00000000..79abeb07
Binary files /dev/null and b/public/icons/docs/kubernetes/16.png differ
diff --git a/public/icons/docs/kubernetes/16@2x.png b/public/icons/docs/kubernetes/16@2x.png
new file mode 100644
index 00000000..9291009d
Binary files /dev/null and b/public/icons/docs/kubernetes/16@2x.png differ
diff --git a/public/icons/docs/kubernetes/SOURCE b/public/icons/docs/kubernetes/SOURCE
new file mode 100644
index 00000000..cedbe271
--- /dev/null
+++ b/public/icons/docs/kubernetes/SOURCE
@@ -0,0 +1 @@
+https://cncf-branding.netlify.app/projects/kubernetes/
\ No newline at end of file