github.com/umeshredd/helm@v3.0.0-alpha.1+incompatible/docs/using_helm.md (about)

     1  # Using Helm
     2  
     3  This guide explains the basics of using Helm to manage
     4  packages on your Kubernetes cluster. It assumes that you have already
     5  [installed](install.md) the Helm client and library (typically by `helm
     6  init`).
     7  
     8  If you are simply interested in running a few quick commands, you may
     9  wish to begin with the [Quickstart Guide](quickstart.md). This chapter
    10  covers the particulars of Helm commands, and explains how to use Helm.
    11  
    12  ## Three Big Concepts
    13  
    14  A *Chart* is a Helm package. It contains all of the resource definitions
    15  necessary to run an application, tool, or service inside of a Kubernetes
    16  cluster. Think of it like the Kubernetes equivalent of a Homebrew formula,
    17  an Apt dpkg, or a Yum RPM file.
    18  
    19  A *Repository* is the place where charts can be collected and shared.
    20  It's like Perl's [CPAN archive](http://www.cpan.org) or the
    21  [Fedora Package Database](https://admin.fedoraproject.org/pkgdb/), but for
    22  Kubernetes packages.
    23  
    24  A *Release* is an instance of a chart running in a Kubernetes cluster.
    25  One chart can often be installed many times into the same cluster. And
    26  each time it is installed, a new _release_ is created. Consider a MySQL
    27  chart. If you want two databases running in your cluster, you can
    28  install that chart twice. Each one will have its own _release_, which
    29  will in turn have its own _release name_.
    30  
    31  With these concepts in mind, we can now explain Helm like this:
    32  
    33  Helm installs _charts_ into Kubernetes, creating a new _release_ for
    34  each installation. And to find new charts, you can search Helm chart
    35  _repositories_.
    36  
    37  ## 'helm search': Finding Charts
    38  
    39  When you first install Helm, it is preconfigured to talk to the official
    40  Kubernetes charts repository. This repository contains a number of
    41  carefully curated and maintained charts. This chart repository is named
    42  `stable` by default.
    43  
    44  You can see which charts are available by running `helm search`:
    45  
    46  ```
    47  $ helm search
    48  NAME                 	VERSION 	DESCRIPTION
    49  stable/drupal   	0.3.2   	One of the most versatile open source content m...
    50  stable/jenkins  	0.1.0   	A Jenkins Helm chart for Kubernetes.
    51  stable/mariadb  	0.5.1   	Chart for MariaDB
    52  stable/mysql    	0.1.0   	Chart for MySQL
    53  ...
    54  ```
    55  
    56  With no filter, `helm search` shows you all of the available charts. You
    57  can narrow down your results by searching with a filter:
    58  
    59  ```
    60  $ helm search mysql
    61  NAME               	VERSION	DESCRIPTION
    62  stable/mysql  	0.1.0  	Chart for MySQL
    63  stable/mariadb	0.5.1  	Chart for MariaDB
    64  ```
    65  
    66  Now you will only see the results that match your filter.
    67  
    68  Why is
    69  `mariadb` in the list? Because its package description relates it to
    70  MySQL. We can use `helm inspect chart` to see this:
    71  
    72  ```
    73  $ helm inspect stable/mariadb
    74  Fetched stable/mariadb to mariadb-0.5.1.tgz
    75  description: Chart for MariaDB
    76  home: https://mariadb.org
    77  keywords:
    78  - mariadb
    79  - mysql
    80  - database
    81  - sql
    82  ...
    83  ```
    84  
    85  Search is a good way to find available packages. Once you have found a
    86  package you want to install, you can use `helm install` to install it.
    87  
    88  ## 'helm install': Installing a Package
    89  
    90  To install a new package, use the `helm install` command. At its
    91  simplest, it takes only one argument: The name of the chart.
    92  
    93  ```
    94  $ helm install stable/mariadb
    95  Fetched stable/mariadb-0.3.0 to /Users/mattbutcher/Code/Go/src/helm.sh/helm/mariadb-0.3.0.tgz
    96  happy-panda
    97  Last Deployed: Wed Sep 28 12:32:28 2016
    98  Namespace: default
    99  Status: DEPLOYED
   100  
   101  Resources:
   102  ==> extensions/Deployment
   103  NAME                     DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
   104  happy-panda-mariadb   1         0         0            0           1s
   105  
   106  ==> v1/Secret
   107  NAME                     TYPE      DATA      AGE
   108  happy-panda-mariadb   Opaque    2         1s
   109  
   110  ==> v1/Service
   111  NAME                     CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
   112  happy-panda-mariadb   10.0.0.70    <none>        3306/TCP   1s
   113  
   114  
   115  Notes:
   116  MariaDB can be accessed via port 3306 on the following DNS name from within your cluster:
   117  happy-panda-mariadb.default.svc.cluster.local
   118  
   119  To connect to your database run the following command:
   120  
   121     kubectl run happy-panda-mariadb-client --rm --tty -i --image bitnami/mariadb --command -- mysql -h happy-panda-mariadb
   122  ```
   123  
   124  Now the `mariadb` chart is installed. Note that installing a chart
   125  creates a new _release_ object. The release above is named
   126  `happy-panda`. (If you want to use your own release name, simply use the
   127  `--name` flag on `helm install`.)
   128  
   129  During installation, the `helm` client will print useful information
   130  about which resources were created, what the state of the release is,
   131  and also whether there are additional configuration steps you can or
   132  should take.
   133  
   134  Helm does not wait until all of the resources are running before it
   135  exits. Many charts require Docker images that are over 600M in size, and
   136  may take a long time to install into the cluster.
   137  
   138  To keep track of a release's state, or to re-read configuration
   139  information, you can use `helm status`:
   140  
   141  ```
   142  $ helm status happy-panda
   143  Last Deployed: Wed Sep 28 12:32:28 2016
   144  Namespace: default
   145  Status: DEPLOYED
   146  
   147  Resources:
   148  ==> v1/Service
   149  NAME                     CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
   150  happy-panda-mariadb   10.0.0.70    <none>        3306/TCP   4m
   151  
   152  ==> extensions/Deployment
   153  NAME                     DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
   154  happy-panda-mariadb   1         1         1            1           4m
   155  
   156  ==> v1/Secret
   157  NAME                     TYPE      DATA      AGE
   158  happy-panda-mariadb   Opaque    2         4m
   159  
   160  
   161  Notes:
   162  MariaDB can be accessed via port 3306 on the following DNS name from within your cluster:
   163  happy-panda-mariadb.default.svc.cluster.local
   164  
   165  To connect to your database run the following command:
   166  
   167     kubectl run happy-panda-mariadb-client --rm --tty -i --image bitnami/mariadb --command -- mysql -h happy-panda-mariadb
   168  ```
   169  
   170  The above shows the current state of your release.
   171  
   172  ### Customizing the Chart Before Installing
   173  
   174  Installing the way we have here will only use the default configuration
   175  options for this chart. Many times, you will want to customize the chart
   176  to use your preferred configuration.
   177  
   178  To see what options are configurable on a chart, use `helm inspect
   179  values`:
   180  
   181  ```console
   182  helm inspect values stable/mariadb
   183  Fetched stable/mariadb-0.3.0.tgz to /Users/mattbutcher/Code/Go/src/helm.sh/helm/mariadb-0.3.0.tgz
   184  ## Bitnami MariaDB image version
   185  ## ref: https://hub.docker.com/r/bitnami/mariadb/tags/
   186  ##
   187  ## Default: none
   188  imageTag: 10.1.14-r3
   189  
   190  ## Specify a imagePullPolicy
   191  ## Default to 'Always' if imageTag is 'latest', else set to 'IfNotPresent'
   192  ## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images
   193  ##
   194  # imagePullPolicy:
   195  
   196  ## Specify password for root user
   197  ## ref: https://github.com/bitnami/bitnami-docker-mariadb/blob/master/README.md#setting-the-root-password-on-first-run
   198  ##
   199  # mariadbRootPassword:
   200  
   201  ## Create a database user
   202  ## ref: https://github.com/bitnami/bitnami-docker-mariadb/blob/master/README.md#creating-a-database-user-on-first-run
   203  ##
   204  # mariadbUser:
   205  # mariadbPassword:
   206  
   207  ## Create a database
   208  ## ref: https://github.com/bitnami/bitnami-docker-mariadb/blob/master/README.md#creating-a-database-on-first-run
   209  ##
   210  # mariadbDatabase:
   211  ```
   212  
   213  You can then override any of these settings in a YAML formatted file,
   214  and then pass that file during installation.
   215  
   216  ```console
   217  $ echo '{mariadbUser: user0, mariadbDatabase: user0db}' > config.yaml
   218  $ helm install -f config.yaml stable/mariadb
   219  ```
   220  
   221  The above will create a default MariaDB user with the name `user0`, and
   222  grant this user access to a newly created `user0db` database, but will
   223  accept all the rest of the defaults for that chart.
   224  
   225  There are two ways to pass configuration data during install:
   226  
   227  - `--values` (or `-f`): Specify a YAML file with overrides. This can be specified multiple times
   228    and the rightmost file will take precedence
   229  - `--set`: Specify overrides on the command line.
   230  
   231  If both are used, `--set` values are merged into `--values` with higher precedence.
   232  Overrides specified with `--set` are persisted in a configmap. Values that have been
   233  `--set` can be viewed for a given release with `helm get values <release-name>`.
   234  Values that have been `--set` can be cleared by running `helm upgrade` with `--reset-values`
   235  specified.
   236  
   237  #### The Format and Limitations of `--set`
   238  
   239  The `--set` option takes zero or more name/value pairs. At its simplest, it is
   240  used like this: `--set name=value`. The YAML equivalent of that is:
   241  
   242  ```yaml
   243  name: value
   244  ```
   245  
   246  Multiple values are separated by `,` characters. So `--set a=b,c=d` becomes:
   247  
   248  ```yaml
   249  a: b
   250  c: d
   251  ```
   252  
   253  More complex expressions are supported. For example, `--set outer.inner=value` is
   254  translated into this:
   255  ```yaml
   256  outer:
   257    inner: value
   258  ```
   259  
   260  Lists can be expressed by enclosing values in `{` and `}`. For example,
   261  `--set name={a, b, c}` translates to:
   262  
   263  ```yaml
   264  name:
   265    - a
   266    - b
   267    - c
   268  ```
   269  
   270  As of Helm 2.5.0, it is possible to access list items using an array index syntax.
   271  For example, `--set servers[0].port=80` becomes:
   272  
   273  ```yaml
   274  servers:
   275    - port: 80
   276  ```
   277  
   278  Multiple values can be set this way. The line `--set servers[0].port=80,servers[0].host=example` becomes:
   279  
   280  ```yaml
   281  servers:
   282    - port: 80
   283      host: example
   284  ```
   285  
   286  Sometimes you need to use special characters in your `--set` lines. You can use
   287  a backslash to escape the characters; `--set name=value1\,value2` will become:
   288  
   289  ```yaml
   290  name: "value1,value2"
   291  ```
   292  
   293  Similarly, you can escape dot sequences as well, which may come in handy when charts use the
   294  `toYaml` function to parse annotations, labels and node selectors. The syntax for
   295  `--set nodeSelector."kubernetes\.io/role"=master` becomes:
   296  
   297  ```yaml
   298  nodeSelector:
   299    kubernetes.io/role: master
   300  ```
   301  
   302  Deeply nested data structures can be difficult to express using `--set`. Chart
   303  designers are encouraged to consider the `--set` usage when designing the format
   304  of a `values.yaml` file.
   305  
   306  ### More Installation Methods
   307  
   308  The `helm install` command can install from several sources:
   309  
   310  - A chart repository (as we've seen above)
   311  - A local chart archive (`helm install foo-0.1.1.tgz`)
   312  - An unpacked chart directory (`helm install path/to/foo`)
   313  - A full URL (`helm install https://example.com/charts/foo-1.2.3.tgz`)
   314  
   315  ## 'helm upgrade' and 'helm rollback': Upgrading a Release, and Recovering on Failure
   316  
   317  When a new version of a chart is released, or when you want to change
   318  the configuration of your release, you can use the `helm upgrade`
   319  command.
   320  
   321  An upgrade takes an existing release and upgrades it according to the
   322  information you provide. Because Kubernetes charts can be large and
   323  complex, Helm tries to perform the least invasive upgrade. It will only
   324  update things that have changed since the last release.
   325  
   326  ```console
   327  $ helm upgrade -f panda.yaml happy-panda stable/mariadb
   328  Fetched stable/mariadb-0.3.0.tgz to /Users/mattbutcher/Code/Go/src/helm.sh/helm/mariadb-0.3.0.tgz
   329  happy-panda has been upgraded. Happy Helming!
   330  Last Deployed: Wed Sep 28 12:47:54 2016
   331  Namespace: default
   332  Status: DEPLOYED
   333  ...
   334  ```
   335  
   336  In the above case, the `happy-panda` release is upgraded with the same
   337  chart, but with a new YAML file:
   338  
   339  ```yaml
   340  mariadbUser: user1
   341  ```
   342  
   343  We can use `helm get values` to see whether that new setting took
   344  effect.
   345  
   346  ```console
   347  $ helm get values happy-panda
   348  mariadbUser: user1
   349  ```
   350  
   351  The `helm get` command is a useful tool for looking at a release in the
   352  cluster. And as we can see above, it shows that our new values from
   353  `panda.yaml` were deployed to the cluster.
   354  
   355  Now, if something does not go as planned during a release, it is easy to
   356  roll back to a previous release using `helm rollback [RELEASE] [REVISION]`.
   357  
   358  ```console
   359  $ helm rollback happy-panda 1
   360  ```
   361  
   362  The above rolls back our happy-panda to its very first release version.
   363  A release version is an incremental revision. Every time an install,
   364  upgrade, or rollback happens, the revision number is incremented by 1.
   365  The first revision number is always 1. And we can use `helm history [RELEASE]`
   366  to see revision numbers for a certain release.
   367  
   368  ## Helpful Options for Install/Upgrade/Rollback
   369  There are several other helpful options you can specify for customizing the
   370  behavior of Helm during an install/upgrade/rollback. Please note that this
   371  is not a full list of cli flags. To see a description of all flags, just run
   372  `helm <command> --help`.
   373  
   374  - `--timeout`: A value in seconds to wait for Kubernetes commands to complete
   375    This defaults to 300 (5 minutes)
   376  - `--wait`: Waits until all Pods are in a ready state, PVCs are bound, Deployments
   377    have minimum (`Desired` minus `maxUnavailable`) Pods in ready state and
   378    Services have an IP address (and Ingress if a `LoadBalancer`) before
   379    marking the release as successful. It will wait for as long as the
   380    `--timeout` value. If timeout is reached, the release will be marked as
   381    `FAILED`. Note: In scenario where Deployment has `replicas` set to 1 and
   382    `maxUnavailable` is not set to 0 as part of rolling update strategy,
   383    `--wait` will return as ready as it has satisfied the minimum Pod in ready condition.
   384  - `--no-hooks`: This skips running hooks for the command
   385  - `--recreate-pods` (only available for `upgrade` and `rollback`): This flag
   386    will cause all pods to be recreated (with the exception of pods belonging to
   387    deployments)
   388  
   389  ## 'helm uninstall': Uninstalling a Release
   390  
   391  When it is time to uninstall or uninstall a release from the cluster, use
   392  the `helm uninstall` command:
   393  
   394  ```
   395  $ helm uninstall happy-panda
   396  ```
   397  
   398  This will remove the release from the cluster. You can see all of your
   399  currently deployed releases with the `helm list` command:
   400  
   401  ```
   402  $ helm list
   403  NAME           	VERSION	UPDATED                        	STATUS         	CHART
   404  inky-cat       	1      	Wed Sep 28 12:59:46 2016       	DEPLOYED       	alpine-0.1.0
   405  ```
   406  
   407  From the output above, we can see that the `happy-panda` release was
   408  uninstalled.
   409  
   410  However, Helm always keeps records of what releases happened. Need to
   411  see the uninstalled releases? `helm list --uninstalled` shows those, and `helm
   412  list --all` shows all of the releases (uninstalled and currently deployed,
   413  as well as releases that failed):
   414  
   415  ```console
   416  ⇒  helm list --all
   417  NAME           	VERSION	UPDATED                        	STATUS         	CHART
   418  happy-panda   	2      	Wed Sep 28 12:47:54 2016       	UNINSTALLED    	mariadb-0.3.0
   419  inky-cat       	1      	Wed Sep 28 12:59:46 2016       	DEPLOYED       	alpine-0.1.0
   420  kindred-angelf 	2      	Tue Sep 27 16:16:10 2016       	UNINSTALLED    	alpine-0.1.0
   421  ```
   422  
   423  Because Helm keeps records of uninstalled releases, a release name cannot
   424  be re-used. (If you _really_ need to re-use a release name, you can use
   425  the `--replace` flag, but it will simply re-use the existing release and
   426  replace its resources.)
   427  
   428  Note that because releases are preserved in this way, you can rollback a
   429  uninstalled resource, and have it re-activate.
   430  
   431  ## 'helm repo': Working with Repositories
   432  
   433  So far, we've been installing charts only from the `stable` repository.
   434  But you can configure `helm` to use other repositories. Helm provides
   435  several repository tools under the `helm repo` command.
   436  
   437  You can see which repositories are configured using `helm repo list`:
   438  
   439  ```console
   440  $ helm repo list
   441  NAME           	URL
   442  stable         	https://kubernetes-charts.storage.googleapis.com
   443  local          	http://localhost:8879/charts
   444  mumoshu        	https://mumoshu.github.io/charts
   445  ```
   446  
   447  And new repositories can be added with `helm repo add`:
   448  
   449  ```console
   450  $ helm repo add dev https://example.com/dev-charts
   451  ```
   452  
   453  Because chart repositories change frequently, at any point you can make
   454  sure your Helm client is up to date by running `helm repo update`.
   455  
   456  ## Creating Your Own Charts
   457  
   458  The [Chart Development Guide](charts.md) explains how to develop your own
   459  charts. But you can get started quickly by using the `helm create`
   460  command:
   461  
   462  ```console
   463  $ helm create deis-workflow
   464  Creating deis-workflow
   465  ```
   466  
   467  Now there is a chart in `./deis-workflow`. You can edit it and create
   468  your own templates.
   469  
   470  As you edit your chart, you can validate that it is well-formatted by
   471  running `helm lint`.
   472  
   473  When it's time to package the chart up for distribution, you can run the
   474  `helm package` command:
   475  
   476  ```console
   477  $ helm package deis-workflow
   478  deis-workflow-0.1.0.tgz
   479  ```
   480  
   481  And that chart can now easily be installed by `helm install`:
   482  
   483  ```console
   484  $ helm install ./deis-workflow-0.1.0.tgz
   485  ...
   486  ```
   487  
   488  Charts that are archived can be loaded into chart repositories. See the
   489  documentation for your chart repository server to learn how to upload.
   490  
   491  Note: The `stable` repository is managed on the [Kubernetes Charts
   492  GitHub repository](https://github.com/helm/charts). That project
   493  accepts chart source code, and (after audit) packages those for you.
   494  
   495  ## Conclusion
   496  
   497  This chapter has covered the basic usage patterns of the `helm` client,
   498  including searching, installation, upgrading, and uninstalling. It has also
   499  covered useful utility commands like `helm status`, `helm get`, and
   500  `helm repo`.
   501  
   502  For more information on these commands, take a look at Helm's built-in
   503  help: `helm help`.
   504  
   505  In the next chapter, we look at the process of developing charts.