Files
container.training/slides/k8s/helm-create-basic-chart.md
Jerome Petazzoni bab493a926 Update descriptions
2020-04-28 06:17:21 -05:00

4.1 KiB

Creating a basic chart

  • We are going to show a way to create a very simplified chart

  • In a real chart, lots of things would be templatized

    (Resource names, service types, number of replicas...)

.exercise[

  • Create a sample chart:

    helm create dockercoins
    
  • Move away the sample templates and create an empty template directory:

    mv dockercoins/templates dockercoins/default-templates
    mkdir dockercoins/templates
    

]


Exporting the YAML for our application

  • The following section assumes that DockerCoins is currently running

  • If DockerCoins is not running, see next slide

.exercise[

  • Create one YAML file for each resource that we need: .small[
    
      while read kind name; do
        kubectl get -o yaml $kind $name > dockercoins/templates/$name-$kind.yaml
      done <<EOF
      deployment worker
      deployment hasher
      daemonset rng
      deployment webui
      deployment redis
      service hasher
      service rng
      service webui
      service redis
      EOF
    
    ]

]


Obtaining DockerCoins YAML

  • If DockerCoins is not running, we can also obtain the YAML from a public repository

.exercise[

  • Clone the kubercoins repository:

    git clone https://github.com/jpetazzo/kubercoins
    
  • Copy the YAML files to the templates/ directory:

    cp kubercoins/*.yaml dockercoins/templates/
    

]


Testing our helm chart

.exercise[

  • Let's install our helm chart!
    helm install helmcoins dockercoins
    
    (helmcoins is the name of the release; dockercoins is the local path of the chart)

]

--

  • Since the application is already deployed, this will fail:
Error: rendered manifests contain a resource that already exists.
Unable to continue with install: existing resource conflict:
kind: Service, namespace: default, name: hasher
  • To avoid naming conflicts, we will deploy the application in another namespace

Switching to another namespace

  • We need create a new namespace

    (Helm 2 creates namespaces automatically; Helm 3 doesn't anymore)

  • We need to tell Helm which namespace to use

.exercise[

  • Create a new namespace:

    kubectl create namespace helmcoins
    
  • Deploy our chart in that namespace:

    helm install helmcoins dockercoins --namespace=helmcoins
    

]


Helm releases are namespaced

  • Let's try to see the release that we just deployed

.exercise[

  • List Helm releases:
    helm list
    

]

Our release doesn't show up!

We have to specify its namespace (or switch to that namespace).


Specifying the namespace

  • Try again, with the correct namespace

.exercise[

  • List Helm releases in helmcoins:
    helm list --namespace=helmcoins
    

]


Checking our new copy of DockerCoins

  • We can check the worker logs, or the web UI

.exercise[

  • Retrieve the NodePort number of the web UI:

    kubectl get service webui --namespace=helmcoins
    
  • Open it in a web browser

  • Look at the worker logs:

    kubectl logs deploy/worker --tail=10 --follow --namespace=helmcoins
    

]

Note: it might take a minute or two for the worker to start.


Discussion, shortcomings

  • Helm (and Kubernetes) best practices recommend to add a number of annotations

    (e.g. app.kubernetes.io/name, helm.sh/chart, app.kubernetes.io/instance ...)

  • Our basic chart doesn't have any of these

  • Our basic chart doesn't use any template tag

  • Does it make sense to use Helm in that case?

  • Yes, because Helm will:

    • track the resources created by the chart

    • save successive revisions, allowing us to rollback

Helm docs and Kubernetes docs have details about recommended annotations and labels.


Cleaning up

  • Let's remove that chart before moving on

.exercise[

  • Delete the release (don't forget to specify the namespace):
    helm delete helmcoins --namespace=helmcoins
    

]

???

:EN:- Writing a basic Helm chart for the whole app :FR:- Écriture d'un chart Helm simplifié