Repository: kubernetes/dashboard
Pull request #4502 (2019-11-04 10:19:31)

Add Helm Chart
I am maintaining the kube-dashboard 2.0.0 helm chart (https://github.com/helm/charts/pull/15744, which is pretty much a whole rewrite of the chart with much more sanity), and I would like to move it to the kubernetes/dashboard repository since everything in helm is being decentralized (and github.com/helm/charts.git being slowly deprecated to move to hub.helm.sh) and continue to (co-)maintain it in this repository.

This is a work in progress and a first proposal in order to discuss.

To do after discussion:
- [x] OWNERS for helm chart (separate? same as repository?)
- [x] README
- [x] Others?
- [ ] Create (through CI?) Helm repository to make it available through hub.helm.sh


k8s-ci-robot: Welcome @desaintmartin! <br><br>It looks like this is your first PR to <a href='https://github.com/kubernetes/dashboard'>kubernetes/dashboard</a> 🎉. Please refer to our [pull request process documentation](https://git.k8s.io/community/contributors/guide/pull-requests.md) to help your PR have a smooth ride to approval. <br><br>You will be prompted by a bot to use commands during the review process. Do not be afraid to follow the prompts! It is okay to experiment. [Here is the bot commands documentation](https://go.k8s.io/bot-commands). <br><br>You can also check if kubernetes/dashboard has [its own contribution guidelines](https://github.com/kubernetes/dashboard/tree/master/CONTRIBUTING.md). <br><br>You may want to refer to our [testing guide](https://git.k8s.io/community/contributors/devel/sig-testing/testing.md) if you run into trouble with your tests not passing. <br><br>If you are having difficulty getting your pull request seen, please follow the [recommended escalation practices](https://github.com/kubernetes/community/blob/master/contributors/guide/pull-requests.md#why-is-my-pull-request-not-getting-reviewed). Also, for tips and tricks in the contribution process you may want to read the [Kubernetes contributor cheat sheet](https://git.k8s.io/community/contributors/guide/contributor-cheatsheet/README.md). We want to make sure your contribution gets all the attention it needs! <br><br>Thank you, and welcome to Kubernetes. :smiley:
k8s-ci-robot: [APPROVALNOTIFIER] This PR is **NOT APPROVED**

This pull-request has been approved by: *<a href="https://github.com/kubernetes/dashboard/pull/4502#" title="Author self-approved">desaintmartin</a>*
To complete the [pull request process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process), please assign **bryk**
You can assign the PR to them by writing `/assign @bryk` in a comment when ready.

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=kubernetes%2Fdashboard).

<details open>
Needs approval from an approver in each of these files:

- **[OWNERS](https://github.com/kubernetes/dashboard/blob/master/OWNERS)**

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":["bryk"]} -->
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- kfox1111
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
desaintmartin: /hold
codecov[bot]: # [Codecov](https://codecov.io/gh/kubernetes/dashboard/pull/4502?src=pr&el=h1) Report
> Merging [#4502](https://codecov.io/gh/kubernetes/dashboard/pull/4502?src=pr&el=desc) into [master](https://codecov.io/gh/kubernetes/dashboard/commit/07376645ddb5b230fad26d496bc978953826d52c?src=pr&el=desc) will **increase** coverage by `0.03%`.
> The diff coverage is `n/a`.

[![Impacted file tree graph](https://codecov.io/gh/kubernetes/dashboard/pull/4502/graphs/tree.svg?width=650&token=Wj7jysJ9A5&height=150&src=pr)](https://codecov.io/gh/kubernetes/dashboard/pull/4502?src=pr&el=tree)

```diff
@@            Coverage Diff             @@
##           master    #4502      +/-   ##
==========================================
+ Coverage    46.6%   46.63%   +0.03%     
==========================================
  Files         203      203              
  Lines        9459     9459              
  Branches      107      107              
==========================================
+ Hits         4408     4411       +3     
+ Misses       4779     4775       -4     
- Partials      272      273       +1
```


| [Impacted Files](https://codecov.io/gh/kubernetes/dashboard/pull/4502?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [src/app/backend/sync/secret.go](https://codecov.io/gh/kubernetes/dashboard/pull/4502/diff?src=pr&el=tree#diff-c3JjL2FwcC9iYWNrZW5kL3N5bmMvc2VjcmV0Lmdv) | `73.26% <0%> (+2.97%)` | :arrow_up: |

------

[Continue to review full report at Codecov](https://codecov.io/gh/kubernetes/dashboard/pull/4502?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/kubernetes/dashboard/pull/4502?src=pr&el=footer). Last update [0737664...78391ec](https://codecov.io/gh/kubernetes/dashboard/pull/4502?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).

maciaszczykm: `OWNERS` file looks okay, +1 from my side to keep you as one of them.

> Create (through CI?) Helm repository to make it available through hub.helm.sh

What do you need to complete this task?

Would you like to merge the files as it is or to continue and perform changes from 1 PR?
desaintmartin: 1/ OWNERS: Great! I am not yet a kubernetes org member, I would probably need sponsorship for this.

2/ Releasing: should we sync dashboard versions and its helm chart versions? If so, we could build and push the helm chart into each github release (can easily be done through GitHub Actions) and generate through CI (Travis? Github Actions?) an index that will be used by the Helm Hub through the gh-pages branch. There's still a question about the testing part to be on par with helm/charts.git, but I guess we can improve over time.
Note that this would probably change the release workflow for the whole project and/or add a new CI through Github Actions.

3/ I think it is better to hold this PR until publishing is ready!
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
- kfox1111
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- kfox1111
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
- kfox1111
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
desaintmartin: So I have a working CI that will push to gh-pages. Downside is that you need to create a github token with write permissions and set it in travis configuration. The other way is to commit an encrypted deploy token in the repository... Or yet another way is to do it manually.
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
floreks: Mostly it lgtm. The only thing I am worried about is how to properly configure travis to be able to push to the repo and branch `gh-pages`.
k8s-ci-robot: [APPROVALNOTIFIER] This PR is **NOT APPROVED**

This pull-request has been approved by: *<a href="https://github.com/kubernetes/dashboard/pull/4502#" title="Author self-approved">desaintmartin</a>*
To complete the [pull request process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process), please assign **floreks**
You can assign the PR to them by writing `/assign @floreks` in a comment when ready.

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=kubernetes%2Fdashboard).

<details open>
Needs approval from an approver in each of these files:

- **[OWNERS](https://github.com/kubernetes/dashboard/blob/master/OWNERS)**

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":["floreks"]} -->
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
desaintmartin: Thanks for the review!

First of all, we DON'T have to automate it now:
- It could be a manual operation done by a maintainer with push access to the repo
- Travis could be configured, but push to ANOTHER repository in order to preserve integrity to kubernetes/dashboard
- The other solution is to maintain a stateful app (namely chartmuseum) that runs somewhere and connects to an object storage (gcs?) to serve Charts. Populated manually or through travis.

That being said, in order to enable the proposed CI, one would have to put into the travis config a GitHub token with push access. This is one huge current limitation of GitHub Pages. This is quite simple to do but have serious implications (Travis is able to push, and whoever has access to Travis parameters could grab the token and... push) so it has to be carefully weighted depending on who has access.

Once again, the PR can be split into two.
floreks: Then I'd move the `gh-pages` logic to a script and make it a manual step that should be executed after creating a new release tag. Keeping token with push access to the repo on travis would be a security risk.
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
desaintmartin: Here is a first version of the script, taking the tag to add to gh-pages as argument.
Sorry for the force-pushes!
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
bskim45: It would be great to add metrics-scraper sidecar as the official manifest suggests. https://github.com/kubernetes/dashboard/tree/master/aio/deploy/recommended

Or should we propose a seperate PR to add metrics-scraper?
desaintmartin: Should we have a Helm Chart in https://github.com/kubernetes-sigs/dashboard-metrics-scraper and make this one depend on it, in a future PR, in order to have clear separation of concern? The only advantage of putting metrics-scraper here would be to have a sidecar in the main Pod.
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
desaintmartin: Fixed Helm 3 compatibility.
davidalger: @bskim45 @desaintmartin Opened a PR to the branch this PR is based on which adds support for the `dashboard-metrics-scraper` and would appreciate any feedback you might have. I've pretty much based the effort on the recommended deployment found here: https://github.com/kubernetes/dashboard/tree/master/aio/deploy/recommended
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
desaintmartin: @davidalger: I propose we include the metrics once we have a first stable version of the chart.

We have to decide whether kubernetes/dashboard.git includes things about metrics-server, or if metrics-server.git should have its own helm chart and kubernetes-dashboard (optionally) depends on it. I tend to prefer the second solution in order to reduce coupling.

What do you think?

(BTW: updated to 2.0.0-rc1)
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
davidalger: @desaintmartin Leaving a crucial component of the dashboard out of the first release of the chart IMO cripples it and puts it at odds with the recommended deployment of `kubernetes-dashboard` which includes the `dashboard-metrics-scraper` (an important part of having a fully functional dashboard)

You are correct, the README is a little bit behind and still references the deprecated use of heapster (which is still supported by v2, as it'll use it if present to display metrics as well as the bundled `dashboard-metrics-scraper` but no longer preferred and is unlikely to be used in new deployments). This wouldn't stop me from including the scraper in the initial release of the chart however, and cloud providers such as AWS are already building their docs to have two steps: 1) deploy metrics-server; 2) deploy kubernetes-dashboard; to setup the Kubernetes UI: https://docs.aws.amazon.com/eks/latest/userguide/dashboard-tutorial.html The docs here in this repository need a few updates it seems to fully cover the changes in dashboard v2, both the README and the integrations wiki page: https://github.com/kubernetes/dashboard/wiki/Integrations as they will be out of date once v2 hits GA.

> or if metrics-server.git should have its own helm chart and kubernetes-dashboard (optionally) depends on it. I tend to prefer the second solution in order to reduce coupling.

Metrics server would not belong bundled into this chart. In some cases it will already be deployed by default (per [Kubernetes docs](https://kubernetes.io/docs/tasks/debug-application-cluster/resource-metrics-pipeline/): It is deployed by default in clusters created by `kube-up.sh` script as a Deployment object). When it's not there, it's as simple as either deploying from the manifests in metrics-server repository (which is what AWS EKS docs is suggesting users do), or leveraging the currently available chart for it (as I am in the cluster I'm currently building):

```
helm install  metrics-server --namespace kube-system stable/metrics-server
```

Is the lack of updated documentation on the use of metrics-server vs heapster the only blocker from your perspective? FWIW, the dashboard will function without metrics-scraper installed, even when dashboard-metrics-scraper is included, it just won't show the metrics data until the user installs the metrics-server.
desaintmartin: @davidalger could you give me the URL of you PR?
davidalger: @desaintmartin PR can be found here: https://github.com/wiremind/dashboard/pull/1

I made that PR against the branch this PR was created from, so if merged this PR would update and include the additional templates.
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
k8s-ci-robot: [Keywords](https://help.github.com/articles/closing-issues-using-keywords) which can automatically close issues and at(@) mentions are not allowed in commit messages.

**The list of commits with invalid commit messages**:

- [46bb52f](https://github.com/kubernetes/dashboard/commits/46bb52f87374d77c67642ee5ba160fbd47a3988a) Added dashboard-metrics-scraper support to chart per recommended deployment

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>

k8s-ci-robot: Thanks for your pull request. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

:memo: **Please follow instructions at <https://git.k8s.io/community/CLA.md#the-contributor-license-agreement> to sign the CLA.**

It may take a couple minutes for the CLA signature to be fully registered; after that, please reply here with a new comment and we'll verify.  Thanks.

---

- If you've already signed a CLA, it's possible we don't have your GitHub username or you're using a different email address.  Check your existing CLA data and verify that your [email is set on your git commits](https://help.github.com/articles/setting-your-email-in-git/).
- If you signed the CLA as a corporation, please sign in with your organization's credentials at <https://identity.linuxfoundation.org/projects/cncf> to be authorized.
- If you have done the above and are still having issues with the CLA being reported as unsigned, please log a ticket with the Linux Foundation Helpdesk: <https://support.linuxfoundation.org/>
- Should you encounter any issues with the Linux Foundation Helpdesk, send a message to the backup e-mail support address at: login-issues@jira.linuxfoundation.org

<!-- need_sender_cla -->

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
	
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
desaintmartin: Hello @davidalger, after our discussion, I've added your commits regarding metrics-scraper into the PR. I wonder if we should add metrics-server as an (optional) dependency as well. What do you think?
Other people, for advice: metrics-scraper deployment is now enabled by default, is that an expected default value to get started ?
davidalger: I signed it
davidalger: > I wonder if we should add metrics-server as an (optional) dependency as well. What do you think?

I think that would be a good idea perhaps. I've not personally used optional dependencies, but if I can find the time to, I'll take a look at what it might look like.

Since the docs state a dependency on either heapster or metrics-server, it would definitely need to be an optional one to avoid breaking the ability for users to deploy the new dashboard into older clusters still running heapster.

vutny: @desaintmartin I'm leaving a link to review comment here since it might get lost in the long thread:
https://github.com/kubernetes/dashboard/pull/4502#discussion_r395591005

For anybody who's testing this, take a look on above suggestion if you see no CPU/memory metrics and those messages in the logs:
```
Skipping metric because of error: Metric label not set.
```
```json
{"level":"error","msg":"Error scraping node metrics: nodes.metrics.k8s.io is forbidden: User \"system:serviceaccount:monitoring:dashboard-kubernetes-dashboard\" cannot list resource \"nodes\" in API group \"metrics.k8s.io\" at the cluster scope","time":"2020-03-20T11:47:21Z"}
```
k8s-ci-robot: [Keywords](https://help.github.com/articles/closing-issues-using-keywords) which can automatically close issues and at(@) mentions are not allowed in commit messages.

**The list of commits with invalid commit messages**:

- [46bb52f](https://github.com/kubernetes/dashboard/commits/46bb52f87374d77c67642ee5ba160fbd47a3988a) Added dashboard-metrics-scraper support to chart per recommended deployment

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>

k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
k8s-ci-robot: [Keywords](https://help.github.com/articles/closing-issues-using-keywords) which can automatically close issues and at(@) mentions are not allowed in commit messages.

**The list of commits with invalid commit messages**:

- [6c8ac1f](https://github.com/kubernetes/dashboard/commits/6c8ac1faebd74492f5de8591b6889a0eea3e4dbd) Added dashboard-metrics-scraper support to chart per recommended deployment

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>

k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
k8s-ci-robot: [Keywords](https://help.github.com/articles/closing-issues-using-keywords) which can automatically close issues and at(@) mentions are not allowed in commit messages.

**The list of commits with invalid commit messages**:

- [6c8ac1f](https://github.com/kubernetes/dashboard/commits/6c8ac1faebd74492f5de8591b6889a0eea3e4dbd) Added dashboard-metrics-scraper support to chart per recommended deployment

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>

k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
k8s-ci-robot: [Keywords](https://help.github.com/articles/closing-issues-using-keywords) which can automatically close issues and at(@) mentions are not allowed in commit messages.

**The list of commits with invalid commit messages**:

- [6c8ac1f](https://github.com/kubernetes/dashboard/commits/6c8ac1faebd74492f5de8591b6889a0eea3e4dbd) Added dashboard-metrics-scraper support to chart per recommended deployment

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>

k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
desaintmartin: So, I've adapted the dashboard-metrics-scraper to make it a sidecar container, added an optional metric-server sub-chart and cleaned up a bit README. I've squashed the older commits for sanity.

It can be still complex to have a working metrics-server + dashboard-metrics-scraper, here is my configuration:
```yaml
rbac:
  create: true
  clusterRoleMetrics: true

metricsScraper:
  enabled: true

metrics-server:
  enabled: true
  args:
    - --kubelet-preferred-address-types=InternalIP
    - --kubelet-insecure-tls
```

But I guess this can be improved in the future. What do you think about those improvements?
k8s-ci-robot: [Keywords](https://help.github.com/articles/closing-issues-using-keywords) which can automatically close issues and at(@) mentions are not allowed in commit messages.

**The list of commits with invalid commit messages**:

- [6c8ac1f](https://github.com/kubernetes/dashboard/commits/6c8ac1faebd74492f5de8591b6889a0eea3e4dbd) Added dashboard-metrics-scraper support to chart per recommended deployment

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>

k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
k8s-ci-robot: [Keywords](https://help.github.com/articles/closing-issues-using-keywords) which can automatically close issues and at(@) mentions are not allowed in commit messages.

**The list of commits with invalid commit messages**:

- [6c8ac1f](https://github.com/kubernetes/dashboard/commits/6c8ac1faebd74492f5de8591b6889a0eea3e4dbd) Added dashboard-metrics-scraper support to chart per recommended deployment

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>

k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
k8s-ci-robot: [Keywords](https://help.github.com/articles/closing-issues-using-keywords) which can automatically close issues and at(@) mentions are not allowed in commit messages.

**The list of commits with invalid commit messages**:

- [6c8ac1f](https://github.com/kubernetes/dashboard/commits/6c8ac1faebd74492f5de8591b6889a0eea3e4dbd) Added dashboard-metrics-scraper support to chart per recommended deployment

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>

k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
k8s-ci-robot: [Keywords](https://help.github.com/articles/closing-issues-using-keywords) which can automatically close issues and at(@) mentions are not allowed in commit messages.

**The list of commits with invalid commit messages**:

- [6c8ac1f](https://github.com/kubernetes/dashboard/commits/6c8ac1faebd74492f5de8591b6889a0eea3e4dbd) Added dashboard-metrics-scraper support to chart per recommended deployment

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>

k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
k8s-ci-robot: [Keywords](https://help.github.com/articles/closing-issues-using-keywords) which can automatically close issues and at(@) mentions are not allowed in commit messages.

**The list of commits with invalid commit messages**:

- [6c8ac1f](https://github.com/kubernetes/dashboard/commits/6c8ac1faebd74492f5de8591b6889a0eea3e4dbd) Added dashboard-metrics-scraper support to chart per recommended deployment

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>

k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
k8s-ci-robot: [Keywords](https://help.github.com/articles/closing-issues-using-keywords) which can automatically close issues and at(@) mentions are not allowed in commit messages.

**The list of commits with invalid commit messages**:

- [6c8ac1f](https://github.com/kubernetes/dashboard/commits/6c8ac1faebd74492f5de8591b6889a0eea3e4dbd) Added dashboard-metrics-scraper support to chart per recommended deployment

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>

k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
k8s-ci-robot: [Keywords](https://help.github.com/articles/closing-issues-using-keywords) which can automatically close issues and at(@) mentions are not allowed in commit messages.

**The list of commits with invalid commit messages**:

- [30bdd72](https://github.com/kubernetes/dashboard/commits/30bdd72ad20bf8261efdc0cda78781df154ef7e8) Added dashboard-metrics-scraper support to chart per recommended deployment

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>

k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
k8s-ci-robot: [Keywords](https://help.github.com/articles/closing-issues-using-keywords) which can automatically close issues and at(@) mentions are not allowed in commit messages.

**The list of commits with invalid commit messages**:

- [30bdd72](https://github.com/kubernetes/dashboard/commits/30bdd72ad20bf8261efdc0cda78781df154ef7e8) Added dashboard-metrics-scraper support to chart per recommended deployment

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>

k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
davidalger: @desaintmartin Don't know that I have a strong opinion either way on making the metrics-scraper run as a sidecar container rather than an independent/sidecar pod. It works either way, but is perhaps more flexible running it out as an additional deployment. This method keeps it running as a single deployment unit so scaling up one requires scaling up the other. Doesn't look like there was any discussion about this before it was added to the manifests for example deployment, it was just merged as a sidecar pod rather than sidecar container: https://github.com/kubernetes/dashboard/pull/3504

There is an issue with these changes and I'm honestly not sure what is causing it, but it's related to specifying the dependency on metrics-server in the requirements.yaml file.

I uninstalled the previous version of this chart from my cluster and when I attempted to install, I got the following error:

```
$ helm -n kube-system install kubernetes-dashboard ./charts/kubernetes-dashboard -f /tmp/values.yml
Error: found in Chart.yaml, but missing in charts/ directory: metrics-server
```

If I comment out the contents of `requirements.yaml` the chart deploys successfully and the metrics-scraper works in tandem with the metrics-server (which is deployed separately in my case). This is what my values file looks like:

```
extraArgs:
- --enable-insecure-login
protocolHttp: true
rbac:
  clusterReadOnlyRole: true
service:
  externalPort: 8080
metricsScraper:
  enabled: true
```


k8s-ci-robot: [Keywords](https://help.github.com/articles/closing-issues-using-keywords) which can automatically close issues and at(@) mentions are not allowed in commit messages.

**The list of commits with invalid commit messages**:

- [3a7e570](https://github.com/kubernetes/dashboard/commits/3a7e570786ff129d47460cae415b814c4f1a29ab) Added dashboard-metrics-scraper support to chart per recommended deployment

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>

k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
atoato88: @desaintmartin 
There are 2 items to action.

1. You need to amend commit message to take into account message rule, that's why CI error occurred.
Please see `k8s-ci-robot` [comment](https://github.com/kubernetes/dashboard/pull/4502#issuecomment-607658226) for detail.

2. And, you need to be member of the kubernetes org.
Plsease see [comment here](https://github.com/kubernetes/dashboard/pull/4502#issuecomment-607658457) and [liked page](https://github.com/kubernetes/community/blob/master/community-membership.md#member).


Please follow up this by other members !! :smile: 
desaintmartin: thanks @atoato88, indeed I haven't progressed on the "kube org member" part yet. Actually I would need another sponsor but I haven't really looked at it yet. If anybody can sponsor me... 
Regarding the signoff commit error, since this is on /hold, I've kept temporary commits, so that people can see the changes, that are NOT meant to be merged but to be squashed before merge (unless the merge system automatically squashes...).


@davidalger oh, actually you need to do `helm dependency build` in order to download the metrics-server as a tgz inside of `./charts` directory. It is not a good practice to commit it so it is actually part of the "release" script. Once it will be uploaded and served, of course a simple `helm install my-dashboard kubernetes-dashboard/kubernetes-dashboard` will work out of the box.

Regarding the pod vs sidecar container, I've observed that in a 2500-pods cluster:
- dashboard-metrics-scraper with default configuration uses ~150MB of memory with negligible cpu
- metrics-server use, for each replica of kube-dashboard/dashboard-metrics-scraper, an additional 50Kb/s of network and 0.01 cpu (and negligible additional memory).

Extrapolating for those figures, a cluster running 10 replicas of this would not put metrics-server in danger and would use approximately 1.5GB more memory than the autonomous deployment/service approach (if it increases linearly...). On the other hand, it eases maintenance and simplify the logic (one less deployment, one less service to be exposed).

Even if I tend to prefer the sidecar approach, it is really easy to rollback to use the standalone approach! @jeefy, what is your opinion on this? Should we assume a very high number of replicas and isolate scraper from dashboard?
davidalger: @desaintmartin Aha, that is what I was missing. Thanks! Works perfectly (even with metrics-server installed separately) once I did that. Appreciate it.

Those numbers and logic behind the pattern change feel solid to me as well. If one is running 10 replicas of this to distribute load on the dashboard, probably want to distribute the load on the dashboard scraper in a similar fashion. I do like that it has fewer moving pieces this way. I'm newer in the k8s ecosystem though, so take what I say there with a grain of salt. My exp is limited to much smaller clusters thus far. :)
pierluigilenoci: What about this? https://github.com/funkypenguin/helm-kubernetes-dashboard
funkypenguin: @pierluigilenoci the above is my fork of https://github.com/wiremind/dashboard/tree/helm-chart, it's 100% aligned with this one. I published it on the basis that I want to use the chart in my CI (which requires a published repo) which is most likely to end up "official". I've PR'd some of my fixes back to https://github.com/wiremind/dashboard/tree/helm-chart. You could use it in the interim until this is merged, but once this is merged I'll be deprecating my chart in favor of this one.
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
desaintmartin: /hold cancel

Eddman: I've tested that chart and found out that as @funkypenguin wrote there are wrongly placed security contexts and resources. Appart of that there is:
```
metricsScraper:
  revisionHistoryLimit: 10
```
That one is never used.

Also the metrics scraper sidecar has wrong version `1.0.3`. Current is `1.0.4`.

Can we get this fixed and release the chart asap? Would be nice to have official chart that we can download and use. Right now I have my own local copy...
floreks: @Eddman thanks for testing. If it will be ready I'll also give it a final check and we can merge.
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
desaintmartin: Thank you both @Eddman and @funkypenguin, I've updated the PR to reflect this.
Eddman: @desaintmartin Checked your changes. 

One thing I don't like is the `ContainerSecurityContext` in `metricsScraper`. [Helm best practice docs](https://helm.sh/docs/chart_best_practices/values/) the naming conventions are saying: always camelCase, no initial caps.

Also I'd suggest to rename both `dashboardContainerSecurityContext` and `metricsScraper.ContainerSecurityContext` to `securityContext`/`metricsScraper.securityContext`. This is convention used in almost all other charts. 
desaintmartin: Thanks for the check @Eddman, the first one was a typo, and I hesitated for the second one so that it is explicit but sure, let me change that.
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
Eddman: @desaintmartin Thanks for quick response! 

`containerSecurityContext` vs. `securityContext` - I mean both are valid. I'd only say that it become somehow community standard to use the shorter `securityContext`, but it is nothing I want to fight over.

One small think: in README.md we still have ref to `dashboardContainerSecurityContext`.
davidalger: @Eddman The two values here `containerSecurityContext` and `securityContext` are for two separate `securityContext` values. The `securityContext` value applies to the Pod and `containerSecurityContext` applies to the container within the Pod.

I've seen some charts use `podSecurityContext` and `securityContext` (for the container) and others use `podSecurityContext` and `containerSecurityContext` to avoid the possible confusion. Perhaps it would be good for charts to move towards the latter convention to help clear things up.

Eddman: Ok, it makes sense, thanks.
desaintmartin: Fixed README.
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
Eddman: @desaintmartin Super stupid thing: I've noticed that all files have LICENSE: `# Copyright 2017` Maybe worth changing to 2020 :man_shrugging: ?
floreks: No need to update the copyright date. It should reflect the original date of creation, not get updated every year.
Eddman: Agree, but the files aren’t even created, yet. These are/will be copletely new in this repo.
floreks: Those nuances are always tricky and I am no lawyer :slightly_smiling_face:. It could be explained in many different ways IMHO. Files definitely are already created somewhere, even if they are just in a PR from your work, not "directly" on this repo. They have been created some time ago and possibly we should reflect the original creation date, not the date of "copying" them over here.
Eddman: Did some check and compared with the original [helm/charts/stable/kubernetes-dashboard](https://github.com/helm/charts/tree/master/stable/kubernetes-dashboard) and non-of these files had any copyright before and some of the files with year 2017 are new in this chart :man_shrugging: :smile: 
desaintmartin: Anyway, CI will check that we have the "2017" copyright: https://github.com/kubernetes/dashboard/blob/master/aio/scripts/license-header.txt

If we have to change the year, we need to change the CI script as well!
Eddman: Further more the chart was funded in 2017, however some of the files were created in 2018 (by me for instance, helm/charts/pull/3935) and some in 2019. :wink: 
Eddman: @desaintmartin So even if you create a file now, you have to add `Copyright 2017`? :thinking: 

But I don't fight here, it's just something that I've spotted there and is not important at all. The chart itself looks good to me, I haven't found any other problems/issues. We have it installed in our test cluster for week now, including the new changes.
floreks: @Eddman good point. We should not check for the year in the license header or extend the check to only check if the year is between 2017 and the current year.
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
desaintmartin: As @funkypenguin points out in another PR, we don't have a readiness probe (because from dashboard point of view, liveness equals readiness). Should we add a readiness probe duplicating the liveness probe in order to please some validators? Should we keep it like this (and in this case, kubernetes considers readiness from the liveness probe)?

(Note that this can be postponed to a future and separate PR since the helm chart follows the official deployment files regarding this topic.)
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
k8s-ci-robot: The following users are mentioned in OWNERS file(s) but are not members of the kubernetes org.

Once all users have been added as [members](https://git.k8s.io/community/community-membership.md#member) of the org, you can trigger verification by writing `/verify-owners` in a comment.
- desaintmartin
  - aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
iAnomaly: @desaintmartin Can you help me understand why you removed the namespace declaration in the secret  and service account with 09405553ad94b880cac7f1f56c814e24970ac5b7?

I'm attempting to use your chart directly until it is merged and this change breaks out of the target namespace encapsulation boundary by attempting to create the secret and service account in the default namespace.
desaintmartin: > @desaintmartin Can you help me understand why you removed the namespace declaration in the secret and service account with [0940555](https://github.com/kubernetes/dashboard/commit/09405553ad94b880cac7f1f56c814e24970ac5b7)?
> 
> I'm attempting to use your chart directly until it is merged and this change breaks out of the target namespace encapsulation boundary by attempting to create the secret and service account in the default namespace.

Sure, this was a legacy from old days, and helm does NOT need namespace to be specified. Could you specify your helm version and the command used to install, so that I try to reproduce? Is that an upgrade or an install? I have running Releases of this PR in clusters, and there is no trace of Secret or ServiceAccount outside of its namespace.
iAnomaly: > > @desaintmartin Can you help me understand why you removed the namespace declaration in the secret and service account with [0940555](https://github.com/kubernetes/dashboard/commit/09405553ad94b880cac7f1f56c814e24970ac5b7)?
> > I'm attempting to use your chart directly until it is merged and this change breaks out of the target namespace encapsulation boundary by attempting to create the secret and service account in the default namespace.
> 
> Sure, this was a legacy from old days, and helm does NOT need namespace to be specified. Could you specify your helm version and the command used to install, so that I try to reproduce? Is that an upgrade or an install? I have running Releases of this PR in clusters, and there is no trace of Secret or ServiceAccount outside of its namespace.

Got it. Thank you. I didn't know Helm did this. I was confused because I saw the namespace line disappear from those templates during a Helm diff during a chart upgrade to your version, however after inspecting the ServiceAccount I do see it is still located in the expected namespace and contains the namespace declaration in its internal manifest. Helm must even do this after its own plugin pipeline.

Thanks for putting together this chart and submitting the PR. Sure hope it can be merged soon, but until then I'll use your fork. Cheers!
desaintmartin: @floreks so, should we change the licence check script to allow any year, and change them accordingly? Or should we keep it as it is now?
Once this is settled, I think we can merge (and of course do other non-breaking PRs thereafter) now that I can be OWNER of the chart.
floreks: I guess we can update license check later.
Eddman: Are we waiting here for something? Or can we already merge it and release the chart?
rifelpet: Has thought been given to how the chart will be hosted? looking at the [helm hub repos](https://github.com/helm/hub/blob/master/config/repo-values.yaml) it seems that most host it on github.io using [chart-releaser](https://github.com/helm/chart-releaser). Will that process be automated or manually run by a maintainer?
desaintmartin: @rifelpet
chart-releaser works (or, at least, worked, last time i've checked) best with several charts. Since we have only one, a maintainer should just run the `aio/scripts/helm-release-chart.sh` (along with its friend `aio/scripts/helm-lint.sh` run by ci) to generate a new chart version, then push to the gh-pages branch of this repository, which would make the helm index accessible through `https://kubernetes.github.io/dashboard` which will be added to the Helm Hub (https://github.com/helm/hub/blob/master/Repositories.md).

Automating this would require a r/w token to be created and given to a CI/CD system (being travis, github actions, prow or any other one), and it has been decided it is not wise exposing this repository this way.

Alternatively, we could create a dedicated github repository where only the helm charts are pushed. Last time I discussed, it seemed better to keep k/dashboard and have manual pushes.
llamahunter: what's the status of this?  Any chance this chart will be officially released soon?
ReSearchITEng: > what's the status of this? Any chance this chart will be officially released soon?
In meanwhile you may use it from this repo:
helm repo add funkypenguin-kubernetes-dashboard https://funkypenguin.github.io/helm-kubernetes-dashboard/
(from https://github.com/funkypenguin/helm-kubernetes-dashboard )
It's the same chart as the one expected to be merged here).
aitorhh: The helm chart provided does not include all the [deploy/recommented](https://github.com/wiremind/dashboard/tree/helm-chart/aio/deploy/recommended) resources. It is missing the [scrapper](https://github.com/wiremind/dashboard/blob/helm-chart/aio/deploy/recommended/08_scraper-deployment.yaml). 

Should that be part of the helm chart as well? Since `metrics-servers` is a dependency, I believe it makes sense to add it, at least as configurable option.
pierluigilenoci: @aitorhh I disagree. The chart should contain the bare minimum. [1] If you want to install metrics-server use the metrics-server chart [2]. It hasn't been migrated away from stable yet but it doesn't matter, it's the idea what really matters. If you want you can create an umbrella chart with all you need [1].

[1] https://helm.sh/docs/howto/charts_tips_and_tricks/#complex-charts-with-many-dependencies
[2] https://github.com/helm/charts/tree/master/stable/metrics-server
ReSearchITEng: @aitorhh Isn't this what you are looking for?
https://github.com/wiremind/dashboard/blob/helm-chart/aio/deploy/helm-chart/kubernetes-dashboard/values.yaml#L139
aitorhh: @ReSearchITEng , I was wondering if the metric-scraper should be part of the dashboard helm chart or a dependency. But as @pierluigilenoci pointed out, it might be better to have it as dependency. However at the moment there is not offical chart for that.
desaintmartin: Please see the values.yaml of this PR for informations about how to enable dashboard-metrics-scraper and metrics-server.
I try to maintain https://wiremind.github.io/dashboard/ as a repository mirroring this PR.
pierluigilenoci: @aitorhh sorry but I read wrong. IMHO the sidecar of the scraper makes sense that it is on the chart in some way, the metrics-server not. It would be like adding in a chart of software that exposes an endpoint for Prometheus the installation of Prometheus itself. Or vice versa, add the installation of Prometheus to the Grafana chart or any other software that consumes the data.
desaintmartin: metrics-server is an optional [subchart](https://helm.sh/docs/chart_template_guide/subcharts_and_globals/), see requirements.yaml, so it respects the separation of concern and all possible use cases. ;)
maciaszczykm: @desaintmartin hey, could you share the status here? Is it far away from getting merged?
Eddman: @desaintmartin Hi, one more thing that can be done: Please change `Ingress` API version to:
```
{{- if .Capabilities.APIVersions.Has "networking.k8s.io/v1beta1" }}
apiVersion: networking.k8s.io/v1beta1
{{ else }}
apiVersion: extensions/v1beta1
```
to support new `networking.k8s.io/v1beta1` API version (since 1.14). `extensions/v1beta1` is deprecated and will be removed.
desaintmartin: `extensions/v1beta1` ingresses will be removed in 1.22, so I think we still have time to switch in a PR done later. ;)
desaintmartin: @maciaszczykm we can merge when a core maintainer is ready to release (i.e run the helm-release script and push to gh-pages after merge).
maciaszczykm: Sounds good. Remind us if we will not do it this week. Thanks again for all the work done here :)
Eddman: @desaintmartin More I'm thinking about it I'm more convinced that we should just go and use `networking.k8s.io/v1beta1` only. It is supported since `1.14` and Dashboard 2.0+ is meant for newer K8s releases only 🤷‍♂️ 
Eddman: And, yes I agree that it can be done later, but this chart is the last one in our cluster that raised a flag that it uses a deprecated API version... 😄 
desaintmartin: I would rather freeze this PR so that it gets merged, unless newly discovered bug, and then new PRs can be done to change the chart.

Moreover, regarding this topic, although it looks interesting to use newer APIs, it would not improve the PR (no new feature, no bug fix) but would arbitrarily break older versions. I propose we change to the new API in a few months only (like when 1.20/1.21 is out and before 1.22 alpha) unless specific need.
maciaszczykm: /verify-owners




pierluigilenoci: At this point does it make sense to update the chart with the new release?
https://github.com/kubernetes/dashboard/releases/tag/v2.0.1
Jasstkn: Hi, everyone. Is there any ETA for this PR? I can't figure out how many questions are waiting for resolution...
maciaszczykm: I'll try to review this Thursday, totally forgot about it last week.
maciaszczykm: It would be good to update it to v2.0.1.
desaintmartin: I've upgraded to v2.0.1 and bumped chart version to v2.0.1. I propose we try to keep synchronized the versions for now, but I doubt we can do it in the long run.
maciaszczykm: @desaintmartin In our docs directory we have a short manual with the release process, you could add the update of these charts there.

Patch:
diff --git a/.travis.yml b/.travis.yml
index fa0d74e90..55fbed044 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -52,22 +52,51 @@ before_script:
 jobs:
   include:
     - stage: test
+      name: "Code check & linting"
       before_script:
         - aio/scripts/install-codegen.sh
       script: npm run check
-    - script: npm run test:coverage
+    - name: "Unit tests"
+      script: npm run test:coverage
       after_success:
         - rm -rf $TRAVIS_BUILD_DIR/.tmp
         - bash <(curl -s https://codecov.io/bash)
-    - script: npm run cluster:start && npm run e2e
+    - name: "Helm linting"
+      cache: false
+      install:
+        - curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
+        - wget https://github.com/garethr/kubeval/releases/download/0.14.0/kubeval-linux-amd64.tar.gz
+        - mkdir kubeval
+        - tar xf kubeval-linux-amd64.tar.gz -C kubeval
+        - export PATH="$PATH:$(pwd)/kubeval"
+      before_script: skip  # We don't need Docker nor Go
+      script:
+        - aio/scripts/helm-lint.sh
+    - name: "e2e tests"
+      script: npm run cluster:start && npm run e2e
+
     - stage: deploy
+      name: "Development release"
       script:
         - docker login -u $DOCKER_USER -p $DOCKER_PASS
         - npm run docker:push:head
+
     - stage: release
+      name: "Release"
       script:
         - docker login -u $DOCKER_RELEASE_USER -p $DOCKER_RELEASE_PASS
         - npm run docker:push
+    # Manual step for now since it requires to add a GitHub Token to Travis which would be a security issue
+    # - name: "Helm repository generation"
+    #   cache: false
+    #   install:
+    #     - curl -L https://git.io/get_helm.sh | bash && helm init --skip-refresh --client-only
+    #     - git remote set-branches origin '*' && git fetch --unshallow
+    #     # GTHUB_WRITE_TOKEN is a travis secret variable that is generated from https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line
+    #     - git remote set-url origin https://x-access-token:${GITHUB_WRITE_TOKEN}@github.com/${TRAVIS_REPO_SLUG}.git
+    #   before_script: skip  # We don't need Docker nor Go
+    #   script:
+    #     - sh ./aio/scripts/
 
 stages:
   - test
diff --git a/aio/deploy/helm-chart/kubernetes-dashboard/.helmignore b/aio/deploy/helm-chart/kubernetes-dashboard/.helmignore
new file mode 100644
index 000000000..91b6b7530
--- /dev/null
+++ b/aio/deploy/helm-chart/kubernetes-dashboard/.helmignore
@@ -0,0 +1,41 @@
+# Copyright 2020 The Kubernetes Authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*~
+
+# Various IDEs
+.project
+.idea/
+*.tmproj
+OWNERS
+
+ci/
diff --git a/aio/deploy/helm-chart/kubernetes-dashboard/Chart.yaml b/aio/deploy/helm-chart/kubernetes-dashboard/Chart.yaml
new file mode 100644
index 000000000..a3ce40df9
--- /dev/null
+++ b/aio/deploy/helm-chart/kubernetes-dashboard/Chart.yaml
@@ -0,0 +1,30 @@
+# Copyright 2017 The Kubernetes Authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: v1
+name: kubernetes-dashboard
+version: 2.0.1
+appVersion: 2.0.1
+description: General-purpose web UI for Kubernetes clusters
+keywords:
+- kubernetes
+- dashboard
+home: https://github.com/kubernetes/dashboard
+sources:
+- https://github.com/kubernetes/dashboard
+maintainers:
+- name: desaintmartin
+  email: cdesaintmartin@wiremind.fr
+icon: https://raw.githubusercontent.com/kubernetes/kubernetes/master/logo/logo.svg
+kubeVersion: ">=1.10.0-0"
diff --git a/aio/deploy/helm-chart/kubernetes-dashboard/OWNERS b/aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
new file mode 100644
index 000000000..0ecc0f483
--- /dev/null
+++ b/aio/deploy/helm-chart/kubernetes-dashboard/OWNERS
@@ -0,0 +1,4 @@
+approvers:
+- desaintmartin
+reviewers:
+- desaintmartin
diff --git a/aio/deploy/helm-chart/kubernetes-dashboard/README.md b/aio/deploy/helm-chart/kubernetes-dashboard/README.md
new file mode 100644
index 000000000..09a1936e5
--- /dev/null
+++ b/aio/deploy/helm-chart/kubernetes-dashboard/README.md
@@ -0,0 +1,145 @@
+# kubernetes-dashboard
+
+[Kubernetes Dashboard](https://github.com/kubernetes/dashboard) is a general purpose, web-based UI for Kubernetes clusters.
+It allows users to manage applications running in the cluster and troubleshoot them, as well as manage the cluster itself.
+
+## TL;DR
+
+```console
+# Add kubernetes-dashboard repository
+helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/
+# Deploy a Helm Release named "my-release" using the kubernetes-dashboard chart
+helm install kubernetes-dashboard/kubernetes-dashboard --name my-release
+```
+
+## Introduction
+
+This chart bootstraps a [Kubernetes Dashboard](https://github.com/kubernetes/dashboard) deployment on a [Kubernetes](http://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager.
+
+## Installing the Chart
+
+To install the chart with the release name `my-release`:
+
+```console
+helm repository add kubernetes-dashboard https://kubernetes.github.io/dashboard/
+helm install kubernetes-dashboard/kubernetes-dashboard --name my-release
+```
+
+The command deploys kubernetes-dashboard on the Kubernetes cluster in the default configuration.
+The [configuration](#configuration) section lists the parameters that can be configured during installation.
+
+## Uninstalling the Chart
+
+To uninstall/delete the `my-release` deployment:
+
+```console
+helm delete my-release
+```
+
+The command removes all the Kubernetes components associated with the chart and deletes the release.
+
+## Upgrading an existing Release to a new major version
+
+A major chart version change (like v1.2.3 -> v2.0.0) indicates that there is an
+incompatible breaking change needing manual actions.
+
+### Upgrade from 1.x.x to 2.x.x
+
+Version 2.0.0 of this chart is the first version hosted in the kubernetes/dashboard.git repository. v1.x.x until 1.10.1 is hosted on https://github.com/helm/charts.
+
+- This version upgrades to kubernetes-dashboard v2.0.0 along with changes in RBAC management: all secrets are explicitely created and ServiceAccount do not have permission to create any secret. On top of that, it completely removes the `clusterAdminRole` parameter, being too dangerous. In order to upgrade, please update your configuration to remove `clusterAdminRole` parameter and uninstall/reinstall the chart.
+- It enables by default values for `podAnnotations` and `securityContext`, please disable them if you don't supoprt them
+- It removes `enableSkipLogin` and `enableInsecureLogin` parameters. Please use `extraEnv` instead.
+- It adds a `ProtocolHttp` parameter, allowing you to switch the backend to plain HTTP and replaces the old `enableSkipLogin` for the network part.
+- If `protocolHttp` is not set, it will automatically add to the `Ingress`, if enabled, annotations to support HTTPS backends for nginx-ingress and GKE Ingresses.
+- It updates all the labels to the new [recommended labels](https://github.com/helm/charts/blob/master/REVIEW_GUIDELINES.md#names-and-labels), most of them being immutable.
+- dashboardContainerSecurityContext has been renamed to containerSecurityContext.
+
+In order to upgrade, please update your configuration to remove `clusterAdminRole` parameter and adapt `enableSkipLogin`, `enableInsecureLogin`, `podAnnotations` and `securityContext` parameters, and uninstall/reinstall the chart.
+
+## Access control
+
+It is critical for the Kubernetes cluster to correctly setup access control of Kubernetes Dashboard.
+See this [guide](https://github.com/kubernetes/dashboard/wiki/Access-control) for best practises.
+
+It is highly recommended to use RBAC with minimal privileges needed for Dashboard to run.
+
+## Configuration
+
+The following table lists the configurable parameters of the kubernetes-dashboard chart and their default values.
+
+Parameter                                       | Description                                                                                                                      | Default
+------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------
+`image.repository`                              | Repository for container image                                                                                                   | `kubernetesui/dashboard`
+`image.tag`                                     | Image tag                                                                                                                        | `v2.0.1`
+`image.pullPolicy`                              | Image pull policy                                                                                                                | `IfNotPresent`
+`image.pullSecrets`                             | Image pull secrets                                                                                                               | `[]`
+`replicaCount`                                  | Number of replicas                                                                                                               | `1`
+`annotations`                                   | Annotations for deployment                                                                                                       | `{}`
+`labels`                                        | Labels for deployment                                                                                                            | `{}`
+`extraArgs`                                     | Additional container arguments                                                                                                   | `[]`
+`extraEnv`                                      | Additional container environment variables                                                                                       | `[]`
+`podAnnotations`                                | Annotations to be added to pods                                                                                                  | `seccomp.security.alpha.kubernetes.io/pod: 'runtime/default'}`
+`nodeSelector`                                  | node labels for pod assignment                                                                                                   | `{}`
+`tolerations`                                   | List of node taints to tolerate (requires Kubernetes >= 1.6)                                                                     | `[]`
+`affinity`                                      | Affinity for pod assignment                                                                                                      | `[]`
+`priorityClassName`                             | Name of Priority Class to assign pods                                                                                            | `nil`
+`resources`                                     | Pod resource requests & limits                                                                                                   | `limits: {cpu: 2, memory: 100Mi}, requests: {cpu: 100m, memory: 100Mi}`
+`protocolHttp`                                  | Serve application over HTTP without TLS                                                                                          | `false`
+`service.type`                                  | Service type                                                                                                                     | `ClusterIP`
+`service.externalPort`                          | Dashboard external port                                                                                                          | `443`
+`service.loadBalancerSourceRanges`              | list of IP CIDRs allowed access to load balancer (if supported)                                                                  | `nil`
+`ingress.annotations`                           | Specify ingress class                                                                                                            | `kubernetes.io/ingress.class: nginx`
+`ingress.labels`                                | Add custom labels                                                                                                                | `[]`
+`ingress.enabled`                               | Enable ingress controller resource                                                                                               | `false`
+`ingress.paths`                                 | Paths to match against incoming requests. Both `/` and `/*` are required to work on gce ingress.                                 | `[/]`
+`ingress.hosts`                                 | Dashboard Hostnames                                                                                                              | `nil`
+`ingress.tls`                                   | Ingress TLS configuration                                                                                                        | `[]`
+`metricsScraper.enabled`                        | Wether to enable dashboard-metrics-scraper                                                                                       | `false`
+`metricsScraper.image.repository`               | Repository for metrics-scraper image                                                                                             | `kubernetesui/metrics-scraper`
+`metricsScraper.image.tag`                      | Repository for metrics-scraper image tag                                                                                         | `v1.0.4`
+`metricsScraper.containerSecurityContext`       | SecurityContext for the kubernetes dashboard metrics scraper container                                                           | `{allowPrivilegeEscalation:false, readOnlyRootFilesystem: true, runAsUser: 1001, runAsGroup: 2001}`
+`metrics-server.enabled`                        | Wether to enable metrics-server                                                                                                  | `false`
+`rbac.create`                                   | Create & use RBAC resources                                                                                                      | `true`
+`rbac.clusterRoleMetrics`                       | If set, an additional cluster role / role binding will be created to access metrics.                                             | `true`
+`rbac.clusterReadOnlyRole`                      | If set, an additional cluster role / role binding will be created with read only permissions to all resources listed inside.     | `false`
+`serviceAccount.create`                         | Whether a new service account name that the agent will use should be created.                                                    | `true`
+`serviceAccount.name`                           | Service account to be used. If not set and serviceAccount.create is `true` a name is generated using the fullname template.      |
+`livenessProbe.initialDelaySeconds`             | Number of seconds to wait before sending first probe                                                                             | `30`
+`livenessProbe.timeoutSeconds`                  | Number of seconds to wait for probe response                                                                                     | `30`
+`podDisruptionBudget.enabled`                   | Create a PodDisruptionBudget                                                                                                     | `false`
+`podDisruptionBudget.minAvailable`              | Minimum available instances; ignored if there is no PodDisruptionBudget                                                          |
+`podDisruptionBudget.maxUnavailable`            | Maximum unavailable instances; ignored if there is no PodDisruptionBudget                                                        |
+`securityContext`                               | PodSecurityContext for pod level securityContext                                                                                 | `nil`
+`containerSecurityContext`                      | SecurityContext for the kubernetes dashboard container                                                                           | `{allowPrivilegeEscalation:false, readOnlyRootFilesystem: true, runAsUser: 1001, runAsGroup: 2001}`
+`networkPolicy.enabled`                         | Whether to create a network policy that allows access to the service                                                             | `false`
+
+
+
+Specify each parameter using the `--set key=value[,key=value]` argument to `helm install`. For example,
+
+```console
+helm install kubernetes-dashboard/kubernetes-dashboard --name my-release \
+  --set=service.externalPort=8080,resources.limits.cpu=200m
+```
+
+Alternatively, a YAML file that specifies the values for the above parameters can be provided while installing the chart. For example,
+
+```console
+helm install kubernetes-dashboard/kubernetes-dashboard --name my-release -f values.yaml
+```
+
+> **Tip**: You can use the default [values.yaml](values.yaml), which is used by default, as reference
+
+## Using the dashboard with 'kubectl proxy'
+
+When running 'kubectl proxy', the address `localhost:8001/ui` automatically expands to:
+
+- `http://localhost:8001/api/v1/namespaces/my-namespace/services/https:kubernetes-dashboard:https/proxy/`
+
+For this to reach the dashboard, the name of the service must be 'kubernetes-dashboard', not any other value as set by Helm.
+You can manually specify this using the value 'fullnameOverride':
+
+```
+fullnameOverride: 'kubernetes-dashboard'
+```
diff --git a/aio/deploy/helm-chart/kubernetes-dashboard/ci/default-values.yaml b/aio/deploy/helm-chart/kubernetes-dashboard/ci/default-values.yaml
new file mode 100644
index 000000000..e69de29bb
diff --git a/aio/deploy/helm-chart/kubernetes-dashboard/ci/ingress-values.yaml b/aio/deploy/helm-chart/kubernetes-dashboard/ci/ingress-values.yaml
new file mode 100644
index 000000000..f6ccc628a
--- /dev/null
+++ b/aio/deploy/helm-chart/kubernetes-dashboard/ci/ingress-values.yaml
@@ -0,0 +1,2 @@
+ingress:
+  enabled: true
diff --git a/aio/deploy/helm-chart/kubernetes-dashboard/ci/metrics-scraper-values.yaml b/aio/deploy/helm-chart/kubernetes-dashboard/ci/metrics-scraper-values.yaml
new file mode 100644
index 000000000..abdda1bee
--- /dev/null
+++ b/aio/deploy/helm-chart/kubernetes-dashboard/ci/metrics-scraper-values.yaml
@@ -0,0 +1,8 @@
+rbac:
+  clusterRoleMetrics: true
+
+metricsScraper:
+  enabled: true
+
+metrics-server:
+  enabled: true
diff --git a/aio/deploy/helm-chart/kubernetes-dashboard/ci/network-policy-values.yaml b/aio/deploy/helm-chart/kubernetes-dashboard/ci/network-policy-values.yaml
new file mode 100644
index 000000000..12e4a94ac
--- /dev/null
+++ b/aio/deploy/helm-chart/kubernetes-dashboard/ci/network-policy-values.yaml
@@ -0,0 +1,2 @@
+networkPolicy:
+  enabled: true
diff --git a/aio/deploy/helm-chart/kubernetes-dashboard/ci/pdb-values.yaml b/aio/deploy/helm-chart/kubernetes-dashboard/ci/pdb-values.yaml
new file mode 100644
index 000000000..cf6d1f5d2
--- /dev/null
+++ b/aio/deploy/helm-chart/kubernetes-dashboard/ci/pdb-values.yaml
@@ -0,0 +1,2 @@
+podDisruptionBudget:
+  enabled: true
diff --git a/aio/deploy/helm-chart/kubernetes-dashboard/ci/rbac-cluster-readonly-role-values.yaml b/aio/deploy/helm-chart/kubernetes-dashboard/ci/rbac-cluster-readonly-role-values.yaml
new file mode 100644
index 000000000..fccc51cb4
--- /dev/null
+++ b/aio/deploy/helm-chart/kubernetes-dashboard/ci/rbac-cluster-readonly-role-values.yaml
@@ -0,0 +1,2 @@
+rbac:
+  clusterReadOnlyRole: true
diff --git a/aio/deploy/helm-chart/kubernetes-dashboard/requirements.lock b/aio/deploy/helm-chart/kubernetes-dashboard/requirements.lock
new file mode 100644
index 000000000..320712403
--- /dev/null
+++ b/aio/deploy/helm-chart/kubernetes-dashboard/requirements.lock
@@ -0,0 +1,6 @@
+dependencies:
+- name: metrics-server
+  repository: https://kubernetes-charts.storage.googleapis.com/
+  version: 2.11.1
+digest: sha256:22392d72416a0330f0c537fcc6cd306da7d25ddf511726bdf8a227d6a6ca8be1
+generated: "2020-04-23T20:58:52.074628+02:00"
diff --git a/aio/deploy/helm-chart/kubernetes-dashboard/requirements.yaml b/aio/deploy/helm-chart/kubernetes-dashboard/requirements.yaml
new file mode 100644
index 000000000..7c253f6d9
--- /dev/null
+++ b/aio/deploy/helm-chart/kubernetes-dashboard/requirements.yaml
@@ -0,0 +1,5 @@
+dependencies:
+  - name: metrics-server
+    version: 2.11.1
+    repository: https://kubernetes-charts.storage.googleapis.com/
+    condition: metrics-server.enabled
diff --git a/aio/deploy/helm-chart/kubernetes-dashboard/templates/NOTES.txt b/aio/deploy/helm-chart/kubernetes-dashboard/templates/NOTES.txt
new file mode 100644
index 000000000..d4c7eaa59
--- /dev/null
+++ b/aio/deploy/helm-chart/kubernetes-dashboard/templates/NOTES.txt
@@ -0,0 +1,49 @@
+*********************************************************************************
+*** PLEASE BE PATIENT: kubernetes-dashboard may take a few minutes to install ***
+*********************************************************************************
+
+{{- if .Values.ingress.enabled }}
+From outside the cluster, the server URL(s) are:
+{{- range .Values.ingress.hosts }}
+{{- if $.Values.protocolHttp }}
+     http://{{ . }}
+{{- else }}
+     https://{{ . }}
+{{- end }}
+{{- end }}
+
+{{- else if contains "NodePort" .Values.service.type }}
+
+Get the Kubernetes Dashboard URL by running:
+  export NODE_PORT=$(kubectl get -n {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ template "kubernetes-dashboard.fullname" . }})
+  export NODE_IP=$(kubectl get nodes -o jsonpath="{.items[0].status.addresses[0].address}")
+{{- if .Values.protocolHttp }}
+  echo http://$NODE_IP:$NODE_PORT/
+{{- else }}
+  echo https://$NODE_IP:$NODE_PORT/
+{{- end }}
+
+{{- else if contains "LoadBalancer" .Values.service.type }}
+
+  NOTE: It may take a few minutes for the LoadBalancer IP to be available.
+        Watch the status with: 'kubectl get svc -n {{ .Release.Namespace }} -w {{ template "kubernetes-dashboard.fullname" . }}'
+
+Get the Kubernetes Dashboard URL by running:
+  export SERVICE_IP=$(kubectl get svc -n {{ .Release.Namespace }} {{ template "kubernetes-dashboard.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
+{{- if .Values.protocolHttp }}
+  echo http://$SERVICE_IP/
+{{- else }}
+  echo https://$SERVICE_IP/
+{{- end }}
+{{- else if contains "ClusterIP"  .Values.service.type }}
+
+Get the Kubernetes Dashboard URL by running:
+  export POD_NAME=$(kubectl get pods -n {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ template "kubernetes-dashboard.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
+{{- if .Values.protocolHttp }}
+  echo http://127.0.0.1:9090/
+  kubectl -n {{ .Release.Namespace }} port-forward $POD_NAME 9090:9090
+{{- else }}
+  echo https://127.0.0.1:8443/
+  kubectl -n {{ .Release.Namespace }} port-forward $POD_NAME 8443:8443
+{{- end }}
+{{- end }}
diff --git a/aio/deploy/helm-chart/kubernetes-dashboard/templates/_helpers.tpl b/aio/deploy/helm-chart/kubernetes-dashboard/templates/_helpers.tpl
new file mode 100644
index 000000000..f52a30294
--- /dev/null
+++ b/aio/deploy/helm-chart/kubernetes-dashboard/templates/_helpers.tpl
@@ -0,0 +1,78 @@
+# Copyright 2017 The Kubernetes Authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+{{/* vim: set filetype=mustache: */}}
+{{/*
+Expand the name of the chart.
+*/}}
+{{- define "kubernetes-dashboard.name" -}}
+{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Create a default fully qualified app name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+If release name contains chart name it will be used as a full name.
+*/}}
+{{- define "kubernetes-dashboard.fullname" -}}
+{{- if .Values.fullnameOverride -}}
+{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- $name := default .Chart.Name .Values.nameOverride -}}
+{{- if contains $name .Release.Name -}}
+{{- .Release.Name | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define "kubernetes-dashboard.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Common labels
+*/}}
+{{- define "kubernetes-dashboard.labels" -}}
+app.kubernetes.io/name: {{ include "kubernetes-dashboard.name" . }}
+helm.sh/chart: {{ include "kubernetes-dashboard.chart" . }}
+app.kubernetes.io/instance: {{ .Release.Name }}
+{{- if .Chart.AppVersion }}
+app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
+{{- end }}
+app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{- end -}}
+
+{{/*
+Common label selectors
+*/}}
+{{- define "kubernetes-dashboard.matchLabels" -}}
+app.kubernetes.io/name: {{ include "kubernetes-dashboard.name" . }}
+app.kubernetes.io/instance: {{ .Release.Name }}
+{{- end -}}
+
+{{/*
+Name of the service account to use
+*/}}
+{{- define "kubernetes-dashboard.serviceAccountName" -}}
+{{- if .Values.serviceAccount.create -}}
+    {{ default (include "kubernetes-dashboard.fullname" .) .Values.serviceAccount.name }}
+{{- else -}}
+    {{ default "default" .Values.serviceAccount.name }}
+{{- end -}}
+{{- end -}}
diff --git a/aio/deploy/helm-chart/kubernetes-dashboard/templates/clusterrole-metrics.yaml b/aio/deploy/helm-chart/kubernetes-dashboard/templates/clusterrole-metrics.yaml
new file mode 100644
index 000000000..441795f94
--- /dev/null
+++ b/aio/deploy/helm-chart/kubernetes-dashboard/templates/clusterrole-metrics.yaml
@@ -0,0 +1,27 @@
+# Copyright 2017 The Kubernetes Authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+{{ if .Values.rbac.clusterRoleMetrics -}}
+kind: ClusterRole
+apiVersion: rbac.authorization.k8s.io/v1
+metadata:
+  name: "{{ template "kubernetes-dashboard.fullname" . }}-metrics"
+  labels:
+{{ include "kubernetes-dashboard.labels" . | indent 4 }}
+rules:
+  # Allow Metrics Scraper to get metrics from the Metrics server
+  - apiGroups: ["metrics.k8s.io"]
+    resources: ["pods", "nodes"]
+    verbs: ["get", "list", "watch"]
+{{- end }}
diff --git a/aio/deploy/helm-chart/kubernetes-dashboard/templates/clusterrole-readonly.yaml b/aio/deploy/helm-chart/kubernetes-dashboard/templates/clusterrole-readonly.yaml
new file mode 100755
index 000000000..059e04613
--- /dev/null
+++ b/aio/deploy/helm-chart/kubernetes-dashboard/templates/clusterrole-readonly.yaml
@@ -0,0 +1,146 @@
+# Copyright 2017 The Kubernetes Authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+{{ if .Values.rbac.clusterReadOnlyRole -}}
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRole
+metadata:
+  name: "{{ template "kubernetes-dashboard.fullname" . }}-readonly"
+  labels:
+{{ include "kubernetes-dashboard.labels" . | indent 4 }}
+rules:
+  - apiGroups:
+      - ""
+    resources:
+      - configmaps
+      - endpoints
+      - persistentvolumeclaims
+      - pods
+      - replicationcontrollers
+      - replicationcontrollers/scale
+      - serviceaccounts
+      - services
+      - nodes
+      - persistentvolumeclaims
+      - persistentvolumes
+    verbs:
+      - get
+      - list
+      - watch
+  - apiGroups:
+      - ""
+    resources:
+      - bindings
+      - events
+      - limitranges
+      - namespaces/status
+      - pods/log
+      - pods/status
+      - replicationcontrollers/status
+      - resourcequotas
+      - resourcequotas/status
+    verbs:
+      - get
+      - list
+      - watch
+  - apiGroups:
+      - ""
+    resources:
+      - namespaces
+    verbs:
+      - get
+      - list
+      - watch
+  - apiGroups:
+      - apps
+    resources:
+      - daemonsets
+      - deployments
+      - deployments/scale
+      - replicasets
+      - replicasets/scale
+      - statefulsets
+    verbs:
+      - get
+      - list
+      - watch
+  - apiGroups:
+      - autoscaling
+    resources:
+      - horizontalpodautoscalers
+    verbs:
+      - get
+      - list
+      - watch
+  - apiGroups:
+      - batch
+    resources:
+      - cronjobs
+      - jobs
+    verbs:
+      - get
+      - list
+      - watch
+  - apiGroups:
+      - extensions
+    resources:
+      - daemonsets
+      - deployments
+      - deployments/scale
+      - ingresses
+      - networkpolicies
+      - replicasets
+      - replicasets/scale
+      - replicationcontrollers/scale
+    verbs:
+      - get
+      - list
+      - watch
+  - apiGroups:
+      - policy
+    resources:
+      - poddisruptionbudgets
+    verbs:
+      - get
+      - list
+      - watch
+  - apiGroups:
+      - networking.k8s.io
+    resources:
+      - networkpolicies
+    verbs:
+      - get
+      - list
+      - watch
+  - apiGroups:
+      - storage.k8s.io
+    resources:
+      - storageclasses
+      - volumeattachments
+    verbs:
+      - get
+      - list
+      - watch
+  - apiGroups:
+      - rbac.authorization.k8s.io
+    resources:
+      - clusterrolebindings
+      - clusterroles
+      - roles
+      - rolebindings
+    verbs:
+      - get
+      - list
+      - watch
+{{- end -}}
diff --git a/aio/deploy/helm-chart/kubernetes-dashboard/templates/clusterrolebinding-metrics.yaml b/aio/deploy/helm-chart/kubernetes-dashboard/templates/clusterrolebinding-metrics.yaml
new file mode 100644
index 000000000..d88c8192c
--- /dev/null
+++ b/aio/deploy/helm-chart/kubernetes-dashboard/templates/clusterrolebinding-metrics.yaml
@@ -0,0 +1,30 @@
+# Copyright 2017 The Kubernetes Authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+{{ if .Values.rbac.clusterRoleMetrics -}}
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRoleBinding
+metadata:
+  name: "{{ template "kubernetes-dashboard.fullname" . }}-metrics"
+  labels:
+{{ include "kubernetes-dashboard.labels" . | indent 4 }}
+roleRef:
+  apiGroup: rbac.authorization.k8s.io
+  kind: ClusterRole
+  name: {{ template "kubernetes-dashboard.fullname" . }}-metrics
+subjects:
+  - kind: ServiceAccount
+    name: {{ template "kubernetes-dashboard.serviceAccountName" . }}
+    namespace: {{ .Release.Namespace }}
+{{- end }}
diff --git a/aio/deploy/helm-chart/kubernetes-dashboard/templates/clusterrolebinding-readonly.yaml b/aio/deploy/helm-chart/kubernetes-dashboard/templates/clusterrolebinding-readonly.yaml
new file mode 100644
index 000000000..c52647a33
--- /dev/null
+++ b/aio/deploy/helm-chart/kubernetes-dashboard/templates/clusterrolebinding-readonly.yaml
@@ -0,0 +1,30 @@
+# Copyright 2017 The Kubernetes Authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+{{ if .Values.rbac.clusterReadOnlyRole -}}
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRoleBinding
+metadata:
+  name: {{ template "kubernetes-dashboard.fullname" . }}-readonly
+  labels:
+{{ include "kubernetes-dashboard.labels" . | indent 4 }}
+roleRef:
+  apiGroup: rbac.authorization.k8s.io
+  kind: ClusterRole
+  name: {{ template "kubernetes-dashboard.fullname" . }}-readonly
+subjects:
+  - kind: ServiceAccount
+    name: {{ template "kubernetes-dashboard.serviceAccountName" . }}
+    namespace: {{ .Release.Namespace }}
+{{- end }}
diff --git a/aio/deploy/helm-chart/kubernetes-dashboard/templates/deployment.yaml b/aio/deploy/helm-chart/kubernetes-dashboard/templates/deployment.yaml
new file mode 100644
index 000000000..741b9bfb0
--- /dev/null
+++ b/aio/deploy/helm-chart/kubernetes-dashboard/templates/deployment.yaml
@@ -0,0 +1,163 @@
+# Copyright 2017 The Kubernetes Authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: {{ template "kubernetes-dashboard.fullname" . }}
+{{- with .Values.annotations }}
+  annotations:
+{{ toYaml . | indent 4 }}
+{{- end }}
+  labels:
+{{ include "kubernetes-dashboard.labels" . | indent 4 }}
+    app.kubernetes.io/component: kubernetes-dashboard
+{{- with .Values.labels }}
+{{ toYaml . | indent 4 }}
+{{- end }}
+spec:
+  replicas: {{ .Values.replicaCount }}
+  strategy:
+    rollingUpdate:
+      maxSurge: 0
+      maxUnavailable: 1
+    type: RollingUpdate
+  selector:
+    matchLabels:
+{{ include "kubernetes-dashboard.matchLabels" . | indent 6 }}
+      app.kubernetes.io/component: kubernetes-dashboard
+  template:
+    metadata:
+{{- with .Values.podAnnotations }}
+      annotations:
+{{ toYaml . | indent 8 }}
+{{- end }}
+      labels:
+{{ include "kubernetes-dashboard.labels" . | indent 8 }}
+        app.kubernetes.io/component: kubernetes-dashboard
+    spec:
+{{- with .Values.securityContext }}
+      securityContext:
+{{ toYaml . | indent 8 }}
+{{- end }}
+      serviceAccountName: {{ template "kubernetes-dashboard.serviceAccountName" . }}
+      containers:
+      - name: {{ .Chart.Name }}
+        image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
+        imagePullPolicy: {{ .Values.image.pullPolicy }}
+        args:
+          - --namespace={{ .Release.Namespace }}
+{{- if not .Values.protocolHttp }}
+          - --auto-generate-certificates
+{{- end }}
+{{- if .Values.metricsScraper.enabled }}
+          - --sidecar-host=http://127.0.0.1:8000
+{{- end }}
+{{- with .Values.extraArgs }}
+{{ toYaml . | indent 10 }}
+{{- end }}
+{{- with .Values.extraEnv }}
+        env:
+{{ toYaml . | indent 10 }}
+{{- end }}
+        ports:
+{{- if .Values.protocolHttp }}
+        - name: http
+          containerPort: 9090
+          protocol: TCP
+{{- else }}
+        - name: https
+          containerPort: 8443
+          protocol: TCP
+{{- end }}
+        volumeMounts:
+        - name: kubernetes-dashboard-certs
+          mountPath: /certs
+          # Create on-disk volume to store exec logs
+        - mountPath: /tmp
+          name: tmp-volume
+        livenessProbe:
+          httpGet:
+{{- if .Values.protocolHttp }}
+            scheme: HTTP
+            path: /
+            port: 9090
+{{- else }}
+            scheme: HTTPS
+            path: /
+            port: 8443
+{{- end }}
+          initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }}
+          timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }}
+{{- with .Values.resources }}
+        resources:
+{{ toYaml . | indent 10 }}
+{{- end }}
+{{- with .Values.containerSecurityContext }}
+        securityContext:
+{{ toYaml . | indent 10 }}
+{{- end }}
+{{- if .Values.metricsScraper.enabled }}
+      - name: dashboard-metrics-scraper
+        image: "{{ .Values.metricsScraper.image.repository }}:{{ .Values.metricsScraper.image.tag }}"
+        imagePullPolicy: {{ .Values.image.pullPolicy }}
+        ports:
+          - containerPort: 8000
+            protocol: TCP
+        livenessProbe:
+          httpGet:
+            scheme: HTTP
+            path: /
+            port: 8000
+          initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }}
+          timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }}
+        volumeMounts:
+        - mountPath: /tmp
+          name: tmp-volume
+{{- with .Values.metricsScraper.containerSecurityContext }}
+        securityContext:
+{{ toYaml . | indent 10 }}
+{{- end }}
+{{- with .Values.metricsScraper.resources }}
+        resources:
+{{ toYaml . | indent 10 }}
+{{- end }}
+{{- end }}
+{{- with .Values.image.pullSecrets }}
+      imagePullSecrets:
+{{- range . }}
+        - name: {{ . }}
+{{- end }}
+{{- end }}
+{{- with .Values.nodeSelector }}
+      nodeSelector:
+{{ toYaml . | indent 8 }}
+{{- end }}
+{{- with .Values.priorityClassName }}
+      priorityClassName: "{{ . }}"
+{{- end }}
+      volumes:
+      - name: kubernetes-dashboard-certs
+        secret:
+          secretName: {{ template "kubernetes-dashboard.fullname" . }}-certs
+      - name: tmp-volume
+        emptyDir: {}
+{{- with .Values.tolerations }}
+      tolerations:
+{{ toYaml . | indent 8 }}
+{{- end }}
+{{- with .Values.affinity }}
+      affinity:
+{{ toYaml . | indent 8 }}
+{{- end }}
diff --git a/aio/deploy/helm-chart/kubernetes-dashboard/templates/ingress.yaml b/aio/deploy/helm-chart/kubernetes-dashboard/templates/ingress.yaml
new file mode 100644
index 000000000..cd4fb8ec4
--- /dev/null
+++ b/aio/deploy/helm-chart/kubernetes-dashboard/templates/ingress.yaml
@@ -0,0 +1,67 @@
+# Copyright 2017 The Kubernetes Authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+{{ if .Values.ingress.enabled -}}
+{{- $serviceName := include "kubernetes-dashboard.fullname" . -}}
+{{- $servicePort := .Values.service.externalPort -}}
+{{- $paths := .Values.ingress.paths -}}
+apiVersion: extensions/v1beta1
+kind: Ingress
+metadata:
+  name: {{ template "kubernetes-dashboard.fullname" . }}
+  labels:
+{{ include "kubernetes-dashboard.labels" . | indent 4 }}
+  {{- range $key, $value := .Values.ingress.labels }}
+    {{ $key }}: {{ $value | quote }}
+  {{- end }}
+
+  annotations:
+{{- if not .Values.protocolHttp }}
+    # Add https backend protocol support for ingress-nginx
+    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
+    # Add https backend protocol support for GKE
+    service.alpha.kubernetes.io/app-protocols: '{"https":"HTTPS"}'
+{{- end }}
+{{- with .Values.ingress.annotations }}
+{{ toYaml . | indent 4 }}
+{{- end }}
+spec:
+  rules:
+  {{- if .Values.ingress.hosts }}
+  {{- range $host := .Values.ingress.hosts }}
+    - host: {{ $host }}
+      http:
+        paths:
+  {{- range $p := $paths }}
+          - path: {{ $p }}
+            backend:
+              serviceName: {{ $serviceName }}
+              servicePort: {{ $servicePort }}
+  {{- end -}}
+  {{- end -}}
+  {{- else }}
+    - http:
+        paths:
+  {{- range $p := $paths }}
+          - path: {{ $p }}
+            backend:
+              serviceName: {{ $serviceName }}
+              servicePort: {{ $servicePort }}
+  {{- end -}}
+  {{- end -}}
+  {{- if .Values.ingress.tls }}
+  tls:
+{{ toYaml .Values.ingress.tls | indent 4 }}
+  {{- end -}}
+{{- end -}}
diff --git a/aio/deploy/helm-chart/kubernetes-dashboard/templates/networkpolicy.yaml b/aio/deploy/helm-chart/kubernetes-dashboard/templates/networkpolicy.yaml
new file mode 100755
index 000000000..a550bd2eb
--- /dev/null
+++ b/aio/deploy/helm-chart/kubernetes-dashboard/templates/networkpolicy.yaml
@@ -0,0 +1,38 @@
+# Copyright 2017 The Kubernetes Authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+{{ if .Values.networkPolicy.enabled -}}
+apiVersion: networking.k8s.io/v1
+kind: NetworkPolicy
+metadata:
+  name: {{ template "kubernetes-dashboard.fullname" . }}
+  labels:
+    app: {{ template "kubernetes-dashboard.name" . }}
+    chart: {{ template "kubernetes-dashboard.chart" . }}
+    release: {{ .Release.Name }}
+    heritage: {{ .Release.Service }}
+spec:
+  podSelector:
+    matchLabels:
+{{ include "kubernetes-dashboard.matchLabels" . | indent 6 }}
+  ingress:
+  - ports:
+{{- if .Values.protocolHttp }}
+    - port: http
+      protocol: TCP
+{{- else }}
+    - port: https
+      protocol: TCP
+{{- end -}}
+{{- end -}}
diff --git a/aio/deploy/helm-chart/kubernetes-dashboard/templates/pdb.yaml b/aio/deploy/helm-chart/kubernetes-dashboard/templates/pdb.yaml
new file mode 100644
index 000000000..c044658ba
--- /dev/null
+++ b/aio/deploy/helm-chart/kubernetes-dashboard/templates/pdb.yaml
@@ -0,0 +1,32 @@
+# Copyright 2017 The Kubernetes Authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+{{ if .Values.podDisruptionBudget.enabled -}}
+apiVersion: policy/v1beta1
+kind: PodDisruptionBudget
+metadata:
+  labels:
+{{ include "kubernetes-dashboard.labels" . | indent 4 }}
+  name: {{ template "kubernetes-dashboard.fullname" . }}
+spec:
+  {{- if .Values.podDisruptionBudget.minAvailable }}
+  minAvailable: {{ .Values.podDisruptionBudget.minAvailable }}
+  {{- end  }}
+  {{- if .Values.podDisruptionBudget.maxUnavailable }}
+  maxUnavailable: {{ .Values.podDisruptionBudget.maxUnavailable }}
+  {{- end  }}
+  selector:
+    matchLabels:
+{{ include "kubernetes-dashboard.matchLabels" . | indent 6 }}
+{{- end -}}
diff --git a/aio/deploy/helm-chart/kubernetes-dashboard/templates/role.yaml b/aio/deploy/helm-chart/kubernetes-dashboard/templates/role.yaml
new file mode 100644
index 000000000..ef9a84a73
--- /dev/null
+++ b/aio/deploy/helm-chart/kubernetes-dashboard/templates/role.yaml
@@ -0,0 +1,42 @@
+# Copyright 2017 The Kubernetes Authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+{{ if .Values.rbac.create -}}
+apiVersion: rbac.authorization.k8s.io/v1
+kind: Role
+metadata:
+  name: {{ template "kubernetes-dashboard.fullname" . }}
+  labels:
+{{ include "kubernetes-dashboard.labels" . | indent 4 }}
+rules:
+    # Allow Dashboard to get, update and delete Dashboard exclusive secrets.
+  - apiGroups: [""]
+    resources: ["secrets"]
+    resourceNames: ["kubernetes-dashboard-key-holder", "kubernetes-dashboard-certs", "kubernetes-dashboard-csrf"]
+    verbs: ["get", "update", "delete"]
+    # Allow Dashboard to get and update 'kubernetes-dashboard-settings' config map.
+  - apiGroups: [""]
+    resources: ["configmaps"]
+    resourceNames: ["kubernetes-dashboard-settings"]
+    verbs: ["get", "update"]
+    # Allow Dashboard to get metrics.
+  - apiGroups: [""]
+    resources: ["services"]
+    resourceNames: ["heapster", "dashboard-metrics-scraper"]
+    verbs: ["proxy"]
+  - apiGroups: [""]
+    resources: ["services/proxy"]
+    resourceNames: ["heapster", "http:heapster:", "https:heapster:", "dashboard-metrics-scraper", "http:dashboard-metrics-scraper"]
+    verbs: ["get"]
+{{- end -}}
diff --git a/aio/deploy/helm-chart/kubernetes-dashboard/templates/rolebinding.yaml b/aio/deploy/helm-chart/kubernetes-dashboard/templates/rolebinding.yaml
new file mode 100755
index 000000000..01fb7638a
--- /dev/null
+++ b/aio/deploy/helm-chart/kubernetes-dashboard/templates/rolebinding.yaml
@@ -0,0 +1,30 @@
+# Copyright 2017 The Kubernetes Authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+{{ if .Values.rbac.create -}}
+apiVersion: rbac.authorization.k8s.io/v1
+kind: RoleBinding
+metadata:
+  name: {{ template "kubernetes-dashboard.fullname" . }}
+  labels:
+{{ include "kubernetes-dashboard.labels" . | indent 4 }}
+roleRef:
+  apiGroup: rbac.authorization.k8s.io
+  kind: Role
+  name: {{ template "kubernetes-dashboard.fullname" . }}
+subjects:
+  - kind: ServiceAccount
+    name: {{ template "kubernetes-dashboard.serviceAccountName" . }}
+    namespace: {{ .Release.Namespace }}
+{{- end -}}
diff --git a/aio/deploy/helm-chart/kubernetes-dashboard/templates/secret.yaml b/aio/deploy/helm-chart/kubernetes-dashboard/templates/secret.yaml
new file mode 100644
index 000000000..72a28ac39
--- /dev/null
+++ b/aio/deploy/helm-chart/kubernetes-dashboard/templates/secret.yaml
@@ -0,0 +1,40 @@
+# Copyright 2017 The Kubernetes Authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# kubernetes-dashboard-certs
+apiVersion: v1
+kind: Secret
+metadata:
+  labels:
+{{ include "kubernetes-dashboard.labels" . | indent 4 }}
+  name: {{ template "kubernetes-dashboard.fullname" . }}-certs
+type: Opaque
+---
+# kubernetes-dashboard-csrf
+apiVersion: v1
+kind: Secret
+metadata:
+  labels:
+{{ include "kubernetes-dashboard.labels" . | indent 4 }}
+  name: kubernetes-dashboard-csrf
+type: Opaque
+---
+# kubernetes-dashboard-key-holder
+apiVersion: v1
+kind: Secret
+metadata:
+  labels:
+{{ include "kubernetes-dashboard.labels" . | indent 4 }}
+  name: kubernetes-dashboard-key-holder
+type: Opaque
diff --git a/aio/deploy/helm-chart/kubernetes-dashboard/templates/service.yaml b/aio/deploy/helm-chart/kubernetes-dashboard/templates/service.yaml
new file mode 100644
index 000000000..9abefd301
--- /dev/null
+++ b/aio/deploy/helm-chart/kubernetes-dashboard/templates/service.yaml
@@ -0,0 +1,50 @@
+# Copyright 2017 The Kubernetes Authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ template "kubernetes-dashboard.fullname" . }}
+  labels:
+{{ include "kubernetes-dashboard.labels" . | indent 4 }}
+    app.kubernetes.io/component: kubernetes-dashboard
+    kubernetes.io/cluster-service: "true"
+{{- if .Values.service.labels }}
+{{ toYaml .Values.service.labels | indent 4 }}
+{{- end }}
+{{- if .Values.service.annotations }}
+  annotations:
+{{ toYaml .Values.service.annotations | indent 4 }}
+{{- end }}
+spec:
+  type: {{ .Values.service.type }}
+  ports:
+  - port: {{ .Values.service.externalPort }}
+{{- if .Values.protocolHttp }}
+    targetPort: http
+    name: http
+{{- else }}
+    targetPort: https
+    name: https
+{{- end }}
+{{- if hasKey .Values.service "nodePort" }}
+    nodePort: {{ .Values.service.nodePort }}
+{{- end }}
+{{- if .Values.service.loadBalancerSourceRanges }}
+  loadBalancerSourceRanges:
+{{ toYaml .Values.service.loadBalancerSourceRanges | indent 4 }}
+{{- end }}
+  selector:
+{{ include "kubernetes-dashboard.matchLabels" . | indent 4 }}
+    app.kubernetes.io/component: kubernetes-dashboard
diff --git a/aio/deploy/helm-chart/kubernetes-dashboard/templates/serviceaccount.yaml b/aio/deploy/helm-chart/kubernetes-dashboard/templates/serviceaccount.yaml
new file mode 100644
index 000000000..c276abadc
--- /dev/null
+++ b/aio/deploy/helm-chart/kubernetes-dashboard/templates/serviceaccount.yaml
@@ -0,0 +1,22 @@
+# Copyright 2017 The Kubernetes Authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+{{ if .Values.serviceAccount.create -}}
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+  labels:
+{{ include "kubernetes-dashboard.labels" . | indent 4 }}
+  name: {{ template "kubernetes-dashboard.serviceAccountName" . }}
+{{- end -}}
diff --git a/aio/deploy/helm-chart/kubernetes-dashboard/values.yaml b/aio/deploy/helm-chart/kubernetes-dashboard/values.yaml
new file mode 100644
index 000000000..6667a7743
--- /dev/null
+++ b/aio/deploy/helm-chart/kubernetes-dashboard/values.yaml
@@ -0,0 +1,221 @@
+# Copyright 2020 The Kubernetes Authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Default values for kubernetes-dashboard
+# This is a YAML-formatted file.
+# Declare name/value pairs to be passed into your templates.
+# name: value
+
+image:
+  repository: kubernetesui/dashboard
+  tag: v2.0.1
+  pullPolicy: IfNotPresent
+  pullSecrets: []
+
+replicaCount: 1
+
+## Here annotations can be added to the kubernetes dashboard deployment
+annotations: {}
+## Here labels can be added to the kubernetes dashboard deployment
+labels: {}
+
+## Additional container arguments
+##
+# extraArgs:
+#   - --enable-skip-login
+#   - --enable-insecure-login
+#   - --system-banner="Welcome to Kubernetes"
+
+## Additional container environment variables
+##
+extraEnv: []
+# - name: SOME_VAR
+#   value: 'some value'
+
+# Annotations to be added to kubernetes dashboard pods
+podAnnotations:
+  seccomp.security.alpha.kubernetes.io/pod: 'runtime/default'
+
+## Node labels for pod assignment
+## Ref: https://kubernetes.io/docs/user-guide/node-selection/
+##
+nodeSelector: {}
+
+## List of node taints to tolerate (requires Kubernetes >= 1.6)
+tolerations: []
+#  - key: "key"
+#    operator: "Equal|Exists"
+#    value: "value"
+#    effect: "NoSchedule|PreferNoSchedule|NoExecute"
+
+## Affinity
+## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity
+affinity: {}
+
+# priorityClassName: ""
+
+resources:
+  requests:
+    cpu: 100m
+    memory: 200Mi
+  limits:
+    cpu: 2
+    memory: 200Mi
+
+## Serve application over HTTP without TLS
+##
+## Note: If set to true, you may want to add --enable-insecure-login to extraArgs
+protocolHttp: false
+
+service:
+  type: ClusterIP
+  externalPort: 443
+
+  # LoadBalancerSourcesRange is a list of allowed CIDR values, which are combined with ServicePort to
+  # set allowed inbound rules on the security group assigned to the master load balancer
+  # loadBalancerSourceRanges: []
+
+  ## Additional Kubernetes Dashboard Service annotations
+  annotations: {}
+
+  ## Here labels can be added to the Kubernetes Dashboard service
+  labels: {}
+
+ingress:
+  ## If true, Kubernetes Dashboard Ingress will be created.
+  ##
+  enabled: false
+
+  ## Kubernetes Dashboard Ingress annotations
+  ##
+  ## Add custom labels
+  # labels:
+  #   key: value
+  # annotations:
+  #   kubernetes.io/ingress.class: nginx
+  #   kubernetes.io/tls-acme: 'true'
+  ## If you plan to use TLS backend with enableInsecureLogin set to false
+  ## (default), you need to uncomment the below.
+  ## If you use ingress-nginx < 0.21.0
+  #   nginx.ingress.kubernetes.io/secure-backends: "true"
+  ## if you use ingress-nginx >= 0.21.0
+  #   nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
+
+
+  ## Kubernetes Dashboard Ingress paths
+  ##
+  paths:
+    - /
+  #  - /*
+
+  ## Kubernetes Dashboard Ingress hostnames
+  ## Must be provided if Ingress is enabled
+  ##
+  # hosts:
+  #   - kubernetes-dashboard.domain.com
+
+  ## Kubernetes Dashboard Ingress TLS configuration
+  ## Secrets must be manually created in the namespace
+  ##
+  # tls:
+  #   - secretName: kubernetes-dashboard-tls
+  #     hosts:
+  #       - kubernetes-dashboard.domain.com
+
+## Metrics Scraper
+## Container to scrape, store, and retrieve a window of time from the Metrics Server.
+## refs: https://github.com/kubernetes-sigs/dashboard-metrics-scraper
+metricsScraper:
+  enabled: false
+  image:
+    repository: kubernetesui/metrics-scraper
+    tag: v1.0.4
+  resources: {}
+  ## SecurityContext for the metrics scraper container
+  containerSecurityContext:
+    allowPrivilegeEscalation: false
+    readOnlyRootFilesystem: true
+    runAsUser: 1001
+    runAsGroup: 2001
+
+
+## Optional Metrics Server sub-chart
+## Enable this is you don't already have metrics-server enabled on your cluster and
+## want to use it with dashboard metrics-scraper
+## refs:
+##  - https://hub.helm.sh/charts/stable/metrics-server
+##  - https://github.com/kubernetes-sigs/metrics-server
+metrics-server:
+  enabled: false
+  ## Example for additional args
+  # args:
+  #  - --kubelet-preferred-address-types=InternalIP
+  #  - --kubelet-insecure-tls
+
+rbac:
+  # Specifies whether namespaced RBAC resources (Role, Rolebinding) should be created
+  create: true
+
+  # Specifies whether cluster-wide RBAC resources (ClusterRole, ClusterRolebinding) to access metrics should be created
+  # Independent from rbac.create parameter.
+  clusterRoleMetrics: true
+
+  # Start in ReadOnly mode.
+  # Only dashboard-related Secrets and ConfigMaps will still be available for writing.
+  #
+  # The basic idea of the clusterReadOnlyRole
+  # is not to hide all the secrets and sensitive data but more
+  # to avoid accidental changes in the cluster outside the standard CI/CD.
+  #
+  # It is NOT RECOMMENDED to use this version in production.
+  # Instead you should review the role and remove all potentially sensitive parts such as
+  # access to persistentvolumes, pods/log etc.
+  #
+  # Independent from rbac.create parameter.
+  clusterReadOnlyRole: false
+
+serviceAccount:
+  # Specifies whether a service account should be created
+  create: true
+  # The name of the service account to use.
+  # If not set and create is true, a name is generated using the fullname template
+  name:
+
+livenessProbe:
+  # Number of seconds to wait before sending first probe
+  initialDelaySeconds: 30
+  # Number of seconds to wait for probe response
+  timeoutSeconds: 30
+
+## podDisruptionBudget
+## ref: https://kubernetes.io/docs/tasks/run-application/configure-pdb/
+podDisruptionBudget:
+  enabled: false
+  minAvailable:
+  maxUnavailable:
+
+## PodSecurityContext for pod level securityContext
+# securityContext:
+#   runAsUser: 1001
+#   runAsGroup: 2001
+
+## SecurityContext for the kubernetes dashboard container
+containerSecurityContext:
+  allowPrivilegeEscalation: false
+  readOnlyRootFilesystem: true
+  runAsUser: 1001
+  runAsGroup: 2001
+
+networkPolicy:
+  enabled: false
diff --git a/aio/scripts/helm-lint.sh b/aio/scripts/helm-lint.sh
new file mode 100755
index 000000000..f5cc967a7
--- /dev/null
+++ b/aio/scripts/helm-lint.sh
@@ -0,0 +1,43 @@
+#!/usr/bin/env bash
+# Copyright 2017 The Kubernetes Authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# This script takes an argument: the tag name ("v1.2.3") to release from.
+
+# Exit on error.
+set -e;
+
+# Import config.
+ROOT_DIR="$(cd $(dirname "${BASH_SOURCE}")/../.. && pwd -P)"
+. "${ROOT_DIR}/aio/scripts/conf.sh"
+
+cd "$AIO_DIR/deploy/helm-chart/kubernetes-dashboard"
+say "\nBuildint Helm Chart dependencies..."
+helm repo add stable https://kubernetes-charts.storage.googleapis.com/
+helm dependency build
+for VALUES_FILE in ci/*; do
+  say "\nLinting and validating Helm Chart using $VALUES_FILE values file..."
+  # Simple lint
+  helm lint --values "$VALUES_FILE";
+
+  # Validate all generated manifest against Kubernetes json schema
+  mkdir helm-output;
+  helm template --values "$VALUES_FILE" --output-dir helm-output .;
+  find helm-output -type f -exec \
+    kubeval \
+    --kubernetes-version 1.16.0 \
+    --schema-location https://raw.githubusercontent.com/instrumenta/kubernetes-json-schema/master \
+    {} +;
+  rm -rf helm-output;
+done;
diff --git a/aio/scripts/helm-release-chart.sh b/aio/scripts/helm-release-chart.sh
new file mode 100755
index 000000000..f54fc9daf
--- /dev/null
+++ b/aio/scripts/helm-release-chart.sh
@@ -0,0 +1,50 @@
+#!/usr/bin/env bash
+# Copyright 2017 The Kubernetes Authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# This script takes an argument: the tag name ("v1.2.3") to release from.
+
+# Exit on error.
+set -e
+
+# Import config.
+ROOT_DIR="$(cd $(dirname "${BASH_SOURCE}")/../.. && pwd -P)"
+. "${ROOT_DIR}/aio/scripts/conf.sh"
+
+# Declare variables.
+HELM_CHART_DIR="$AIO_DIR/deploy/helm-chart/kubernetes-dashboard"
+
+function release-helm-chart {
+  if [ -n "$(git status --porcelain)" ]; then
+    saye "\nGit working tree not clean, aborting."
+    exit 1
+  fi
+  say "\nGenerating Helm Chart package for new version."
+  say "Please note that your gh-pages branch, if it locally exists, should be up-to-date."
+  helm repo add stable https://kubernetes-charts.storage.googleapis.com/
+  helm dependency build "$HELM_CHART_DIR"
+  helm package "$HELM_CHART_DIR"
+  rm -rf "$HELM_CHART_DIR/charts/"
+  say "\nSwitching git branch to gh-pages so that we can commit package along the previous versions."
+  git checkout gh-pages
+  say "\nGenerating new Helm index, containing all existing versions in gh-pages (previous ones + new one)."
+  helm repo index .
+  say "\nCommit new package and index."
+  git add -A "./kubernetes-dashboard-*.tgz" ./index.yaml && git commit -m "Update Helm repository from CI."
+  say "\nIf you are happy with the changes, please manually push to the gh-pages branch. No force should be needed."
+  say "Assuming upstream is your remote, please run: git push upstream gh-pages."
+}
+
+# Execute script.
+release-helm-chart
diff --git a/docs/developer/release-procedures.md b/docs/developer/release-procedures.md
index c3bb827f8..5149ae60a 100644
--- a/docs/developer/release-procedures.md
+++ b/docs/developer/release-procedures.md
@@ -9,11 +9,13 @@ After significant improvements have been done it is worth to release a new versi
     * `package.json` and `package-lock.json`
     * `aio/gulp/conf.js`
     * YAML files from `aio/deploy`
+    * Helm Chart from `aio/deploy/helm-chart/kubernetes-dashboard`: `image.tag` of `README.md` and `values.yaml`, `version` and `appVersion` of `Chart.yaml`
 3. Get the pull request reviewed and merged.
 4. Create a git [release](https://github.com/kubernetes/dashboard/releases/) tag for the merged pull request. Release description should include a changelog.
 5. Update add-ons on the [Kubernetes](https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/dashboard) repository. If the update is minor, all that needs to be done is to change image version number in the main controller config file (`dashboard-controller.yaml`), and other configs, as described in the header of the config. If the release is major, this needs coordination with Kubernetes core team and possibly alignment with the schedule of the core.
 6. Update addon config in the [minikube](https://github.com/kubernetes/minikube/tree/master/deploy/addons) repository.
 7. Update addon config in the [kops](https://github.com/kubernetes/kops/tree/master/addons/kubernetes-dashboard) repository.
+8. Release Helm Chart by running the `aio/scripts/helm-release-chart.sh` script from the newly created git tag, then push the git `gh-pages` branch of your `https://github.com/kubernetes/dashboard/` git remote.
 
 Official release procedures are done by CI after successful TAG build automatically, that are pushed to [`kubernetesui/dashboard*`](https://hub.docker.com/u/kubernetesui) repositories.
 
diff --git a/i18n/de/messages.de.xlf b/i18n/de/messages.de.xlf
index c4a8cb6b0..93b8d1ee8 100644
--- a/i18n/de/messages.de.xlf
+++ b/i18n/de/messages.de.xlf
@@ -4206,7 +4206,7 @@
       </trans-unit>
       <trans-unit id="b129f142540fcf057f58e5ffc3a4bd1aae6f074b" datatype="html">
         <source>System information</source>
-        <target>Systeminforamtion</target>
+        <target>Systeminformation</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/resource/cluster/node/detail/template.html</context>
           <context context-type="linenumber">69</context>
diff --git a/i18n/zh-Hans/messages.zh-Hans.xlf b/i18n/zh-Hans/messages.zh-Hans.xlf
index 42ab9e2b0..353b26967 100644
--- a/i18n/zh-Hans/messages.zh-Hans.xlf
+++ b/i18n/zh-Hans/messages.zh-Hans.xlf
@@ -1678,7 +1678,7 @@
       </trans-unit>
       <trans-unit id="a3e6ad731f3d27e2fd80064adf380f461ea0251b" datatype="html">
         <source>No resources found in the selected namespace.</source>
-        <target state="new">No resources found in the selected namespace.</target>
+        <target>在所选的 namespace 中找不到资源</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/components/resourcelist/crdobject/template.html</context>
           <context context-type="linenumber">90</context>
@@ -1874,7 +1874,7 @@
       </trans-unit>
       <trans-unit id="b7c59f712c5e6628569d1aed53a624f883c11663" datatype="html">
         <source>No resources found.</source>
-        <target>找不到资源。</target>
+        <target>找不到资源</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/components/list/zerostate/template.html</context>
           <context context-type="linenumber">27</context>
@@ -2955,11 +2955,11 @@
               here
             <x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a>"/>.
           </source>
-        <target state="new">
-            Insecure access detected. Sign in will not be available. Access Dashboard securely over HTTPS or using localhost. Read more
+        <target>
+            检测到不安全的访问。无法登陆。通过 HTTPS 或使用 localhost 安全访问 Dashboard 。更多信息
             <x id="START_LINK" ctype="x-a" equiv-text="&lt;a>"/>
-              here
-            <x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a>"/>.
+              在这里
+            <x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a>"/>阅读。
           </target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/login/template.html</context>
@@ -4252,7 +4252,7 @@
       </trans-unit>
       <trans-unit id="72f275d9b31bf0e6dc122c1a9b58b4986800eb7a" datatype="html">
         <source>Auto-refresh (every <x id="INTERPOLATION" equiv-text="{{refreshInterval}}"/> s.)</source>
-        <target state="new">Auto-refresh (every <x id="INTERPOLATION" equiv-text="{{refreshInterval}}"/> s.)</target>
+        <target>自动刷新 (每 <x id="INTERPOLATION" equiv-text="{{refreshInterval}}"/> 秒)</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/logs/template.html</context>
           <context context-type="linenumber">141</context>
diff --git a/license-checker-config.json b/license-checker-config.json
index 6526f2a81..fec63ff54 100644
--- a/license-checker-config.json
+++ b/license-checker-config.json
@@ -3,7 +3,7 @@
     "*", "docs", "i18n",
     ".cached_tools", ".git", ".github", ".tmp", "coverage", "cypress",
     "aio/test-resources",
-    "**/*.json", "**/*.svg", "**/*.txt"
+    "**/*.json", "**/*.yaml", "**/*.svg", "**/*.txt", "**/*.md", "**/OWNERS", "**/.helmignore", "**/*.lock"
   ],
   "license": "aio/scripts/license-header.txt",
   "defaultFormat": {
diff --git a/package-lock.json b/package-lock.json
index a4e8812d1..2692fd595 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -5,31 +5,42 @@
   "requires": true,
   "dependencies": {
     "@angular-devkit/architect": {
-      "version": "0.901.6",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.901.6.tgz",
-      "integrity": "sha512-0pWzn10gCZxMCrS62NlD38qE2R7l5fPfBuNylntNqvzw9L7iS1ARgqMlAKn8KLaNG6FrXONmgUWHsV987ZICIw==",
+      "version": "0.901.7",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.901.7.tgz",
+      "integrity": "sha512-yW/PUEqle55QihOFbmeNXaVTodhfeXkteoFDUpz+YpX3xiQDXDtNbIJSzKOQTojtBKdSMKMvZkQLr+RAa7/1EA==",
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "9.1.6",
+        "@angular-devkit/core": "9.1.7",
         "rxjs": "6.5.4"
+      },
+      "dependencies": {
+        "rxjs": {
+          "version": "6.5.4",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz",
+          "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==",
+          "dev": true,
+          "requires": {
+            "tslib": "^1.9.0"
+          }
+        }
       }
     },
     "@angular-devkit/build-angular": {
-      "version": "0.901.6",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.901.6.tgz",
-      "integrity": "sha512-jgLFKRWSZIZZVb7fiGC0SHzBFYBkDOLTw/MRta8p81o8WzLe0uxGVP4RlIj6fZxv3Vvb1NZI4HHrgt/jASaj4A==",
+      "version": "0.901.7",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.901.7.tgz",
+      "integrity": "sha512-NiBwapx/XJqYGzSmENff78i6Yif9PjYDJ9BB+59t2eDofkCZUcPFrhQmRgliO7rt6RATvT81lDP89+LBXCTQPw==",
       "dev": true,
       "requires": {
-        "@angular-devkit/architect": "0.901.6",
-        "@angular-devkit/build-optimizer": "0.901.6",
-        "@angular-devkit/build-webpack": "0.901.6",
-        "@angular-devkit/core": "9.1.6",
+        "@angular-devkit/architect": "0.901.7",
+        "@angular-devkit/build-optimizer": "0.901.7",
+        "@angular-devkit/build-webpack": "0.901.7",
+        "@angular-devkit/core": "9.1.7",
         "@babel/core": "7.9.0",
         "@babel/generator": "7.9.3",
         "@babel/preset-env": "7.9.0",
         "@babel/template": "7.8.6",
         "@jsdevtools/coverage-istanbul-loader": "3.0.3",
-        "@ngtools/webpack": "9.1.6",
+        "@ngtools/webpack": "9.1.7",
         "ajv": "6.12.0",
         "autoprefixer": "9.7.4",
         "babel-loader": "8.0.6",
@@ -76,7 +87,7 @@
         "tree-kill": "1.2.2",
         "webpack": "4.42.0",
         "webpack-dev-middleware": "3.7.2",
-        "webpack-dev-server": "3.10.3",
+        "webpack-dev-server": "3.11.0",
         "webpack-merge": "4.2.2",
         "webpack-sources": "1.4.3",
         "webpack-subresource-integrity": "1.4.0",
@@ -153,190 +164,18 @@
             "uri-js": "^4.2.2"
           }
         },
-        "ansi-regex": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
-          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
-          "dev": true
-        },
-        "anymatch": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
-          "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
-          "dev": true,
-          "requires": {
-            "micromatch": "^3.1.4",
-            "normalize-path": "^2.1.1"
-          },
-          "dependencies": {
-            "normalize-path": {
-              "version": "2.1.1",
-              "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
-              "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
-              "dev": true,
-              "requires": {
-                "remove-trailing-separator": "^1.0.1"
-              }
-            }
-          }
-        },
-        "binary-extensions": {
-          "version": "1.13.1",
-          "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
-          "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
-          "dev": true
-        },
-        "braces": {
-          "version": "2.3.2",
-          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
-          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
-          "dev": true,
-          "requires": {
-            "arr-flatten": "^1.1.0",
-            "array-unique": "^0.3.2",
-            "extend-shallow": "^2.0.1",
-            "fill-range": "^4.0.0",
-            "isobject": "^3.0.1",
-            "repeat-element": "^1.1.2",
-            "snapdragon": "^0.8.1",
-            "snapdragon-node": "^2.0.1",
-            "split-string": "^3.0.2",
-            "to-regex": "^3.0.1"
-          }
-        },
-        "chokidar": {
-          "version": "2.1.8",
-          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
-          "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
-          "dev": true,
-          "requires": {
-            "anymatch": "^2.0.0",
-            "async-each": "^1.0.1",
-            "braces": "^2.3.2",
-            "fsevents": "^1.2.7",
-            "glob-parent": "^3.1.0",
-            "inherits": "^2.0.3",
-            "is-binary-path": "^1.0.0",
-            "is-glob": "^4.0.0",
-            "normalize-path": "^3.0.0",
-            "path-is-absolute": "^1.0.0",
-            "readdirp": "^2.2.1",
-            "upath": "^1.1.1"
-          }
-        },
-        "cliui": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
-          "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
-          "dev": true,
-          "requires": {
-            "string-width": "^2.1.1",
-            "strip-ansi": "^4.0.0",
-            "wrap-ansi": "^2.0.0"
-          },
-          "dependencies": {
-            "ansi-regex": {
-              "version": "3.0.0",
-              "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
-              "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
-              "dev": true
-            },
-            "strip-ansi": {
-              "version": "4.0.0",
-              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
-              "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
-              "dev": true,
-              "requires": {
-                "ansi-regex": "^3.0.0"
-              }
-            }
-          }
-        },
-        "del": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz",
-          "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==",
-          "dev": true,
-          "requires": {
-            "@types/glob": "^7.1.1",
-            "globby": "^6.1.0",
-            "is-path-cwd": "^2.0.0",
-            "is-path-in-cwd": "^2.0.0",
-            "p-map": "^2.0.0",
-            "pify": "^4.0.1",
-            "rimraf": "^2.6.3"
-          },
-          "dependencies": {
-            "rimraf": {
-              "version": "2.7.1",
-              "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
-              "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
-              "dev": true,
-              "requires": {
-                "glob": "^7.1.3"
-              }
-            }
-          }
-        },
         "emojis-list": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
           "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
           "dev": true
         },
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        },
         "fast-deep-equal": {
           "version": "3.1.1",
           "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz",
           "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==",
           "dev": true
         },
-        "fill-range": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
-          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
-          "dev": true,
-          "requires": {
-            "extend-shallow": "^2.0.1",
-            "is-number": "^3.0.0",
-            "repeat-string": "^1.6.1",
-            "to-regex-range": "^2.1.0"
-          }
-        },
-        "find-up": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
-          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
-          "dev": true,
-          "requires": {
-            "locate-path": "^3.0.0"
-          }
-        },
-        "fsevents": {
-          "version": "1.2.13",
-          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
-          "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "bindings": "^1.5.0",
-            "nan": "^2.12.1"
-          }
-        },
-        "get-caller-file": {
-          "version": "1.0.3",
-          "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
-          "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
-          "dev": true
-        },
         "glob": {
           "version": "7.1.6",
           "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
@@ -351,66 +190,6 @@
             "path-is-absolute": "^1.0.0"
           }
         },
-        "globby": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
-          "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
-          "dev": true,
-          "requires": {
-            "array-union": "^1.0.1",
-            "glob": "^7.0.3",
-            "object-assign": "^4.0.1",
-            "pify": "^2.0.0",
-            "pinkie-promise": "^2.0.0"
-          },
-          "dependencies": {
-            "pify": {
-              "version": "2.3.0",
-              "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-              "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
-              "dev": true
-            }
-          }
-        },
-        "is-absolute-url": {
-          "version": "3.0.3",
-          "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz",
-          "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==",
-          "dev": true
-        },
-        "is-binary-path": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
-          "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
-          "dev": true,
-          "requires": {
-            "binary-extensions": "^1.0.0"
-          }
-        },
-        "is-fullwidth-code-point": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
-          "dev": true
-        },
-        "is-number": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
-          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          }
-        },
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        },
         "loader-utils": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
@@ -422,43 +201,12 @@
             "json5": "^2.1.2"
           }
         },
-        "locate-path": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
-          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
-          "dev": true,
-          "requires": {
-            "p-locate": "^3.0.0",
-            "path-exists": "^3.0.0"
-          }
-        },
-        "p-locate": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
-          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
-          "dev": true,
-          "requires": {
-            "p-limit": "^2.0.0"
-          }
-        },
-        "p-map": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz",
-          "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==",
-          "dev": true
-        },
         "parse5": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
           "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
           "dev": true
         },
-        "path-exists": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
-          "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
-          "dev": true
-        },
         "postcss": {
           "version": "7.0.27",
           "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz",
@@ -472,28 +220,11 @@
           "dependencies": {
             "source-map": {
               "version": "0.6.1",
-              "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-              "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-              "dev": true
-            }
-          }
-        },
-        "readdirp": {
-          "version": "2.2.1",
-          "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
-          "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.1.11",
-            "micromatch": "^3.1.10",
-            "readable-stream": "^2.0.2"
-          }
-        },
-        "require-main-filename": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
-          "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
-          "dev": true
+              "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+              "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+              "dev": true
+            }
+          }
         },
         "rimraf": {
           "version": "3.0.2",
@@ -504,6 +235,15 @@
             "glob": "^7.1.3"
           }
         },
+        "rxjs": {
+          "version": "6.5.4",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz",
+          "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==",
+          "dev": true,
+          "requires": {
+            "tslib": "^1.9.0"
+          }
+        },
         "sass-loader": {
           "version": "8.0.2",
           "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz",
@@ -567,42 +307,6 @@
           "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
           "dev": true
         },
-        "string-width": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
-          "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
-          "dev": true,
-          "requires": {
-            "is-fullwidth-code-point": "^2.0.0",
-            "strip-ansi": "^4.0.0"
-          },
-          "dependencies": {
-            "ansi-regex": {
-              "version": "3.0.0",
-              "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
-              "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
-              "dev": true
-            },
-            "strip-ansi": {
-              "version": "4.0.0",
-              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
-              "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
-              "dev": true,
-              "requires": {
-                "ansi-regex": "^3.0.0"
-              }
-            }
-          }
-        },
-        "strip-ansi": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
-          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^2.0.0"
-          }
-        },
         "supports-color": {
           "version": "6.1.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
@@ -611,145 +315,13 @@
           "requires": {
             "has-flag": "^3.0.0"
           }
-        },
-        "to-regex-range": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
-          "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
-          "dev": true,
-          "requires": {
-            "is-number": "^3.0.0",
-            "repeat-string": "^1.6.1"
-          }
-        },
-        "webpack-dev-server": {
-          "version": "3.10.3",
-          "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.10.3.tgz",
-          "integrity": "sha512-e4nWev8YzEVNdOMcNzNeCN947sWJNd43E5XvsJzbAL08kGc2frm1tQ32hTJslRS+H65LCb/AaUCYU7fjHCpDeQ==",
-          "dev": true,
-          "requires": {
-            "ansi-html": "0.0.7",
-            "bonjour": "^3.5.0",
-            "chokidar": "^2.1.8",
-            "compression": "^1.7.4",
-            "connect-history-api-fallback": "^1.6.0",
-            "debug": "^4.1.1",
-            "del": "^4.1.1",
-            "express": "^4.17.1",
-            "html-entities": "^1.2.1",
-            "http-proxy-middleware": "0.19.1",
-            "import-local": "^2.0.0",
-            "internal-ip": "^4.3.0",
-            "ip": "^1.1.5",
-            "is-absolute-url": "^3.0.3",
-            "killable": "^1.0.1",
-            "loglevel": "^1.6.6",
-            "opn": "^5.5.0",
-            "p-retry": "^3.0.1",
-            "portfinder": "^1.0.25",
-            "schema-utils": "^1.0.0",
-            "selfsigned": "^1.10.7",
-            "semver": "^6.3.0",
-            "serve-index": "^1.9.1",
-            "sockjs": "0.3.19",
-            "sockjs-client": "1.4.0",
-            "spdy": "^4.0.1",
-            "strip-ansi": "^3.0.1",
-            "supports-color": "^6.1.0",
-            "url": "^0.11.0",
-            "webpack-dev-middleware": "^3.7.2",
-            "webpack-log": "^2.0.0",
-            "ws": "^6.2.1",
-            "yargs": "12.0.5"
-          },
-          "dependencies": {
-            "schema-utils": {
-              "version": "1.0.0",
-              "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
-              "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
-              "dev": true,
-              "requires": {
-                "ajv": "^6.1.0",
-                "ajv-errors": "^1.0.0",
-                "ajv-keywords": "^3.1.0"
-              }
-            },
-            "semver": {
-              "version": "6.3.0",
-              "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-              "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-              "dev": true
-            }
-          }
-        },
-        "wrap-ansi": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
-          "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
-          "dev": true,
-          "requires": {
-            "string-width": "^1.0.1",
-            "strip-ansi": "^3.0.1"
-          },
-          "dependencies": {
-            "is-fullwidth-code-point": {
-              "version": "1.0.0",
-              "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
-              "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
-              "dev": true,
-              "requires": {
-                "number-is-nan": "^1.0.0"
-              }
-            },
-            "string-width": {
-              "version": "1.0.2",
-              "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
-              "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
-              "dev": true,
-              "requires": {
-                "code-point-at": "^1.0.0",
-                "is-fullwidth-code-point": "^1.0.0",
-                "strip-ansi": "^3.0.0"
-              }
-            }
-          }
-        },
-        "yargs": {
-          "version": "12.0.5",
-          "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz",
-          "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==",
-          "dev": true,
-          "requires": {
-            "cliui": "^4.0.0",
-            "decamelize": "^1.2.0",
-            "find-up": "^3.0.0",
-            "get-caller-file": "^1.0.1",
-            "os-locale": "^3.0.0",
-            "require-directory": "^2.1.1",
-            "require-main-filename": "^1.0.1",
-            "set-blocking": "^2.0.0",
-            "string-width": "^2.0.0",
-            "which-module": "^2.0.0",
-            "y18n": "^3.2.1 || ^4.0.0",
-            "yargs-parser": "^11.1.1"
-          }
-        },
-        "yargs-parser": {
-          "version": "11.1.1",
-          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz",
-          "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==",
-          "dev": true,
-          "requires": {
-            "camelcase": "^5.0.0",
-            "decamelize": "^1.2.0"
-          }
         }
       }
     },
     "@angular-devkit/build-optimizer": {
-      "version": "0.901.6",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.901.6.tgz",
-      "integrity": "sha512-M0H9SrOq4QOYqGCIguGQDWizf+XL7whJjBtYHxI7jEjtzar3zkTFgzZ/znv49R56Zch1niH0mBgtDxCFFWqarQ==",
+      "version": "0.901.7",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.901.7.tgz",
+      "integrity": "sha512-Xuce3StdxhcgLYb0BAaFGr3Bzj5EM2OsAqIT15PkikWY1k5cK50vPxoC/BkX4QDL9eXSHtqAfMBfA6h5N422vw==",
       "dev": true,
       "requires": {
         "loader-utils": "2.0.0",
@@ -797,20 +369,31 @@
       }
     },
     "@angular-devkit/build-webpack": {
-      "version": "0.901.6",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.901.6.tgz",
-      "integrity": "sha512-jEk850AtIFK+xbXXiloVvueXTbJOL1mANR2UBrmWk7V4Bct+gHVerdXjn9vo1Tsd8BgemUYAcqvLldCx9MSDTg==",
+      "version": "0.901.7",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.901.7.tgz",
+      "integrity": "sha512-pTLW5Eqy9cHgv78LKiH0e30lxqKzUPjh1djvNtFsEemOHsfKQdAfjLjikoaQvqMoBKVaUU7r2vmyyS17cH+1yw==",
       "dev": true,
       "requires": {
-        "@angular-devkit/architect": "0.901.6",
-        "@angular-devkit/core": "9.1.6",
+        "@angular-devkit/architect": "0.901.7",
+        "@angular-devkit/core": "9.1.7",
         "rxjs": "6.5.4"
+      },
+      "dependencies": {
+        "rxjs": {
+          "version": "6.5.4",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz",
+          "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==",
+          "dev": true,
+          "requires": {
+            "tslib": "^1.9.0"
+          }
+        }
       }
     },
     "@angular-devkit/core": {
-      "version": "9.1.6",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-9.1.6.tgz",
-      "integrity": "sha512-lYXoRtsMsfyIrNAa49Hcx79FPRW6ZrWjK2yJ3avON1Q3WEHYb/DIUP+ItyOQAkNUsCVMyK4wkddsu8PsqEW6tg==",
+      "version": "9.1.7",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-9.1.7.tgz",
+      "integrity": "sha512-guvolu9Cl+qYMTtedLZD9wCqustJjdqzJ2psD2C1Sr1LrX9T0mprmDldR/YnhsitThveJEb6sM/0EvqWxoSvKw==",
       "dev": true,
       "requires": {
         "ajv": "6.12.0",
@@ -844,6 +427,15 @@
           "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
           "dev": true
         },
+        "rxjs": {
+          "version": "6.5.4",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz",
+          "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==",
+          "dev": true,
+          "requires": {
+            "tslib": "^1.9.0"
+          }
+        },
         "source-map": {
           "version": "0.7.3",
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
@@ -900,6 +492,15 @@
           "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
           "dev": true
         },
+        "rxjs": {
+          "version": "6.5.4",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz",
+          "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==",
+          "dev": true,
+          "requires": {
+            "tslib": "^1.9.0"
+          }
+        },
         "source-map": {
           "version": "0.7.3",
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
@@ -957,6 +558,17 @@
           "requires": {
             "@angular-devkit/core": "9.1.7",
             "rxjs": "6.5.4"
+          },
+          "dependencies": {
+            "rxjs": {
+              "version": "6.5.4",
+              "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz",
+              "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==",
+              "dev": true,
+              "requires": {
+                "tslib": "^1.9.0"
+              }
+            }
           }
         },
         "@angular-devkit/core": {
@@ -970,6 +582,17 @@
             "magic-string": "0.25.7",
             "rxjs": "6.5.4",
             "source-map": "0.7.3"
+          },
+          "dependencies": {
+            "rxjs": {
+              "version": "6.5.4",
+              "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz",
+              "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==",
+              "dev": true,
+              "requires": {
+                "tslib": "^1.9.0"
+              }
+            }
           }
         },
         "ajv": {
@@ -2446,15 +2069,26 @@
       }
     },
     "@ngtools/webpack": {
-      "version": "9.1.6",
-      "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-9.1.6.tgz",
-      "integrity": "sha512-W/9kENoiYARDGXqXSmOekQddUlQUVxfYP7JgQwqdg7JYktIpThicbV/iLBChZwWnmn9mb7MDw1IPeUTkZzrO2Q==",
+      "version": "9.1.7",
+      "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-9.1.7.tgz",
+      "integrity": "sha512-A7VB2I42Kn+7jl0tDKzGNLAoZLWSqkKo9Hg1bmKpvAAIz+DSbq3uV+JWgGgTprM3tn0lfkVgmqk4H17HKwAOcg==",
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "9.1.6",
+        "@angular-devkit/core": "9.1.7",
         "enhanced-resolve": "4.1.1",
         "rxjs": "6.5.4",
         "webpack-sources": "1.4.3"
+      },
+      "dependencies": {
+        "rxjs": {
+          "version": "6.5.4",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz",
+          "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==",
+          "dev": true,
+          "requires": {
+            "tslib": "^1.9.0"
+          }
+        }
       }
     },
     "@nodelib/fs.scandir": {
@@ -2513,6 +2147,17 @@
             "magic-string": "0.25.7",
             "rxjs": "6.5.4",
             "source-map": "0.7.3"
+          },
+          "dependencies": {
+            "rxjs": {
+              "version": "6.5.4",
+              "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz",
+              "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==",
+              "dev": true,
+              "requires": {
+                "tslib": "^1.9.0"
+              }
+            }
           }
         },
         "ajv": {
@@ -2601,6 +2246,15 @@
           "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
           "dev": true
         },
+        "rxjs": {
+          "version": "6.5.4",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz",
+          "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==",
+          "dev": true,
+          "requires": {
+            "tslib": "^1.9.0"
+          }
+        },
         "semver": {
           "version": "7.1.3",
           "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz",
@@ -2622,9 +2276,9 @@
       "dev": true
     },
     "@swimlane/ngx-charts": {
-      "version": "13.0.4",
-      "resolved": "https://registry.npmjs.org/@swimlane/ngx-charts/-/ngx-charts-13.0.4.tgz",
-      "integrity": "sha512-4EvwclbctVQ5VzPBC63DJsg+jwQU/NlR/yQ9ObVH5acefEbS8kupn3cp/gaWftLTQ0jdXqRqycHNkLOQZfa3XQ==",
+      "version": "14.0.0",
+      "resolved": "https://registry.npmjs.org/@swimlane/ngx-charts/-/ngx-charts-14.0.0.tgz",
+      "integrity": "sha512-UiAleBA4Hs7IEB+5mSmn1ojntD32lpfR7BokuVUNkhWiX4CsljKsXgm1EwIw2A14JBu4g8EDjKrdbED79eShEA==",
       "requires": {
         "d3-array": "^2.4.0",
         "d3-brush": "^1.1.5",
@@ -3003,9 +2657,9 @@
       "dev": true
     },
     "@types/lodash": {
-      "version": "4.14.149",
-      "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.149.tgz",
-      "integrity": "sha512-ijGqzZt/b7BfzcK9vTrS6MFljQRPn5BFWOx8oE0GYxribu6uV+aA9zZuXI1zc/etK9E8nrgdoF2+LgUw7+9tJQ==",
+      "version": "4.14.154",
+      "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.154.tgz",
+      "integrity": "sha512-VoDZIJmg3P8vPEnTldLvgA+q7RkIbVkbYX4k0cAVFzGAOQwUehVgRHgIr2/wepwivDst/rVRqaiBSjCXRnoWwQ==",
       "dev": true
     },
     "@types/minimatch": {
@@ -7137,9 +6791,9 @@
       "dev": true
     },
     "codelyzer": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-5.2.1.tgz",
-      "integrity": "sha512-awBZXFcJUyC5HMYXiHzjr3D24tww2l1D1OqtfA9vUhEtYr32a65A+Gblm/OvsO+HuKLYzn8EDMw1inSM3VbxWA==",
+      "version": "5.2.2",
+      "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-5.2.2.tgz",
+      "integrity": "sha512-jB4FZ1Sx7kZhvZVdf+N2BaKTdrrNZOL0Bj10RRfrhHrb3zEvXjJvvq298JPMJAiyiCS/v4zs1QlGU0ip7xGqeA==",
       "dev": true,
       "requires": {
         "app-root-path": "^2.2.1",
@@ -7347,9 +7001,9 @@
       }
     },
     "concurrently": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-5.1.0.tgz",
-      "integrity": "sha512-9ViZMu3OOCID3rBgU31mjBftro2chOop0G2u1olq1OuwRBVRw/GxHTg80TVJBUTJfoswMmEUeuOg1g1yu1X2dA==",
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-5.2.0.tgz",
+      "integrity": "sha512-XxcDbQ4/43d6CxR7+iV8IZXhur4KbmEJk1CetVMUqCy34z9l0DkszbY+/9wvmSnToTej0SYomc2WSRH+L0zVJw==",
       "dev": true,
       "requires": {
         "chalk": "^2.4.2",
@@ -8263,9 +7917,9 @@
       "dev": true
     },
     "cypress": {
-      "version": "4.6.0",
-      "resolved": "https://registry.npmjs.org/cypress/-/cypress-4.6.0.tgz",
-      "integrity": "sha512-vIPXAceRP+Nxvnm/O9ruY9EQaRGmVVybtk9F1sfC9mH3067YbitrdBTynaaLuHFj90p9e0U2ZCV7OkX4x4V/Wg==",
+      "version": "4.7.0",
+      "resolved": "https://registry.npmjs.org/cypress/-/cypress-4.7.0.tgz",
+      "integrity": "sha512-Vav6wUFhPRlImIND/2lOQlUnAWzgCC/iXyJlJjX9nJOJul5LC1vUpf/m8Oiae870PFPyT0ZLLwPHKTXZNdXmHw==",
       "dev": true,
       "requires": {
         "@cypress/listr-verbose-renderer": "0.4.1",
@@ -8384,9 +8038,9 @@
       }
     },
     "d3": {
-      "version": "5.15.0",
-      "resolved": "https://registry.npmjs.org/d3/-/d3-5.15.0.tgz",
-      "integrity": "sha512-C+E80SL2nLLtmykZ6klwYj5rPqB5nlfN5LdWEAVdWPppqTD8taoJi2PxLZjPeYT8FFRR2yucXq+kBlOnnvZeLg==",
+      "version": "5.16.0",
+      "resolved": "https://registry.npmjs.org/d3/-/d3-5.16.0.tgz",
+      "integrity": "sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw==",
       "requires": {
         "d3-array": "1",
         "d3-axis": "1",
@@ -8558,9 +8212,9 @@
       "integrity": "sha512-TWks25e7t8/cqctxCmxpUuzZN11QxIA7YrMbram94zMQ0PXjE4LVIMe/f6a4+xxL8HQ3OsAFULOINQi1pE62Aw=="
     },
     "d3-geo": {
-      "version": "1.12.0",
-      "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.0.tgz",
-      "integrity": "sha512-NalZVW+6/SpbKcnl+BCO67m8gX+nGeJdo6oGL9H6BRUGUL1e+AtPcP4vE4TwCQ/gl8y5KE7QvBzrLn+HsKIl+w==",
+      "version": "1.12.1",
+      "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz",
+      "integrity": "sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==",
       "requires": {
         "d3-array": "1"
       },
@@ -8703,9 +8357,9 @@
       }
     },
     "date-fns": {
-      "version": "2.13.0",
-      "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.13.0.tgz",
-      "integrity": "sha512-xm0c61mevGF7f0XpCGtDTGpzEFC/1fpLXHbmFpxZZQJuvByIK2ozm6cSYuU+nxFYOPh2EuCfzUwlTEFwKG+h5w==",
+      "version": "2.14.0",
+      "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.14.0.tgz",
+      "integrity": "sha512-1zD+68jhFgDIM0rF05rcwYO8cExdNqxjq4xP1QKM60Q45mnO6zaMWB4tOzrIr4M4GSLntsKeE4c9Bdl2jhL/yw==",
       "dev": true
     },
     "date-format": {
@@ -12276,9 +11930,9 @@
       "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q="
     },
     "http-proxy": {
-      "version": "1.18.0",
-      "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz",
-      "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==",
+      "version": "1.18.1",
+      "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
+      "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
       "dev": true,
       "requires": {
         "eventemitter3": "^4.0.0",
@@ -12379,14 +12033,14 @@
       }
     },
     "husky": {
-      "version": "4.2.3",
-      "resolved": "https://registry.npmjs.org/husky/-/husky-4.2.3.tgz",
-      "integrity": "sha512-VxTsSTRwYveKXN4SaH1/FefRJYCtx+wx04sSVcOpD7N2zjoHxa+cEJ07Qg5NmV3HAK+IRKOyNVpi2YBIVccIfQ==",
+      "version": "4.2.5",
+      "resolved": "https://registry.npmjs.org/husky/-/husky-4.2.5.tgz",
+      "integrity": "sha512-SYZ95AjKcX7goYVZtVZF2i6XiZcHknw50iXvY7b0MiGoj5RwdgRQNEHdb+gPDPCXKlzwrybjFjkL6FOj8uRhZQ==",
       "dev": true,
       "requires": {
-        "chalk": "^3.0.0",
+        "chalk": "^4.0.0",
         "ci-info": "^2.0.0",
-        "compare-versions": "^3.5.1",
+        "compare-versions": "^3.6.0",
         "cosmiconfig": "^6.0.0",
         "find-versions": "^3.2.0",
         "opencollective-postinstall": "^2.0.2",
@@ -12407,9 +12061,9 @@
           }
         },
         "chalk": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
-          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz",
+          "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==",
           "dev": true,
           "requires": {
             "ansi-styles": "^4.1.0",
@@ -12721,6 +12375,11 @@
       "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==",
       "dev": true
     },
+    "intersection-observer": {
+      "version": "0.10.0",
+      "resolved": "https://registry.npmjs.org/intersection-observer/-/intersection-observer-0.10.0.tgz",
+      "integrity": "sha512-fn4bQ0Xq8FTej09YC/jqKZwtijpvARlRp6wxL5WTA6yPe2YWSJ5RJh7Nm79rK2qB0wr6iDQzH60XGq5V/7u8YQ=="
+    },
     "invariant": {
       "version": "2.2.4",
       "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
@@ -12730,12 +12389,6 @@
         "loose-envify": "^1.0.0"
       }
     },
-    "invert-kv": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz",
-      "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==",
-      "dev": true
-    },
     "ip": {
       "version": "1.1.5",
       "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
@@ -13393,20 +13046,12 @@
       "dev": true
     },
     "jasmine-spec-reporter": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz",
-      "integrity": "sha512-FZBoZu7VE5nR7Nilzy+Np8KuVIOxF4oXDPDknehCYBDE080EnlPu0afdZNmpGDBRCUBv3mj5qgqCRmk6W/K8vg==",
+      "version": "5.0.2",
+      "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-5.0.2.tgz",
+      "integrity": "sha512-6gP1LbVgJ+d7PKksQBc2H0oDGNRQI3gKUsWlswKaQ2fif9X5gzhQcgM5+kiJGCQVurOG09jqNhk7payggyp5+g==",
       "dev": true,
       "requires": {
-        "colors": "1.1.2"
-      },
-      "dependencies": {
-        "colors": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
-          "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=",
-          "dev": true
-        }
+        "colors": "1.4.0"
       }
     },
     "jest-worker": {
@@ -13477,9 +13122,9 @@
       "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
     },
     "js-yaml": {
-      "version": "3.13.1",
-      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
-      "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+      "version": "3.14.0",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
+      "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
       "requires": {
         "argparse": "^1.0.7",
         "esprima": "^4.0.0"
@@ -13918,9 +13563,9 @@
       }
     },
     "karma-jasmine": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-3.1.1.tgz",
-      "integrity": "sha512-pxBmv5K7IkBRLsFSTOpgiK/HzicQT3mfFF+oHAC7nxMfYKhaYFgxOa5qjnHW4sL5rUnmdkSajoudOnnOdPyW4Q==",
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-3.2.0.tgz",
+      "integrity": "sha512-NkMgcMVKZJ2LtxWXXWD+d6OSFf8ehjxhfgpjdx9DgjwpLDpirm66kEc7+S0i4HcTJzgNhyTWutDzzfnbvKJpNg==",
       "dev": true,
       "requires": {
         "jasmine-core": "^3.5.0"
@@ -14002,15 +13647,6 @@
         "readable-stream": "^2.0.5"
       }
     },
-    "lcid": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz",
-      "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==",
-      "dev": true,
-      "requires": {
-        "invert-kv": "^2.0.0"
-      }
-    },
     "lead": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz",
@@ -15540,15 +15176,6 @@
       "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==",
       "dev": true
     },
