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.