From 9e0ed9ed332ea5a62282a950c3517e246a7958ef Mon Sep 17 00:00:00 2001 From: Robert Brennan Date: Fri, 15 Jan 2021 15:16:59 -0500 Subject: [PATCH] Update docs (#472) * move docs files * update docs from template * another update * add insights callouts * add ingress check to the docs * remove old prefixes on check names --- .circleci/config.yml | 33 ++++++- .gitignore | 1 + .../.vuepress/public/scripts/leadlander.js | 12 --- {docs-md => docs}/.vuepress/config-extras.js | 0 {docs-md => docs}/.vuepress/config.js | 2 +- .../.vuepress/public/favicon.png | Bin .../public/img/FW_Insights_Polaris.svg | 0 .../.vuepress/public/img/architecture.svg | 0 .../public/img/dashboard-screenshot.png | Bin .../.vuepress/public/img/fairwinds-logo.svg | 0 .../.vuepress/public/img/polaris-logo.png | Bin docs/.vuepress/public/scripts/marketing.js | 29 ++++++ .../.vuepress/public/scripts/modify.js | 0 {docs-md => docs}/.vuepress/styles/index.styl | 0 .../.vuepress/styles/palette.styl | 0 {docs-md => docs}/.vuepress/theme/index.js | 0 .../.vuepress/theme/layouts/Layout.vue | 0 docs/404.html | 22 ----- docs/CNAME | 1 - {docs-md => docs}/README.md | 2 +- {docs-md => docs}/admission-controller.md | 3 + docs/admission-controller/index.html | 45 ---------- docs/assets/css/0.styles.db69974e.css | 1 - docs/assets/img/search.83621669.svg | 1 - docs/assets/js/10.9d1a1701.js | 1 - docs/assets/js/11.d7eadcf0.js | 1 - docs/assets/js/12.85c0eab0.js | 1 - docs/assets/js/13.0487faf0.js | 1 - docs/assets/js/14.60ea393e.js | 1 - docs/assets/js/15.00f25aaa.js | 1 - docs/assets/js/16.cb0515ce.js | 1 - docs/assets/js/17.013e9969.js | 1 - docs/assets/js/18.a0fcb2d2.js | 1 - docs/assets/js/19.9fe045af.js | 1 - docs/assets/js/2.28adca5d.js | 1 - docs/assets/js/20.5bcacf34.js | 1 - docs/assets/js/21.2f58615f.js | 1 - docs/assets/js/22.90ebc6b9.js | 1 - docs/assets/js/3.0cb25b42.js | 1 - docs/assets/js/4.be9896b6.js | 1 - docs/assets/js/5.665b3e6a.js | 1 - docs/assets/js/6.a5e340ed.js | 1 - docs/assets/js/7.dbd47d64.js | 1 - docs/assets/js/8.5a82b7c2.js | 1 - docs/assets/js/9.4f55b6b3.js | 1 - docs/assets/js/app.65b94829.js | 13 --- {docs-md => docs}/changelog.md | 0 docs/changelog/index.html | 38 -------- {docs-md => docs}/checks/efficiency.md | 8 +- docs/checks/efficiency/index.html | 33 ------- {docs-md => docs}/checks/reliability.md | 12 +-- docs/checks/reliability/index.html | 29 ------ {docs-md => docs}/checks/security.md | 21 ++--- docs/checks/security/index.html | 34 ------- {docs-md => docs}/cli/options.md | 0 docs/cli/options/index.html | 85 ------------------ {docs-md => docs}/code-of-conduct.md | 0 docs/code-of-conduct/index.html | 60 ------------- {docs-md => docs}/contributing.md | 0 docs/contributing/index.html | 49 ---------- {docs-md => docs}/customization/checks.md | 0 docs/customization/checks/index.html | 36 -------- .../customization/configuration.md | 0 docs/customization/configuration/index.html | 32 ------- .../customization/custom-checks.md | 0 docs/customization/custom-checks/index.html | 57 ------------ {docs-md => docs}/customization/exemptions.md | 0 docs/customization/exemptions/index.html | 48 ---------- {docs-md => docs}/dashboard.md | 3 + docs/dashboard/index.html | 45 ---------- docs/favicon.png | Bin 400 -> 0 bytes docs/img/dashboard-screenshot.png | Bin 190805 -> 0 bytes docs/img/fairwinds-logo.svg | 25 ------ docs/img/polaris-logo.png | Bin 13770 -> 0 bytes docs/index.html | 31 ------- {docs-md => docs}/infrastructure-as-code.md | 3 + docs/infrastructure-as-code/index.html | 45 ---------- {docs-md => docs}/package-lock.json | 0 {docs-md => docs}/package.json | 49 +++++----- docs/scripts/leadlander.js | 12 --- docs/scripts/modify.js | 15 ---- 81 files changed, 117 insertions(+), 839 deletions(-) delete mode 100644 docs-md/.vuepress/public/scripts/leadlander.js rename {docs-md => docs}/.vuepress/config-extras.js (100%) rename {docs-md => docs}/.vuepress/config.js (97%) rename {docs-md => docs}/.vuepress/public/favicon.png (100%) rename {docs-md => docs}/.vuepress/public/img/FW_Insights_Polaris.svg (100%) rename {docs-md => docs}/.vuepress/public/img/architecture.svg (100%) rename {docs-md => docs}/.vuepress/public/img/dashboard-screenshot.png (100%) rename {docs-md => docs}/.vuepress/public/img/fairwinds-logo.svg (100%) rename {docs-md => docs}/.vuepress/public/img/polaris-logo.png (100%) create mode 100644 docs/.vuepress/public/scripts/marketing.js rename {docs-md => docs}/.vuepress/public/scripts/modify.js (100%) rename {docs-md => docs}/.vuepress/styles/index.styl (100%) rename {docs-md => docs}/.vuepress/styles/palette.styl (100%) rename {docs-md => docs}/.vuepress/theme/index.js (100%) rename {docs-md => docs}/.vuepress/theme/layouts/Layout.vue (100%) delete mode 100644 docs/404.html delete mode 100644 docs/CNAME rename {docs-md => docs}/README.md (95%) rename {docs-md => docs}/admission-controller.md (92%) delete mode 100644 docs/admission-controller/index.html delete mode 100644 docs/assets/css/0.styles.db69974e.css delete mode 100644 docs/assets/img/search.83621669.svg delete mode 100644 docs/assets/js/10.9d1a1701.js delete mode 100644 docs/assets/js/11.d7eadcf0.js delete mode 100644 docs/assets/js/12.85c0eab0.js delete mode 100644 docs/assets/js/13.0487faf0.js delete mode 100644 docs/assets/js/14.60ea393e.js delete mode 100644 docs/assets/js/15.00f25aaa.js delete mode 100644 docs/assets/js/16.cb0515ce.js delete mode 100644 docs/assets/js/17.013e9969.js delete mode 100644 docs/assets/js/18.a0fcb2d2.js delete mode 100644 docs/assets/js/19.9fe045af.js delete mode 100644 docs/assets/js/2.28adca5d.js delete mode 100644 docs/assets/js/20.5bcacf34.js delete mode 100644 docs/assets/js/21.2f58615f.js delete mode 100644 docs/assets/js/22.90ebc6b9.js delete mode 100644 docs/assets/js/3.0cb25b42.js delete mode 100644 docs/assets/js/4.be9896b6.js delete mode 100644 docs/assets/js/5.665b3e6a.js delete mode 100644 docs/assets/js/6.a5e340ed.js delete mode 100644 docs/assets/js/7.dbd47d64.js delete mode 100644 docs/assets/js/8.5a82b7c2.js delete mode 100644 docs/assets/js/9.4f55b6b3.js delete mode 100644 docs/assets/js/app.65b94829.js rename {docs-md => docs}/changelog.md (100%) delete mode 100644 docs/changelog/index.html rename {docs-md => docs}/checks/efficiency.md (79%) delete mode 100644 docs/checks/efficiency/index.html rename {docs-md => docs}/checks/reliability.md (82%) delete mode 100644 docs/checks/reliability/index.html rename {docs-md => docs}/checks/security.md (66%) delete mode 100644 docs/checks/security/index.html rename {docs-md => docs}/cli/options.md (100%) delete mode 100644 docs/cli/options/index.html rename {docs-md => docs}/code-of-conduct.md (100%) delete mode 100644 docs/code-of-conduct/index.html rename {docs-md => docs}/contributing.md (100%) delete mode 100644 docs/contributing/index.html rename {docs-md => docs}/customization/checks.md (100%) delete mode 100644 docs/customization/checks/index.html rename {docs-md => docs}/customization/configuration.md (100%) delete mode 100644 docs/customization/configuration/index.html rename {docs-md => docs}/customization/custom-checks.md (100%) delete mode 100644 docs/customization/custom-checks/index.html rename {docs-md => docs}/customization/exemptions.md (100%) delete mode 100644 docs/customization/exemptions/index.html rename {docs-md => docs}/dashboard.md (93%) delete mode 100644 docs/dashboard/index.html delete mode 100644 docs/favicon.png delete mode 100644 docs/img/dashboard-screenshot.png delete mode 100644 docs/img/fairwinds-logo.svg delete mode 100644 docs/img/polaris-logo.png delete mode 100644 docs/index.html rename {docs-md => docs}/infrastructure-as-code.md (88%) delete mode 100644 docs/infrastructure-as-code/index.html rename {docs-md => docs}/package-lock.json (100%) rename {docs-md => docs}/package.json (73%) delete mode 100644 docs/scripts/leadlander.js delete mode 100644 docs/scripts/modify.js diff --git a/.circleci/config.yml b/.circleci/config.yml index 9ad80226e..52b7f89e4 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -194,6 +194,31 @@ jobs: - *set_environment_variables - *docker_build_and_push + publish_docs: + docker: + - image: cimg/node:15.5.1 + steps: + - checkout + - run: + name: Build Docs Site + command: | + set -e + cd ./docs + npm install + npm run check-links + npm run build + - run: + name: Install AWS CLI + command: | + curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" + unzip awscliv2.zip + sudo ./aws/install + - run: + name: Publish Docs Site to S3 + command: | + cd ./dist + aws s3 sync ./ s3://polaris.docs.fairwinds.com --delete + workflows: version: 2 @@ -224,7 +249,6 @@ workflows: filters: branches: ignore: /.*/ - # Testing tags are reserved for testing circle test + build steps tags: ignore: /^testing-.*/ - release_images: @@ -234,6 +258,11 @@ workflows: filters: branches: ignore: /.*/ - # Testing tags are reserved for testing circle test + build steps + tags: + ignore: /^testing-.*/ + - publish_docs: + filters: + branches: + ignore: /.*/ tags: ignore: /^testing-.*/ diff --git a/.gitignore b/.gitignore index 6f7630cfe..a53eaed39 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,4 @@ dist *-test.yaml node_modules +/dist diff --git a/docs-md/.vuepress/public/scripts/leadlander.js b/docs-md/.vuepress/public/scripts/leadlander.js deleted file mode 100644 index e85b54edd..000000000 --- a/docs-md/.vuepress/public/scripts/leadlander.js +++ /dev/null @@ -1,12 +0,0 @@ -/* - * This file is generated from FairwindsOps/documentation-template - * DO NOT EDIT MANUALLY - */ - -var llcookieless = true; -var sf14gv = 32793; -(function() { - var sf14g = document.createElement('script'); - sf14g.src = 'https://lltrck.com/lt-v2.min.js'; - var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(sf14g, s); -})(); diff --git a/docs-md/.vuepress/config-extras.js b/docs/.vuepress/config-extras.js similarity index 100% rename from docs-md/.vuepress/config-extras.js rename to docs/.vuepress/config-extras.js diff --git a/docs-md/.vuepress/config.js b/docs/.vuepress/config.js similarity index 97% rename from docs-md/.vuepress/config.js rename to docs/.vuepress/config.js index 5e6ece147..166ddb206 100644 --- a/docs-md/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -38,7 +38,7 @@ const baseConfig = { head: [ ['link', { rel: 'icon', href: '/favicon.png' }], ['script', { src: '/scripts/modify.js' }], - ['script', { src: '/scripts/leadlander.js' }], + ['script', { src: '/scripts/marketing.js' }], ], themeConfig: { docsRepo: "", diff --git a/docs-md/.vuepress/public/favicon.png b/docs/.vuepress/public/favicon.png similarity index 100% rename from docs-md/.vuepress/public/favicon.png rename to docs/.vuepress/public/favicon.png diff --git a/docs-md/.vuepress/public/img/FW_Insights_Polaris.svg b/docs/.vuepress/public/img/FW_Insights_Polaris.svg similarity index 100% rename from docs-md/.vuepress/public/img/FW_Insights_Polaris.svg rename to docs/.vuepress/public/img/FW_Insights_Polaris.svg diff --git a/docs-md/.vuepress/public/img/architecture.svg b/docs/.vuepress/public/img/architecture.svg similarity index 100% rename from docs-md/.vuepress/public/img/architecture.svg rename to docs/.vuepress/public/img/architecture.svg diff --git a/docs-md/.vuepress/public/img/dashboard-screenshot.png b/docs/.vuepress/public/img/dashboard-screenshot.png similarity index 100% rename from docs-md/.vuepress/public/img/dashboard-screenshot.png rename to docs/.vuepress/public/img/dashboard-screenshot.png diff --git a/docs-md/.vuepress/public/img/fairwinds-logo.svg b/docs/.vuepress/public/img/fairwinds-logo.svg similarity index 100% rename from docs-md/.vuepress/public/img/fairwinds-logo.svg rename to docs/.vuepress/public/img/fairwinds-logo.svg diff --git a/docs-md/.vuepress/public/img/polaris-logo.png b/docs/.vuepress/public/img/polaris-logo.png similarity index 100% rename from docs-md/.vuepress/public/img/polaris-logo.png rename to docs/.vuepress/public/img/polaris-logo.png diff --git a/docs/.vuepress/public/scripts/marketing.js b/docs/.vuepress/public/scripts/marketing.js new file mode 100644 index 000000000..e480cc63f --- /dev/null +++ b/docs/.vuepress/public/scripts/marketing.js @@ -0,0 +1,29 @@ +/* + * This file is generated from FairwindsOps/documentation-template + * DO NOT EDIT MANUALLY + */ + +var llcookieless = true; +var sf14gv = 32793; +(function() { + var sf14g = document.createElement('script'); + sf14g.src = 'https://lltrck.com/lt-v2.min.js'; + var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(sf14g, s); +})(); + +!function(f,b,e,v,n,t,s) +{if(f.fbq)return;n=f.fbq=function(){n.callMethod? +n.callMethod.apply(n,arguments):n.queue.push(arguments)}; +if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version=‘2.0’; +n.queue=[];t=b.createElement(e);t.async=!0; +t.src=v;s=b.getElementsByTagName(e)[0]; +s.parentNode.insertBefore(t,s)}(window, document,‘script’, +‘https://connect.facebook.net/en_US/fbevents.js’); +fbq(‘init’, ‘159554595936922’); +fbq(‘track’, ‘PageView’); + +(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({‘gtm.start’: +new Date().getTime(),event:‘gtm.js’});var f=d.getElementsByTagName(s)[0], +j=d.createElement(s),dl=l!=‘dataLayer’?‘&l=‘+l:‘’;j.async=true;j.src= +’https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); +})(window,document,‘script’,‘dataLayer’,‘GTM-K5KK5H3’); diff --git a/docs-md/.vuepress/public/scripts/modify.js b/docs/.vuepress/public/scripts/modify.js similarity index 100% rename from docs-md/.vuepress/public/scripts/modify.js rename to docs/.vuepress/public/scripts/modify.js diff --git a/docs-md/.vuepress/styles/index.styl b/docs/.vuepress/styles/index.styl similarity index 100% rename from docs-md/.vuepress/styles/index.styl rename to docs/.vuepress/styles/index.styl diff --git a/docs-md/.vuepress/styles/palette.styl b/docs/.vuepress/styles/palette.styl similarity index 100% rename from docs-md/.vuepress/styles/palette.styl rename to docs/.vuepress/styles/palette.styl diff --git a/docs-md/.vuepress/theme/index.js b/docs/.vuepress/theme/index.js similarity index 100% rename from docs-md/.vuepress/theme/index.js rename to docs/.vuepress/theme/index.js diff --git a/docs-md/.vuepress/theme/layouts/Layout.vue b/docs/.vuepress/theme/layouts/Layout.vue similarity index 100% rename from docs-md/.vuepress/theme/layouts/Layout.vue rename to docs/.vuepress/theme/layouts/Layout.vue diff --git a/docs/404.html b/docs/404.html deleted file mode 100644 index f3d8e4a8a..000000000 --- a/docs/404.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - Fairwinds Polaris Documentation - - - - - - - - - - -

404

Looks like we've got some broken links.
- Take me home. -
- - - diff --git a/docs/CNAME b/docs/CNAME deleted file mode 100644 index 14bb158f9..000000000 --- a/docs/CNAME +++ /dev/null @@ -1 +0,0 @@ -polaris.docs.fairwinds.com \ No newline at end of file diff --git a/docs-md/README.md b/docs/README.md similarity index 95% rename from docs-md/README.md rename to docs/README.md index f4826a72f..66418d88a 100644 --- a/docs-md/README.md +++ b/docs/README.md @@ -35,7 +35,7 @@ Polaris can be run in three different modes: Fairwinds Insights

-[Fairwinds Insights](https://www.fairwinds.com/insights?utm_campaign=Hosted%20Polaris%20&utm_source=polaris&utm_term=polaris&utm_content=polaris) +[Fairwinds Insights](https://www.fairwinds.com/fairwinds-polaris-upgrade) is a platform for auditing Kubernetes clusters and enforcing policy. If you'd like to: * manage Polaris across a fleet of clusters * track findings over time diff --git a/docs-md/admission-controller.md b/docs/admission-controller.md similarity index 92% rename from docs-md/admission-controller.md rename to docs/admission-controller.md index c1aaf2cbf..4fd1a9503 100644 --- a/docs-md/admission-controller.md +++ b/docs/admission-controller.md @@ -1,4 +1,7 @@ # Admission Controller +> Want to manage the Admission Controller across multiple clusters? Check out +> [Fairwinds Insights](https://www.fairwinds.com/fairwinds-polaris-upgrade) + Polaris can be run as an admission controller that acts as a validating webhook. This accepts the same configuration as the dashboard, and can run the same validations. diff --git a/docs/admission-controller/index.html b/docs/admission-controller/index.html deleted file mode 100644 index 0a853776c..000000000 --- a/docs/admission-controller/index.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - Admission Controller | Fairwinds Polaris Documentation - - - - - - - - - - -

# Admission Controller

Polaris can be run as an admission controller that acts as a validating webhook. -This accepts the same configuration as the dashboard, and can run the same validations.

The webhook will reject any workloads that trigger a danger-level check. -This is indicative of the greater goal of Polaris, not just to encourage better -configuration through dashboard visibility, but to actually enforce it with this webhook.

Note that Polaris will not alter your workloads, only block workloads that don't conform to the configured policies.

# Installation

# kubectl

kubectl apply -f https://github.com/fairwindsops/polaris/releases/latest/download/webhook.yaml
-

# Helm

helm repo add fairwindsops-stable https://charts.fairwindsops.com/stable
-helm upgrade --install polaris fairwindsops-stable/polaris --namespace polaris \
-  --set webhook.enable=true --set dashboard.enable=false
-

# Workload Types

The webhook comes with built-in support for a handful of known controller types, -such as Deployments, Jobs, and DaemonSets. To add new controller types, -you can set webhook.rules in the -Helm chart (opens new window)

# Warnings

Unfortunately we have not found a way to display warnings as part of kubectl -output unless we are rejecting a workload altogether.

This means that any checks with a severity of warning will still pass webhook validation, -and the only evidence of that warning will either be in the Polaris dashboard or the -Polaris webhook logs. This will change in a future version of Kubernetes.

- - - diff --git a/docs/assets/css/0.styles.db69974e.css b/docs/assets/css/0.styles.db69974e.css deleted file mode 100644 index c8ef8c008..000000000 --- a/docs/assets/css/0.styles.db69974e.css +++ /dev/null @@ -1 +0,0 @@ -code[class*=language-],pre[class*=language-]{color:#ccc;background:none;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}.theme-default-content code{color:#476582;padding:.25rem .5rem;margin:0;font-size:.85em;background-color:rgba(27,31,35,.05);border-radius:3px}.theme-default-content code .token.deleted{color:#ec5975}.theme-default-content code .token.inserted{color:#ff6c00}.theme-default-content pre,.theme-default-content pre[class*=language-]{line-height:1.4;padding:1.25rem 1.5rem;margin:.85rem 0;background-color:#282c34;border-radius:6px;overflow:auto}.theme-default-content pre[class*=language-] code,.theme-default-content pre code{color:#fff;padding:0;background-color:transparent;border-radius:0}div[class*=language-]{position:relative;background-color:#282c34;border-radius:6px}div[class*=language-] .highlight-lines{-webkit-user-select:none;-ms-user-select:none;user-select:none;padding-top:1.3rem;position:absolute;top:0;left:0;width:100%;line-height:1.4}div[class*=language-] .highlight-lines .highlighted{background-color:rgba(0,0,0,.66)}div[class*=language-] pre,div[class*=language-] pre[class*=language-]{background:transparent;position:relative;z-index:1}div[class*=language-]:before{position:absolute;z-index:3;top:.8em;right:1em;font-size:.75rem;color:hsla(0,0%,100%,.4)}div[class*=language-]:not(.line-numbers-mode) .line-numbers-wrapper{display:none}div[class*=language-].line-numbers-mode .highlight-lines .highlighted{position:relative}div[class*=language-].line-numbers-mode .highlight-lines .highlighted:before{content:" ";position:absolute;z-index:3;left:0;top:0;display:block;width:3.5rem;height:100%;background-color:rgba(0,0,0,.66)}div[class*=language-].line-numbers-mode pre{padding-left:4.5rem;vertical-align:middle}div[class*=language-].line-numbers-mode .line-numbers-wrapper{position:absolute;top:0;width:3.5rem;text-align:center;color:hsla(0,0%,100%,.3);padding:1.25rem 0;line-height:1.4}div[class*=language-].line-numbers-mode .line-numbers-wrapper br{-webkit-user-select:none;-ms-user-select:none;user-select:none}div[class*=language-].line-numbers-mode .line-numbers-wrapper .line-number{position:relative;z-index:4;-webkit-user-select:none;-ms-user-select:none;user-select:none;font-size:.85em}div[class*=language-].line-numbers-mode:after{content:"";position:absolute;z-index:2;top:0;left:0;width:3.5rem;height:100%;border-radius:6px 0 0 6px;border-right:1px solid rgba(0,0,0,.66);background-color:#282c34}div[class~=language-js]:before{content:"js"}div[class~=language-ts]:before{content:"ts"}div[class~=language-html]:before{content:"html"}div[class~=language-md]:before{content:"md"}div[class~=language-vue]:before{content:"vue"}div[class~=language-css]:before{content:"css"}div[class~=language-sass]:before{content:"sass"}div[class~=language-scss]:before{content:"scss"}div[class~=language-less]:before{content:"less"}div[class~=language-stylus]:before{content:"stylus"}div[class~=language-go]:before{content:"go"}div[class~=language-java]:before{content:"java"}div[class~=language-c]:before{content:"c"}div[class~=language-sh]:before{content:"sh"}div[class~=language-yaml]:before{content:"yaml"}div[class~=language-py]:before{content:"py"}div[class~=language-docker]:before{content:"docker"}div[class~=language-dockerfile]:before{content:"dockerfile"}div[class~=language-makefile]:before{content:"makefile"}div[class~=language-javascript]:before{content:"js"}div[class~=language-typescript]:before{content:"ts"}div[class~=language-markup]:before{content:"html"}div[class~=language-markdown]:before{content:"md"}div[class~=language-json]:before{content:"json"}div[class~=language-ruby]:before{content:"rb"}div[class~=language-python]:before{content:"py"}div[class~=language-bash]:before{content:"sh"}div[class~=language-php]:before{content:"php"}.custom-block .custom-block-title{font-weight:600;margin-bottom:-.4rem}.custom-block.danger,.custom-block.tip,.custom-block.warning{padding:.1rem 1.5rem;border-left-width:.5rem;border-left-style:solid;margin:1rem 0}.custom-block.tip{background-color:#f3f5f7;border-color:#42b983}.custom-block.warning{background-color:rgba(255,229,100,.3);border-color:#e7c000;color:#6b5900}.custom-block.warning .custom-block-title{color:#b29400}.custom-block.warning a{color:#2c3e50}.custom-block.danger{background-color:#ffe6e6;border-color:#c00;color:#4d0000}.custom-block.danger .custom-block-title{color:#900}.custom-block.danger a{color:#2c3e50}.custom-block.details{display:block;position:relative;border-radius:2px;margin:1.6em 0;padding:1.6em;background-color:#eee}.custom-block.details h4{margin-top:0}.custom-block.details figure:last-child,.custom-block.details p:last-child{margin-bottom:0;padding-bottom:0}.custom-block.details summary{outline:none;cursor:pointer}.arrow{display:inline-block;width:0;height:0}.arrow.up{border-bottom:6px solid #ccc}.arrow.down,.arrow.up{border-left:4px solid transparent;border-right:4px solid transparent}.arrow.down{border-top:6px solid #ccc}.arrow.right{border-left:6px solid #ccc}.arrow.left,.arrow.right{border-top:4px solid transparent;border-bottom:4px solid transparent}.arrow.left{border-right:6px solid #ccc}.theme-default-content:not(.custom){max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.theme-default-content:not(.custom){padding:2rem}}@media (max-width:419px){.theme-default-content:not(.custom){padding:1.5rem}}.table-of-contents .badge{vertical-align:middle}body,html{padding:0;margin:0;background-color:#fff}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:16px;color:#2c3e50}.page{padding-left:20rem}.navbar{z-index:20;right:0;height:3.6rem;background-color:#fff;box-sizing:border-box;border-bottom:1px solid #eaecef}.navbar,.sidebar-mask{position:fixed;top:0;left:0}.sidebar-mask{z-index:9;width:100vw;height:100vh;display:none}.sidebar{font-size:16px;background-color:#fff;width:20rem;position:fixed;z-index:10;margin:0;top:3.6rem;left:0;bottom:0;box-sizing:border-box;border-right:1px solid #eaecef;overflow-y:auto}.theme-default-content:not(.custom)>:first-child{margin-top:3.6rem}.theme-default-content:not(.custom) a:hover{text-decoration:underline}.theme-default-content:not(.custom) p.demo{padding:1rem 1.5rem;border:1px solid #ddd;border-radius:4px}.theme-default-content:not(.custom) img{max-width:100%}.theme-default-content.custom{padding:0;margin:0}.theme-default-content.custom img{max-width:100%}a{font-weight:500;text-decoration:none}a,p a code{color:#ff6c00}p a code{font-weight:400}kbd{background:#eee;border:.15rem solid #ddd;border-bottom:.25rem solid #ddd;border-radius:.15rem;padding:0 .15em}blockquote{font-size:1rem;color:#999;border-left:.2rem solid #dfe2e5;margin:1rem 0;padding:.25rem 0 .25rem 1rem}blockquote>p{margin:0}ol,ul{padding-left:1.2em}strong{font-weight:600}h1,h2,h3,h4,h5,h6{font-weight:600;line-height:1.25}.theme-default-content:not(.custom)>h1,.theme-default-content:not(.custom)>h2,.theme-default-content:not(.custom)>h3,.theme-default-content:not(.custom)>h4,.theme-default-content:not(.custom)>h5,.theme-default-content:not(.custom)>h6{margin-top:-3.1rem;padding-top:4.6rem;margin-bottom:0}.theme-default-content:not(.custom)>h1:first-child,.theme-default-content:not(.custom)>h2:first-child,.theme-default-content:not(.custom)>h3:first-child,.theme-default-content:not(.custom)>h4:first-child,.theme-default-content:not(.custom)>h5:first-child,.theme-default-content:not(.custom)>h6:first-child{margin-top:-1.5rem;margin-bottom:1rem}.theme-default-content:not(.custom)>h1:first-child+.custom-block,.theme-default-content:not(.custom)>h1:first-child+p,.theme-default-content:not(.custom)>h1:first-child+pre,.theme-default-content:not(.custom)>h2:first-child+.custom-block,.theme-default-content:not(.custom)>h2:first-child+p,.theme-default-content:not(.custom)>h2:first-child+pre,.theme-default-content:not(.custom)>h3:first-child+.custom-block,.theme-default-content:not(.custom)>h3:first-child+p,.theme-default-content:not(.custom)>h3:first-child+pre,.theme-default-content:not(.custom)>h4:first-child+.custom-block,.theme-default-content:not(.custom)>h4:first-child+p,.theme-default-content:not(.custom)>h4:first-child+pre,.theme-default-content:not(.custom)>h5:first-child+.custom-block,.theme-default-content:not(.custom)>h5:first-child+p,.theme-default-content:not(.custom)>h5:first-child+pre,.theme-default-content:not(.custom)>h6:first-child+.custom-block,.theme-default-content:not(.custom)>h6:first-child+p,.theme-default-content:not(.custom)>h6:first-child+pre{margin-top:2rem}h1:hover .header-anchor,h2:hover .header-anchor,h3:hover .header-anchor,h4:hover .header-anchor,h5:hover .header-anchor,h6:hover .header-anchor{opacity:1}h1{font-size:2.2rem}h2{font-size:1.65rem;padding-bottom:.3rem;border-bottom:1px solid #eaecef}h3{font-size:1.35rem}a.header-anchor{font-size:.85em;float:left;margin-left:-.87em;padding-right:.23em;margin-top:.125em;opacity:0}a.header-anchor:hover{text-decoration:none}.line-number,code,kbd{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}ol,p,ul{line-height:1.7}hr{border:0;border-top:1px solid #eaecef}table{border-collapse:collapse;margin:1rem 0;display:block;overflow-x:auto}tr{border-top:1px solid #dfe2e5}tr:nth-child(2n){background-color:#f6f8fa}td,th{border:1px solid #dfe2e5;padding:.6em 1em}.theme-container.sidebar-open .sidebar-mask{display:block}.theme-container.no-navbar .theme-default-content:not(.custom)>h1,.theme-container.no-navbar h2,.theme-container.no-navbar h3,.theme-container.no-navbar h4,.theme-container.no-navbar h5,.theme-container.no-navbar h6{margin-top:1.5rem;padding-top:0}.theme-container.no-navbar .sidebar{top:0}@media (min-width:720px){.theme-container.no-sidebar .sidebar{display:none}.theme-container.no-sidebar .page{padding-left:0}}@media (max-width:959px){.sidebar{font-size:15px;width:16.4rem}.page{padding-left:16.4rem}}@media (max-width:719px){.sidebar{top:0;padding-top:3.6rem;transform:translateX(-100%);transition:transform .2s ease}.page{padding-left:0}.theme-container.sidebar-open .sidebar{transform:translateX(0)}.theme-container.no-navbar .sidebar{padding-top:0}}@media (max-width:419px){h1{font-size:1.9rem}.theme-default-content div[class*=language-]{margin:.85rem -1.5rem;border-radius:0}}.github-only{display:none}.text-primary{color:#23103a}.text-danger{color:#a0204c}.text-warning{color:#ff6c00}.text-info{color:#8bd2dc}.text-success{color:#28a745}.page-edit,.page-nav,.theme-default-content:not(.custom),footer{margin:0!important}.theme-default-content:not(.custom)>h2{padding-top:7rem}.navbar .site-name{display:none}.navbar,.navbar .links{background-color:#23103a!important}.navbar .links a{color:#fff}.navbar .links a svg{display:none}img{border:5px solid #f7f7f7}.no-border img,header img,img.no-border{border:none}.mini-img{text-align:center}.theme-default-content:not(.custom) .mini-img img{max-width:300px}.page{padding-bottom:0!important}#nprogress{pointer-events:none}#nprogress .bar{background:#ff6c00;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #ff6c00,0 0 5px #ff6c00;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border-color:#ff6c00 transparent transparent #ff6c00;border-style:solid;border-width:2px;border-radius:50%;-webkit-animation:nprogress-spinner .4s linear infinite;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@-webkit-keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.icon.outbound{color:#aaa;display:inline-block;vertical-align:middle;position:relative;top:-1px}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.home{padding:3.6rem 2rem 0;max-width:960px;margin:0 auto;display:block}.home .hero{text-align:center}.home .hero img{max-width:100%;max-height:280px;display:block;margin:3rem auto 1.5rem}.home .hero h1{font-size:3rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.8rem auto}.home .hero .description{max-width:35rem;font-size:1.6rem;line-height:1.3;color:#6a8bad}.home .hero .action-button{display:inline-block;font-size:1.2rem;color:#fff;background-color:#ff6c00;padding:.8rem 1.6rem;border-radius:4px;transition:background-color .1s ease;box-sizing:border-box;border-bottom:1px solid #e66100}.home .hero .action-button:hover{background-color:#ff7b1a}.home .features{border-top:1px solid #eaecef;padding:1.2rem 0;margin-top:2.5rem;display:flex;flex-wrap:wrap;align-items:flex-start;align-content:stretch;justify-content:space-between}.home .feature{flex-grow:1;flex-basis:30%;max-width:30%}.home .feature h2{font-size:1.4rem;font-weight:500;border-bottom:none;padding-bottom:0;color:#3a5169}.home .feature p{color:#4e6e8e}.home .footer{padding:2.5rem;border-top:1px solid #eaecef;text-align:center;color:#4e6e8e}@media (max-width:719px){.home .features{flex-direction:column}.home .feature{max-width:100%;padding:0 2.5rem}}@media (max-width:419px){.home{padding-left:1.5rem;padding-right:1.5rem}.home .hero img{max-height:210px;margin:2rem auto 1.2rem}.home .hero h1{font-size:2rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.2rem auto}.home .hero .description{font-size:1.2rem}.home .hero .action-button{font-size:1rem;padding:.6rem 1.2rem}.home .feature h2{font-size:1.25rem}}.search-box{display:inline-block;position:relative;margin-right:1rem}.search-box input{cursor:text;width:10rem;height:2rem;color:#4e6e8e;display:inline-block;border:1px solid #cfd4db;border-radius:2rem;font-size:.9rem;line-height:2rem;padding:0 .5rem 0 2rem;outline:none;transition:all .2s ease;background:#fff url(/assets/img/search.83621669.svg) .6rem .5rem no-repeat;background-size:1rem}.search-box input:focus{cursor:auto;border-color:#ff6c00}.search-box .suggestions{background:#fff;width:20rem;position:absolute;top:2rem;border:1px solid #cfd4db;border-radius:6px;padding:.4rem;list-style-type:none}.search-box .suggestions.align-right{right:0}.search-box .suggestion{line-height:1.4;padding:.4rem .6rem;border-radius:4px;cursor:pointer}.search-box .suggestion a{white-space:normal;color:#5d82a6}.search-box .suggestion a .page-title{font-weight:600}.search-box .suggestion a .header{font-size:.9em;margin-left:.25em}.search-box .suggestion.focused{background-color:#f3f4f5}.search-box .suggestion.focused a{color:#ff6c00}@media (max-width:959px){.search-box input{cursor:pointer;width:0;border-color:transparent;position:relative}.search-box input:focus{cursor:text;left:0;width:10rem}}@media (-ms-high-contrast:none){.search-box input{height:2rem}}@media (max-width:959px) and (min-width:719px){.search-box .suggestions{left:0}}@media (max-width:719px){.search-box{margin-right:0}.search-box input{left:1rem}.search-box .suggestions{right:0}}@media (max-width:419px){.search-box .suggestions{width:calc(100vw - 4rem)}.search-box input:focus{width:8rem}}.sidebar-button{cursor:pointer;display:none;width:1.25rem;height:1.25rem;position:absolute;padding:.6rem;top:.6rem;left:1rem}.sidebar-button .icon{display:block;width:1.25rem;height:1.25rem}@media (max-width:719px){.sidebar-button{display:block}}.dropdown-enter,.dropdown-leave-to{height:0!important}.dropdown-wrapper{cursor:pointer}.dropdown-wrapper .dropdown-title,.dropdown-wrapper .mobile-dropdown-title{display:block;font-size:.9rem;font-family:inherit;cursor:inherit;padding:inherit;line-height:1.4rem;background:transparent;border:none;font-weight:500;color:#2c3e50}.dropdown-wrapper .dropdown-title:hover,.dropdown-wrapper .mobile-dropdown-title:hover{border-color:transparent}.dropdown-wrapper .dropdown-title .arrow,.dropdown-wrapper .mobile-dropdown-title .arrow{vertical-align:middle;margin-top:-1px;margin-left:.4rem}.dropdown-wrapper .mobile-dropdown-title{display:none;font-weight:600}.dropdown-wrapper .mobile-dropdown-title font-size inherit:hover{color:#ff6c00}.dropdown-wrapper .nav-dropdown .dropdown-item{color:inherit;line-height:1.7rem}.dropdown-wrapper .nav-dropdown .dropdown-item h4{margin:.45rem 0 0;border-top:1px solid #eee;padding:1rem 1.5rem .45rem 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper{padding:0;list-style:none}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper .dropdown-subitem{font-size:.9em}.dropdown-wrapper .nav-dropdown .dropdown-item a{display:block;line-height:1.7rem;position:relative;border-bottom:none;font-weight:400;margin-bottom:0;padding:0 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active,.dropdown-wrapper .nav-dropdown .dropdown-item a:hover{color:#ff6c00}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{content:"";width:0;height:0;border-left:5px solid #ff6c00;border-top:3px solid transparent;border-bottom:3px solid transparent;position:absolute;top:calc(50% - 2px);left:9px}.dropdown-wrapper .nav-dropdown .dropdown-item:first-child h4{margin-top:0;padding-top:0;border-top:0}@media (max-width:719px){.dropdown-wrapper.open .dropdown-title{margin-bottom:.5rem}.dropdown-wrapper .dropdown-title{display:none}.dropdown-wrapper .mobile-dropdown-title{display:block}.dropdown-wrapper .nav-dropdown{transition:height .1s ease-out;overflow:hidden}.dropdown-wrapper .nav-dropdown .dropdown-item h4{border-top:0;margin-top:0;padding-top:0}.dropdown-wrapper .nav-dropdown .dropdown-item>a,.dropdown-wrapper .nav-dropdown .dropdown-item h4{font-size:15px;line-height:2rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem{font-size:14px;padding-left:1rem}}@media (min-width:719px){.dropdown-wrapper{height:1.8rem}.dropdown-wrapper.open .nav-dropdown,.dropdown-wrapper:hover .nav-dropdown{display:block!important}.dropdown-wrapper.open:blur{display:none}.dropdown-wrapper .nav-dropdown{display:none;height:auto!important;box-sizing:border-box;max-height:calc(100vh - 2.7rem);overflow-y:auto;position:absolute;top:100%;right:0;background-color:#fff;padding:.6rem 0;border:1px solid;border-color:#ddd #ddd #ccc;text-align:left;border-radius:.25rem;white-space:nowrap;margin:0}}.nav-links{display:inline-block}.nav-links a{line-height:1.4rem;color:inherit}.nav-links a.router-link-active,.nav-links a:hover{color:#ff6c00}.nav-links .nav-item{position:relative;display:inline-block;margin-left:1.5rem;line-height:2rem}.nav-links .nav-item:first-child{margin-left:0}.nav-links .repo-link{margin-left:1.5rem}@media (max-width:719px){.nav-links .nav-item,.nav-links .repo-link{margin-left:0}}@media (min-width:719px){.nav-links a.router-link-active,.nav-links a:hover{color:#2c3e50}.nav-item>a:not(.external).router-link-active,.nav-item>a:not(.external):hover{margin-bottom:-2px;border-bottom:2px solid #ff7814}}.navbar{padding:.7rem 1.5rem;line-height:2.2rem}.navbar a,.navbar img,.navbar span{display:inline-block}.navbar .logo{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top}.navbar .site-name{font-size:1.3rem;font-weight:600;color:#2c3e50;position:relative}.navbar .links{padding-left:1.5rem;box-sizing:border-box;background-color:#fff;white-space:nowrap;font-size:.9rem;position:absolute;right:1.5rem;top:.7rem;display:flex}.navbar .links .search-box{flex:0 0 auto;vertical-align:top}@media (max-width:719px){.navbar{padding-left:4rem}.navbar .can-hide{display:none}.navbar .links{padding-left:1.5rem}.navbar .site-name{width:calc(100vw - 9.4rem);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}}.page-edit{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.page-edit{padding:2rem}}@media (max-width:419px){.page-edit{padding:1.5rem}}.page-edit{padding-top:1rem;padding-bottom:1rem;overflow:auto}.page-edit .edit-link{display:inline-block}.page-edit .edit-link a{color:#4e6e8e;margin-right:.25rem}.page-edit .last-updated{float:right;font-size:.9em}.page-edit .last-updated .prefix{font-weight:500;color:#4e6e8e}.page-edit .last-updated .time{font-weight:400;color:#767676}@media (max-width:719px){.page-edit .edit-link{margin-bottom:.5rem}.page-edit .last-updated{font-size:.8em;float:none;text-align:left}}.page-nav{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.page-nav{padding:2rem}}@media (max-width:419px){.page-nav{padding:1.5rem}}.page-nav{padding-top:1rem;padding-bottom:0}.page-nav .inner{min-height:2rem;margin-top:0;border-top:1px solid #eaecef;padding-top:1rem;overflow:auto}.page-nav .next{float:right}.page{padding-bottom:2rem;display:block}.sidebar-group .sidebar-group{padding-left:.5em}.sidebar-group:not(.collapsable) .sidebar-heading:not(.clickable){cursor:auto;color:inherit}.sidebar-group.is-sub-group{padding-left:0}.sidebar-group.is-sub-group>.sidebar-heading{font-size:.95em;line-height:1.4;font-weight:400;padding-left:2rem}.sidebar-group.is-sub-group>.sidebar-heading:not(.clickable){opacity:.5}.sidebar-group.is-sub-group>.sidebar-group-items{padding-left:1rem}.sidebar-group.is-sub-group>.sidebar-group-items>li>.sidebar-link{font-size:.95em;border-left:none}.sidebar-group.depth-2>.sidebar-heading{border-left:none}.sidebar-heading{color:#2c3e50;transition:color .15s ease;cursor:pointer;font-size:1.1em;font-weight:700;padding:.35rem 1.5rem .35rem 1.25rem;width:100%;box-sizing:border-box;margin:0;border-left:.25rem solid transparent}.sidebar-heading.open,.sidebar-heading:hover{color:inherit}.sidebar-heading .arrow{position:relative;top:-.12em;left:.5em}.sidebar-heading.clickable.active{font-weight:600;color:#ff6c00;border-left-color:#ff6c00}.sidebar-heading.clickable:hover{color:#ff6c00}.sidebar-group-items{transition:height .1s ease-out;font-size:.95em;overflow:hidden}.sidebar .sidebar-sub-headers{padding-left:1rem;font-size:.95em}a.sidebar-link{font-size:1em;font-weight:400;display:inline-block;color:#2c3e50;border-left:.25rem solid transparent;padding:.35rem 1rem .35rem 1.25rem;line-height:1.4;width:100%;box-sizing:border-box}a.sidebar-link:hover{color:#ff6c00}a.sidebar-link.active{font-weight:600;color:#ff6c00;border-left-color:#ff6c00}.sidebar-group a.sidebar-link{padding-left:2rem}.sidebar-sub-headers a.sidebar-link{padding-top:.25rem;padding-bottom:.25rem;border-left:none}.sidebar-sub-headers a.sidebar-link.active{font-weight:500}.sidebar ul{padding:0;margin:0;list-style-type:none}.sidebar a{display:inline-block}.sidebar .nav-links{display:none;border-bottom:1px solid #eaecef;padding:.5rem 0 .75rem}.sidebar .nav-links a{font-weight:600}.sidebar .nav-links .nav-item,.sidebar .nav-links .repo-link{display:block;line-height:1.25rem;font-size:1.1em;padding:.5rem 0 .5rem 1.5rem}.sidebar>.sidebar-links{padding:1.5rem 0}.sidebar>.sidebar-links>li>a.sidebar-link{font-size:1.1em;line-height:1.7;font-weight:700}.sidebar>.sidebar-links>li:not(:first-child){margin-top:.75rem}@media (max-width:719px){.sidebar .nav-links{display:block}.sidebar .nav-links .dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{top:calc(1rem - 2px)}.sidebar>.sidebar-links{padding:1rem 0}}div.custom-footer{display:flex;justify-content:space-between;border-top:1px solid #eaecef;padding:2rem 2.5rem}.custom-footer .left-footer{margin-top:0!important}.custom-footer .left-footer a:first-of-type{margin-right:1.5rem}.custom-footer a{color:#4e6e8e}.badge[data-v-15b7b770]{display:inline-block;font-size:14px;height:18px;line-height:18px;border-radius:3px;padding:0 6px;color:#fff}.badge.green[data-v-15b7b770],.badge.tip[data-v-15b7b770],.badge[data-v-15b7b770]{background-color:#42b983}.badge.error[data-v-15b7b770]{background-color:#da5961}.badge.warn[data-v-15b7b770],.badge.warning[data-v-15b7b770],.badge.yellow[data-v-15b7b770]{background-color:#e7c000}.badge+.badge[data-v-15b7b770]{margin-left:5px}.theme-code-block[data-v-6d04095e]{display:none}.theme-code-block__active[data-v-6d04095e]{display:block}.theme-code-block>pre[data-v-6d04095e]{background-color:orange}.theme-code-group__nav[data-v-32c2d7ed]{margin-bottom:-35px;background-color:#282c34;padding-bottom:22px;border-top-left-radius:6px;border-top-right-radius:6px;padding-left:10px;padding-top:10px}.theme-code-group__ul[data-v-32c2d7ed]{margin:auto 0;padding-left:0;display:inline-flex;list-style:none}.theme-code-group__nav-tab[data-v-32c2d7ed]{border:0;padding:5px;cursor:pointer;background-color:transparent;font-size:.85em;line-height:1.4;color:hsla(0,0%,100%,.9);font-weight:600}.theme-code-group__nav-tab-active[data-v-32c2d7ed]{border-bottom:1px solid #42b983}.pre-blank[data-v-32c2d7ed]{color:#42b983} \ No newline at end of file diff --git a/docs/assets/img/search.83621669.svg b/docs/assets/img/search.83621669.svg deleted file mode 100644 index 03d83913e..000000000 --- a/docs/assets/img/search.83621669.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/assets/js/10.9d1a1701.js b/docs/assets/js/10.9d1a1701.js deleted file mode 100644 index 17d816ea2..000000000 --- a/docs/assets/js/10.9d1a1701.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[10],{370:function(e,r,t){"use strict";t.r(r);var a=t(42),s=Object(a.a)({},(function(){var e=this,r=e.$createElement,t=e._self._c||r;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h2",{attrs:{id:"upcoming"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#upcoming"}},[e._v("#")]),e._v(" Upcoming")]),e._v(" "),t("ul",[t("li",[e._v("Standardize categories of checks into Security, Reliability, and Efficiency")])]),e._v(" "),t("h2",{attrs:{id:"_1-2-1"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_1-2-1"}},[e._v("#")]),e._v(" 1.2.1")]),e._v(" "),t("ul",[t("li",[e._v("Update date on dashboard footer")])]),e._v(" "),t("h2",{attrs:{id:"_1-2-0"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_1-2-0"}},[e._v("#")]),e._v(" 1.2.0")]),e._v(" "),t("ul",[t("li",[e._v("Add ability to audit a single workload")]),e._v(" "),t("li",[e._v("Enable "),t("code",[e._v("pullPolicyAlways")]),e._v(" by default")]),e._v(" "),t("li",[e._v("Fix for finding parent resources")])]),e._v(" "),t("h2",{attrs:{id:"_1-1-1"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_1-1-1"}},[e._v("#")]),e._v(" 1.1.1")]),e._v(" "),t("ul",[t("li",[e._v("Show controller checks on dashboard")]),e._v(" "),t("li",[e._v("Fix for orphaned pods w/ controller checks")])]),e._v(" "),t("h2",{attrs:{id:"_1-1-0"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_1-1-0"}},[e._v("#")]),e._v(" 1.1.0")]),e._v(" "),t("ul",[t("li",[e._v("Add namespace filter in UI")]),e._v(" "),t("li",[e._v("Add priorityClass check")]),e._v(" "),t("li",[e._v("Support reading from STDIN")]),e._v(" "),t("li",[e._v("Ensure severity is set for all custom checks")]),e._v(" "),t("li",[e._v("Support audit files which use \\r or \\r\\n as newline character")]),e._v(" "),t("li",[e._v("Add option to exempt an entire controller from checks via config file")]),e._v(" "),t("li",[e._v("Fixed case where parent resources trigger error")]),e._v(" "),t("li",[e._v("Fixed UI zero-state")])]),e._v(" "),t("h2",{attrs:{id:"_1-0-3"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_1-0-3"}},[e._v("#")]),e._v(" 1.0.3")]),e._v(" "),t("ul",[t("li",[e._v("Fixed case where parent resources trigger error")]),e._v(" "),t("li",[e._v("Fixed dashboard link when "),t("code",[e._v("--base-path")]),e._v(" is set")])]),e._v(" "),t("h2",{attrs:{id:"_1-0-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_1-0-2"}},[e._v("#")]),e._v(" 1.0.2")]),e._v(" "),t("ul",[t("li",[e._v("Fixed case where custom CRDs are not covered by RBAC")])]),e._v(" "),t("h2",{attrs:{id:"_1-0-1"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_1-0-1"}},[e._v("#")]),e._v(" 1.0.1")]),e._v(" "),t("ul",[t("li",[e._v("Added ARM binaries to releases")])]),e._v(" "),t("h2",{attrs:{id:"_1-0-0"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_1-0-0"}},[e._v("#")]),e._v(" 1.0.0")]),e._v(" "),t("h3",{attrs:{id:"new-features"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#new-features"}},[e._v("#")]),e._v(" New Features")]),e._v(" "),t("ul",[t("li",[e._v("Added support for custom checks using JSON Schema")]),e._v(" "),t("li",[e._v("Added support for arbitrary controllers, rather than a pre-configured set\n"),t("ul",[t("li",[e._v("removed support for "),t("code",[e._v("controllers_to_scan")]),e._v(" in config")])])]),e._v(" "),t("li",[e._v("Added the ability to exempt a particular controller from a particular check.")]),e._v(" "),t("li",[e._v("Docker image now includes the default config")])]),e._v(" "),t("h3",{attrs:{id:"breaking-changes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#breaking-changes"}},[e._v("#")]),e._v(" Breaking Changes")]),e._v(" "),t("ul",[t("li",[e._v("Breaking changes in both input and output formats. See "),t("a",{attrs:{href:"https://github.com/FairwindsOps/polaris/tree/master/examples",target:"_blank",rel:"noopener noreferrer"}},[e._v("Examples"),t("OutboundLink")],1),e._v(" for examples of the new formats.\n"),t("ul",[t("li",[e._v("removed config-level configuration for checks like max/min memory settings")]),e._v(" "),t("li",[e._v("changed severity "),t("code",[e._v("error")]),e._v(" to "),t("code",[e._v("danger")])])])]),e._v(" "),t("li",[e._v("Breaking changes to the CLI\n"),t("ul",[t("li",[e._v("CLI flag "),t("code",[e._v("--set-exit-code-on-error")]),e._v(" is now "),t("code",[e._v("--set-exit-code-on-danger")])]),e._v(" "),t("li",[e._v("Flags "),t("code",[e._v("--version")]),e._v(", "),t("code",[e._v("--dashboard")]),e._v(", "),t("code",[e._v("--webhook")]),e._v(", and "),t("code",[e._v("--audit")]),e._v(" are now arguments")]),e._v(" "),t("li",[e._v("Port flags are now just "),t("code",[e._v("--port")])])])])]),e._v(" "),t("h2",{attrs:{id:"_0-6-0"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_0-6-0"}},[e._v("#")]),e._v(" 0.6.0")]),e._v(" "),t("ul",[t("li",[e._v("Fixed webhook support in Kubernetes 1.16\n"),t("ul",[t("li",[e._v("this also removes support for 1.8")])])]),e._v(" "),t("li",[e._v("Added support for exemptions via controller annotations")])]),e._v(" "),t("h2",{attrs:{id:"_0-5-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_0-5-2"}},[e._v("#")]),e._v(" 0.5.2")]),e._v(" "),t("ul",[t("li",[e._v("Fixed missing success messages for resource requests/limits")])]),e._v(" "),t("h2",{attrs:{id:"_0-5-1"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_0-5-1"}},[e._v("#")]),e._v(" 0.5.1")]),e._v(" "),t("ul",[t("li",[e._v("Added a few more exemptions")]),e._v(" "),t("li",[e._v("Started checking exemptions based on controller name prefix")]),e._v(" "),t("li",[t("code",[e._v("runAsUser != 0")]),e._v(" now passes the "),t("code",[e._v("runAsNonRoot")]),e._v(" check")])]),e._v(" "),t("h2",{attrs:{id:"_0-5-0"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_0-5-0"}},[e._v("#")]),e._v(" 0.5.0")]),e._v(" "),t("ul",[t("li",[e._v("Added "),t("code",[e._v("--load-audit-file")]),e._v(" flag to run the dashboard from an existing audit")]),e._v(" "),t("li",[e._v("Added an "),t("code",[e._v("ID")]),e._v(" field to each check in the output")]),e._v(" "),t("li",[e._v("Skip health checks for jobs, cronjobs, initcontainers")]),e._v(" "),t("li",[e._v("Added support for exemptions")]),e._v(" "),t("li",[e._v("Fixed dashboard base path option")])]),e._v(" "),t("h2",{attrs:{id:"_0-4-0"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_0-4-0"}},[e._v("#")]),e._v(" 0.4.0")]),e._v(" "),t("ul",[t("li",[e._v("Added additional Pod Controllers to scan PodSpec ("),t("code",[e._v("jobs")]),e._v(", "),t("code",[e._v("cronjobs")]),e._v(", "),t("code",[e._v("daemonsets")]),e._v(", "),t("code",[e._v("replicationcontrollers")]),e._v(")")])]),e._v(" "),t("h2",{attrs:{id:"_0-3-1"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_0-3-1"}},[e._v("#")]),e._v(" 0.3.1")]),e._v(" "),t("ul",[t("li",[e._v("Changed dashboard branding to refer to new org name Fairwinds")])]),e._v(" "),t("h2",{attrs:{id:"_0-3-0"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_0-3-0"}},[e._v("#")]),e._v(" 0.3.0")]),e._v(" "),t("ul",[t("li",[e._v("Added "),t("code",[e._v("--set-exit-code-on-error")]),e._v(" and "),t("code",[e._v("--set-exit-code-below-score")]),e._v(" flags to better support CI/CD")])]),e._v(" "),t("h2",{attrs:{id:"_0-2-1"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_0-2-1"}},[e._v("#")]),e._v(" 0.2.1")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/FairwindsOps/polaris/issues/146",target:"_blank",rel:"noopener noreferrer"}},[e._v("Fix"),t("OutboundLink")],1),e._v(": Fixed logic on RunAsNonRoot check to incorporate settings in podSpec")])]),e._v(" "),t("h2",{attrs:{id:"_0-2-0"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_0-2-0"}},[e._v("#")]),e._v(" 0.2.0")]),e._v(" "),t("ul",[t("li",[e._v("Added "),t("code",[e._v("--output-format")]),e._v(" flag for better CI/CD support")]),e._v(" "),t("li",[e._v("Added "),t("code",[e._v("--display-name")]),e._v(" flag")]),e._v(" "),t("li",[e._v("Added support for StatefulSets")]),e._v(" "),t("li",[e._v("Show error message if no kubeconfig is set")])]),e._v(" "),t("h2",{attrs:{id:"_0-1-5"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_0-1-5"}},[e._v("#")]),e._v(" 0.1.5")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/FairwindsOps/polaris/issues/125",target:"_blank",rel:"noopener noreferrer"}},[e._v("Fix"),t("OutboundLink")],1),e._v(": ignore limits/requests for initContainers")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/FairwindsOps/polaris/issues/132",target:"_blank",rel:"noopener noreferrer"}},[e._v("Fix"),t("OutboundLink")],1),e._v(": support custom base path")])]),e._v(" "),t("h2",{attrs:{id:"_0-1-4"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_0-1-4"}},[e._v("#")]),e._v(" 0.1.4")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/FairwindsOps/polaris/issues/116",target:"_blank",rel:"noopener noreferrer"}},[e._v("Fix"),t("OutboundLink")],1),e._v(": details pages getting template errors")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/FairwindsOps/polaris/issues/114",target:"_blank",rel:"noopener noreferrer"}},[e._v("Fix"),t("OutboundLink")],1),e._v(": support all auth providers")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/FairwindsOps/polaris/issues/112",target:"_blank",rel:"noopener noreferrer"}},[e._v("Fix"),t("OutboundLink")],1),e._v(": Ignore readiness probe for initContainers")])]),e._v(" "),t("h2",{attrs:{id:"_0-1-3"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_0-1-3"}},[e._v("#")]),e._v(" 0.1.3")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/FairwindsOps/polaris/issues/109",target:"_blank",rel:"noopener noreferrer"}},[e._v("Fix"),t("OutboundLink")],1),e._v(": dashboard not updating when running persistently")])]),e._v(" "),t("h2",{attrs:{id:"_0-1-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_0-1-2"}},[e._v("#")]),e._v(" 0.1.2")]),e._v(" "),t("ul",[t("li",[e._v("Stored all third-party assets (e.g. Charts.js) to local files to support offline dashboard viewing")]),e._v(" "),t("li",[e._v("Fix: custom configs in "),t("code",[e._v("ConfigMap")]),e._v(" not respected")])]),e._v(" "),t("h2",{attrs:{id:"_0-1-1"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_0-1-1"}},[e._v("#")]),e._v(" 0.1.1")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/FairwindsOps/polaris/issues/93",target:"_blank",rel:"noopener noreferrer"}},[e._v("Fix"),t("OutboundLink")],1),e._v(": missing "),t("code",[e._v("config.yaml")]),e._v(" and dashboard assets in binary releases")]),e._v(" "),t("li",[e._v("Added some tests and better error handling")])]),e._v(" "),t("h2",{attrs:{id:"_0-1-0"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_0-1-0"}},[e._v("#")]),e._v(" 0.1.0")]),e._v(" "),t("ul",[t("li",[e._v("Dashboard fully functional")]),e._v(" "),t("li",[e._v("Validating webhook functional, but still considered beta")]),e._v(" "),t("li",[e._v("Checks:\n"),t("ul",[t("li",[e._v("Health\n"),t("ul",[t("li",[e._v("readiness probe missing")]),e._v(" "),t("li",[e._v("liveness probe missing")])])]),e._v(" "),t("li",[e._v("Images\n"),t("ul",[t("li",[e._v("tag not specified")]),e._v(" "),t("li",[e._v("pull policy not always")])])]),e._v(" "),t("li",[e._v("Networking\n"),t("ul",[t("li",[e._v("host network set")]),e._v(" "),t("li",[e._v("host port set")])])]),e._v(" "),t("li",[e._v("Resources\n"),t("ul",[t("li",[e._v("cpu/memory requests missing")]),e._v(" "),t("li",[e._v("cpu/memory limits missing")]),e._v(" "),t("li",[e._v("cpu/memory ranges exceeded")])])]),e._v(" "),t("li",[e._v("Security\n"),t("ul",[t("li",[e._v("security capabilities")]),e._v(" "),t("li",[e._v("host IPC set")]),e._v(" "),t("li",[e._v("host PID set")]),e._v(" "),t("li",[e._v("not read-only fs")]),e._v(" "),t("li",[e._v("privilege escalation allowed")]),e._v(" "),t("li",[e._v("run as root allowed")]),e._v(" "),t("li",[e._v("run as privileged")])])])])])])])}),[],!1,null,null,null);r.default=s.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/11.d7eadcf0.js b/docs/assets/js/11.d7eadcf0.js deleted file mode 100644 index 7f8f954e6..000000000 --- a/docs/assets/js/11.d7eadcf0.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[11],{373:function(e,t,r){"use strict";r.r(t);var s=r(42),o=Object(s.a)({},(function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[r("h1",{attrs:{id:"efficiency"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#efficiency"}},[e._v("#")]),e._v(" Efficiency")]),e._v(" "),r("p",[e._v("These checks ensure that CPU and memory settings are configured, so that\nKubernetes can schedule your workload effectively.")]),e._v(" "),r("h2",{attrs:{id:"presence-checks"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#presence-checks"}},[e._v("#")]),e._v(" Presence Checks")]),e._v(" "),r("p",[e._v("To simplify ensure that these values have been set, the following attributes are available:")]),e._v(" "),r("table",[r("thead",[r("tr",[r("th",[e._v("key")]),e._v(" "),r("th",[e._v("default")]),e._v(" "),r("th",[e._v("description")])])]),e._v(" "),r("tbody",[r("tr",[r("td",[r("code",[e._v("resources.cpuRequestsMissing")])]),e._v(" "),r("td",[r("code",[e._v("warning")])]),e._v(" "),r("td",[e._v("Fails when "),r("code",[e._v("resources.requests.cpu")]),e._v(" attribute is not configured.")])]),e._v(" "),r("tr",[r("td",[r("code",[e._v("resources.memoryRequestsMissing")])]),e._v(" "),r("td",[r("code",[e._v("warning")])]),e._v(" "),r("td",[e._v("Fails when "),r("code",[e._v("resources.requests.memory")]),e._v(" attribute is not configured.")])]),e._v(" "),r("tr",[r("td",[r("code",[e._v("resources.cpuLimitsMissing")])]),e._v(" "),r("td",[r("code",[e._v("warning")])]),e._v(" "),r("td",[e._v("Fails when "),r("code",[e._v("resources.limits.cpu")]),e._v(" attribute is not configured.")])]),e._v(" "),r("tr",[r("td",[r("code",[e._v("resources.memoryLimitsMissing")])]),e._v(" "),r("td",[r("code",[e._v("warning")])]),e._v(" "),r("td",[e._v("Fails when "),r("code",[e._v("resources.limits.memory")]),e._v(" attribute is not configured.")])])])]),e._v(" "),r("h2",{attrs:{id:"background"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#background"}},[e._v("#")]),e._v(" Background")]),e._v(" "),r("p",[e._v("Configuring resource requests and limits for containers running in Kubernetes is an important best practice to follow. Setting appropriate resource requests will ensure that all your applications have sufficient compute resources. Setting appropriate resource limits will ensure that your applications do not consume too many resources.")]),e._v(" "),r("p",[e._v("Having these values appropriately configured ensures that:")]),e._v(" "),r("ul",[r("li",[r("p",[e._v("Cluster autoscaling can function as intended. New nodes are scheduled once pods are unable to be scheduled on an existing node due to insufficient resources. This will not happen if resource requests are not configured.")])]),e._v(" "),r("li",[r("p",[e._v("Each container has sufficient access to compute resources. Without resource requests, a pod may be scheduled on a node that is already overutilized. Without resource limits, a single poorly behaving pod could utilize the majority of resources on a node, significantly impacting the performance of other pods on the same node.")])])]),e._v(" "),r("h2",{attrs:{id:"further-reading"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#further-reading"}},[e._v("#")]),e._v(" Further Reading")]),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Kubernetes Docs: Managing Compute Resources for Containers"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://cloud.google.com/blog/products/gcp/kubernetes-best-practices-resource-requests-and-limits",target:"_blank",rel:"noopener noreferrer"}},[e._v("Kubernetes best practices: Resource requests and limits"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler",target:"_blank",rel:"noopener noreferrer"}},[e._v("Vertical Pod Autoscaler (can automatically set resource requests and limits)"),r("OutboundLink")],1)])])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/12.85c0eab0.js b/docs/assets/js/12.85c0eab0.js deleted file mode 100644 index fbb4b8c50..000000000 --- a/docs/assets/js/12.85c0eab0.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[12],{366:function(e,t,a){"use strict";a.r(t);var i=a(42),r=Object(i.a)({},(function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"reliability"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#reliability"}},[e._v("#")]),e._v(" Reliability")]),e._v(" "),a("p",[e._v("These checks help to make sure your workloads are always available,\nand are running the correct image.")]),e._v(" "),a("table",[a("thead",[a("tr",[a("th",[e._v("key")]),e._v(" "),a("th",[e._v("default")]),e._v(" "),a("th",[e._v("description")])])]),e._v(" "),a("tbody",[a("tr",[a("td",[a("code",[e._v("reliability.readinessProbeMissing")])]),e._v(" "),a("td",[a("code",[e._v("warning")])]),e._v(" "),a("td",[e._v("Fails when a readiness probe is not configured for a pod.")])]),e._v(" "),a("tr",[a("td",[a("code",[e._v("reliability.livenessProbeMissing")])]),e._v(" "),a("td",[a("code",[e._v("warning")])]),e._v(" "),a("td",[e._v("Fails when a liveness probe is not configured for a pod.")])]),e._v(" "),a("tr",[a("td",[a("code",[e._v("reliability.tagNotSpecified")])]),e._v(" "),a("td",[a("code",[e._v("danger")])]),e._v(" "),a("td",[e._v("Fails when an image tag is either not specified or "),a("code",[e._v("latest")]),e._v(".")])]),e._v(" "),a("tr",[a("td",[a("code",[e._v("reliability.pullPolicyNotAlways")])]),e._v(" "),a("td",[a("code",[e._v("warning")])]),e._v(" "),a("td",[e._v("Fails when an image pull policy is not "),a("code",[e._v("always")]),e._v(".")])]),e._v(" "),a("tr",[a("td",[a("code",[e._v("reliability.priorityClassNotSet")])]),e._v(" "),a("td",[a("code",[e._v("ignore")])]),e._v(" "),a("td",[e._v("Fails when a priorityClassName is not set for a pod.")])]),e._v(" "),a("tr",[a("td",[a("code",[e._v("reliability.multipleReplicasForDeployment")])]),e._v(" "),a("td",[a("code",[e._v("ignore")])]),e._v(" "),a("td",[e._v("Fails when there is only one replica for a deployment.")])])])]),e._v(" "),a("h2",{attrs:{id:"background"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#background"}},[e._v("#")]),e._v(" Background")]),e._v(" "),a("p",[e._v("Readiness and liveness probes can help maintain the health of applications running inside Kubernetes. By default, Kubernetes only knows whether or not a process is running, not if it's healthy. Properly configured readiness and liveness probes will also be able to ensure the health of an application.")]),e._v(" "),a("p",[e._v('Readiness probes are designed to ensure that an application has reached a "ready" state. In many cases there is a period of time between when a webserver process starts and when it is ready to receive traffic. A readiness probe can ensure the traffic is not sent to a pod until it is actually ready to receive traffic.')]),e._v(" "),a("p",[e._v("Liveness probes are designed to ensure that an application stays in a healthy state. When a liveness probe fails, the pod will be restarted.")]),e._v(" "),a("p",[e._v("Docker's "),a("code",[e._v("latest")]),e._v(" tag is applied by default to images where a tag hasn't been specified. Not specifying a specific version of an image can lead to a wide variety of problems. The underlying image could include unexpected breaking changes that break your application whenever the latest image is pulled. Reusing the same tag for multiple versions of an image can lead to different nodes in the same cluster having different versions of an image, even if the tag is identical.")]),e._v(" "),a("p",[e._v("Related to that, relying on cached versions of a Docker image can become a security vulnerability. By default, an image will be pulled if it isn't already cached on the node attempting to run it. This can result in variations in images that are running per node, or potentially provide a way to gain access to an image without having direct access to the ImagePullSecret. With that in mind, it's often better to ensure the a pod has "),a("code",[e._v("pullPolicy: Always")]),e._v(" specified, so images are always pulled directly from their source.")]),e._v(" "),a("h2",{attrs:{id:"further-reading"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#further-reading"}},[e._v("#")]),e._v(" Further Reading")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://vsupalov.com/docker-latest-tag/",target:"_blank",rel:"noopener noreferrer"}},[e._v("What's Wrong With The Docker :latest Tag?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://medium.com/@trstringer/kubernetes-alwayspullimages-admission-control-the-importance-implementation-and-security-d83ff3815840",target:"_blank",rel:"noopener noreferrer"}},[e._v("Kubernetes’ AlwaysPullImages Admission Control — the Importance, Implementation, and Security Vulnerability in its Absence"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Kubernetes Docs: Configure Liveness and Readiness Probes"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://medium.com/spire-labs/utilizing-kubernetes-liveness-and-readiness-probes-to-automatically-recover-from-failure-2fe0314f2b2e",target:"_blank",rel:"noopener noreferrer"}},[e._v("Utilizing Kubernetes Liveness and Readiness Probes to Automatically Recover From Failure"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://blog.colinbreck.com/kubernetes-liveness-and-readiness-probes-how-to-avoid-shooting-yourself-in-the-foot/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Kubernetes Liveness and Readiness Probes: How to Avoid Shooting Yourself in the Foot"),a("OutboundLink")],1)])])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/13.0487faf0.js b/docs/assets/js/13.0487faf0.js deleted file mode 100644 index d9219525f..000000000 --- a/docs/assets/js/13.0487faf0.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[13],{367:function(e,t,r){"use strict";r.r(t);var o=r(42),i=Object(o.a)({},(function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[r("h1",{attrs:{id:"security"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#security"}},[e._v("#")]),e._v(" Security")]),e._v(" "),r("p",[e._v("These checks are related to security concerns. Workloads that fail these\nchecks may make your cluster more vulnerable, often by introducing a path\nfor privilege escalation.")]),e._v(" "),r("table",[r("thead",[r("tr",[r("th",[e._v("key")]),e._v(" "),r("th",[e._v("default")]),e._v(" "),r("th",[e._v("description")])])]),e._v(" "),r("tbody",[r("tr",[r("td",[r("code",[e._v("security.hostIPCSet")])]),e._v(" "),r("td",[r("code",[e._v("danger")])]),e._v(" "),r("td",[e._v("Fails when "),r("code",[e._v("hostIPC")]),e._v(" attribute is configured.")])]),e._v(" "),r("tr",[r("td",[r("code",[e._v("security.hostPIDSet")])]),e._v(" "),r("td",[r("code",[e._v("danger")])]),e._v(" "),r("td",[e._v("Fails when "),r("code",[e._v("hostPID")]),e._v(" attribute is configured.")])]),e._v(" "),r("tr",[r("td",[r("code",[e._v("security.notReadOnlyRootFilesystem")])]),e._v(" "),r("td",[r("code",[e._v("warning")])]),e._v(" "),r("td",[e._v("Fails when "),r("code",[e._v("securityContext.readOnlyRootFilesystem")]),e._v(" is not true.")])]),e._v(" "),r("tr",[r("td",[r("code",[e._v("security.privilegeEscalationAllowed")])]),e._v(" "),r("td",[r("code",[e._v("danger")])]),e._v(" "),r("td",[e._v("Fails when "),r("code",[e._v("securityContext.allowPrivilegeEscalation")]),e._v(" is true.")])]),e._v(" "),r("tr",[r("td",[r("code",[e._v("security.runAsRootAllowed")])]),e._v(" "),r("td",[r("code",[e._v("warning")])]),e._v(" "),r("td",[e._v("Fails when "),r("code",[e._v("securityContext.runAsNonRoot")]),e._v(" is not true.")])]),e._v(" "),r("tr",[r("td",[r("code",[e._v("security.runAsPrivileged")])]),e._v(" "),r("td",[r("code",[e._v("danger")])]),e._v(" "),r("td",[e._v("Fails when "),r("code",[e._v("securityContext.privileged")]),e._v(" is true.")])]),e._v(" "),r("tr",[r("td",[r("code",[e._v("security.insecureCapabilities")])]),e._v(" "),r("td",[r("code",[e._v("warning")])]),e._v(" "),r("td",[e._v("Fails when "),r("code",[e._v("securityContext.capabilities")]),e._v(" includes one of the capabilities "),r("a",{attrs:{href:"https://github.com/FairwindsOps/polaris/tree/master/checks/insecureCapabilities.yaml",target:"_blank",rel:"noopener noreferrer"}},[e._v("listed here"),r("OutboundLink")],1)])]),e._v(" "),r("tr",[r("td",[r("code",[e._v("security.dangerousCapabilities")])]),e._v(" "),r("td",[r("code",[e._v("danger")])]),e._v(" "),r("td",[e._v("Fails when "),r("code",[e._v("securityContext.capabilities")]),e._v(" includes one of the capabilities "),r("a",{attrs:{href:"https://github.com/FairwindsOps/polaris/tree/master/checks/dangerousCapabilities.yaml",target:"_blank",rel:"noopener noreferrer"}},[e._v("listed here"),r("OutboundLink")],1)])]),e._v(" "),r("tr",[r("td",[r("code",[e._v("security.hostNetworkSet")])]),e._v(" "),r("td",[r("code",[e._v("warning")])]),e._v(" "),r("td",[e._v("Fails when "),r("code",[e._v("hostNetwork")]),e._v(" attribute is configured.")])]),e._v(" "),r("tr",[r("td",[r("code",[e._v("security.hostPortSet")])]),e._v(" "),r("td",[r("code",[e._v("warning")])]),e._v(" "),r("td",[e._v("Fails when "),r("code",[e._v("hostPort")]),e._v(" attribute is configured.")])])])]),e._v(" "),r("h2",{attrs:{id:"background"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#background"}},[e._v("#")]),e._v(" Background")]),e._v(" "),r("p",[e._v("Securing workloads in Kubernetes is an important part of overall cluster security. The overall goal should be to ensure that containers are running with as minimal privileges as possible. This includes avoiding privilege escalation, not running containers with a root user, not giving excessive access to the host network, and using read only file systems wherever possible.")]),e._v(" "),r("p",[e._v("A pod running with the "),r("code",[e._v("hostNetwork")]),e._v(" attribute enabled will have access to the loopback device, services listening on localhost, and could be used to snoop on network activity of other pods on the same node. There are certain examples where setting "),r("code",[e._v("hostNetwork")]),e._v(" to true is required, such as deploying a networking plugin like Flannel.")]),e._v(" "),r("p",[e._v("Setting the "),r("code",[e._v("hostPort")]),e._v(" attribute on a container will ensure that it is accessible on that specific port on each node it is deployed to. Unfortunately when this is specified, it limits where a pod can actually be scheduled in a cluster.")]),e._v(" "),r("p",[e._v("Much of this configuration can be found in the "),r("code",[e._v("securityContext")]),e._v(" attribute for both Kubernetes pods and containers. Where configuration is available at both a pod and container level, Polaris validates both.")]),e._v(" "),r("h2",{attrs:{id:"further-reading"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#further-reading"}},[e._v("#")]),e._v(" Further Reading")]),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://kubernetes.io/docs/tasks/configure-pod-container/security-context/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Kubernetes Docs: Configure a Security Context for a Pod or Container"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://www.youtube.com/watch?v=ltrV-Qmh3oY",target:"_blank",rel:"noopener noreferrer"}},[e._v("KubeCon 2018 Keynote: Running with Scissors"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://kubernetes-security.info/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Kubernetes Security Book"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-capabilities-for-a-container",target:"_blank",rel:"noopener noreferrer"}},[e._v("Kubernetes Docs: Set capabilities for a Container"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"http://man7.org/linux/man-pages/man7/capabilities.7.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux Programmer's Manual: Capabilities"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://kubernetes.io/docs/concepts/configuration/overview/#services",target:"_blank",rel:"noopener noreferrer"}},[e._v("Kubernetes Docs: Configuration Best Practices"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"http://alesnosek.com/blog/2017/02/14/accessing-kubernetes-pods-from-outside-of-the-cluster/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Accessing Kubernetes Pods from Outside of the Cluster"),r("OutboundLink")],1)])])])}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/14.60ea393e.js b/docs/assets/js/14.60ea393e.js deleted file mode 100644 index 5533b03fa..000000000 --- a/docs/assets/js/14.60ea393e.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[14],{371:function(e,n,t){"use strict";t.r(n);var s=t(42),i=Object(s.a)({},(function(){var e=this.$createElement,n=this._self._c||e;return n("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[n("h4",{attrs:{id:"cli-options"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#cli-options"}},[this._v("#")]),this._v(" CLI Options")]),this._v(" "),n("div",{staticClass:"language- extra-class"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[this._v('# top-level commands\naudit\n Runs a one-time audit.\ndashboard\n Runs the webserver for Polaris dashboard.\nhelp\n Prints help, if you give it a command then it will print help for that command. Same as -h\nversion\n Prints the version of Polaris\nwebhook\n Runs the webhook webserver\n\n# high-level flags\n-c, --config string\n Location of Polaris configuration file\n--disallow-exemptions\n Disallow any exemptions from configuration file.\n-h, --help\n Help for Polaris (same as help command)\n--kubeconfig string\n Path to a kubeconfig. Only required if out-of-cluster.\n--log-level string\n Logrus log level (default "info")\n--master string\n The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster.\n\n# dashboard flags\n--audit-path string\n If specified, audits one or more YAML files instead of a cluster\n--base-path string\n Path on which the dashboard is served (default "/")\n--display-name string\n An optional identifier for the audit\n--load-audit-file string\n Runs the dashboard with data saved from a past audit.\n-p, --port int\n Port for the dashboard webserver (default 8080)\n\n# audit flags\n--audit-path string\n If specified, audits one or more YAML files instead of a cluster\n--resource string\n If specified, audit a specific resource, in the format namespace/kind/version/name, e.g. nginx-ingress/Deployment.apps/v1/default-backend\n--display-name string\n An optional identifier for the audit\n--format string\n Output format for results - json, yaml, or score (default "json")\n--output-file string\n Destination file for audit results\n--output-url string\n Destination URL to send audit results\n--set-exit-code-below-score int\n Set an exit code of 4 when the score is below this threshold (1-100)\n--set-exit-code-on-danger\n Set an exit code of 3 when the audit contains danger-level issues.\n\n# webhook flags\n--disable-webhook-config-installer\n disable the installer in the webhook server, so it won\'t install webhook configuration resources during bootstrapping\n-p, --port int\n Port for the webhook webserver (default 9876)\n')])])])])}),[],!1,null,null,null);n.default=i.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/15.00f25aaa.js b/docs/assets/js/15.00f25aaa.js deleted file mode 100644 index acaf0fb32..000000000 --- a/docs/assets/js/15.00f25aaa.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[15],{365:function(e,t,n){"use strict";n.r(t);var a=n(42),r=Object(a.a)({},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[n("h1",{attrs:{id:"code-of-conduct"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#code-of-conduct"}},[e._v("#")]),e._v(" Code of Conduct")]),e._v(" "),n("h2",{attrs:{id:"our-pledge"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#our-pledge"}},[e._v("#")]),e._v(" Our Pledge")]),e._v(" "),n("p",[e._v("In the interest of fostering an open and welcoming environment, we as\ncontributors and maintainers pledge to making participation in our project and\nour community a harassment-free experience for everyone, regardless of age, body\nsize, disability, ethnicity, gender identity and expression, level of experience,\nnationality, personal appearance, race, religion, or sexual identity and\norientation.")]),e._v(" "),n("h2",{attrs:{id:"our-standards"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#our-standards"}},[e._v("#")]),e._v(" Our Standards")]),e._v(" "),n("p",[e._v("Examples of behavior that contributes to creating a positive environment\ninclude:")]),e._v(" "),n("ul",[n("li",[e._v("Using welcoming and inclusive language")]),e._v(" "),n("li",[e._v("Being respectful of differing viewpoints and experiences")]),e._v(" "),n("li",[e._v("Gracefully accepting constructive criticism")]),e._v(" "),n("li",[e._v("Focusing on what is best for the community")]),e._v(" "),n("li",[e._v("Showing empathy towards other community members")])]),e._v(" "),n("p",[e._v("Examples of unacceptable behavior by participants include:")]),e._v(" "),n("ul",[n("li",[e._v("The use of sexualized language or imagery and unwelcome sexual attention or\nadvances")]),e._v(" "),n("li",[e._v("Trolling, insulting/derogatory comments, and personal or political attacks")]),e._v(" "),n("li",[e._v("Public or private harassment")]),e._v(" "),n("li",[e._v("Publishing others' private information, such as a physical or electronic\naddress, without explicit permission")]),e._v(" "),n("li",[e._v("Other conduct which could reasonably be considered inappropriate in a\nprofessional setting")])]),e._v(" "),n("h2",{attrs:{id:"our-responsibilities"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#our-responsibilities"}},[e._v("#")]),e._v(" Our Responsibilities")]),e._v(" "),n("p",[e._v("Project maintainers are responsible for clarifying the standards of acceptable\nbehavior and are expected to take appropriate and fair corrective action in\nresponse to any instances of unacceptable behavior.")]),e._v(" "),n("p",[e._v("Project maintainers have the right and responsibility to remove, edit, or\nreject comments, commits, code, wiki edits, issues, and other contributions\nthat are not aligned to this Code of Conduct, or to ban temporarily or\npermanently any contributor for other behaviors that they deem inappropriate,\nthreatening, offensive, or harmful.")]),e._v(" "),n("h2",{attrs:{id:"scope"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#scope"}},[e._v("#")]),e._v(" Scope")]),e._v(" "),n("p",[e._v("This Code of Conduct applies both within project spaces and in public spaces\nwhen an individual is representing the project or its community. Examples of\nrepresenting a project or community include using an official project e-mail\naddress, posting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event. Representation of a project may be\nfurther defined and clarified by project maintainers.")]),e._v(" "),n("h2",{attrs:{id:"enforcement"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#enforcement"}},[e._v("#")]),e._v(" Enforcement")]),e._v(" "),n("p",[e._v("Instances of abusive, harassing, or otherwise unacceptable behavior may be\nreported by contacting the project team at [INSERT EMAIL ADDRESS]. All\ncomplaints will be reviewed and investigated and will result in a response that\nis deemed necessary and appropriate to the circumstances. The project team is\nobligated to maintain confidentiality with regard to the reporter of an incident.\nFurther details of specific enforcement policies may be posted separately.")]),e._v(" "),n("p",[e._v("Project maintainers who do not follow or enforce the Code of Conduct in good\nfaith may face temporary or permanent repercussions as determined by other\nmembers of the project's leadership.")]),e._v(" "),n("h2",{attrs:{id:"attribution"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#attribution"}},[e._v("#")]),e._v(" Attribution")]),e._v(" "),n("p",[e._v("This Code of Conduct is adapted from the "),n("a",{attrs:{href:"http://contributor-covenant.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("Contributor Covenant"),n("OutboundLink")],1),e._v(", version 1.4,\navailable at "),n("a",{attrs:{href:"http://contributor-covenant.org/version/1/4/",target:"_blank",rel:"noopener noreferrer"}},[e._v("http://contributor-covenant.org/version/1/4"),n("OutboundLink")],1)])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/16.cb0515ce.js b/docs/assets/js/16.cb0515ce.js deleted file mode 100644 index b0905eb41..000000000 --- a/docs/assets/js/16.cb0515ce.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[16],{379:function(e,t,a){"use strict";a.r(t);var r=a(42),s=Object(r.a)({},(function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"contributing"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#contributing"}},[e._v("#")]),e._v(" Contributing")]),e._v(" "),a("p",[e._v("Issues, whether bugs, tasks, or feature requests are essential for keeping Polaris great. We believe it should be as easy as possible to contribute changes that get things working in your environment. There are a few guidelines that we need contributors to follow so that we can keep on top of things.")]),e._v(" "),a("h2",{attrs:{id:"code-of-conduct"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#code-of-conduct"}},[e._v("#")]),e._v(" Code of Conduct")]),e._v(" "),a("p",[e._v("This project adheres to a "),a("RouterLink",{attrs:{to:"/code-of-conduct.html"}},[e._v("code of conduct")]),e._v(". Please review this document before contributing to this project.")],1),e._v(" "),a("h2",{attrs:{id:"sign-the-cla"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#sign-the-cla"}},[e._v("#")]),e._v(" Sign the CLA")]),e._v(" "),a("p",[e._v("Before you can contribute, you will need to sign the "),a("a",{attrs:{href:"https://cla-assistant.io/fairwindsops/polaris",target:"_blank",rel:"noopener noreferrer"}},[e._v("Contributor License Agreement"),a("OutboundLink")],1),e._v(".")]),e._v(" "),a("h2",{attrs:{id:"project-structure"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#project-structure"}},[e._v("#")]),e._v(" Project Structure")]),e._v(" "),a("p",[e._v("Polaris is built on top of "),a("a",{attrs:{href:"https://github.com/kubernetes-sigs/controller-runtime",target:"_blank",rel:"noopener noreferrer"}},[e._v("controller-runtime"),a("OutboundLink")],1),e._v(". It can run in 3 different modes, a dashboard, a webhook, or a reporter that prints or exports validation results. All of these modes make use of the shared "),a("code",[e._v("validator")]),e._v(" and "),a("code",[e._v("config")]),e._v(" packages. Adding new validations is possible by only making additions to those packages.")]),e._v(" "),a("h2",{attrs:{id:"getting-started"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#getting-started"}},[e._v("#")]),e._v(" Getting Started")]),e._v(" "),a("p",[e._v("We label issues with the "),a("a",{attrs:{href:"https://github.com/FairwindsOps/polaris/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22",target:"_blank",rel:"noopener noreferrer"}},[e._v('"good first issue" tag'),a("OutboundLink")],1),e._v(" if we believe they'll be a good starting point for new contributors. If you're interested in working on an issue, please start a conversation on that issue, and we can help answer any questions as they come up.")]),e._v(" "),a("h2",{attrs:{id:"setting-up-your-development-environment"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#setting-up-your-development-environment"}},[e._v("#")]),e._v(" Setting Up Your Development Environment")]),e._v(" "),a("h3",{attrs:{id:"prerequisites"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites"}},[e._v("#")]),e._v(" Prerequisites")]),e._v(" "),a("ul",[a("li",[e._v("A properly configured Golang environment with Go 1.11 or higher")]),e._v(" "),a("li",[e._v("If you want to see the local changes you make on a Polaris dashboard, you will need access to a Kubernetes cluster defined in "),a("code",[e._v("~/.kube/config")])])]),e._v(" "),a("h3",{attrs:{id:"installation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[e._v("#")]),e._v(" Installation")]),e._v(" "),a("ul",[a("li",[e._v("Install the project with "),a("code",[e._v("go get github.com/fairwindsops/polaris")])]),e._v(" "),a("li",[e._v("Change into the polaris directory which is installed at "),a("code",[e._v("$GOPATH/src/github.com/fairwindsops/polaris")])]),e._v(" "),a("li",[e._v("See the dashboard with "),a("code",[e._v("go run main.go dashboard")]),e._v(", then open http://localhost:8080/")]),e._v(" "),a("li",[e._v("See the audit data "),a("code",[e._v("go run main.go audit")]),e._v(". This command shows the audit information on the command line.")])]),e._v(" "),a("h2",{attrs:{id:"running-tests"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#running-tests"}},[e._v("#")]),e._v(" Running Tests")]),e._v(" "),a("p",[e._v("The following commands are all required to pass as part of Polaris testing:")]),e._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("go list ./... | grep -v vendor | xargs golint -set_exit_status\ngo list ./... | grep -v vendor | xargs go vet\ngo test ./pkg/... -v -coverprofile cover.out\n")])])]),a("h2",{attrs:{id:"creating-a-new-issue"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-new-issue"}},[e._v("#")]),e._v(" Creating a New Issue")]),e._v(" "),a("p",[e._v("If you've encountered an issue that is not already reported, please create a "),a("a",{attrs:{href:"https://github.com/FairwindsOps/polaris/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("new issue"),a("OutboundLink")],1),e._v(", choose "),a("code",[e._v("Bug Report")]),e._v(", "),a("code",[e._v("Feature Request")]),e._v(" or "),a("code",[e._v("Misc.")]),e._v(" and follow the instructions in the template.")]),e._v(" "),a("h2",{attrs:{id:"creating-a-pull-request"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-pull-request"}},[e._v("#")]),e._v(" Creating a Pull Request")]),e._v(" "),a("p",[e._v("Each new pull request should:")]),e._v(" "),a("ul",[a("li",[e._v("Reference any related issues")]),e._v(" "),a("li",[e._v("Add tests that show the issues have been solved")]),e._v(" "),a("li",[e._v("Pass existing tests and linting")]),e._v(" "),a("li",[e._v("Contain a clear indication of if they're ready for review or a work in progress")]),e._v(" "),a("li",[e._v("Be up to date and/or rebased on the master branch")])]),e._v(" "),a("h2",{attrs:{id:"creating-a-new-release"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-new-release"}},[e._v("#")]),e._v(" Creating a new release")]),e._v(" "),a("h3",{attrs:{id:"patch-releases"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#patch-releases"}},[e._v("#")]),e._v(" Patch releases")]),e._v(" "),a("p",[e._v("Patch releases only need to change this repo. The Helm chart and deploy scripts\nwill automatically pull in the latest changes.")]),e._v(" "),a("p",[e._v("If the release involves changes to anything in the "),a("code",[e._v("deploy/")]),e._v(" folder (e.g. new RBAC permissions),\nit needs to be a minor or major release in order to prevent breaking the Helm chart.")]),e._v(" "),a("ol",[a("li",[e._v("Create a PR for this repo\n"),a("ol",[a("li",[e._v("Bump the version number in:\n"),a("ol",[a("li",[e._v("main.go")]),e._v(" "),a("li",[e._v("README.md")])])]),e._v(" "),a("li",[e._v("Update CHANGELOG.md")]),e._v(" "),a("li",[e._v("Merge your PR")])])]),e._v(" "),a("li",[e._v("Tag the latest branch for this repo\n"),a("ol",[a("li",[e._v("Pull the latest commit for the "),a("code",[e._v("master")]),e._v(" branch (which you just merged in your PR)")]),e._v(" "),a("li",[e._v("Run "),a("code",[e._v("git tag $VERSION && git push --tags")])]),e._v(" "),a("li",[e._v("Make sure CircleCI runs successfully for the new tag - this will push images to quay.io and create a release in GitHub\n"),a("ol",[a("li",[e._v("If CircleCI fails, check with Codeowners ASAP")])])])])])]),e._v(" "),a("h3",{attrs:{id:"minor-major-releases"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#minor-major-releases"}},[e._v("#")]),e._v(" Minor/Major releases")]),e._v(" "),a("p",[e._v("Minor and major releases need to change both this repository and the\n"),a("a",{attrs:{href:"https://github.com/FairwindsOps/charts/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Helm chart repo"),a("OutboundLink")],1),e._v(".")]),e._v(" "),a("p",[e._v("The steps are:")]),e._v(" "),a("ol",[a("li",[e._v("Modify the "),a("a",{attrs:{href:"https://github.com/FairwindsOps/charts/stable/polaris",target:"_blank",rel:"noopener noreferrer"}},[e._v("Helm chart"),a("OutboundLink")],1),e._v(" "),a("ol",[a("li",[e._v("Clone the helm charts repo\n"),a("ol",[a("li",[a("code",[e._v("git clone https://github.com/FairwindsOps/charts")])]),e._v(" "),a("li",[a("code",[e._v("git checkout -b yourname/update-polaris")])])])]),e._v(" "),a("li",[e._v("Bump the version number in:\n"),a("ol",[a("li",[e._v("stable/polaris/README.md")]),e._v(" "),a("li",[e._v("stable/polaris/Chart.yaml")]),e._v(" "),a("li",[e._v("stable/polaris/values.yaml")])])]),e._v(" "),a("li",[e._v("Make any necessary changes to the chart to support the new version of Polaris (e.g. new RBAC permissions)")]),e._v(" "),a("li",[a("strong",[e._v("Don't merge yet!")])])])]),e._v(" "),a("li",[e._v("Create a PR for this repo\n"),a("ol",[a("li",[e._v("Create a new branch named "),a("code",[e._v("yourname/update-version")])]),e._v(" "),a("li",[e._v("Bump the version number in:\n"),a("ol",[a("li",[e._v("main.go")]),e._v(" "),a("li",[e._v("README.md")])])]),e._v(" "),a("li",[e._v("Regenerate the deployment files. Assuming you've cloned the charts repo to "),a("code",[e._v("~/git/charts")]),e._v(":\n"),a("ol",[a("li",[a("code",[e._v("CHARTS_DIR=~/git/charts ./scripts/generate-deployment-files.sh")])])])]),e._v(" "),a("li",[e._v("Update CHANGELOG.md")]),e._v(" "),a("li",[e._v("Merge your PR")])])]),e._v(" "),a("li",[e._v("Tag the latest branch for this repo\n"),a("ol",[a("li",[e._v("Pull the latest for the "),a("code",[e._v("master")]),e._v(" branch")]),e._v(" "),a("li",[e._v("Run "),a("code",[e._v("git tag $VERSION && git push --tags")])]),e._v(" "),a("li",[e._v("Make sure CircleCI runs successfully for the new tag - this will push images to quay.io and create a release in GitHub\n"),a("ol",[a("li",[e._v("If CircleCI fails, check with Codeowners ASAP")])])])])]),e._v(" "),a("li",[e._v("Create and merge a PR for your changes to the Helm chart")])])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/17.013e9969.js b/docs/assets/js/17.013e9969.js deleted file mode 100644 index 75ec5cc94..000000000 --- a/docs/assets/js/17.013e9969.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[17],{368:function(e,t,a){"use strict";a.r(t);var s=a(42),n=Object(s.a)({},(function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"check-settings"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#check-settings"}},[e._v("#")]),e._v(" Check Settings")]),e._v(" "),a("p",[e._v("Each check can be assigned a "),a("code",[e._v("severity")]),e._v(". Only checks with a severity of "),a("code",[e._v("danger")]),e._v(" or "),a("code",[e._v("warning")]),e._v(" will be validated. The results of these validations are visible on the dashboard. In the case of the validating webhook, only failures with a severity of "),a("code",[e._v("danger")]),e._v(" will result in a change being rejected.")]),e._v(" "),a("p",[e._v("Polaris validation checks fall into several different categories:")]),e._v(" "),a("ul",[a("li",[a("RouterLink",{attrs:{to:"/checks/security.html"}},[e._v("Security")])],1),e._v(" "),a("li",[a("RouterLink",{attrs:{to:"/checks/reliability.html"}},[e._v("Reliability")])],1),e._v(" "),a("li",[a("RouterLink",{attrs:{to:"/checks/efficiency.html"}},[e._v("Efficiency")])],1)]),e._v(" "),a("p",[e._v("To change the default severity levels, or to turn checks on or off, you can create your own "),a("code",[e._v("config.yaml")]),e._v(":")]),e._v(" "),a("div",{staticClass:"language-yaml extra-class"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[e._v("checks")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[e._v("tagNotSpecified")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" ignore\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[e._v("runAsRootAllowed")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" danger\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[e._v("pullPolicyNotAlways")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" warning\n")])])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/18.a0fcb2d2.js b/docs/assets/js/18.a0fcb2d2.js deleted file mode 100644 index 11e6b2070..000000000 --- a/docs/assets/js/18.a0fcb2d2.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[18],{369:function(t,o,e){"use strict";e.r(o);var n=e(42),i=Object(n.a)({},(function(){var t=this,o=t.$createElement,e=t._self._c||o;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"configuration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#configuration"}},[t._v("#")]),t._v(" Configuration")]),t._v(" "),e("p",[t._v("The default Polaris configuration can be "),e("a",{attrs:{href:"https://github.com/FairwindsOps/polaris/blob/master/examples/config.yaml",target:"_blank",rel:"noopener noreferrer"}},[t._v("seen here"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[t._v("You can customize the configuration to do things like:")]),t._v(" "),e("ul",[e("li",[t._v("Turn checks "),e("RouterLink",{attrs:{to:"/customization/checks.html"}},[t._v("on and off")])],1),t._v(" "),e("li",[t._v("Change the "),e("RouterLink",{attrs:{to:"/customization/checks.html"}},[t._v("severity level")]),t._v(" of checks")],1),t._v(" "),e("li",[t._v("Add new "),e("RouterLink",{attrs:{to:"/customization/custom-checks.html"}},[t._v("custom checks")])],1),t._v(" "),e("li",[t._v("Add "),e("RouterLink",{attrs:{to:"/customization/exemptions.html"}},[t._v("exemptions")]),t._v(" for particular workloads or namespaces")],1)]),t._v(" "),e("p",[t._v("To pass in your custom configuration, follow the instructions for your environment:")]),t._v(" "),e("ul",[e("li",[t._v("CLI - set the "),e("code",[t._v("--config")]),t._v(" argument to point to your "),e("code",[t._v("config.yaml")])]),t._v(" "),e("li",[t._v("Helm - set the "),e("code",[t._v("config")]),t._v(" variable in your values file")]),t._v(" "),e("li",[t._v("kubectl - create a ConfigMap with your "),e("code",[t._v("config.yaml")]),t._v(", mount it as a volume, and use the "),e("code",[t._v("--config")]),t._v(" argument in your Deployment")])])])}),[],!1,null,null,null);o.default=i.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/19.9fe045af.js b/docs/assets/js/19.9fe045af.js deleted file mode 100644 index f4c52a8c6..000000000 --- a/docs/assets/js/19.9fe045af.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{375:function(t,a,e){"use strict";e.r(a);var s=e(42),n=Object(s.a)({},(function(){var t=this,a=t.$createElement,e=t._self._c||a;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"custom-checks"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#custom-checks"}},[t._v("#")]),t._v(" Custom Checks")]),t._v(" "),e("p",[t._v("If you'd like to create your own checks, you can use "),e("a",{attrs:{href:"https://json-schema.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("JSON Schema"),e("OutboundLink")],1),t._v(". For example,\nto disallow images from quay.io:")]),t._v(" "),e("div",{staticClass:"language-yaml extra-class"},[e("pre",{pre:!0,attrs:{class:"language-yaml"}},[e("code",[e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("checks")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("imageRegistry")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" warning\n"),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("customChecks")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("imageRegistry")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("successMessage")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" Image comes from allowed registries\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("failureMessage")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" Image should not be from disallowed registry\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("category")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" Images\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("target")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" Container "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# target can be "Container" or "Pod"')]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("schema")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("'$schema'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" http"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("//json"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("-")]),t._v("schema.org/draft"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("-")]),t._v("07/schema\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" object\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("properties")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("image")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" string\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("not")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("pattern")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" ^quay.io\n")])])]),e("p",[t._v("Schemas can also be specified as JSON strings instead of YAML, for easier copy/pasting:")]),t._v(" "),e("div",{staticClass:"language-yaml extra-class"},[e("pre",{pre:!0,attrs:{class:"language-yaml"}},[e("code",[e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("customChecks")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("foo")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("jsonSchema")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("|")]),e("span",{pre:!0,attrs:{class:"token scalar string"}},[t._v('\n {\n "$schema": "http://json-schema.org/draft-07/schema",\n "type": "object"\n }')]),t._v("\n")])])]),e("p",[t._v("We extend JSON Schema with "),e("code",[t._v("resourceMinimum")]),t._v(" and "),e("code",[t._v("resourceMaximum")]),t._v(" fields to help compare memory and CPU resource\nstrings like "),e("code",[t._v("1000m")]),t._v(" and "),e("code",[t._v("1G")]),t._v(". You can see an example in "),e("a",{attrs:{href:"https://github.com/FairwindsOps/polaris/tree/master/examples/config-full.yaml",target:"_blank",rel:"noopener noreferrer"}},[t._v("the extended config"),e("OutboundLink")],1)]),t._v(" "),e("p",[t._v("There are additional examples in the "),e("a",{attrs:{href:"https://github.com/FairwindsOps/polaris/tree/master/checks",target:"_blank",rel:"noopener noreferrer"}},[t._v("checks folder"),e("OutboundLink")],1),t._v(".")])])}),[],!1,null,null,null);a.default=n.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/2.28adca5d.js b/docs/assets/js/2.28adca5d.js deleted file mode 100644 index 9c7d2b93d..000000000 --- a/docs/assets/js/2.28adca5d.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[2],{305:function(t,e,n){"use strict";n.d(e,"d",(function(){return i})),n.d(e,"a",(function(){return a})),n.d(e,"i",(function(){return s})),n.d(e,"f",(function(){return u})),n.d(e,"g",(function(){return l})),n.d(e,"h",(function(){return c})),n.d(e,"b",(function(){return h})),n.d(e,"e",(function(){return p})),n.d(e,"k",(function(){return f})),n.d(e,"l",(function(){return d})),n.d(e,"c",(function(){return v})),n.d(e,"j",(function(){return m}));n(23),n(92),n(167),n(95),n(172),n(65),n(43),n(306),n(66),n(308),n(94);var i=/#.*$/,r=/\.(md|html)$/,a=/\/$/,s=/^[a-z]+:/i;function o(t){return decodeURI(t).replace(i,"").replace(r,"")}function u(t){return s.test(t)}function l(t){return/^mailto:/.test(t)}function c(t){return/^tel:/.test(t)}function h(t){if(u(t))return t;var e=t.match(i),n=e?e[0]:"",r=o(t);return a.test(r)?t:r+".html"+n}function p(t,e){var n=decodeURIComponent(t.hash),r=function(t){var e=t.match(i);if(e)return e[0]}(e);return(!r||n===r)&&o(t.path)===o(e)}function f(t,e,n){if(u(e))return{type:"external",path:e};n&&(e=function(t,e,n){var i=t.charAt(0);if("/"===i)return t;if("?"===i||"#"===i)return e+t;var r=e.split("/");n&&r[r.length-1]||r.pop();for(var a=t.replace(/^\//,"").split("/"),s=0;s3&&void 0!==arguments[3]?arguments[3]:1;if("string"==typeof e)return f(n,e,i);if(Array.isArray(e))return Object.assign(f(n,e[0],i),{title:e[1]});var a=e.children||[];return 0===a.length&&e.path?Object.assign(f(n,e.path,i),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:a.map((function(e){return t(e,n,i,r+1)})),collapsable:!1!==e.collapsable}}(t,r,l)})):[]}return[]}function g(t){var e=v(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map((function(e){return{type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}}))}]}function v(t){var e;return(t=t.map((function(t){return Object.assign({},t)}))).forEach((function(t){2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)})),t.filter((function(t){return 2===t.level}))}function m(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},306:function(t,e,n){"use strict";var i=n(169),r=n(5),a=n(13),s=n(22),o=n(170),u=n(171);i("match",1,(function(t,e,n){return[function(e){var n=s(this),i=null==e?void 0:e[t];return void 0!==i?i.call(e,n):new RegExp(e)[t](String(n))},function(t){var i=n(e,t,this);if(i.done)return i.value;var s=r(t),l=String(this);if(!s.global)return u(s,l);var c=s.unicode;s.lastIndex=0;for(var h,p=[],f=0;null!==(h=u(s,l));){var d=String(h[0]);p[f]=d,""===d&&(s.lastIndex=o(l,a(s.lastIndex),c)),f++}return 0===f?null:p}]}))},307:function(t,e){t.exports="\t\n\v\f\r                 \u2028\u2029\ufeff"},308:function(t,e,n){"use strict";var i=n(169),r=n(168),a=n(5),s=n(22),o=n(100),u=n(170),l=n(13),c=n(171),h=n(68),p=n(1),f=[].push,d=Math.min,g=!p((function(){return!RegExp(4294967295,"y")}));i("split",2,(function(t,e,n){var i;return i="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(t,n){var i=String(s(this)),a=void 0===n?4294967295:n>>>0;if(0===a)return[];if(void 0===t)return[i];if(!r(t))return e.call(i,t,a);for(var o,u,l,c=[],p=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":""),d=0,g=new RegExp(t.source,p+"g");(o=h.call(g,i))&&!((u=g.lastIndex)>d&&(c.push(i.slice(d,o.index)),o.length>1&&o.index=a));)g.lastIndex===o.index&&g.lastIndex++;return d===i.length?!l&&g.test("")||c.push(""):c.push(i.slice(d)),c.length>a?c.slice(0,a):c}:"0".split(void 0,0).length?function(t,n){return void 0===t&&0===n?[]:e.call(this,t,n)}:e,[function(e,n){var r=s(this),a=null==e?void 0:e[t];return void 0!==a?a.call(e,r,n):i.call(String(r),e,n)},function(t,r){var s=n(i,t,this,r,i!==e);if(s.done)return s.value;var h=a(t),p=String(this),f=o(h,RegExp),v=h.unicode,m=(h.ignoreCase?"i":"")+(h.multiline?"m":"")+(h.unicode?"u":"")+(g?"y":"g"),b=new f(g?h:"^(?:"+h.source+")",m),k=void 0===r?4294967295:r>>>0;if(0===k)return[];if(0===p.length)return null===c(b,p)?[p]:[];for(var _=0,x=0,C=[];x-1)&&(e=e.replace(/y/g,""));var o=s(x?new m(t,e):m(t,e),i?this:b,$);return C&&n&&d(o,{sticky:n}),o},y=function(t){t in $||o($,t,{configurable:!0,get:function(){return m[t]},set:function(e){m[t]=e}})},L=u(m),w=0;L.length>w;)y(L[w++]);b.constructor=$,$.prototype=b,p(r,"RegExp",$)}g("RegExp")},313:function(t,e,n){},314:function(t,e,n){},315:function(t,e,n){},316:function(t,e,n){},317:function(t,e,n){},318:function(t,e,n){},319:function(t,e){t.exports=function(t){return null==t}},320:function(t,e,n){},321:function(t,e,n){},322:function(t,e,n){},323:function(t,e,n){},324:function(t,e,n){},325:function(t,e,n){},330:function(t,e,n){"use strict";n.r(e);n(166);var i=n(305),r={name:"SidebarGroup",components:{DropdownTransition:n(331).a},props:["item","open","collapsable","depth"],beforeCreate:function(){this.$options.components.SidebarLinks=n(330).default},methods:{isActive:i.e}},a=(n(351),n(42)),s=Object(a.a)(r,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("section",{staticClass:"sidebar-group",class:[{collapsable:t.collapsable,"is-sub-group":0!==t.depth},"depth-"+t.depth]},[t.item.path?n("RouterLink",{staticClass:"sidebar-heading clickable",class:{open:t.open,active:t.isActive(t.$route,t.item.path)},attrs:{to:t.item.path},nativeOn:{click:function(e){return t.$emit("toggle")}}},[n("span",[t._v(t._s(t.item.title))]),t._v(" "),t.collapsable?n("span",{staticClass:"arrow",class:t.open?"down":"right"}):t._e()]):n("p",{staticClass:"sidebar-heading",class:{open:t.open},on:{click:function(e){return t.$emit("toggle")}}},[n("span",[t._v(t._s(t.item.title))]),t._v(" "),t.collapsable?n("span",{staticClass:"arrow",class:t.open?"down":"right"}):t._e()]),t._v(" "),n("DropdownTransition",[t.open||!t.collapsable?n("SidebarLinks",{staticClass:"sidebar-group-items",attrs:{items:t.item.children,"sidebar-depth":t.item.sidebarDepth,"initial-open-group-index":t.item.initialOpenGroupIndex,depth:t.depth+1}}):t._e()],1)],1)}),[],!1,null,null,null).exports;n(352),n(65);function o(t,e,n,i,r){var a={props:{to:e,activeClass:"",exactActiveClass:""},class:{active:i,"sidebar-link":!0}};return r>2&&(a.style={"padding-left":r+"rem"}),t("RouterLink",a,n)}function u(t,e,n,r,a){var s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:1;return!e||s>a?null:t("ul",{class:"sidebar-sub-headers"},e.map((function(e){var l=Object(i.e)(r,n+"#"+e.slug);return t("li",{class:"sidebar-sub-header"},[o(t,n+"#"+e.slug,e.title,l,e.level-1),u(t,e.children,n,r,a,s+1)])})))}var l={functional:!0,props:["item","sidebarDepth"],render:function(t,e){var n=e.parent,r=n.$page,a=(n.$site,n.$route),s=n.$themeConfig,l=n.$themeLocaleConfig,c=e.props,h=c.item,p=c.sidebarDepth,f=Object(i.e)(a,h.path),d="auto"===h.type?f||h.children.some((function(t){return Object(i.e)(a,h.basePath+"#"+t.slug)})):f,g="external"===h.type?function(t,e,n){return t("a",{attrs:{href:e,target:"_blank",rel:"noopener noreferrer"},class:{"sidebar-link":!0}},[n,t("OutboundLink")])}(t,h.path,h.title||h.path):o(t,h.path,h.title||h.path,d),v=[r.frontmatter.sidebarDepth,p,l.sidebarDepth,s.sidebarDepth,1].find((function(t){return void 0!==t})),m=l.displayAllHeaders||s.displayAllHeaders;return"auto"===h.type?[g,u(t,h.children,h.basePath,a,v)]:(d||m)&&h.headers&&!i.d.test(h.path)?[g,u(t,Object(i.c)(h.headers),h.path,a,v)]:g}};n(353);function c(t,e){return"group"===e.type&&e.children.some((function(e){return"group"===e.type?c(t,e):"page"===e.type&&Object(i.e)(t,e.path)}))}var h={name:"SidebarLinks",components:{SidebarGroup:s,SidebarLink:Object(a.a)(l,void 0,void 0,!1,null,null,null).exports},props:["items","depth","sidebarDepth","initialOpenGroupIndex"],data:function(){return{openGroupIndex:this.initialOpenGroupIndex||0}},watch:{$route:function(){this.refreshIndex()}},created:function(){this.refreshIndex()},methods:{refreshIndex:function(){var t=function(t,e){for(var n=0;n-1&&(this.openGroupIndex=t)},toggleGroup:function(t){this.openGroupIndex=t===this.openGroupIndex?-1:t},isActive:function(t){return Object(i.e)(this.$route,t.regularPath)}}},p=Object(a.a)(h,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return t.items.length?n("ul",{staticClass:"sidebar-links"},t._l(t.items,(function(e,i){return n("li",{key:i},["group"===e.type?n("SidebarGroup",{attrs:{item:e,open:i===t.openGroupIndex,collapsable:e.collapsable||e.collapsible,depth:t.depth},on:{toggle:function(e){return t.toggleGroup(i)}}}):n("SidebarLink",{attrs:{"sidebar-depth":t.sidebarDepth,item:e}})],1)})),0):t._e()}),[],!1,null,null,null);e.default=p.exports},331:function(t,e,n){"use strict";var i={name:"DropdownTransition",methods:{setHeight:function(t){t.style.height=t.scrollHeight+"px"},unsetHeight:function(t){t.style.height=""}}},r=(n(343),n(42)),a=Object(r.a)(i,(function(){var t=this.$createElement;return(this._self._c||t)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.a=a.exports},332:function(t,e,n){"use strict";var i=n(0),r=n(333);i({target:"String",proto:!0,forced:n(334)("link")},{link:function(t){return r(this,"a","href",t)}})},333:function(t,e,n){var i=n(22),r=/"/g;t.exports=function(t,e,n,a){var s=String(i(t)),o="<"+e;return""!==n&&(o+=" "+n+'="'+String(a).replace(r,""")+'"'),o+">"+s+""}},334:function(t,e,n){var i=n(1);t.exports=function(t){return i((function(){var e=""[t]('"');return e!==e.toLowerCase()||e.split('"').length>3}))}},335:function(t,e,n){"use strict";n(309)},336:function(t,e,n){var i=n(0),r=n(337);i({global:!0,forced:parseInt!=r},{parseInt:r})},337:function(t,e,n){var i=n(3),r=n(310).trim,a=n(307),s=i.parseInt,o=/^[+-]?0[Xx]/,u=8!==s(a+"08")||22!==s(a+"0x16");t.exports=u?function(t,e){var n=r(String(t));return s(n,e>>>0||(o.test(n)?16:10))}:s},338:function(t,e,n){var i=n(1),r=n(307);t.exports=function(t){return i((function(){return!!r[t]()||"​…᠎"!="​…᠎"[t]()||r[t].name!==t}))}},339:function(t,e,n){var i=n(4),r=n(99);t.exports=function(t,e,n){var a,s;return r&&"function"==typeof(a=e.constructor)&&a!==n&&i(s=a.prototype)&&s!==n.prototype&&r(t,s),t}},340:function(t,e,n){"use strict";var i,r=n(0),a=n(24).f,s=n(13),o=n(101),u=n(22),l=n(102),c=n(19),h="".endsWith,p=Math.min,f=l("endsWith");r({target:"String",proto:!0,forced:!!(c||f||(i=a(String.prototype,"endsWith"),!i||i.writable))&&!f},{endsWith:function(t){var e=String(u(this));o(t);var n=arguments.length>1?arguments[1]:void 0,i=s(e.length),r=void 0===n?i:p(s(n),i),a=String(t);return h?h.call(e,a,r):e.slice(r-a.length,r)===a}})},341:function(t,e,n){"use strict";n(313)},342:function(t,e,n){"use strict";n(314)},343:function(t,e,n){"use strict";n(315)},344:function(t,e,n){"use strict";n(316)},345:function(t,e,n){"use strict";n(317)},346:function(t,e,n){"use strict";n(318)},347:function(t,e,n){"use strict";n(320)},348:function(t,e,n){var i=n(30),r=n(14),a=n(25);t.exports=function(t){return"string"==typeof t||!r(t)&&a(t)&&"[object String]"==i(t)}},349:function(t,e,n){"use strict";n(321)},350:function(t,e,n){"use strict";n(322)},351:function(t,e,n){"use strict";n(323)},352:function(t,e,n){"use strict";var i=n(0),r=n(29).find,a=n(97),s=n(17),o=!0,u=s("find");"find"in[]&&Array(1).find((function(){o=!1})),i({target:"Array",proto:!0,forced:o||!u},{find:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),a("find")},353:function(t,e,n){"use strict";n(324)},354:function(t,e,n){"use strict";n(325)},359:function(t,e,n){"use strict";n(166),n(93),n(332);var i=n(305),r={name:"NavLink",props:{item:{required:!0}},computed:{link:function(){return Object(i.b)(this.item.link)},exact:function(){var t=this;return this.$site.locales?Object.keys(this.$site.locales).some((function(e){return e===t.link})):"/"===this.link},isNonHttpURI:function(){return Object(i.g)(this.link)||Object(i.h)(this.link)},isBlankTarget:function(){return"_blank"===this.target},isInternal:function(){return!Object(i.f)(this.link)&&!this.isBlankTarget},target:function(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(i.f)(this.link)?"_blank":""},rel:function(){return this.isNonHttpURI||!1===this.item.rel?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":null}},methods:{focusoutAction:function(){this.$emit("focusout")}}},a=n(42),s=Object(a.a)(r,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return t.isInternal?n("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(e){return t.focusoutAction(e)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):n("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?n("OutboundLink"):t._e()],1)}),[],!1,null,null,null).exports,o={name:"Home",components:{NavLink:s},computed:{data:function(){return this.$page.frontmatter},actionLink:function(){return{link:this.data.actionLink,text:this.data.actionText}}}},u=(n(335),Object(a.a)(o,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("main",{staticClass:"home",attrs:{"aria-labelledby":null!==t.data.heroText?"main-title":null}},[n("header",{staticClass:"hero"},[t.data.heroImage?n("img",{attrs:{src:t.$withBase(t.data.heroImage),alt:t.data.heroAlt||"hero"}}):t._e(),t._v(" "),null!==t.data.heroText?n("h1",{attrs:{id:"main-title"}},[t._v("\n "+t._s(t.data.heroText||t.$title||"Hello")+"\n ")]):t._e(),t._v(" "),null!==t.data.tagline?n("p",{staticClass:"description"},[t._v("\n "+t._s(t.data.tagline||t.$description||"Welcome to your VuePress site")+"\n ")]):t._e(),t._v(" "),t.data.actionText&&t.data.actionLink?n("p",{staticClass:"action"},[n("NavLink",{staticClass:"action-button",attrs:{item:t.actionLink}})],1):t._e()]),t._v(" "),t.data.features&&t.data.features.length?n("div",{staticClass:"features"},t._l(t.data.features,(function(e,i){return n("div",{key:i,staticClass:"feature"},[n("h2",[t._v(t._s(e.title))]),t._v(" "),n("p",[t._v(t._s(e.details))])])})),0):t._e(),t._v(" "),n("Content",{staticClass:"theme-default-content custom"}),t._v(" "),t.data.footer?n("div",{staticClass:"footer"},[t._v("\n "+t._s(t.data.footer)+"\n ")]):t._e()],1)}),[],!1,null,null,null).exports),l=(n(336),n(23),n(174),n(167),n(95),n(43),n(176),n(306),n(311),n(172),n(65),n(312),n(96),n(340),n(66),n(308),n(178)),c=n.n(l),h=function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,i=c()(e,"title","");return c()(e,"frontmatter.tags")&&(i+=" ".concat(e.frontmatter.tags.join(" "))),n&&(i+=" ".concat(n)),p(t,i)},p=function(t,e){var n=function(t){return t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&")},i=new RegExp("[^\0-]"),r=t.split(/\s+/g).map((function(t){return t.trim()})).filter((function(t){return!!t}));if(i.test(t))return r.some((function(t){return e.toLowerCase().indexOf(t)>-1}));var a=t.endsWith(" ");return new RegExp(r.map((function(t,e){return r.length!==e+1||a?"(?=.*\\b".concat(n(t),"\\b)"):"(?=.*\\b".concat(n(t),")")})).join("")+".+","gi").test(e)},f={name:"SearchBox",data:function(){return{query:"",focused:!1,focusIndex:0,placeholder:void 0}},computed:{showSuggestions:function(){return this.focused&&this.suggestions&&this.suggestions.length},suggestions:function(){var t=this.query.trim().toLowerCase();if(t){for(var e=this.$site.pages,n=this.$site.themeConfig.searchMaxSuggestions||5,i=this.$localePath,r=[],a=0;a=n);a++){var s=e[a];if(this.getPageLocalePath(s)===i&&this.isSearchable(s))if(h(t,s))r.push(s);else if(s.headers)for(var o=0;o=n);o++){var u=s.headers[o];u.title&&h(t,s,u.title)&&r.push(Object.assign({},s,{path:s.path+"#"+u.slug,header:u}))}}return r}},alignRight:function(){return(this.$site.themeConfig.nav||[]).length+(this.$site.repo?1:0)<=2}},mounted:function(){this.placeholder=this.$site.themeConfig.searchPlaceholder||"",document.addEventListener("keydown",this.onHotkey)},beforeDestroy:function(){document.removeEventListener("keydown",this.onHotkey)},methods:{getPageLocalePath:function(t){for(var e in this.$site.locales||{})if("/"!==e&&0===t.path.indexOf(e))return e;return"/"},isSearchable:function(t){var e=null;return null===e||(e=Array.isArray(e)?e:new Array(e)).filter((function(e){return t.path.match(e)})).length>0},onHotkey:function(t){t.srcElement===document.body&&["s","/"].includes(t.key)&&(this.$refs.input.focus(),t.preventDefault())},onUp:function(){this.showSuggestions&&(this.focusIndex>0?this.focusIndex--:this.focusIndex=this.suggestions.length-1)},onDown:function(){this.showSuggestions&&(this.focusIndex "+t._s(e.header.title))]):t._e()])])})),0):t._e()])}),[],!1,null,null,null).exports),g=(n(342),Object(a.a)({},(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"sidebar-button",on:{click:function(e){return t.$emit("toggle-sidebar")}}},[n("svg",{staticClass:"icon",attrs:{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",role:"img",viewBox:"0 0 448 512"}},[n("path",{attrs:{fill:"currentColor",d:"M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"}})])])}),[],!1,null,null,null).exports),v=(n(177),n(40)),m=n(331),b=n(179),k=n.n(b),_={name:"DropdownLink",components:{NavLink:s,DropdownTransition:m.a},props:{item:{required:!0}},data:function(){return{open:!1}},computed:{dropdownAriaLabel:function(){return this.item.ariaLabel||this.item.text}},watch:{$route:function(){this.open=!1}},methods:{setOpen:function(t){this.open=t},isLastItemOfArray:function(t,e){return k()(e)===t},handleDropdown:function(){0===event.detail&&this.setOpen(!this.open)}}},x=(n(344),{name:"NavLinks",components:{NavLink:s,DropdownLink:Object(a.a)(_,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"dropdown-wrapper",class:{open:t.open}},[n("button",{staticClass:"dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:t.handleDropdown}},[n("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),n("span",{staticClass:"arrow down"})]),t._v(" "),n("button",{staticClass:"mobile-dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:function(e){return t.setOpen(!t.open)}}},[n("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),n("span",{staticClass:"arrow",class:t.open?"down":"right"})]),t._v(" "),n("DropdownTransition",[n("ul",{directives:[{name:"show",rawName:"v-show",value:t.open,expression:"open"}],staticClass:"nav-dropdown"},t._l(t.item.items,(function(e,i){return n("li",{key:e.link||i,staticClass:"dropdown-item"},["links"===e.type?n("h4",[t._v("\n "+t._s(e.text)+"\n ")]):t._e(),t._v(" "),"links"===e.type?n("ul",{staticClass:"dropdown-subitem-wrapper"},t._l(e.items,(function(i){return n("li",{key:i.link,staticClass:"dropdown-subitem"},[n("NavLink",{attrs:{item:i},on:{focusout:function(n){t.isLastItemOfArray(i,e.items)&&t.isLastItemOfArray(e,t.item.items)&&t.setOpen(!1)}}})],1)})),0):n("NavLink",{attrs:{item:e},on:{focusout:function(n){t.isLastItemOfArray(e,t.item.items)&&t.setOpen(!1)}}})],1)})),0)])],1)}),[],!1,null,null,null).exports},computed:{userNav:function(){return this.$themeLocaleConfig.nav||this.$site.themeConfig.nav||[]},nav:function(){var t=this,e=this.$site.locales;if(e&&Object.keys(e).length>1){var n=this.$page.path,i=this.$router.options.routes,r=this.$site.themeConfig.locales||{},a={text:this.$themeLocaleConfig.selectText||"Languages",ariaLabel:this.$themeLocaleConfig.ariaLabel||"Select language",items:Object.keys(e).map((function(a){var s,o=e[a],u=r[a]&&r[a].label||o.lang;return o.lang===t.$lang?s=n:(s=n.replace(t.$localeConfig.path,a),i.some((function(t){return t.path===s}))||(s=a)),{text:u,link:s}}))};return[].concat(Object(v.a)(this.userNav),[a])}return this.userNav},userLinks:function(){return(this.nav||[]).map((function(t){return Object.assign(Object(i.j)(t),{items:(t.items||[]).map(i.j)})}))},repoLink:function(){var t=this.$site.themeConfig.repo;return t?/^https?:/.test(t)?t:"https://github.com/".concat(t):null},repoLabel:function(){if(this.repoLink){if(this.$site.themeConfig.repoLabel)return this.$site.themeConfig.repoLabel;for(var t=this.repoLink.match(/^https?:\/\/[^/]+/)[0],e=["GitHub","GitLab","Bitbucket"],n=0;nMath.abs(n)&&Math.abs(e)>40&&(e>0&&this.touchStart.x<=80?this.toggleSidebar(!0):this.toggleSidebar(!1))}}}),G=Object(a.a)(W,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"theme-container",class:t.pageClasses,on:{touchstart:t.onTouchStart,touchend:t.onTouchEnd}},[t.shouldShowNavbar?n("Navbar",{on:{"toggle-sidebar":t.toggleSidebar}}):t._e(),t._v(" "),n("div",{staticClass:"sidebar-mask",on:{click:function(e){return t.toggleSidebar(!1)}}}),t._v(" "),n("Sidebar",{attrs:{items:t.sidebarItems},on:{"toggle-sidebar":t.toggleSidebar},scopedSlots:t._u([{key:"top",fn:function(){return[t._t("sidebar-top")]},proxy:!0},{key:"bottom",fn:function(){return[t._t("sidebar-bottom")]},proxy:!0}],null,!0)}),t._v(" "),t.$page.frontmatter.home?n("Home"):n("Page",{attrs:{"sidebar-items":t.sidebarItems},scopedSlots:t._u([{key:"top",fn:function(){return[t._t("page-top")]},proxy:!0},{key:"bottom",fn:function(){return[t._t("page-bottom")]},proxy:!0}],null,!0)})],1)}),[],!1,null,null,null);e.a=G.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/20.5bcacf34.js b/docs/assets/js/20.5bcacf34.js deleted file mode 100644 index f80cd6224..000000000 --- a/docs/assets/js/20.5bcacf34.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[20],{376:function(t,a,e){"use strict";e.r(a);var s=e(42),n=Object(s.a)({},(function(){var t=this,a=t.$createElement,e=t._self._c||a;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"exemptions"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#exemptions"}},[t._v("#")]),t._v(" Exemptions")]),t._v(" "),e("p",[t._v("Sometimes a workload really does need to do things that Polaris considers insecure. For instance,\nmany of the "),e("code",[t._v("kube-system")]),t._v(" workloads need to run as root, or need access to the host network. In these\ncases, we can add "),e("strong",[t._v("exemptions")]),t._v(" to allow the workload to pass Polaris checks.")]),t._v(" "),e("p",[t._v("Exemptions can be added two ways: by annotating a controller, or editing the Polaris config.")]),t._v(" "),e("h2",{attrs:{id:"annotations"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#annotations"}},[t._v("#")]),t._v(" Annotations")]),t._v(" "),e("p",[t._v("To exempt a controller from all checks via annotations, use the annotation "),e("code",[t._v("polaris.fairwinds.com/exempt=true")]),t._v(", e.g.")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("kubectl annotate deployment my-deployment polaris.fairwinds.com/exempt=true\n")])])]),e("p",[t._v("To exempt a controller from a particular check via annotations, use an annotation in the form of "),e("code",[t._v("polaris.fairwinds.com/-exempt=true")]),t._v(", e.g.")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("kubectl annotate deployment my-deployment polaris.fairwinds.com/cpuRequestsMissing-exempt=true\n")])])]),e("h2",{attrs:{id:"config"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#config"}},[t._v("#")]),t._v(" Config")]),t._v(" "),e("p",[t._v("To exempt a controller via the config, you have to specify a namespace (optional), a list of controller names and a list of rules, e.g.")]),t._v(" "),e("div",{staticClass:"language-yaml extra-class"},[e("pre",{pre:!0,attrs:{class:"language-yaml"}},[e("code",[e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("exemptions")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# exemption valid for kube-system namespace")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("-")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("namespace")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" kube"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("-")]),t._v("system\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("controllerNames")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("-")]),t._v(" dns"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("-")]),t._v("controller\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("rules")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("-")]),t._v(" hostNetworkSet\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# exemption valid in all namespaces")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("-")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("controllerNames")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("-")]),t._v(" dns"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("-")]),t._v("controller\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("rules")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("-")]),t._v(" hostNetworkSet\n")])])])])}),[],!1,null,null,null);a.default=n.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/21.2f58615f.js b/docs/assets/js/21.2f58615f.js deleted file mode 100644 index 876457479..000000000 --- a/docs/assets/js/21.2f58615f.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[21],{364:function(a,s,t){"use strict";t.r(s);var e=t(42),r=Object(e.a)({},(function(){var a=this,s=a.$createElement,t=a._self._c||s;return t("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[t("h1",{attrs:{id:"dashboard"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#dashboard"}},[a._v("#")]),a._v(" Dashboard")]),a._v(" "),t("p",[a._v("The Polaris dashboard can be installed on a cluster using kubectl or Helm. It\ncan also be run locally, connecting to your cluster using the credentials stored in your "),t("code",[a._v("KUBECONFIG")]),a._v(".")]),a._v(" "),t("p",[a._v("The dashboard is a good way to understand what workloads inside your cluster or Infrastructure as Code\ndon't conform to best practices.")]),a._v(" "),t("h2",{attrs:{id:"installation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[a._v("#")]),a._v(" Installation")]),a._v(" "),t("h3",{attrs:{id:"kubectl"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#kubectl"}},[a._v("#")]),a._v(" kubectl")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("kubectl apply -f https://github.com/fairwindsops/polaris/releases/latest/download/dashboard.yaml\nkubectl port-forward --namespace polaris svc/polaris-dashboard "),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("8080")]),a._v(":80\n")])])]),t("h3",{attrs:{id:"helm"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#helm"}},[a._v("#")]),a._v(" Helm")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("helm repo "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("add")]),a._v(" fairwinds-stable https://charts.fairwinds.com/stable\nhelm upgrade --install polaris fairwinds-stable/polaris --namespace polaris\nkubectl port-forward --namespace polaris svc/polaris-dashboard "),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("8080")]),a._v(":80\n")])])]),t("h3",{attrs:{id:"local-binary"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#local-binary"}},[a._v("#")]),a._v(" Local Binary")]),a._v(" "),t("p",[a._v("You'll need a valid "),t("code",[a._v("KUBECONFIG")]),a._v(" set up for the dashboard to connect to your cluster.")]),a._v(" "),t("p",[a._v("Binary releases can be dowloaded from the "),t("a",{attrs:{href:"https://github.com/fairwindsops/polaris/releases",target:"_blank",rel:"noopener noreferrer"}},[a._v("releases page"),t("OutboundLink")],1),a._v("\nor can be installed with "),t("a",{attrs:{href:"https://brew.sh/",target:"_blank",rel:"noopener noreferrer"}},[a._v("Homebrew"),t("OutboundLink")],1),a._v(":")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("brew tap reactiveops/tap\nbrew "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" reactiveops/tap/polaris\npolaris dashboard --port "),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("8080")]),a._v("\n")])])]),t("p",[a._v("You can also point the dashboard to the local filesystem, instead of a live cluster:")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("polaris dashboard --port "),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("8080")]),a._v(" --audit-path"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("./deploy/\n")])])]),t("h3",{attrs:{id:"local-docker-container"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#local-docker-container"}},[a._v("#")]),a._v(" Local Docker container")]),a._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[a._v("docker run -d -p8080:8080 -v ~/.kube/config:/opt/app/config:ro quay.io/fairwinds/polaris:1.2 polaris dashboard --kubeconfig /opt/app/config\n")])])]),t("h2",{attrs:{id:"using-the-dashboard"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#using-the-dashboard"}},[a._v("#")]),a._v(" Using the Dashboard")]),a._v(" "),t("p",[a._v("The Polaris dashboard is a way to get a simple visual overview of the current state of your Kubernetes workloads as well as a roadmap for what can be improved. The dashboard provides a cluster wide overview as well as breaking out results by category, namespace, and workload.")]),a._v(" "),t("p",{attrs:{align:"center"}},[t("img",{attrs:{src:"/img/dashboard-screenshot.png",alt:"Polaris Dashboard",width:"550"}})]),a._v(" "),t("p",[a._v("Our default standards in Polaris are rather high, so don’t be surprised if your score is lower than you might expect. A key goal for Polaris was to set a high standard and aim for great configuration by default. If the defaults we’ve included are too strict, it’s easy to adjust the configuration as part of the deployment configuration to better suit your workloads.")])])}),[],!1,null,null,null);s.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/22.90ebc6b9.js b/docs/assets/js/22.90ebc6b9.js deleted file mode 100644 index 2ff600973..000000000 --- a/docs/assets/js/22.90ebc6b9.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{372:function(e,a,s){"use strict";s.r(a);var t=s(42),n=Object(t.a)({},(function(){var e=this,a=e.$createElement,s=e._self._c||a;return s("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[s("h1",{attrs:{id:"infrastructure-as-code"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#infrastructure-as-code"}},[e._v("#")]),e._v(" Infrastructure as Code")]),e._v(" "),s("p",[e._v("Polaris can be used on the command line to audit local Kubernetes manifests stored in YAML files.\nThis is particularly helpful for running Polaris against your infrastructure-as-code as part of a\nCI/CD pipeline. Use the available "),s("a",{attrs:{href:"#running-in-a-ci-pipeline"}},[e._v("command line flags")]),e._v("\nto cause CI/CD to fail if your Polaris score drops below a certain threshold, or if any danger-level issues arise.")]),e._v(" "),s("h2",{attrs:{id:"install-the-cli"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#install-the-cli"}},[e._v("#")]),e._v(" Install the CLI")]),e._v(" "),s("p",[e._v("To run Polaris against your YAML manifests, e.g. as part of a Continuous Integration process,\nyou'll need to install the CLI.")]),e._v(" "),s("p",[e._v("Binary releases can be downloaded from the "),s("a",{attrs:{href:"https://github.com/fairwindsops/polaris/releases",target:"_blank",rel:"noopener noreferrer"}},[e._v("releases page"),s("OutboundLink")],1),e._v("\nor can be installed with "),s("a",{attrs:{href:"https://brew.sh/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Homebrew"),s("OutboundLink")],1),e._v(":")]),e._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[e._v("brew tap FairwindsOps/tap\nbrew "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" FairwindsOps/tap/polaris\npolaris version\n")])])]),s("h2",{attrs:{id:"running-in-a-ci-pipeline"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#running-in-a-ci-pipeline"}},[e._v("#")]),e._v(" Running in a CI pipeline")]),e._v(" "),s("p",[e._v("You can tell the CLI to set an exit code if it detects certain issues with your\nYAML files.\nFor example, to fail if polaris detects "),s("em",[e._v("any")]),e._v(" danger-level issues, or if the score drops below 90%:")]),e._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[e._v("polaris audit --audit-path ./deploy/ "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n --set-exit-code-on-danger "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n --set-exit-code-below-score "),s("span",{pre:!0,attrs:{class:"token number"}},[e._v("90")]),e._v("\n")])])])])}),[],!1,null,null,null);a.default=n.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/3.0cb25b42.js b/docs/assets/js/3.0cb25b42.js deleted file mode 100644 index ed0b6f492..000000000 --- a/docs/assets/js/3.0cb25b42.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[3],{326:function(t,a,s){},355:function(t,a,s){"use strict";s(326)},362:function(t,a,s){"use strict";s.r(a);var n={name:"Layout",components:{ParentLayout:s(359).a}},r=(s(355),s(42)),i=Object(r.a)(n,(function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("ParentLayout",{scopedSlots:t._u([{key:"page-bottom",fn:function(){return[s("div",{staticClass:"custom-footer"},[s("div",{staticClass:"left-footer"},[s("a",{attrs:{href:"https://fairwinds.com",target:"_blank"}},[t._v("Learn more about Fairwinds")]),t._v(" "),s("a",{attrs:{href:"https://fairwinds.com/insights",target:"_blank"}},[t._v("Try Fairwinds Insights")])]),t._v(" "),s("div",{staticClass:"right-footer"},[s("a",{attrs:{href:"https://www.fairwinds.com/privacy-policy",target:"_blank"}},[t._v("Privacy Policy")])])])]},proxy:!0}])})}),[],!1,null,null,null);a.default=i.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/4.be9896b6.js b/docs/assets/js/4.be9896b6.js deleted file mode 100644 index 842eeed18..000000000 --- a/docs/assets/js/4.be9896b6.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{327:function(t,e,n){},356:function(t,e,n){"use strict";n(327)},374:function(t,e,n){"use strict";n.r(e);var i={functional:!0,props:{type:{type:String,default:"tip"},text:String,vertical:{type:String,default:"top"}},render:function(t,e){var n=e.props,i=e.slots;return t("span",{class:["badge",n.type],style:{verticalAlign:n.vertical}},n.text||i().default)}},r=(n(356),n(42)),p=Object(r.a)(i,void 0,void 0,!1,null,"15b7b770",null);e.default=p.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/5.665b3e6a.js b/docs/assets/js/5.665b3e6a.js deleted file mode 100644 index 859c9349c..000000000 --- a/docs/assets/js/5.665b3e6a.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{328:function(e,t,c){},357:function(e,t,c){"use strict";c(328)},360:function(e,t,c){"use strict";c.r(t);var i={name:"CodeBlock",props:{title:{type:String,required:!0},active:{type:Boolean,default:!1}}},n=(c(357),c(42)),s=Object(n.a)(i,(function(){var e=this.$createElement;return(this._self._c||e)("div",{staticClass:"theme-code-block",class:{"theme-code-block__active":this.active}},[this._t("default")],2)}),[],!1,null,"6d04095e",null);t.default=s.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/6.a5e340ed.js b/docs/assets/js/6.a5e340ed.js deleted file mode 100644 index c96208305..000000000 --- a/docs/assets/js/6.a5e340ed.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[6],{329:function(e,t,o){},358:function(e,t,o){"use strict";o(329)},361:function(e,t,o){"use strict";o.r(t);o(23),o(92),o(65),o(94);var a={name:"CodeGroup",data:function(){return{codeTabs:[],activeCodeTabIndex:-1}},watch:{activeCodeTabIndex:function(e){this.codeTabs.forEach((function(e){e.elm.classList.remove("theme-code-block__active")})),this.codeTabs[e].elm.classList.add("theme-code-block__active")}},mounted:function(){var e=this;this.codeTabs=(this.$slots.default||[]).filter((function(e){return Boolean(e.componentOptions)})).map((function(t,o){return""===t.componentOptions.propsData.active&&(e.activeCodeTabIndex=o),{title:t.componentOptions.propsData.title,elm:t.elm}})),-1===this.activeCodeTabIndex&&this.codeTabs.length>0&&(this.activeCodeTabIndex=0)},methods:{changeCodeTab:function(e){this.activeCodeTabIndex=e}}},c=(o(358),o(42)),n=Object(c.a)(a,(function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("div",{staticClass:"theme-code-group"},[o("div",{staticClass:"theme-code-group__nav"},[o("ul",{staticClass:"theme-code-group__ul"},e._l(e.codeTabs,(function(t,a){return o("li",{key:t.title,staticClass:"theme-code-group__li"},[o("button",{staticClass:"theme-code-group__nav-tab",class:{"theme-code-group__nav-tab-active":a===e.activeCodeTabIndex},on:{click:function(t){return e.changeCodeTab(a)}}},[e._v("\n "+e._s(t.title)+"\n ")])])})),0)]),e._v(" "),e._t("default"),e._v(" "),e.codeTabs.length<1?o("pre",{staticClass:"pre-blank"},[e._v("// Make sure to add code blocks to your code group")]):e._e()],2)}),[],!1,null,"32c2d7ed",null);t.default=n.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/7.dbd47d64.js b/docs/assets/js/7.dbd47d64.js deleted file mode 100644 index 189fd0295..000000000 --- a/docs/assets/js/7.dbd47d64.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[7],{363:function(t,e,s){"use strict";s.r(e);var n=["There's nothing here.","How did we get here?","That's a Four-Oh-Four.","Looks like we've got some broken links."],o={methods:{getMsg:function(){return n[Math.floor(Math.random()*n.length)]}}},i=s(42),h=Object(i.a)(o,(function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"theme-container"},[e("div",{staticClass:"theme-default-content"},[e("h1",[this._v("404")]),this._v(" "),e("blockquote",[this._v(this._s(this.getMsg()))]),this._v(" "),e("RouterLink",{attrs:{to:"/"}},[this._v("\n Take me home.\n ")])],1)])}),[],!1,null,null,null);e.default=h.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/8.5a82b7c2.js b/docs/assets/js/8.5a82b7c2.js deleted file mode 100644 index 18e4a65f3..000000000 --- a/docs/assets/js/8.5a82b7c2.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[8],{378:function(r,t,e){"use strict";e.r(t);var o=e(42),a=Object(o.a)({},(function(){var r=this,t=r.$createElement,e=r._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":r.$parent.slotKey}},[e("div",{staticClass:"no-border",attrs:{align:"center"}},[e("img",{attrs:{src:"/img/polaris-logo.png",alt:"Polaris Logo"}}),r._v(" "),e("br"),r._v(" "),e("h3",[r._v("Best Practices for Kubernetes Workload Configuration")]),r._v(" "),e("a",{attrs:{href:"https://github.com/FairwindsOps/polaris"}},[e("img",{attrs:{src:"https://img.shields.io/static/v1.svg?label=Version&message=1.2.0&color=239922"}})]),r._v(" "),e("a",{attrs:{href:"https://goreportcard.com/report/github.com/FairwindsOps/polaris"}},[e("img",{attrs:{src:"https://goreportcard.com/badge/github.com/FairwindsOps/polaris"}})]),r._v(" "),e("a",{attrs:{href:"https://circleci.com/gh/FairwindsOps/polaris.svg"}},[e("img",{attrs:{src:"https://circleci.com/gh/FairwindsOps/polaris.svg?style=svg"}})])]),r._v(" "),e("p",[r._v("Fairwinds' Polaris keeps your clusters sailing smoothly. It runs a variety of checks to ensure that\nKubernetes pods and controllers are configured using best practices, helping you avoid\nproblems in the future. Polaris can be run in a few different modes:")]),r._v(" "),e("p",[r._v("Polaris can be run in three different modes:")]),r._v(" "),e("ul",[e("li",[r._v("As a "),e("a",{attrs:{href:"/dashboard"}},[r._v("dashboard")]),r._v(", so you can audit what's running inside your cluster.")]),r._v(" "),e("li",[r._v("As an "),e("a",{attrs:{href:"/admission-controller"}},[r._v("admission controller")]),r._v(", so you can automatically reject workloads that don't adhere to your organization's policies.")]),r._v(" "),e("li",[r._v("As a "),e("a",{attrs:{href:"/infrastructure-as-code"}},[r._v("command-line tool")]),r._v(", so you can test local YAML files, e.g. as part of a CI/CD process.")])]),r._v(" "),e("p",[e("strong",[r._v("Want to learn more?")]),r._v(" Reach out on "),e("a",{attrs:{href:"https://fairwindscommunity.slack.com/messages/polaris",target:"_blank",rel:"noopener noreferrer"}},[r._v("the Slack channel"),e("OutboundLink")],1),r._v(" ("),e("a",{attrs:{href:"https://join.slack.com/t/fairwindscommunity/shared_invite/zt-e3c6vj4l-3lIH6dvKqzWII5fSSFDi1g",target:"_blank",rel:"noopener noreferrer"}},[r._v("request invite"),e("OutboundLink")],1),r._v("), send an email to "),e("code",[r._v("opensource@fairwinds.com")]),r._v(", or join us for "),e("a",{attrs:{href:"https://fairwindscommunity.slack.com/messages/office-hours",target:"_blank",rel:"noopener noreferrer"}},[r._v("office hours on Zoom"),e("OutboundLink")],1)]),r._v(" "),e("h2",{attrs:{id:"integration-with-fairwinds-insights"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#integration-with-fairwinds-insights"}},[r._v("#")]),r._v(" Integration with Fairwinds Insights")]),r._v(" "),e("p",[e("a",{attrs:{href:"https://www.fairwinds.com/insights?utm_campaign=Hosted%20Polaris%20&utm_source=polaris&utm_term=polaris&utm_content=polaris",target:"_blank",rel:"noopener noreferrer"}},[r._v("Fairwinds Insights"),e("OutboundLink")],1),r._v("\nis a platform for auditing Kubernetes clusters and enforcing policy. If you'd like to:")]),r._v(" "),e("ul",[e("li",[r._v("manage Polaris across a fleet of clusters")]),r._v(" "),e("li",[r._v("track findings over time")]),r._v(" "),e("li",[r._v("send results to services like Slack and Datadog")]),r._v(" "),e("li",[r._v("add additional checks from tools like\n"),e("a",{attrs:{href:"https://github.com/aquasecurity/trivy",target:"_blank",rel:"noopener noreferrer"}},[r._v("Trivy"),e("OutboundLink")],1),r._v(",\n"),e("a",{attrs:{href:"https://github.com/FairwindsOps/goldilocks/",target:"_blank",rel:"noopener noreferrer"}},[r._v("Goldilocks"),e("OutboundLink")],1),r._v(", and\n"),e("a",{attrs:{href:"https://www.openpolicyagent.org",target:"_blank",rel:"noopener noreferrer"}},[r._v("OPA"),e("OutboundLink")],1)])]),r._v(" "),e("p",[r._v("you can sign up for a "),e("a",{attrs:{href:"https://insights.fairwinds.com?source=polaris",target:"_blank",rel:"noopener noreferrer"}},[r._v("free account here"),e("OutboundLink")],1),r._v(".")]),r._v(" "),e("h2",{attrs:{id:"contributing"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#contributing"}},[r._v("#")]),r._v(" Contributing")]),r._v(" "),e("p",[r._v("PRs welcome! Check out the "),e("RouterLink",{attrs:{to:"/contributing/"}},[r._v("Contributing Guidelines")]),r._v(" and "),e("a",{attrs:{href:"/code-of-conduct"}},[r._v("Code of Conduct")]),r._v(" for more information.")],1),r._v(" "),e("h2",{attrs:{id:"further-information"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#further-information"}},[r._v("#")]),r._v(" Further Information")]),r._v(" "),e("p",[r._v("A history of changes to this project can be viewed in the "),e("RouterLink",{attrs:{to:"/changelog/"}},[r._v("Changelog")])],1),r._v(" "),e("p",[r._v("If you'd like to learn more about Polaris, or if you'd like to speak with\na Kubernetes expert, you can contact "),e("code",[r._v("info@fairwinds.com")]),r._v(" or "),e("a",{attrs:{href:"https://fairwinds.com",target:"_blank",rel:"noopener noreferrer"}},[r._v("visit our website"),e("OutboundLink")],1)]),r._v(" "),e("hr"),r._v(" "),e("p",{attrs:{align:"center"}},[e("img",{attrs:{src:"/img/dashboard-screenshot.png",alt:"Polaris Dashboard",width:"550"}})])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/9.4f55b6b3.js b/docs/assets/js/9.4f55b6b3.js deleted file mode 100644 index 08ad9be3c..000000000 --- a/docs/assets/js/9.4f55b6b3.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[9],{377:function(a,t,e){"use strict";e.r(t);var s=e(42),o=Object(s.a)({},(function(){var a=this,t=a.$createElement,e=a._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[e("h1",{attrs:{id:"admission-controller"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#admission-controller"}},[a._v("#")]),a._v(" Admission Controller")]),a._v(" "),e("p",[a._v("Polaris can be run as an admission controller that acts as a validating webhook.\nThis accepts the same configuration as the dashboard, and can run the same validations.")]),a._v(" "),e("p",[a._v("The webhook will reject any workloads that trigger a danger-level check.\nThis is indicative of the greater goal of Polaris, not just to encourage better\nconfiguration through dashboard visibility, but to actually enforce it with this webhook.")]),a._v(" "),e("p",[a._v("Note that Polaris will not alter your workloads, only block workloads that don't conform to the configured policies.")]),a._v(" "),e("h2",{attrs:{id:"installation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[a._v("#")]),a._v(" Installation")]),a._v(" "),e("h3",{attrs:{id:"kubectl"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#kubectl"}},[a._v("#")]),a._v(" kubectl")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("kubectl apply -f https://github.com/fairwindsops/polaris/releases/latest/download/webhook.yaml\n")])])]),e("h3",{attrs:{id:"helm"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#helm"}},[a._v("#")]),a._v(" Helm")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("helm repo "),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("add")]),a._v(" fairwindsops-stable https://charts.fairwindsops.com/stable\nhelm upgrade --install polaris fairwindsops-stable/polaris --namespace polaris "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n --set webhook.enable"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("true --set dashboard.enable"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("false\n")])])]),e("h2",{attrs:{id:"workload-types"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#workload-types"}},[a._v("#")]),a._v(" Workload Types")]),a._v(" "),e("p",[a._v("The webhook comes with built-in support for a handful of known controller types,\nsuch as Deployments, Jobs, and DaemonSets. To add new controller types,\nyou can set "),e("code",[a._v("webhook.rules")]),a._v(" in the\n"),e("a",{attrs:{href:"https://github.com/FairwindsOps/charts/tree/master/stable/polaris",target:"_blank",rel:"noopener noreferrer"}},[a._v("Helm chart"),e("OutboundLink")],1)]),a._v(" "),e("h2",{attrs:{id:"warnings"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#warnings"}},[a._v("#")]),a._v(" Warnings")]),a._v(" "),e("p",[a._v("Unfortunately we have not found a way to display warnings as part of "),e("code",[a._v("kubectl")]),a._v("\noutput unless we are rejecting a workload altogether.")]),a._v(" "),e("p",[a._v("This means that any checks with a severity of "),e("code",[a._v("warning")]),a._v(" will still pass webhook validation,\nand the only evidence of that warning will either be in the Polaris dashboard or the\nPolaris webhook logs. This will change in a future version of Kubernetes.")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/app.65b94829.js b/docs/assets/js/app.65b94829.js deleted file mode 100644 index ef9baba41..000000000 --- a/docs/assets/js/app.65b94829.js +++ /dev/null @@ -1,13 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[0],[]]);!function(t){function e(e){for(var r,a,c=e[0],u=e[1],s=e[2],l=0,p=[];l0?o(r(t),9007199254740991):0}},function(t,e){var n=Array.isArray;t.exports=n},function(t,e,n){var r=n(31),o=n(22);t.exports=function(t){return r(o(t))}},function(t,e,n){var r=n(140),o="object"==typeof self&&self&&self.Object===Object&&self,i=r||o||Function("return this")();t.exports=i},function(t,e,n){var r=n(6),o=n(1),i=n(7),a=Object.defineProperty,c={},u=function(t){throw t};t.exports=function(t,e){if(i(c,t))return c[t];e||(e={});var n=[][t],s=!!i(e,"ACCESSORS")&&e.ACCESSORS,f=i(e,0)?e[0]:u,l=i(e,1)?e[1]:void 0;return c[t]=!!n&&!o((function(){if(s&&!r)return!0;var t={length:-1};s?a(t,1,{enumerable:!0,get:u}):t[1]=1,n.call(t,f,l)}))}},function(t,e,n){var r=n(110),o=n(3),i=function(t){return"function"==typeof t?t:void 0};t.exports=function(t,e){return arguments.length<2?i(r[t])||i(o[t]):r[t]&&r[t][e]||o[t]&&o[t][e]}},function(t,e){t.exports=!1},function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(String(t)+" is not a function");return t}},function(t,e,n){var r=n(223),o=n(226);t.exports=function(t,e){var n=o(t,e);return r(n)?n:void 0}},function(t,e){t.exports=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t}},function(t,e,n){"use strict";var r=n(0),o=n(29).filter,i=n(53),a=n(17),c=i("filter"),u=a("filter");r({target:"Array",proto:!0,forced:!c||!u},{filter:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}})},function(t,e,n){var r=n(6),o=n(77),i=n(32),a=n(15),c=n(44),u=n(7),s=n(105),f=Object.getOwnPropertyDescriptor;e.f=r?f:function(t,e){if(t=a(t),e=c(e,!0),s)try{return f(t,e)}catch(t){}if(u(t,e))return i(!o.f.call(t,e),t[e])}},function(t,e){t.exports=function(t){return null!=t&&"object"==typeof t}},function(t,e){var n={}.toString;t.exports=function(t){return n.call(t).slice(8,-1)}},function(t,e,n){"use strict";var r=n(128).charAt,o=n(28),i=n(111),a=o.set,c=o.getterFor("String Iterator");i(String,"String",(function(t){a(this,{type:"String Iterator",string:String(t),index:0})}),(function(){var t,e=c(this),n=e.string,o=e.index;return o>=n.length?{value:void 0,done:!0}:(t=r(n,o),e.index+=t.length,{value:t,done:!1})}))},function(t,e,n){var r,o,i,a=n(182),c=n(3),u=n(4),s=n(11),f=n(7),l=n(70),p=n(48),h=n(34),d=c.WeakMap;if(a){var v=l.state||(l.state=new d),y=v.get,m=v.has,g=v.set;r=function(t,e){return e.facade=t,g.call(v,t,e),e},o=function(t){return y.call(v,t)||{}},i=function(t){return m.call(v,t)}}else{var b=p("state");h[b]=!0,r=function(t,e){return e.facade=t,s(t,b,e),e},o=function(t){return f(t,b)?t[b]:{}},i=function(t){return f(t,b)}}t.exports={set:r,get:o,has:i,enforce:function(t){return i(t)?o(t):r(t,{})},getterFor:function(t){return function(e){var n;if(!u(e)||(n=o(e)).type!==t)throw TypeError("Incompatible receiver, "+t+" required");return n}}}},function(t,e,n){var r=n(50),o=n(31),i=n(12),a=n(13),c=n(127),u=[].push,s=function(t){var e=1==t,n=2==t,s=3==t,f=4==t,l=6==t,p=5==t||l;return function(h,d,v,y){for(var m,g,b=i(h),_=o(b),x=r(d,v,3),w=a(_.length),O=0,S=y||c,k=e?S(h,w):n?S(h,0):void 0;w>O;O++)if((p||O in _)&&(g=x(m=_[O],O,b),t))if(e)k[O]=g;else if(g)switch(t){case 3:return!0;case 5:return m;case 6:return O;case 2:u.call(k,m)}else if(f)return!1;return l?-1:s||f?f:k}};t.exports={forEach:s(0),map:s(1),filter:s(2),some:s(3),every:s(4),find:s(5),findIndex:s(6)}},function(t,e,n){var r=n(39),o=n(208),i=n(209),a=r?r.toStringTag:void 0;t.exports=function(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":a&&a in Object(t)?o(t):i(t)}},function(t,e,n){var r=n(1),o=n(26),i="".split;t.exports=r((function(){return!Object("z").propertyIsEnumerable(0)}))?function(t){return"String"==o(t)?i.call(t,""):Object(t)}:Object},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e,n){var r,o=n(5),i=n(181),a=n(75),c=n(34),u=n(109),s=n(72),f=n(48),l=f("IE_PROTO"),p=function(){},h=function(t){return" - - - - - - - -

# Upcoming

  • Standardize categories of checks into Security, Reliability, and Efficiency

# 1.2.1

  • Update date on dashboard footer

# 1.2.0

  • Add ability to audit a single workload
  • Enable pullPolicyAlways by default
  • Fix for finding parent resources

# 1.1.1

  • Show controller checks on dashboard
  • Fix for orphaned pods w/ controller checks

# 1.1.0

  • Add namespace filter in UI
  • Add priorityClass check
  • Support reading from STDIN
  • Ensure severity is set for all custom checks
  • Support audit files which use \r or \r\n as newline character
  • Add option to exempt an entire controller from checks via config file
  • Fixed case where parent resources trigger error
  • Fixed UI zero-state

# 1.0.3

  • Fixed case where parent resources trigger error
  • Fixed dashboard link when --base-path is set

# 1.0.2

  • Fixed case where custom CRDs are not covered by RBAC

# 1.0.1

  • Added ARM binaries to releases

# 1.0.0

# New Features

  • Added support for custom checks using JSON Schema
  • Added support for arbitrary controllers, rather than a pre-configured set -
    • removed support for controllers_to_scan in config
  • Added the ability to exempt a particular controller from a particular check.
  • Docker image now includes the default config

# Breaking Changes

  • Breaking changes in both input and output formats. See Examples (opens new window) for examples of the new formats. -
    • removed config-level configuration for checks like max/min memory settings
    • changed severity error to danger
  • Breaking changes to the CLI -
    • CLI flag --set-exit-code-on-error is now --set-exit-code-on-danger
    • Flags --version, --dashboard, --webhook, and --audit are now arguments
    • Port flags are now just --port

# 0.6.0

  • Fixed webhook support in Kubernetes 1.16 -
    • this also removes support for 1.8
  • Added support for exemptions via controller annotations

# 0.5.2

  • Fixed missing success messages for resource requests/limits

# 0.5.1

  • Added a few more exemptions
  • Started checking exemptions based on controller name prefix
  • runAsUser != 0 now passes the runAsNonRoot check

# 0.5.0

  • Added --load-audit-file flag to run the dashboard from an existing audit
  • Added an ID field to each check in the output
  • Skip health checks for jobs, cronjobs, initcontainers
  • Added support for exemptions
  • Fixed dashboard base path option

# 0.4.0

  • Added additional Pod Controllers to scan PodSpec (jobs, cronjobs, daemonsets, replicationcontrollers)

# 0.3.1

  • Changed dashboard branding to refer to new org name Fairwinds

# 0.3.0

  • Added --set-exit-code-on-error and --set-exit-code-below-score flags to better support CI/CD

# 0.2.1

# 0.2.0

  • Added --output-format flag for better CI/CD support
  • Added --display-name flag
  • Added support for StatefulSets
  • Show error message if no kubeconfig is set

# 0.1.5

# 0.1.4

# 0.1.3

# 0.1.2

  • Stored all third-party assets (e.g. Charts.js) to local files to support offline dashboard viewing
  • Fix: custom configs in ConfigMap not respected

# 0.1.1

  • Fix (opens new window): missing config.yaml and dashboard assets in binary releases
  • Added some tests and better error handling

# 0.1.0

  • Dashboard fully functional
  • Validating webhook functional, but still considered beta
  • Checks: -
    • Health -
      • readiness probe missing
      • liveness probe missing
    • Images -
      • tag not specified
      • pull policy not always
    • Networking -
      • host network set
      • host port set
    • Resources -
      • cpu/memory requests missing
      • cpu/memory limits missing
      • cpu/memory ranges exceeded
    • Security -
      • security capabilities
      • host IPC set
      • host PID set
      • not read-only fs
      • privilege escalation allowed
      • run as root allowed
      • run as privileged
- - - diff --git a/docs-md/checks/efficiency.md b/docs/checks/efficiency.md similarity index 79% rename from docs-md/checks/efficiency.md rename to docs/checks/efficiency.md index 7903b3cda..ff41f9b53 100644 --- a/docs-md/checks/efficiency.md +++ b/docs/checks/efficiency.md @@ -9,10 +9,10 @@ To simplify ensure that these values have been set, the following attributes are key | default | description ----|---------|------------ -`resources.cpuRequestsMissing` | `warning` | Fails when `resources.requests.cpu` attribute is not configured. -`resources.memoryRequestsMissing` | `warning` | Fails when `resources.requests.memory` attribute is not configured. -`resources.cpuLimitsMissing` | `warning` | Fails when `resources.limits.cpu` attribute is not configured. -`resources.memoryLimitsMissing` | `warning` | Fails when `resources.limits.memory` attribute is not configured. +`cpuRequestsMissing` | `warning` | Fails when `resources.requests.cpu` attribute is not configured. +`memoryRequestsMissing` | `warning` | Fails when `resources.requests.memory` attribute is not configured. +`cpuLimitsMissing` | `warning` | Fails when `resources.limits.cpu` attribute is not configured. +`memoryLimitsMissing` | `warning` | Fails when `resources.limits.memory` attribute is not configured. ## Background diff --git a/docs/checks/efficiency/index.html b/docs/checks/efficiency/index.html deleted file mode 100644 index 2b40906d8..000000000 --- a/docs/checks/efficiency/index.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - Efficiency | Fairwinds Polaris Documentation - - - - - - - - - - -

# Efficiency

These checks ensure that CPU and memory settings are configured, so that -Kubernetes can schedule your workload effectively.

# Presence Checks

To simplify ensure that these values have been set, the following attributes are available:

key default description
resources.cpuRequestsMissing warning Fails when resources.requests.cpu attribute is not configured.
resources.memoryRequestsMissing warning Fails when resources.requests.memory attribute is not configured.
resources.cpuLimitsMissing warning Fails when resources.limits.cpu attribute is not configured.
resources.memoryLimitsMissing warning Fails when resources.limits.memory attribute is not configured.

# Background

Configuring resource requests and limits for containers running in Kubernetes is an important best practice to follow. Setting appropriate resource requests will ensure that all your applications have sufficient compute resources. Setting appropriate resource limits will ensure that your applications do not consume too many resources.

Having these values appropriately configured ensures that:

  • Cluster autoscaling can function as intended. New nodes are scheduled once pods are unable to be scheduled on an existing node due to insufficient resources. This will not happen if resource requests are not configured.

  • Each container has sufficient access to compute resources. Without resource requests, a pod may be scheduled on a node that is already overutilized. Without resource limits, a single poorly behaving pod could utilize the majority of resources on a node, significantly impacting the performance of other pods on the same node.

# Further Reading

- - - diff --git a/docs-md/checks/reliability.md b/docs/checks/reliability.md similarity index 82% rename from docs-md/checks/reliability.md rename to docs/checks/reliability.md index 460c19cf6..4578a3683 100644 --- a/docs-md/checks/reliability.md +++ b/docs/checks/reliability.md @@ -5,12 +5,12 @@ and are running the correct image. key | default | description ----|---------|------------ -`reliability.readinessProbeMissing` | `warning` | Fails when a readiness probe is not configured for a pod. -`reliability.livenessProbeMissing` | `warning` | Fails when a liveness probe is not configured for a pod. -`reliability.tagNotSpecified` | `danger` | Fails when an image tag is either not specified or `latest`. -`reliability.pullPolicyNotAlways` | `warning` | Fails when an image pull policy is not `always`. -`reliability.priorityClassNotSet` | `ignore` | Fails when a priorityClassName is not set for a pod. -`reliability.multipleReplicasForDeployment` | `ignore` | Fails when there is only one replica for a deployment. +`readinessProbeMissing` | `warning` | Fails when a readiness probe is not configured for a pod. +`livenessProbeMissing` | `warning` | Fails when a liveness probe is not configured for a pod. +`tagNotSpecified` | `danger` | Fails when an image tag is either not specified or `latest`. +`pullPolicyNotAlways` | `warning` | Fails when an image pull policy is not `always`. +`priorityClassNotSet` | `ignore` | Fails when a priorityClassName is not set for a pod. +`multipleReplicasForDeployment` | `ignore` | Fails when there is only one replica for a deployment. ## Background diff --git a/docs/checks/reliability/index.html b/docs/checks/reliability/index.html deleted file mode 100644 index 60ce04cd3..000000000 --- a/docs/checks/reliability/index.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - Reliability | Fairwinds Polaris Documentation - - - - - - - - - - -

# Reliability

These checks help to make sure your workloads are always available, -and are running the correct image.

key default description
reliability.readinessProbeMissing warning Fails when a readiness probe is not configured for a pod.
reliability.livenessProbeMissing warning Fails when a liveness probe is not configured for a pod.
reliability.tagNotSpecified danger Fails when an image tag is either not specified or latest.
reliability.pullPolicyNotAlways warning Fails when an image pull policy is not always.
reliability.priorityClassNotSet ignore Fails when a priorityClassName is not set for a pod.
reliability.multipleReplicasForDeployment ignore Fails when there is only one replica for a deployment.

# Background

Readiness and liveness probes can help maintain the health of applications running inside Kubernetes. By default, Kubernetes only knows whether or not a process is running, not if it's healthy. Properly configured readiness and liveness probes will also be able to ensure the health of an application.

Readiness probes are designed to ensure that an application has reached a "ready" state. In many cases there is a period of time between when a webserver process starts and when it is ready to receive traffic. A readiness probe can ensure the traffic is not sent to a pod until it is actually ready to receive traffic.

Liveness probes are designed to ensure that an application stays in a healthy state. When a liveness probe fails, the pod will be restarted.

Docker's latest tag is applied by default to images where a tag hasn't been specified. Not specifying a specific version of an image can lead to a wide variety of problems. The underlying image could include unexpected breaking changes that break your application whenever the latest image is pulled. Reusing the same tag for multiple versions of an image can lead to different nodes in the same cluster having different versions of an image, even if the tag is identical.

Related to that, relying on cached versions of a Docker image can become a security vulnerability. By default, an image will be pulled if it isn't already cached on the node attempting to run it. This can result in variations in images that are running per node, or potentially provide a way to gain access to an image without having direct access to the ImagePullSecret. With that in mind, it's often better to ensure the a pod has pullPolicy: Always specified, so images are always pulled directly from their source.

# Further Reading

- - - diff --git a/docs-md/checks/security.md b/docs/checks/security.md similarity index 66% rename from docs-md/checks/security.md rename to docs/checks/security.md index 64d872a82..9e4bd7932 100644 --- a/docs-md/checks/security.md +++ b/docs/checks/security.md @@ -6,16 +6,17 @@ for privilege escalation. key | default | description ----|---------|------------ -`security.hostIPCSet` | `danger` | Fails when `hostIPC` attribute is configured. -`security.hostPIDSet` | `danger` | Fails when `hostPID` attribute is configured. -`security.notReadOnlyRootFilesystem` | `warning` | Fails when `securityContext.readOnlyRootFilesystem` is not true. -`security.privilegeEscalationAllowed` | `danger` | Fails when `securityContext.allowPrivilegeEscalation` is true. -`security.runAsRootAllowed` | `warning` | Fails when `securityContext.runAsNonRoot` is not true. -`security.runAsPrivileged` | `danger` | Fails when `securityContext.privileged` is true. -`security.insecureCapabilities` | `warning` | Fails when `securityContext.capabilities` includes one of the capabilities [listed here](https://github.com/FairwindsOps/polaris/tree/master/checks/insecureCapabilities.yaml) -`security.dangerousCapabilities` | `danger` | Fails when `securityContext.capabilities` includes one of the capabilities [listed here](https://github.com/FairwindsOps/polaris/tree/master/checks/dangerousCapabilities.yaml) -`security.hostNetworkSet` | `warning` | Fails when `hostNetwork` attribute is configured. -`security.hostPortSet` | `warning` | Fails when `hostPort` attribute is configured. +`hostIPCSet` | `danger` | Fails when `hostIPC` attribute is configured. +`hostPIDSet` | `danger` | Fails when `hostPID` attribute is configured. +`notReadOnlyRootFilesystem` | `warning` | Fails when `securityContext.readOnlyRootFilesystem` is not true. +`privilegeEscalationAllowed` | `danger` | Fails when `securityContext.allowPrivilegeEscalation` is true. +`runAsRootAllowed` | `warning` | Fails when `securityContext.runAsNonRoot` is not true. +`runAsPrivileged` | `danger` | Fails when `securityContext.privileged` is true. +`insecureCapabilities` | `warning` | Fails when `securityContext.capabilities` includes one of the capabilities [listed here](https://github.com/FairwindsOps/polaris/tree/master/checks/insecureCapabilities.yaml) +`dangerousCapabilities` | `danger` | Fails when `securityContext.capabilities` includes one of the capabilities [listed here](https://github.com/FairwindsOps/polaris/tree/master/checks/dangerousCapabilities.yaml) +`hostNetworkSet` | `warning` | Fails when `hostNetwork` attribute is configured. +`hostPortSet` | `warning` | Fails when `hostPort` attribute is configured. +`tlsSettingsMissing` | `warning` | Fails when an Ingress lacks TLS settings. ## Background diff --git a/docs/checks/security/index.html b/docs/checks/security/index.html deleted file mode 100644 index 2e42a9f35..000000000 --- a/docs/checks/security/index.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - Security | Fairwinds Polaris Documentation - - - - - - - - - - -

# Security

These checks are related to security concerns. Workloads that fail these -checks may make your cluster more vulnerable, often by introducing a path -for privilege escalation.

key default description
security.hostIPCSet danger Fails when hostIPC attribute is configured.
security.hostPIDSet danger Fails when hostPID attribute is configured.
security.notReadOnlyRootFilesystem warning Fails when securityContext.readOnlyRootFilesystem is not true.
security.privilegeEscalationAllowed danger Fails when securityContext.allowPrivilegeEscalation is true.
security.runAsRootAllowed warning Fails when securityContext.runAsNonRoot is not true.
security.runAsPrivileged danger Fails when securityContext.privileged is true.
security.insecureCapabilities warning Fails when securityContext.capabilities includes one of the capabilities listed here (opens new window)
security.dangerousCapabilities danger Fails when securityContext.capabilities includes one of the capabilities listed here (opens new window)
security.hostNetworkSet warning Fails when hostNetwork attribute is configured.
security.hostPortSet warning Fails when hostPort attribute is configured.

# Background

Securing workloads in Kubernetes is an important part of overall cluster security. The overall goal should be to ensure that containers are running with as minimal privileges as possible. This includes avoiding privilege escalation, not running containers with a root user, not giving excessive access to the host network, and using read only file systems wherever possible.

A pod running with the hostNetwork attribute enabled will have access to the loopback device, services listening on localhost, and could be used to snoop on network activity of other pods on the same node. There are certain examples where setting hostNetwork to true is required, such as deploying a networking plugin like Flannel.

Setting the hostPort attribute on a container will ensure that it is accessible on that specific port on each node it is deployed to. Unfortunately when this is specified, it limits where a pod can actually be scheduled in a cluster.

Much of this configuration can be found in the securityContext attribute for both Kubernetes pods and containers. Where configuration is available at both a pod and container level, Polaris validates both.

# Further Reading

- - - diff --git a/docs-md/cli/options.md b/docs/cli/options.md similarity index 100% rename from docs-md/cli/options.md rename to docs/cli/options.md diff --git a/docs/cli/options/index.html b/docs/cli/options/index.html deleted file mode 100644 index 3cf21ad28..000000000 --- a/docs/cli/options/index.html +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - CLI Options | Fairwinds Polaris Documentation - - - - - - - - - - -

# CLI Options

# top-level commands
-audit
-      Runs a one-time audit.
-dashboard
-      Runs the webserver for Polaris dashboard.
-help
-      Prints help, if you give it a command then it will print help for that command. Same as -h
-version
-      Prints the version of Polaris
-webhook
-      Runs the webhook webserver
-
-# high-level flags
--c, --config string
-      Location of Polaris configuration file
---disallow-exemptions
-      Disallow any exemptions from configuration file.
--h, --help
-      Help for Polaris (same as help command)
---kubeconfig string
-      Path to a kubeconfig. Only required if out-of-cluster.
---log-level string
-      Logrus log level (default "info")
---master string
-      The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster.
-
-# dashboard flags
---audit-path string
-      If specified, audits one or more YAML files instead of a cluster
---base-path string
-      Path on which the dashboard is served (default "/")
---display-name string
-      An optional identifier for the audit
---load-audit-file string
-      Runs the dashboard with data saved from a past audit.
--p, --port int
-      Port for the dashboard webserver (default 8080)
-
-# audit flags
---audit-path string
-      If specified, audits one or more YAML files instead of a cluster
---resource string
-      If specified, audit a specific resource, in the format namespace/kind/version/name, e.g. nginx-ingress/Deployment.apps/v1/default-backend
---display-name string
-      An optional identifier for the audit
---format string
-      Output format for results - json, yaml, or score (default "json")
---output-file string
-      Destination file for audit results
---output-url string
-      Destination URL to send audit results
---set-exit-code-below-score int
-      Set an exit code of 4 when the score is below this threshold (1-100)
---set-exit-code-on-danger
-      Set an exit code of 3 when the audit contains danger-level issues.
-
-# webhook flags
---disable-webhook-config-installer
-      disable the installer in the webhook server, so it won't install webhook configuration resources during bootstrapping
--p, --port int
-      Port for the webhook webserver (default 9876)
-
- - - diff --git a/docs-md/code-of-conduct.md b/docs/code-of-conduct.md similarity index 100% rename from docs-md/code-of-conduct.md rename to docs/code-of-conduct.md diff --git a/docs/code-of-conduct/index.html b/docs/code-of-conduct/index.html deleted file mode 100644 index c334f8be7..000000000 --- a/docs/code-of-conduct/index.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - Code of Conduct | Fairwinds Polaris Documentation - - - - - - - - - - -

# Code of Conduct

# Our Pledge

In the interest of fostering an open and welcoming environment, we as -contributors and maintainers pledge to making participation in our project and -our community a harassment-free experience for everyone, regardless of age, body -size, disability, ethnicity, gender identity and expression, level of experience, -nationality, personal appearance, race, religion, or sexual identity and -orientation.

# Our Standards

Examples of behavior that contributes to creating a positive environment -include:

  • Using welcoming and inclusive language
  • Being respectful of differing viewpoints and experiences
  • Gracefully accepting constructive criticism
  • Focusing on what is best for the community
  • Showing empathy towards other community members

Examples of unacceptable behavior by participants include:

  • The use of sexualized language or imagery and unwelcome sexual attention or -advances
  • Trolling, insulting/derogatory comments, and personal or political attacks
  • Public or private harassment
  • Publishing others' private information, such as a physical or electronic -address, without explicit permission
  • Other conduct which could reasonably be considered inappropriate in a -professional setting

# Our Responsibilities

Project maintainers are responsible for clarifying the standards of acceptable -behavior and are expected to take appropriate and fair corrective action in -response to any instances of unacceptable behavior.

Project maintainers have the right and responsibility to remove, edit, or -reject comments, commits, code, wiki edits, issues, and other contributions -that are not aligned to this Code of Conduct, or to ban temporarily or -permanently any contributor for other behaviors that they deem inappropriate, -threatening, offensive, or harmful.

# Scope

This Code of Conduct applies both within project spaces and in public spaces -when an individual is representing the project or its community. Examples of -representing a project or community include using an official project e-mail -address, posting via an official social media account, or acting as an appointed -representative at an online or offline event. Representation of a project may be -further defined and clarified by project maintainers.

# Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at [INSERT EMAIL ADDRESS]. All -complaints will be reviewed and investigated and will result in a response that -is deemed necessary and appropriate to the circumstances. The project team is -obligated to maintain confidentiality with regard to the reporter of an incident. -Further details of specific enforcement policies may be posted separately.

Project maintainers who do not follow or enforce the Code of Conduct in good -faith may face temporary or permanent repercussions as determined by other -members of the project's leadership.

# Attribution

This Code of Conduct is adapted from the Contributor Covenant (opens new window), version 1.4, -available at http://contributor-covenant.org/version/1/4 (opens new window)

- - - diff --git a/docs-md/contributing.md b/docs/contributing.md similarity index 100% rename from docs-md/contributing.md rename to docs/contributing.md diff --git a/docs/contributing/index.html b/docs/contributing/index.html deleted file mode 100644 index d386898c0..000000000 --- a/docs/contributing/index.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - Contributing | Fairwinds Polaris Documentation - - - - - - - - - - -

# Contributing

Issues, whether bugs, tasks, or feature requests are essential for keeping Polaris great. We believe it should be as easy as possible to contribute changes that get things working in your environment. There are a few guidelines that we need contributors to follow so that we can keep on top of things.

# Code of Conduct

This project adheres to a code of conduct. Please review this document before contributing to this project.

# Sign the CLA

Before you can contribute, you will need to sign the Contributor License Agreement (opens new window).

# Project Structure

Polaris is built on top of controller-runtime (opens new window). It can run in 3 different modes, a dashboard, a webhook, or a reporter that prints or exports validation results. All of these modes make use of the shared validator and config packages. Adding new validations is possible by only making additions to those packages.

# Getting Started

We label issues with the "good first issue" tag (opens new window) if we believe they'll be a good starting point for new contributors. If you're interested in working on an issue, please start a conversation on that issue, and we can help answer any questions as they come up.

# Setting Up Your Development Environment

# Prerequisites

  • A properly configured Golang environment with Go 1.11 or higher
  • If you want to see the local changes you make on a Polaris dashboard, you will need access to a Kubernetes cluster defined in ~/.kube/config

# Installation

  • Install the project with go get github.com/fairwindsops/polaris
  • Change into the polaris directory which is installed at $GOPATH/src/github.com/fairwindsops/polaris
  • See the dashboard with go run main.go dashboard, then open http://localhost:8080/
  • See the audit data go run main.go audit. This command shows the audit information on the command line.

# Running Tests

The following commands are all required to pass as part of Polaris testing:

go list ./... | grep -v vendor | xargs golint -set_exit_status
-go list ./... | grep -v vendor | xargs go vet
-go test ./pkg/... -v -coverprofile cover.out
-

# Creating a New Issue

If you've encountered an issue that is not already reported, please create a new issue (opens new window), choose Bug Report, Feature Request or Misc. and follow the instructions in the template.

# Creating a Pull Request

Each new pull request should:

  • Reference any related issues
  • Add tests that show the issues have been solved
  • Pass existing tests and linting
  • Contain a clear indication of if they're ready for review or a work in progress
  • Be up to date and/or rebased on the master branch

# Creating a new release

# Patch releases

Patch releases only need to change this repo. The Helm chart and deploy scripts -will automatically pull in the latest changes.

If the release involves changes to anything in the deploy/ folder (e.g. new RBAC permissions), -it needs to be a minor or major release in order to prevent breaking the Helm chart.

  1. Create a PR for this repo -
    1. Bump the version number in: -
      1. main.go
      2. README.md
    2. Update CHANGELOG.md
    3. Merge your PR
  2. Tag the latest branch for this repo -
    1. Pull the latest commit for the master branch (which you just merged in your PR)
    2. Run git tag $VERSION && git push --tags
    3. Make sure CircleCI runs successfully for the new tag - this will push images to quay.io and create a release in GitHub -
      1. If CircleCI fails, check with Codeowners ASAP

# Minor/Major releases

Minor and major releases need to change both this repository and the -Helm chart repo (opens new window).

The steps are:

  1. Modify the Helm chart (opens new window)
    1. Clone the helm charts repo -
      1. git clone https://github.com/FairwindsOps/charts
      2. git checkout -b yourname/update-polaris
    2. Bump the version number in: -
      1. stable/polaris/README.md
      2. stable/polaris/Chart.yaml
      3. stable/polaris/values.yaml
    3. Make any necessary changes to the chart to support the new version of Polaris (e.g. new RBAC permissions)
    4. Don't merge yet!
  2. Create a PR for this repo -
    1. Create a new branch named yourname/update-version
    2. Bump the version number in: -
      1. main.go
      2. README.md
    3. Regenerate the deployment files. Assuming you've cloned the charts repo to ~/git/charts: -
      1. CHARTS_DIR=~/git/charts ./scripts/generate-deployment-files.sh
    4. Update CHANGELOG.md
    5. Merge your PR
  3. Tag the latest branch for this repo -
    1. Pull the latest for the master branch
    2. Run git tag $VERSION && git push --tags
    3. Make sure CircleCI runs successfully for the new tag - this will push images to quay.io and create a release in GitHub -
      1. If CircleCI fails, check with Codeowners ASAP
  4. Create and merge a PR for your changes to the Helm chart
- - - diff --git a/docs-md/customization/checks.md b/docs/customization/checks.md similarity index 100% rename from docs-md/customization/checks.md rename to docs/customization/checks.md diff --git a/docs/customization/checks/index.html b/docs/customization/checks/index.html deleted file mode 100644 index 97f08e950..000000000 --- a/docs/customization/checks/index.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - Check Settings | Fairwinds Polaris Documentation - - - - - - - - - - -

# Check Settings

Each check can be assigned a severity. Only checks with a severity of danger or warning will be validated. The results of these validations are visible on the dashboard. In the case of the validating webhook, only failures with a severity of danger will result in a change being rejected.

Polaris validation checks fall into several different categories:

To change the default severity levels, or to turn checks on or off, you can create your own config.yaml:

checks:
-  tagNotSpecified: ignore
-  runAsRootAllowed: danger
-  pullPolicyNotAlways: warning
-
- - - diff --git a/docs-md/customization/configuration.md b/docs/customization/configuration.md similarity index 100% rename from docs-md/customization/configuration.md rename to docs/customization/configuration.md diff --git a/docs/customization/configuration/index.html b/docs/customization/configuration/index.html deleted file mode 100644 index 73bba98a8..000000000 --- a/docs/customization/configuration/index.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - Configuration | Fairwinds Polaris Documentation - - - - - - - - - - -

# Configuration

The default Polaris configuration can be seen here (opens new window).

You can customize the configuration to do things like:

To pass in your custom configuration, follow the instructions for your environment:

  • CLI - set the --config argument to point to your config.yaml
  • Helm - set the config variable in your values file
  • kubectl - create a ConfigMap with your config.yaml, mount it as a volume, and use the --config argument in your Deployment
- - - diff --git a/docs-md/customization/custom-checks.md b/docs/customization/custom-checks.md similarity index 100% rename from docs-md/customization/custom-checks.md rename to docs/customization/custom-checks.md diff --git a/docs/customization/custom-checks/index.html b/docs/customization/custom-checks/index.html deleted file mode 100644 index 29bbf20cc..000000000 --- a/docs/customization/custom-checks/index.html +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - Custom Checks | Fairwinds Polaris Documentation - - - - - - - - - - -

# Custom Checks

If you'd like to create your own checks, you can use JSON Schema (opens new window). For example, -to disallow images from quay.io:

checks:
-  imageRegistry: warning
-customChecks:
-  imageRegistry:
-    successMessage: Image comes from allowed registries
-    failureMessage: Image should not be from disallowed registry
-    category: Images
-    target: Container # target can be "Container" or "Pod"
-    schema:
-      '$schema': http://json-schema.org/draft-07/schema
-      type: object
-      properties:
-        image:
-          type: string
-          not:
-            pattern: ^quay.io
-

Schemas can also be specified as JSON strings instead of YAML, for easier copy/pasting:

customChecks:
-  foo:
-    jsonSchema: |
-      {
-        "$schema": "http://json-schema.org/draft-07/schema",
-        "type": "object"
-      }
-

We extend JSON Schema with resourceMinimum and resourceMaximum fields to help compare memory and CPU resource -strings like 1000m and 1G. You can see an example in the extended config (opens new window)

There are additional examples in the checks folder (opens new window).

- - - diff --git a/docs-md/customization/exemptions.md b/docs/customization/exemptions.md similarity index 100% rename from docs-md/customization/exemptions.md rename to docs/customization/exemptions.md diff --git a/docs/customization/exemptions/index.html b/docs/customization/exemptions/index.html deleted file mode 100644 index f6cd17d03..000000000 --- a/docs/customization/exemptions/index.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - Exemptions | Fairwinds Polaris Documentation - - - - - - - - - - -

# Exemptions

Sometimes a workload really does need to do things that Polaris considers insecure. For instance, -many of the kube-system workloads need to run as root, or need access to the host network. In these -cases, we can add exemptions to allow the workload to pass Polaris checks.

Exemptions can be added two ways: by annotating a controller, or editing the Polaris config.

# Annotations

To exempt a controller from all checks via annotations, use the annotation polaris.fairwinds.com/exempt=true, e.g.

kubectl annotate deployment my-deployment polaris.fairwinds.com/exempt=true
-

To exempt a controller from a particular check via annotations, use an annotation in the form of polaris.fairwinds.com/<check>-exempt=true, e.g.

kubectl annotate deployment my-deployment polaris.fairwinds.com/cpuRequestsMissing-exempt=true
-

# Config

To exempt a controller via the config, you have to specify a namespace (optional), a list of controller names and a list of rules, e.g.

exemptions:
-  # exemption valid for kube-system namespace
-  - namespace: kube-system
-    controllerNames:
-      - dns-controller
-    rules:
-      - hostNetworkSet
-  # exemption valid in all namespaces
-  - controllerNames:
-      - dns-controller
-    rules:
-      - hostNetworkSet
-
- - - diff --git a/docs-md/dashboard.md b/docs/dashboard.md similarity index 93% rename from docs-md/dashboard.md rename to docs/dashboard.md index c41734b3a..ed8c664dc 100644 --- a/docs-md/dashboard.md +++ b/docs/dashboard.md @@ -1,5 +1,8 @@ # Dashboard +> Want to see Polaris results for all your clusters in a single dashboard? Check out +> [Fairwinds Insights](https://www.fairwinds.com/fairwinds-polaris-upgrade) + The Polaris dashboard can be installed on a cluster using kubectl or Helm. It can also be run locally, connecting to your cluster using the credentials stored in your `KUBECONFIG`. diff --git a/docs/dashboard/index.html b/docs/dashboard/index.html deleted file mode 100644 index ef8e74e3f..000000000 --- a/docs/dashboard/index.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - Dashboard | Fairwinds Polaris Documentation - - - - - - - - - - -

# Dashboard

The Polaris dashboard can be installed on a cluster using kubectl or Helm. It -can also be run locally, connecting to your cluster using the credentials stored in your KUBECONFIG.

The dashboard is a good way to understand what workloads inside your cluster or Infrastructure as Code -don't conform to best practices.

# Installation

# kubectl

kubectl apply -f https://github.com/fairwindsops/polaris/releases/latest/download/dashboard.yaml
-kubectl port-forward --namespace polaris svc/polaris-dashboard 8080:80
-

# Helm

helm repo add fairwinds-stable https://charts.fairwinds.com/stable
-helm upgrade --install polaris fairwinds-stable/polaris --namespace polaris
-kubectl port-forward --namespace polaris svc/polaris-dashboard 8080:80
-

# Local Binary

You'll need a valid KUBECONFIG set up for the dashboard to connect to your cluster.

Binary releases can be dowloaded from the releases page (opens new window) -or can be installed with Homebrew (opens new window):

brew tap reactiveops/tap
-brew install reactiveops/tap/polaris
-polaris dashboard --port 8080
-

You can also point the dashboard to the local filesystem, instead of a live cluster:

polaris dashboard --port 8080 --audit-path=./deploy/
-

# Local Docker container

docker run -d -p8080:8080 -v ~/.kube/config:/opt/app/config:ro  quay.io/fairwinds/polaris:1.2 polaris dashboard --kubeconfig /opt/app/config
-

# Using the Dashboard

The Polaris dashboard is a way to get a simple visual overview of the current state of your Kubernetes workloads as well as a roadmap for what can be improved. The dashboard provides a cluster wide overview as well as breaking out results by category, namespace, and workload.

Polaris Dashboard

Our default standards in Polaris are rather high, so don’t be surprised if your score is lower than you might expect. A key goal for Polaris was to set a high standard and aim for great configuration by default. If the defaults we’ve included are too strict, it’s easy to adjust the configuration as part of the deployment configuration to better suit your workloads.

- - - diff --git a/docs/favicon.png b/docs/favicon.png deleted file mode 100644 index 5f4efc0f07f58effb6b6cfcf975242601791cd90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 400 zcmV;B0dM|^P)lMlZR=yfGq>-0D%Dv0VRH`|C*9E zYX;N-YGO781LOcpVEkKMR2H-o7?50`DrmDCh?N+Sfr_AwCD0L}KpaRT90asHKwZe* zKu6S-iD49=15H6Y6JRv>0prGt0_?3SWaFYPV#7|d1E`n?U#ke&NRs0KYGuP$KnF++ zqyq*#1P0atDuPyb)r76N2F?KjR

;hLq$2ps)Wc@RV?E@Uf9mIG8MXp+hE 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 F|36MGUUUEe diff --git a/docs/img/fairwinds-logo.svg b/docs/img/fairwinds-logo.svg deleted file mode 100644 index 1595e1bad..000000000 --- a/docs/img/fairwinds-logo.svg +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/img/polaris-logo.png b/docs/img/polaris-logo.png deleted file mode 100644 index 66b1876f5ba4a0c4d9e94ce56e9e962cfad87525..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13770 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 diff --git a/docs/index.html b/docs/index.html deleted file mode 100644 index 35a22e023..000000000 --- a/docs/index.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - Fairwinds Polaris Documentation - - - - - - - - - - -

Polaris Logo

Best Practices for Kubernetes Workload Configuration

Fairwinds' Polaris keeps your clusters sailing smoothly. It runs a variety of checks to ensure that -Kubernetes pods and controllers are configured using best practices, helping you avoid -problems in the future. Polaris can be run in a few different modes:

Polaris can be run in three different modes:

  • As a dashboard, so you can audit what's running inside your cluster.
  • As an admission controller, so you can automatically reject workloads that don't adhere to your organization's policies.
  • As a command-line tool, so you can test local YAML files, e.g. as part of a CI/CD process.

Want to learn more? Reach out on the Slack channel (opens new window) (request invite (opens new window)), send an email to opensource@fairwinds.com, or join us for office hours on Zoom (opens new window)

# Integration with Fairwinds Insights

Fairwinds Insights (opens new window) -is a platform for auditing Kubernetes clusters and enforcing policy. If you'd like to:

you can sign up for a free account here (opens new window).

# Contributing

PRs welcome! Check out the Contributing Guidelines and Code of Conduct for more information.

# Further Information

A history of changes to this project can be viewed in the Changelog

If you'd like to learn more about Polaris, or if you'd like to speak with -a Kubernetes expert, you can contact info@fairwinds.com or visit our website (opens new window)


Polaris Dashboard

- - - diff --git a/docs-md/infrastructure-as-code.md b/docs/infrastructure-as-code.md similarity index 88% rename from docs-md/infrastructure-as-code.md rename to docs/infrastructure-as-code.md index 100c41ee3..825458856 100644 --- a/docs-md/infrastructure-as-code.md +++ b/docs/infrastructure-as-code.md @@ -1,4 +1,7 @@ # Infrastructure as Code +> Want to see results for all your IaC repos in one place? Check out +> [Fairwinds Insights](https://www.fairwinds.com/fairwinds-polaris-upgrade) + Polaris can be used on the command line to audit local Kubernetes manifests stored in YAML files. This is particularly helpful for running Polaris against your infrastructure-as-code as part of a CI/CD pipeline. Use the available [command line flags](#running-in-a-ci-pipeline) diff --git a/docs/infrastructure-as-code/index.html b/docs/infrastructure-as-code/index.html deleted file mode 100644 index 83fbf3c44..000000000 --- a/docs/infrastructure-as-code/index.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - Infrastructure as Code | Fairwinds Polaris Documentation - - - - - - - - - - -

# Infrastructure as Code

Polaris can be used on the command line to audit local Kubernetes manifests stored in YAML files. -This is particularly helpful for running Polaris against your infrastructure-as-code as part of a -CI/CD pipeline. Use the available command line flags -to cause CI/CD to fail if your Polaris score drops below a certain threshold, or if any danger-level issues arise.

# Install the CLI

To run Polaris against your YAML manifests, e.g. as part of a Continuous Integration process, -you'll need to install the CLI.

Binary releases can be downloaded from the releases page (opens new window) -or can be installed with Homebrew (opens new window):

brew tap FairwindsOps/tap
-brew install FairwindsOps/tap/polaris
-polaris version
-

# Running in a CI pipeline

You can tell the CLI to set an exit code if it detects certain issues with your -YAML files. -For example, to fail if polaris detects any danger-level issues, or if the score drops below 90%:

polaris audit --audit-path ./deploy/ \
-  --set-exit-code-on-danger \
-  --set-exit-code-below-score 90
-
- - - diff --git a/docs-md/package-lock.json b/docs/package-lock.json similarity index 100% rename from docs-md/package-lock.json rename to docs/package-lock.json diff --git a/docs-md/package.json b/docs/package.json similarity index 73% rename from docs-md/package.json rename to docs/package.json index 6ba0132d8..ce670ae4d 100644 --- a/docs-md/package.json +++ b/docs/package.json @@ -1,36 +1,35 @@ { - "name": "fairwinds-docs-template", - "version": "0.0.1", - "description": "A repository with a Vuepress template for Fairwinds projects", - "main": "index.js", - "directories": { - "doc": "docs" - }, - "scripts": { - "check-links": "vuepress check-md", - "build": "npm run build:readme && npm run build:docs && npm run reset-cname", - "build:readme": "cat ../README.md | grep -v 'ocumentation' | sed \"s/https:\\/\\/\\w\\+.docs.fairwinds.com//g\" > README.md", - "build:docs": "vuepress build -d ../docs/ && touch ../docs/CNAME && git checkout -- ../docs/CNAME", - "reset-cname": "touch ../docs/CNAME && git checkout -- ../docs/CNAME", - "serve": "vuepress dev --port 3003", - "vuepress": "vuepress" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/FairwindsOps/insights-docs.git" - }, "author": "", - "license": "MIT", "bugs": { "url": "https://github.com/FairwindsOps/insights-docs/issues" }, - "homepage": "https://github.com/FairwindsOps/insights-docs#readme", + "dependencies": { + "vuepress-plugin-check-md": "0.0.2" + }, + "description": "A repository with a Vuepress template for Fairwinds projects", "devDependencies": { "vuepress": "^1.4.0", "vuepress-plugin-clean-urls": "^1.1.1", "vuepress-plugin-redirect": "^1.2.3" }, - "dependencies": { - "vuepress-plugin-check-md": "0.0.2" - } + "directories": { + "doc": "docs" + }, + "homepage": "https://github.com/FairwindsOps/insights-docs#readme", + "license": "MIT", + "main": "index.js", + "name": "fairwinds-docs-template", + "repository": { + "type": "git", + "url": "git+https://github.com/FairwindsOps/insights-docs.git" + }, + "scripts": { + "build": "npm run build:readme && npm run build:docs", + "build:docs": "vuepress build -d ../dist/", + "build:readme": "cat ../README.md | grep -v 'ocumentation' | sed \"s/https:\\/\\/\\w\\+.docs.fairwinds.com//g\" > README.md", + "check-links": "vuepress check-md", + "serve": "npm run build:readme && vuepress dev --port 3003", + "vuepress": "vuepress" + }, + "version": "0.0.1" } diff --git a/docs/scripts/leadlander.js b/docs/scripts/leadlander.js deleted file mode 100644 index e85b54edd..000000000 --- a/docs/scripts/leadlander.js +++ /dev/null @@ -1,12 +0,0 @@ -/* - * This file is generated from FairwindsOps/documentation-template - * DO NOT EDIT MANUALLY - */ - -var llcookieless = true; -var sf14gv = 32793; -(function() { - var sf14g = document.createElement('script'); - sf14g.src = 'https://lltrck.com/lt-v2.min.js'; - var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(sf14g, s); -})(); diff --git a/docs/scripts/modify.js b/docs/scripts/modify.js deleted file mode 100644 index e72a2179a..000000000 --- a/docs/scripts/modify.js +++ /dev/null @@ -1,15 +0,0 @@ -/* - * This file is generated from FairwindsOps/documentation-template - * DO NOT EDIT MANUALLY - */ - -document.addEventListener("DOMContentLoaded", function(){ - setTimeout(function() { - var link = document.getElementsByClassName('home-link')[0]; - linkClone = link.cloneNode(true); - linkClone.href = "https://fairwinds.com"; - link.setAttribute('target', '_blank'); - link.parentNode.replaceChild(linkClone, link); - }, 1000); -}); -