-    "map-age-cleaner": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
-      "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
-      "dev": true,
-      "requires": {
-        "p-defer": "^1.0.0"
-      }
-    },
     "map-cache": {
       "version": "0.2.2",
       "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
@@ -15640,17 +15267,6 @@
       "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
       "dev": true
     },
-    "mem": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz",
-      "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==",
-      "dev": true,
-      "requires": {
-        "map-age-cleaner": "^0.1.1",
-        "mimic-fn": "^2.0.0",
-        "p-is-promise": "^2.0.0"
-      }
-    },
     "memory-fs": {
       "version": "0.5.0",
       "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz",
@@ -16242,6 +15858,15 @@
       "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=",
       "dev": true
     },
+    "ng-in-viewport": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/ng-in-viewport/-/ng-in-viewport-6.1.0.tgz",
+      "integrity": "sha512-mJlsiGBhOLiqgM4S36zg9IWjv0YsOPuoVB1T4mKaq4NZ2aHB/8t5n5pB+pP93k1mmSUhp+cPscGua5o7gJrURg==",
+      "requires": {
+        "intersection-observer": ">=0.5.1",
+        "tslib": ">=1.9.0"
+      }
+    },
     "ngx-cookie-service": {
       "version": "2.4.0",
       "resolved": "https://registry.npmjs.org/ngx-cookie-service/-/ngx-cookie-service-2.4.0.tgz",
@@ -17371,17 +16996,6 @@
       "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
       "dev": true
     },
