github.com/cloudposse/helm@v2.2.3+incompatible/docs/using_helm.md (about)

     1  # Using Helm
     2  
     3  This guide explains the basics of using Helm (and Tiller) to manage
     4  packages on your Kubernetes cluster. It assumes that you have already
     5  [installed](install.md) the Helm client and the Tiller server (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  engine: gotpl
    77  home: https://mariadb.org
    78  keywords:
    79  - mariadb
    80  - mysql
    81  - database
    82  - sql
    83  ...
    84  ```
    85  
    86  Search is a good way to find available packages. Once you have found a
    87  package you want to install, you can use `helm install` to install it.
    88  
    89  ## 'helm install': Installing a Package
    90  
    91  To install a new package, use the `helm install` command. At its
    92  simplest, it takes only one argument: The name of the chart.
    93  
    94  ```
    95  $ helm install stable/mariadb
    96  Fetched stable/mariadb-0.3.0 to /Users/mattbutcher/Code/Go/src/k8s.io/helm/mariadb-0.3.0.tgz
    97  happy-panda
    98  Last Deployed: Wed Sep 28 12:32:28 2016
    99  Namespace: default
   100  Status: DEPLOYED
   101  
   102  Resources:
   103  ==> extensions/Deployment
   104  NAME                     DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
   105  happy-panda-mariadb   1         0         0            0           1s
   106  
   107  ==> v1/Secret
   108  NAME                     TYPE      DATA      AGE
   109  happy-panda-mariadb   Opaque    2         1s
   110  
   111  ==> v1/Service
   112  NAME                     CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
   113  happy-panda-mariadb   10.0.0.70    <none>        3306/TCP   1s
   114  
   115  
   116  Notes:
   117  MariaDB can be accessed via port 3306 on the following DNS name from within your cluster:
   118  happy-panda-mariadb.default.svc.cluster.local
   119  
   120  To connect to your database run the following command:
   121  
   122     kubectl run happy-panda-mariadb-client --rm --tty -i --image bitnami/mariadb --command -- mysql -h happy-panda-mariadb
   123  ```
   124  
   125  Now the `mariadb` chart is installed. Note that installing a chart
   126  creates a new _release_ object. The release above is named
   127  `happy-panda`. (If you want to use your own release name, simply use the
   128  `--name` flag on `helm install`.)
   129  
   130  During installation, the `helm` client will print useful information
   131  about which resources were created, what the state of the release is,
   132  and also whether there are additional configuration steps you can or
   133  should take.
   134  
   135  Helm does not wait until all of the resources are running before it
   136  exits. Many charts require Docker images that are over 600M in size, and
   137  may take a long time to install into the cluster.
   138  
   139  To keep track of a release's state, or to re-read configuration
   140  information, you can use `helm status`:
   141  
   142  ```
   143  $ helm status happy-panda
   144  Last Deployed: Wed Sep 28 12:32:28 2016
   145  Namespace: default
   146  Status: DEPLOYED
   147  
   148  Resources:
   149  ==> v1/Service
   150  NAME                     CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
   151  happy-panda-mariadb   10.0.0.70    <none>        3306/TCP   4m
   152  
   153  ==> extensions/Deployment
   154  NAME                     DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
   155  happy-panda-mariadb   1         1         1            1           4m
   156  
   157  ==> v1/Secret
   158  NAME                     TYPE      DATA      AGE
   159  happy-panda-mariadb   Opaque    2         4m
   160  
   161  
   162  Notes:
   163  MariaDB can be accessed via port 3306 on the following DNS name from within your cluster:
   164  happy-panda-mariadb.default.svc.cluster.local
   165  
   166  To connect to your database run the following command:
   167  
   168     kubectl run happy-panda-mariadb-client --rm --tty -i --image bitnami/mariadb --command -- mysql -h happy-panda-mariadb
   169  ```
   170  
   171  The above shows the current state of your release.
   172  
   173  ### Customizing the Chart Before Installing
   174  
   175  Installing the way we have here will only use the default configuration
   176  options for this chart. Many times, you will want to customize the chart
   177  to use your preferred configuration.
   178  
   179  To see what options are configurable on a chart, use `helm inspect
   180  values`:
   181  
   182  ```console
   183  helm inspect values stable/mariadb
   184  Fetched stable/mariadb-0.3.0.tgz to /Users/mattbutcher/Code/Go/src/k8s.io/helm/mariadb-0.3.0.tgz
   185  ## Bitnami MariaDB image version
   186  ## ref: https://hub.docker.com/r/bitnami/mariadb/tags/
   187  ##
   188  ## Default: none
   189  imageTag: 10.1.14-r3
   190  
   191  ## Specify a imagePullPolicy
   192  ## Default to 'Always' if imageTag is 'latest', else set to 'IfNotPresent'
   193  ## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images
   194  ##
   195  # imagePullPolicy:
   196  
   197  ## Specify password for root user
   198  ## ref: https://github.com/bitnami/bitnami-docker-mariadb/blob/master/README.md#setting-the-root-password-on-first-run
   199  ##
   200  # mariadbRootPassword:
   201  
   202  ## Create a database user
   203  ## ref: https://github.com/bitnami/bitnami-docker-mariadb/blob/master/README.md#creating-a-database-user-on-first-run
   204  ##
   205  # mariadbUser:
   206  # mariadbPassword:
   207  
   208  ## Create a database
   209  ## ref: https://github.com/bitnami/bitnami-docker-mariadb/blob/master/README.md#creating-a-database-on-first-run
   210  ##
   211  # mariadbDatabase:
   212  ```
   213  
   214  You can then override any of these settings in a YAML formatted file,
   215  and then pass that file during installation.
   216  
   217  ```console
   218  $ echo 'mariadbUser: user0` > config.yaml
   219  $ helm install -f config.yaml stable/mariadb
   220  ```
   221  
   222  The above will set the default MariaDB user to `user0`, but accept all
   223  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  
   233  #### The Format and Limitations of `--set`
   234  
   235  The `--set` option takes zero or more name/value pairs. At its simplest, it is
   236  used like this: `--set name=value`. The YAML equivalent of that is:
   237  
   238  ```yaml
   239  name: value
   240  ```
   241  
   242  Multiple values are separated by `,` characters. So `--set a=b,c=d` becomes:
   243  
   244  ```yaml
   245  a: b
   246  c: d
   247  ```
   248  
   249  More complex expressions are supported. For example, `--set outer.inner=value` is
   250  translated into this:
   251  ```yaml
   252  outer:
   253    inner: value
   254  ```
   255  
   256  Lists can be expressed by enclosing values in `{` and `}`. For example,
   257  `--set name={a, b, c}` translates to:
   258  
   259  ```yaml
   260  name:
   261    - a
   262    - b
   263    - c
   264  ```
   265  
   266  Sometimes you need to use special characters in your `--set` lines. You can use
   267  a backslash to escape the characters; `--set name=value1\,value2` will become:
   268  
   269  ```yaml
   270  name: "value1,value2"
   271  ```
   272  
   273  The `--set` syntax is not as expressive as YAML, especially when it comes to
   274  collections. And there is currently no method for expressing things such as "set
   275  the third item in a list to...".
   276  
   277  ### More Installation Methods
   278  
   279  The `helm install` command can install from several sources:
   280  
   281  - A chart repository (as we've seen above)
   282  - A local chart archive (`helm install foo-0.1.1.tgz`)
   283  - An unpacked chart directory (`helm install path/to/foo`)
   284  - A full URL (`helm install https://example.com/charts/foo-1.2.3.tgz`)
   285  
   286  ## 'helm upgrade' and 'helm rollback': Upgrading a Release, and Recovering on Failure
   287  
   288  When a new version of a chart is released, or when you want to change
   289  the configuration of your release, you can use the `helm upgrade`
   290  command.
   291  
   292  An upgrade takes an existing release and upgrades it according to the
   293  information you provide. Because Kubernetes charts can be large and
   294  complex, Helm tries to perform the least invasive upgrade. It will only
   295  update things that have changed since the last release.
   296  
   297  ```console
   298  $ helm upgrade -f panda.yaml happy-panda stable/mariadb
   299  Fetched stable/mariadb-0.3.0.tgz to /Users/mattbutcher/Code/Go/src/k8s.io/helm/mariadb-0.3.0.tgz
   300  happy-panda has been upgraded. Happy Helming!
   301  Last Deployed: Wed Sep 28 12:47:54 2016
   302  Namespace: default
   303  Status: DEPLOYED
   304  ...
   305  ```
   306  
   307  In the above case, the `happy-panda` release is upgraded with the same
   308  chart, but with a new YAML file:
   309  
   310  ```yaml
   311  mariadbUser: user1
   312  ```
   313  
   314  We can use `helm get values` to see whether that new setting took
   315  effect.
   316  
   317  ```console
   318  $ helm get values happy-panda
   319  mariadbUser: user1
   320  ```
   321  
   322  The `helm get` command is a useful tool for looking at a release in the
   323  cluster. And as we can see above, it shows that our new values from
   324  `panda.yaml` were deployed to the cluster.
   325  
   326  Now, if something does not go as planned during a release, it is easy to
   327  roll back to a previous release using `helm rollback [RELEASE] [REVISION]`.
   328  
   329  ```console
   330  $ helm rollback happy-panda 1
   331  ```
   332  
   333  The above rolls back our happy-panda to its very first release version.
   334  A release version is an incremental revision. Every time an install,
   335  upgrade, or rollback happens, the revision number is incremented by 1.
   336  The first revision number is always 1. And we can use `helm history [RELEASE]`
   337  to see revision numbers for a certain release.
   338  
   339  ## Helpful Options for Install/Upgrade/Rollback
   340  There are several other helpful options you can specify for customizing the
   341  behavior of Helm during an install/upgrade/rollback. Please note that this
   342  is not a full list of cli flags. To see a description of all flags, just run
   343  `helm <command> --help`.
   344  
   345  - `--timeout`: A value in seconds to wait for Kubernetes commands to complete
   346    This defaults to 300 (5 minutes)
   347  - `--wait`: Waits until all Pods are in a ready state, PVCs are bound, and 
   348    Services have and IP address (and Ingress if a `LoadBalancer`) before 
   349    marking the release as successful. It will wait for as long as the 
   350    `--timeout` value. If timeout is reached, the release will be marked as 
   351    `FAILED`.
   352  - `--no-hooks`: This skips running hooks for the command
   353  - `--recreate-pods` (only available for `upgrade` and `rollback`): This flag
   354    will cause all pods to be recreated (with the exception of pods belonging to
   355    deployments)
   356  
   357  ## 'helm delete': Deleting a Release
   358  
   359  When it is time to uninstall or delete a release from the cluster, use
   360  the `helm delete` command:
   361  
   362  ```
   363  $ helm delete happy-panda
   364  ```
   365  
   366  This will remove the release from the cluster. You can see all of your
   367  currently deployed releases with the `helm list` command:
   368  
   369  ```
   370  $ helm list
   371  NAME           	VERSION	UPDATED                        	STATUS         	CHART
   372  inky-cat       	1      	Wed Sep 28 12:59:46 2016       	DEPLOYED       	alpine-0.1.0
   373  ```
   374  
   375  From the output above, we can see that the `happy-panda` release was
   376  deleted.
   377  
   378  However, Helm always keeps records of what releases happened. Need to
   379  see the deleted releases? `helm list --deleted` shows those, and `helm
   380  list --all` shows all of the releases (deleted and currently deployed,
   381  as well as releases that failed):
   382  
   383  ```console
   384  ⇒  helm list --all
   385  NAME           	VERSION	UPDATED                        	STATUS         	CHART
   386  happy-panda   	2      	Wed Sep 28 12:47:54 2016       	DELETED        	mariadb-0.3.0
   387  inky-cat       	1      	Wed Sep 28 12:59:46 2016       	DEPLOYED       	alpine-0.1.0
   388  kindred-angelf 	2      	Tue Sep 27 16:16:10 2016       	DELETED        	alpine-0.1.0
   389  ```
   390  
   391  Because Helm keeps records of deleted releases, a release name cannot be
   392  re-used. (If you _really_ need to re-use a release name, you can use the
   393  `--replace` flag, but it will simply re-use the existing release and
   394  replace its resources.)
   395  
   396  Note that because releases are preserved in this way, you can rollback a
   397  deleted resource, and have it re-activate.
   398  
   399  ## 'helm repo': Working with Repositories
   400  
   401  So far, we've been installing charts only from the `stable` repository.
   402  But you can configure `helm` to use other repositories. Helm provides
   403  several repository tools under the `helm repo` command.
   404  
   405  You can see which repositories are configured using `helm repo list`:
   406  
   407  ```console
   408  $ helm repo list
   409  NAME           	URL
   410  stable         	https://kubernetes-charts.storage.googleapis.com
   411  local          	http://localhost:8879/charts
   412  mumoshu        	https://mumoshu.github.io/charts
   413  ```
   414  
   415  And new repositories can be added with `helm repo add`:
   416  
   417  ```console
   418  $ helm repo add dev https://example.com/dev-charts
   419  ```
   420  
   421  Because chart repositories change frequently, at any point you can make
   422  sure your Helm client is up to date by running `helm repo update`.
   423  
   424  ## Creating Your Own Charts
   425  
   426  The [Chart Development Guide](charts.md) explains how to develop your own
   427  charts. But you can get started quickly by using the `helm create`
   428  command:
   429  
   430  ```console
   431  $ helm create deis-workflow
   432  Creating deis-workflow
   433  ```
   434  
   435  Now there is a chart in `./deis-workflow`. You can edit it and create
   436  your own templates.
   437  
   438  As you edit your chart, you can validate that it is well-formatted by
   439  running `helm lint`.
   440  
   441  When it's time to package the chart up for distribution, you can run the
   442  `helm package` command:
   443  
   444  ```console
   445  $ helm package deis-workflow
   446  deis-workflow-0.1.0.tgz
   447  ```
   448  
   449  And that chart can now easily be installed by `helm install`:
   450  
   451  ```console
   452  $ helm install ./deis-workflow-0.1.0.tgz
   453  ...
   454  ```
   455  
   456  Charts that are archived can be loaded into chart repositories. See the
   457  documentation for your chart repository server to learn how to upload.
   458  
   459  Note: The `stable` repository is managed on the [Kubernetes Charts
   460  GitHub repository](https://github.com/kubernetes/charts). That project
   461  accepts chart source code, and (after audit) packages those for you.
   462  
   463  ## Conclusion
   464  
   465  This chapter has covered the basic usage patterns of the `helm` client,
   466  including searching, installation, upgrading, and deleting. It has also
   467  covered useful utility commands like `helm status`, `helm get`, and
   468  `helm repo`.
   469  
   470  For more information on these commands, take a look at Helm's built-in
   471  help: `helm help`.
   472  
   473  In the next chapter, we look at the process of developing charts.