github.com/felipejfc/helm@v2.1.2+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`): Specifiy a YAML file with overrides.
   228  - `--set`: Specify overrides on the command line.
   229  
   230  If both are used, `--set` values are merged into `--values` with higher precedence.
   231  
   232  #### The Format and Limitations of `--set`
   233  
   234  The `--set` option takes zero or more name/value pairs. At its simplest, it is
   235  used like this: `--set name=value`. The YAML equivalent of that is:
   236  
   237  ```yaml
   238  name: value
   239  ```
   240  
   241  Multiple values are separated by `,` characters. So `--set a=b,c=d` becomes:
   242  
   243  ```yaml
   244  a: b
   245  c: d
   246  ```
   247  
   248  More complex expressions are supported. For example, `--set outer.inner=value` is
   249  translated into this:
   250  ```yaml
   251  outer:
   252    inner: value
   253  ```
   254  
   255  Lists can be expressed by enclosing values in `{` and `}`. For example,
   256  `--set name={a, b, c}` translates to:
   257  
   258  ```yaml
   259  name:
   260    - a
   261    - b
   262    - c
   263  ```
   264  
   265  Sometimes you need to use special characters in your `--set` lines. You can use
   266  a backslash to escape the characters; `--set name=value1\,value2` will become:
   267  
   268  ```yaml
   269  name: "value1,value2"
   270  ```
   271  
   272  The `--set` syntax is not as expressive as YAML, especially when it comes to
   273  collections. And there is currently no method for expressing things such as "set
   274  the third item in a list to...".
   275  
   276  ### More Installation Methods
   277  
   278  The `helm install` command can install from several sources:
   279  
   280  - A chart repository (as we've seen above)
   281  - A local chart archive (`helm install foo-0.1.1.tgz`)
   282  - An unpacked chart directory (`helm install path/to/foo`)
   283  - A full URL (`helm install https://example.com/charts/foo-1.2.3.tgz`)
   284  
   285  ## 'helm upgrade' and 'helm rollback': Upgrading a Release, and Recovering on Failure
   286  
   287  When a new version of a chart is released, or when you want to change
   288  the configuration of your release, you can use the `helm upgrade`
   289  command.
   290  
   291  An upgrade takes an existing release and upgrades it according to the
   292  information you provide. Because Kubernetes charts can be large and
   293  complex, Helm tries to perform the least invasive upgrade. It will only
   294  update things that have changed since the last release.
   295  
   296  ```console
   297  $ helm upgrade -f panda.yaml happy-panda stable/mariadb
   298  Fetched stable/mariadb-0.3.0.tgz to /Users/mattbutcher/Code/Go/src/k8s.io/helm/mariadb-0.3.0.tgz
   299  happy-panda has been upgraded. Happy Helming!
   300  Last Deployed: Wed Sep 28 12:47:54 2016
   301  Namespace: default
   302  Status: DEPLOYED
   303  ...
   304  ```
   305  
   306  In the above case, the `happy-panda` release is upgraded with the same
   307  chart, but with a new YAML file:
   308  
   309  ```yaml
   310  mariadbUser: user1
   311  ```
   312  
   313  We can use `helm get values` to see whether that new setting took
   314  effect.
   315  
   316  ```console
   317  $ helm get values happy-panda
   318  mariadbUser: user1
   319  ```
   320  
   321  The `helm get` command is a useful tool for looking at a release in the
   322  cluster. And as we can see above, it shows that our new values from
   323  `panda.yaml` were deployed to the cluster.
   324  
   325  Now, if something does not go as planned during a release, it is easy to
   326  roll back to a previous release.
   327  
   328  ```console
   329  $ helm rollback happy-panda --version 1
   330  ```
   331  
   332  The above rolls back our happy-panda to its very first release version.
   333  A release version is an incremental revision. Every time an install,
   334  upgrade, or rollback happens, the revision number is incremented by 1.
   335  The first revision number is always 1.
   336  
   337  ## 'helm delete': Deleting a Release
   338  
   339  When it is time to uninstall or delete a release from the cluster, use
   340  the `helm delete` command:
   341  
   342  ```
   343  $ helm delete happy-panda
   344  ```
   345  
   346  This will remove the release from the cluster. You can see all of your
   347  currently deployed releases with the `helm list` command:
   348  
   349  ```
   350  $ helm list
   351  NAME           	VERSION	UPDATED                        	STATUS         	CHART
   352  inky-cat       	1      	Wed Sep 28 12:59:46 2016       	DEPLOYED       	alpine-0.1.0
   353  ```
   354  
   355  From the output above, we can see that the `happy-panda` release was
   356  deleted.
   357  
   358  However, Helm always keeps records of what releases happened. Need to
   359  see the deleted releases? `helm list --deleted` shows those, and `helm
   360  list --all` shows all of the releases (deleted and currently deployed,
   361  as well as releases that failed):
   362  
   363  ```console
   364  ⇒  helm list --all
   365  NAME           	VERSION	UPDATED                        	STATUS         	CHART
   366  happy-panda   	2      	Wed Sep 28 12:47:54 2016       	DELETED        	mariadb-0.3.0
   367  inky-cat       	1      	Wed Sep 28 12:59:46 2016       	DEPLOYED       	alpine-0.1.0
   368  kindred-angelf 	2      	Tue Sep 27 16:16:10 2016       	DELETED        	alpine-0.1.0
   369  ```
   370  
   371  Because Helm keeps records of deleted releases, a release name cannot be
   372  re-used. (If you _really_ need to re-use a release name, you can use the
   373  `--replace` flag, but it will simply re-use the existing release and
   374  replace its resources.)
   375  
   376  Note that because releases are preserved in this way, you can rollback a
   377  deleted resource, and have it re-activate.
   378  
   379  ## 'helm repo': Working with Repositories
   380  
   381  So far, we've been installing charts only from the `stable` repository.
   382  But you can configure `helm` to use other repositories. Helm provides
   383  several repository tools under the `helm repo` command.
   384  
   385  You can see which repositories are configured using `helm repo list`:
   386  
   387  ```console
   388  $ helm repo list
   389  NAME           	URL
   390  stable         	https://kubernetes-charts.storage.googleapis.com
   391  local          	http://localhost:8879/charts
   392  mumoshu        	https://mumoshu.github.io/charts
   393  ```
   394  
   395  And new repositories can be added with `helm repo add`:
   396  
   397  ```console
   398  $ helm repo add dev https://example.com/dev-charts
   399  ```
   400  
   401  Because chart repositories change frequently, at any point you can make
   402  sure your Helm client is up to date by running `helm repo update`.
   403  
   404  ## Creating Your Own Charts
   405  
   406  The [Chart Development Guide](charts.md) explains how to develop your own
   407  charts. But you can get started quickly by using the `helm create`
   408  command:
   409  
   410  ```console
   411  $ helm create deis-workflow
   412  Creating deis-workflow
   413  ```
   414  
   415  Now there is a chart in `./deis-workflow`. You can edit it and create
   416  your own templates.
   417  
   418  As you edit your chart, you can validate that it is well-formatted by
   419  running `helm lint`.
   420  
   421  When it's time to package the chart up for distribution, you can run the
   422  `helm package` command:
   423  
   424  ```console
   425  $ helm package deis-workflow
   426  deis-workflow-0.1.0.tgz
   427  ```
   428  
   429  And that chart can now easily be installed by `helm install`:
   430  
   431  ```console
   432  $ helm install ./deis-workflow-0.1.0.tgz
   433  ...
   434  ```
   435  
   436  Charts that are archived can be loaded into chart repositories. See the
   437  documentation for your chart repository server to learn how to upload.
   438  
   439  Note: The `stable` repository is managed on the [Kubernetes Charts
   440  GitHub repository](https://github.com/kubernetes/charts). That project
   441  accepts chart source code, and (after audit) packages those for you.
   442  
   443  ## Conclusion
   444  
   445  This chapter has covered the basic usage patterns of the `helm` client,
   446  including searching, installation, upgrading, and deleting. It has also
   447  covered useful utility commands like `helm status`, `helm get`, and
   448  `helm repo`.
   449  
   450  For more information on these commands, take a look at Helm's built-in
   451  help: `helm help`.
   452  
   453  In the next chapter, we look at the process of developing charts.