-    "os-locale": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz",
-      "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==",
-      "dev": true,
-      "requires": {
-        "execa": "^1.0.0",
-        "lcid": "^2.0.0",
-        "mem": "^4.0.0"
-      }
-    },
     "os-tmpdir": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
@@ -17421,24 +17035,12 @@
       "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
       "dev": true
     },
-    "p-defer": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
-      "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=",
-      "dev": true
-    },
     "p-finally": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
       "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
       "dev": true
     },
-    "p-is-promise": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz",
-      "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==",
-      "dev": true
-    },
     "p-limit": {
       "version": "2.3.0",
       "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
@@ -19877,9 +19479,9 @@
       "dev": true
     },
     "rxjs": {
-      "version": "6.5.4",
-      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz",
-      "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==",
+      "version": "6.5.5",
+      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz",
+      "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==",
       "requires": {
         "tslib": "^1.9.0"
       }
@@ -20975,27 +20577,6 @@
         }
       }
     },
-    "sockjs": {
-      "version": "0.3.19",
-      "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz",
-      "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==",
-      "dev": true,
-      "requires": {
-        "faye-websocket": "^0.10.0",
-        "uuid": "^3.0.1"
-      },
-      "dependencies": {
-        "faye-websocket": {
-          "version": "0.10.0",
-          "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz",
-          "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=",
-          "dev": true,
-          "requires": {
-            "websocket-driver": ">=0.5.1"
-          }
-        }
-      }
-    },
     "sockjs-client": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz",
@@ -21964,12 +21545,12 @@
       "dev": true
     },
     "tar": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.1.tgz",
-      "integrity": "sha512-bKhKrrz2FJJj5s7wynxy/fyxpE0CmCjmOQ1KV4KkgXFWOgoIT/NbTMnB1n+LFNrNk0SSBVGGxcK5AGsyC+pW5Q==",
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.2.tgz",
+      "integrity": "sha512-Glo3jkRtPcvpDlAs/0+hozav78yoXKFr+c4wgw62NNMO3oo4AaJdCo21Uu7lcwr55h39W2XD1LMERc64wtbItg==",
       "dev": true,
       "requires": {
-        "chownr": "^1.1.3",
+        "chownr": "^2.0.0",
         "fs-minipass": "^2.0.0",
         "minipass": "^3.0.0",
         "minizlib": "^2.1.0",
@@ -21977,6 +21558,12 @@
         "yallist": "^4.0.0"
       },
       "dependencies": {
+        "chownr": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+          "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+          "dev": true
+        },
         "minizlib": {
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz",
@@ -22506,9 +22093,9 @@
       "integrity": "sha1-hiGabDV12bch04aRvwjISqWtqkI="
     },
     "ts-loader": {
-      "version": "6.2.1",
-      "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-6.2.1.tgz",
-      "integrity": "sha512-Dd9FekWuABGgjE1g0TlQJ+4dFUfYGbYcs52/HQObE0ZmUNjQlmLAS7xXsSzy23AMaMwipsx5sNHvoEpT2CZq1g==",
+      "version": "7.0.5",
+      "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-7.0.5.tgz",
+      "integrity": "sha512-zXypEIT6k3oTc+OZNx/cqElrsbBtYqDknf48OZos0NQ3RTt045fBIU8RRSu+suObBzYB355aIPGOe/3kj9h7Ig==",
       "dev": true,
       "requires": {
         "chalk": "^2.3.0",
@@ -22537,9 +22124,9 @@
       }
     },
     "ts-node": {
-      "version": "8.10.1",
-      "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.10.1.tgz",
-      "integrity": "sha512-bdNz1L4ekHiJul6SHtZWs1ujEKERJnHs4HxN7rjTyyVOFf3HaJ6sLqe6aPG62XTzAB/63pKRh5jTSWL0D7bsvw==",
+      "version": "8.10.2",
+      "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.10.2.tgz",
+      "integrity": "sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA==",
       "dev": true,
       "requires": {
         "arg": "^4.1.0",
@@ -24412,9 +23999,9 @@
       "integrity": "sha512-98211RIDrAECqpsxs6gbilwMcxLtxSDIvtzZUIqP1xIByXtuccJ4pmMhHGJATZeEGe/reARPMqwPINK8T7jGZg=="
     },
     "xterm-addon-fit": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/xterm-addon-fit/-/xterm-addon-fit-0.3.0.tgz",
-      "integrity": "sha512-kvkiqHVrnMXgyCH9Xn0BOBJ7XaWC/4BgpSWQy3SueqximgW630t/QOankgqkvk11iTOCwWdAY9DTyQBXUMN3lw=="
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/xterm-addon-fit/-/xterm-addon-fit-0.4.0.tgz",
+      "integrity": "sha512-p4BESuV/g2L6pZzFHpeNLLnep9mp/DkF3qrPglMiucSFtD8iJxtMufEoEJbN8LZwB4i+8PFpFvVuFrGOSpW05w=="
     },
     "y18n": {
       "version": "4.0.0",
diff --git a/package.json b/package.json
index 20832cebc..17dd5e382 100644
--- a/package.json
+++ b/package.json
@@ -108,7 +108,7 @@
     "@angular/platform-browser": "9.1.9",
     "@angular/platform-browser-dynamic": "9.1.9",
     "@angular/router": "9.1.9",
-    "@swimlane/ngx-charts": "13.0.4",
+    "@swimlane/ngx-charts": "14.0.0",
     "@types/c3": "0.7.1",
     "@types/d3": "5.7.2",
     "@types/d3-scale": "2.2.0",
@@ -119,16 +119,17 @@
     "ansi-to-html": "0.6.14",
     "c3": "0.7.15",
     "core-js": "3.6.4",
-    "d3": "5.15.0",
+    "d3": "5.16.0",
     "file-saver": "2.0.2",
     "highlight.js": "10.0.3",
-    "js-yaml": "3.13.1",
+    "js-yaml": "3.14.0",
     "material-design-icons": "3.0.1",
+    "ng-in-viewport": "6.1.0",
     "ngx-cookie-service": "2.4.0",
     "ngx-filter-pipe": "2.1.2",
     "normalize.css": "8.0.1",
     "roboto-fontface": "0.10.0",
-    "rxjs": "6.5.4",
+    "rxjs": "6.5.5",
     "rxjs-compat": "6.5.5",
     "sockjs-client": "1.4.0",
     "systemjs": "6.3.2",
@@ -136,11 +137,11 @@
     "tslib": "1.13.0",
     "web-animations-js": "2.3.2",
     "xterm": "4.6.0",
-    "xterm-addon-fit": "0.3.0",
+    "xterm-addon-fit": "0.4.0",
     "zone.js": "0.10.3"
   },
   "devDependencies": {
-    "@angular-devkit/build-angular": "0.901.6",
+    "@angular-devkit/build-angular": "0.901.7",
     "@angular/cli": "9.1.7",
     "@angular/compiler-cli": "9.1.9",
     "@angular/language-service": "9.1.9",
@@ -148,29 +149,29 @@
     "@types/jasmine": "3.5.10",
     "@types/jasminewd2": "2.0.8",
     "@types/js-yaml": "3.12.2",
-    "@types/lodash": "4.14.149",
+    "@types/lodash": "4.14.154",
     "@types/node": "14.0.5",
     "babel-cli": "6.26.0",
     "babel-preset-env": "1.7.0",
     "babel-register": "6.26.0",
-    "codelyzer": "5.2.1",
-    "concurrently": "5.1.0",
-    "cypress": "4.6.0",
+    "codelyzer": "5.2.2",
+    "concurrently": "5.2.0",
+    "cypress": "4.7.0",
     "del": "5.1.0",
     "git-describe": "4.0.4",
     "gts": "1.1.2",
     "gulp": "4.0.2",
     "gulp-filter": "6.0.0",
-    "husky": "4.2.3",
+    "husky": "4.2.5",
     "jasmine-core": "3.5.0",
-    "jasmine-spec-reporter": "4.2.1",
+    "jasmine-spec-reporter": "5.0.2",
     "js-beautify": "1.10.3",
     "karma": "5.0.9",
     "karma-chrome-launcher": "3.1.0",
     "karma-cli": "2.0.0",
     "karma-coverage-istanbul-reporter": "3.0.2",
     "karma-firefox-launcher": "1.3.0",
-    "karma-jasmine": "3.1.1",
+    "karma-jasmine": "3.2.0",
     "karma-jasmine-html-reporter": "1.5.2",
     "license-check-and-add": "3.0.4",
     "lint-staged": "10.2.4",
@@ -189,10 +190,10 @@
     "scssfmt": "1.0.7",
     "semver": "7.3.2",
     "source-map-explorer": "2.4.2",
-    "tar": "6.0.1",
+    "tar": "6.0.2",
     "through2": "3.0.1",
-    "ts-loader": "6.2.1",
-    "ts-node": "8.10.1",
+    "ts-loader": "7.0.5",
+    "ts-node": "8.10.2",
     "tslint": "5.20.1",
     "typescript": "3.8.3",
     "wait-on": "5.0.0",
diff --git a/src/app/backend/client/api/common.go b/src/app/backend/client/api/common.go
index 83e72cebd..cb34a7dfa 100644
--- a/src/app/backend/client/api/common.go
+++ b/src/app/backend/client/api/common.go
@@ -16,19 +16,23 @@ package api
 
 import (
 	"crypto/rand"
+	"fmt"
+	"strings"
 
 	v1 "k8s.io/api/authorization/v1"
 )
 
 // ToSelfSubjectAccessReview creates kubernetes API object based on provided data.
-func ToSelfSubjectAccessReview(namespace, name, resource, verb string) *v1.SelfSubjectAccessReview {
+func ToSelfSubjectAccessReview(namespace, name, resourceKind, verb string) *v1.SelfSubjectAccessReview {
 	return &v1.SelfSubjectAccessReview{
 		Spec: v1.SelfSubjectAccessReviewSpec{
 			ResourceAttributes: &v1.ResourceAttributes{
 				Namespace: namespace,
 				Name:      name,
-				Resource:  resource,
-				Verb:      verb,
+				// Resource kind name must be in a plural lower-case format,
+				Resource: fmt.Sprintf("%ss", strings.ToLower(resourceKind)),
+				// Let's enforce the same lower-case format for verbs
+				Verb: strings.ToLower(verb),
 			},
 		},
 	}
diff --git a/src/app/frontend/common/components/graph/component.ts b/src/app/frontend/common/components/graph/component.ts
index 41bd104d3..0e10805d8 100644
--- a/src/app/frontend/common/components/graph/component.ts
+++ b/src/app/frontend/common/components/graph/component.ts
@@ -14,6 +14,7 @@
 
 import {Component, Input, OnChanges, OnInit, SimpleChanges} from '@angular/core';
 import {DataPoint, Metric} from '@api/backendapi';
+import {ViewportMetadata} from '@api/frontendapi';
 import {curveMonotoneX, timeFormat} from 'd3';
 
 import {FormattedValue} from './helper';
@@ -38,6 +39,7 @@ export class GraphComponent implements OnInit, OnChanges {
 
   private suffixMap_: Map<number, string> = new Map<number, string>();
   private yAxisSuffix_ = '';
+  private visible_ = false;
 
   ngOnInit(): void {
     if (!this.graphType) {
@@ -50,8 +52,14 @@ export class GraphComponent implements OnInit, OnChanges {
   }
 
   ngOnChanges(_: SimpleChanges): void {
-    this.suffixMap_.clear();
-    this.series = this.generateSeries_();
+    if (this.visible_) {
+      this.suffixMap_.clear();
+      this.series = this.generateSeries_();
+    }
+  }
+
+  changeState(isInViewPort: ViewportMetadata): void {
+    this.visible_ = isInViewPort.visible;
   }
 
   getTooltipValue(value: number): string {
diff --git a/src/app/frontend/common/components/graph/template.html b/src/app/frontend/common/components/graph/template.html
index 66c8d9bf0..bcf4fc538 100644
--- a/src/app/frontend/common/components/graph/template.html
+++ b/src/app/frontend/common/components/graph/template.html
@@ -15,6 +15,9 @@ limitations under the License.
 -->
 
 <ngx-charts-area-chart fxFlex
+                       inViewport
+                       [inViewportOptions]="{partial: false}"
+                       (inViewportAction)="changeState($event)"
                        [xAxis]="true"
                        [yAxis]="true"
                        [showYAxisLabel]="true"
diff --git a/src/app/frontend/error/handler.ts b/src/app/frontend/error/handler.ts
index 8520f8211..3e2b179f8 100644
--- a/src/app/frontend/error/handler.ts
+++ b/src/app/frontend/error/handler.ts
@@ -40,6 +40,7 @@ export class GlobalErrorHandler implements ErrorHandler {
     }
 
     if (error instanceof YAMLException) {
+      console.error(error);
       return;
     }
 
diff --git a/src/app/frontend/shared.module.ts b/src/app/frontend/shared.module.ts
index 33fa064a6..f783f1578 100644
--- a/src/app/frontend/shared.module.ts
+++ b/src/app/frontend/shared.module.ts
@@ -43,6 +43,7 @@ import {MatTabsModule} from '@angular/material/tabs';
 import {MatToolbarModule} from '@angular/material/toolbar';
 import {MAT_TOOLTIP_DEFAULT_OPTIONS, MatTooltipModule} from '@angular/material/tooltip';
 import {RouterModule} from '@angular/router';
+import {InViewportModule} from 'ng-in-viewport';
 import {FilterPipeModule} from 'ngx-filter-pipe';
 
 import {PipesModule} from './common/pipes/module';
@@ -88,6 +89,7 @@ const SHARED_DEPENDENCIES = [
   RouterModule,
   FilterPipeModule,
   NgxChartsModule,
+  InViewportModule,
 
   // Custom application modules
   PipesModule,
diff --git a/src/app/frontend/typings/frontendapi.ts b/src/app/frontend/typings/frontendapi.ts
index e2383196e..8676678b6 100644
--- a/src/app/frontend/typings/frontendapi.ts
+++ b/src/app/frontend/typings/frontendapi.ts
@@ -134,3 +134,8 @@ export interface PluginsConfig {
   plugins: PluginMetadata[];
   errors?: object[];
 }
+
+export interface ViewportMetadata {
+  target: HTMLElement;
+  visible: boolean;
+}


Test patch:
diff --git a/src/app/backend/client/api/common_test.go b/src/app/backend/client/api/common_test.go
index e3c653de5..2cb7f5724 100644
--- a/src/app/backend/client/api/common_test.go
+++ b/src/app/backend/client/api/common_test.go
@@ -18,8 +18,9 @@ import (
 	"reflect"
 	"testing"
 
-	"github.com/kubernetes/dashboard/src/app/backend/client/api"
 	v1 "k8s.io/api/authorization/v1"
+
+	"github.com/kubernetes/dashboard/src/app/backend/client/api"
 )
 
 func TestToSelfSubjectAccessReview(t *testing.T) {
@@ -32,8 +33,8 @@ func TestToSelfSubjectAccessReview(t *testing.T) {
 			ResourceAttributes: &v1.ResourceAttributes{
 				Namespace: ns,
 				Name:      name,
-				Resource:  resourceName,
-				Verb:      verb,
+				Resource:  "deployments",
+				Verb:      "get",
 			},
 		},
 	}