Avís
Aquest article és antic i és possible que part de la informació estigui desactualitzada o ja no sigui vàlida actualment.
Si tens qualsevol dubte o necessites confirmar algun detall, et recomanem contactar amb el nostre equip de suport per rebre informació actualitzada i assistència personalitzada.
Requisits
- Nocions bàsiques de Kubernetes.
- Tenir Kubernetes instal·lat.
- Haver creat un clúster.
Tots aquests requisits estan explicats en un article anterior.
Helm és un gestor de paquets de Kubernetes, una eina per ajudar-nos a desplegar aplicacions. Els beneficis principals són els següents:
- Gestió de la complexitat mitjançant els _Charts_.
- Actualitzacions senzilles
- Portabilitat fàcil
- Sistema de gestió dels _rollbacks_
Conceptes importants
Hi ha tres conceptes fonamentals a Helm:
- _Charts_: diversos fitxers de configuració YAML i certes plantilles que defineixen com instanciar una aplicació de K8s.
- _config_: com el seu nom indica, informació de configuració que es pot combinar amb un _chart_ per crear una _release_.
- _Release_: una instància d'un _chart_ amb una determinada _config_
Arquitectura
L'arquitectura de Helm té fonamentalment dues parts, la del costat del client i la del costat del servidor:
Client Helm
És la línia d'ordres des d'on enviem les ordres perquè les executi el servidor, com ara enviar _charts_ perquè s'instal·lin, demanar informació o desinstal·lar una _release_.
Tiller
És la part del servidor, en aquest cas la que s'executa en un clúster de K8s i la que es comunica amb l'API de K8s. S'encarrega d'atendre les peticions del client, instal·lar diversos _charts_ i dur a terme les altres accions demanades pel client.
Estructura d'un _Chart_
package-name/
charts/
templates/
Chart.yaml
LICENSE
README.md
requirements.yaml
values.yaml
- charts/: directori de Charts que són dependències del Chart que estem definint.
- templates/: directori que conté plantilles que, combinades amb els valors de values.yaml, generen els fitxers de manifest vàlids per a Kubernetes.
- Chart.yaml: fitxer de configuració amb informació general sobre el paquet, com ara el nom o la versió.
- LICENSE (opcional): fitxer de text pla que conté informació sobre la llicència amb què es distribueix aquest paquet (p. ex.: MIT, GNU GPL v3,…).
- README.md (opcional): fitxer Markdown amb informació d'interès (similar al README d'un repositori git).
- requirements.yaml (opcional): fitxer de dependències del Chart.
- values.yaml: valors de configuració per defecte per a l'ús de les plantilles (que són a templates/).
Instal·lació de Helm
Com s'ha dit anteriorment, se suposa que s'han instal·lat Docker i Kubernetes a la màquina amb què es treballarà. En el nostre exemple treballarem sobre un sistema GNU/Linux, específicament la versió 18.04 d'Ubuntu. Es recomana com a mínim 2Gb de RAM i 10Gb de disc dur.
Abans de començar cal tenir un clúster de Kubernetes per instal·lar Tiller. Podem comprovar si està ben configurat executant:
# kubectl cluster-infoLa resposta hauria de ser semblant a aquesta:
Kubernetes master is running at https://URL_VPS:6443
KubeDNS is running at https://URL_VPS:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.Si hi ha algun error, vol dir que K8s no està ben configurat. Es recomana seguir els passos d'aquest article fins a l'apartat “Comú” (inclòs).
Si no hi ha hagut cap error, hem de veure si el Context és l'adequat amb les ordres següents:
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* kubernetes-admin@kubernetes kubernetes kubernetes-adminL'asterisc en aquest cas ens indica que estem connectats al clúster _kubernetes-admin@kubernetes_. Es pot canviar entre clústers amb:
# kubectl config use-context NOMBRE_CONTEXTOAra ja podem instal·lar Helm. Les instruccions d'instal·lació són pràcticament les mateixes en altres sistemes, ja que al repositori de Helm a GitHub es pot trobar un script que facilita la instal·lació:
# cd /tmp
# curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get > instalacionHelm.shDonem permisos d'execució a l'script descarregat i l'executem:
# chmod u+x instalacionHelm.sh
# ./instalacionHelm.shSi tot s'ha executat amb normalitat i sense errors, ja hauríem de tenir Helm instal·lat, amb una pantalla semblant a la següent:
Downloading https://get.helm.sh/helm-v2.15.1-linux-amd64.tar.gz
Preparing to install helm and tiller into /usr/local/bin
helm installed into /usr/local/bin/helm
tiller installed into /usr/local/bin/tiller
Run 'helm init' to configure helm.Ara toca configurar Tiller. Per fer-ho, crearem un _serviceaccount_ perquè funcioni correctament:
# kubectl -n kube-system create serviceaccount tillerSi s'ha executat sense errors, cal afegir-lo a _cluster-admin_:
# kubectl create clusterrolebinding tiller --clusterrole cluster-admin --serviceaccount=kube-system:tillerDesprés d'instal·lar-lo, podem iniciar-lo perquè s'acabi de configurar (crear carpetes de configuració, afegir el repositori per defecte,…) amb l'ordre següent:
Creating /root/.helm
Creating /root/.helm/repository
Creating /root/.helm/repository/cache
Creating /root/.helm/repository/local
Creating /root/.helm/plugins
Creating /root/.helm/starters
Creating /root/.helm/cache/archive
Creating /root/.helm/repository/repositories.yaml
Adding stable repo with URL: https://kubernetes-charts.storage.googleapis.com
Adding local repo with URL: http://127.0.0.1:8879/charts
$HELM_HOME has been configured at /root/.helm.
Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.
Please note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy.
To prevent this, run `helm init` with the --tiller-tls-verify flag.
For more information on securing your installation see:
https://docs.helm.sh/using_helm/#securing-your-helm-installationExemple: Instal·lació de nginx
Vegem com es desplega un servidor web bàsic (nginx) amb Helm. Això ens ajudarà a entendre com funcionen els _Charts_ i els repositoris d'aquests.
Per defecte, helm afegeix un repositori creat per ells. En primer lloc, l'actualitzarem:
Hang tight while we grab the latest from your chart repositories...
...Skip local chart repository
...Successfully got an update from the "stable" chart repository
Update Complete.
Per cercar un _Chart_ podem fer servir l'ordre helm search, que, si no hi afegim cap paràmetre, ens retornarà una llista de tots els _charts_ del repositori (el de per defecte). Com que volem instal·lar _nginx_, executem:
NAME CHART VERSION APP VERSION DESCRIPTION
stable/nginx-ingress 1.24.4 0.26.1 An nginx Ingress controller that uses ConfigMap to store ...
stable/nginx-ldapauth-proxy 0.1.3 1.13.5 nginx proxy with ldapauth
stable/nginx-lego 0.3.1 Chart for nginx-ingress-controller and kube-lego
stable/gcloud-endpoints 0.1.2 1 DEPRECATED Develop, deploy, protect and monitor your APIs...
Com es pot veure, cap dels _charts_ disponibles és el de _nginx_. Això es deu al fet que no existeix al repositori per defecte i per això no el troba. Per solucionar aquest problema, el cercarem en un altre repositori, més concretament el repositori de Bitnami.
Primer cal afegir el repositori a la nostra llista local de repositoris:
# helm repo add bitnami https://charts.bitnami.com/bitnamiPodem imprimir fàcilment una llista dels paquets disponibles en aquest repositori:
# helm search bitnamiCom que volem el paquet de _nginx_ en concret:
NAME CHART VERSION APP VERSION DESCRIPTION
bitnami/nginx 4.3.10 1.16.1 Chart for the nginx server
bitnami/nginx-ingress-controller 5.0.10 0.26.1 Chart for the nginx Ingress controller
Veiem que el primer paquet és el que ens interessa, atès que és el del servidor. Per instal·lar-lo:
# helm install bitnami/nginx --name miservidorI aquesta és la sortida que hauria de donar:
NAME: miservidor
LAST DEPLOYED: Sat Oct 26 16:55:41 2019
NAMESPACE: default
STATUS: DEPLOYED
RESOURCES:
==> v1/Deployment
NAME READY UP-TO-DATE AVAILABLE AGE
miservidor-nginx 0/1 1 0 1s
==> v1/Pod(related)
NAME READY STATUS RESTARTS AGE
miservidor-nginx-7f6b9459c7-gfpf8 0/1 Pending 0 0s
==> v1/Service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
miservidor-nginx LoadBalancer 10.107.125.197 80:31658/TCP 1s
NOTES:
Get the NGINX URL:
NOTE: It may take a few minutes for the LoadBalancer IP to be available.
Watch the status with: 'kubectl get svc --namespace default -w miservidor-nginx'
export SERVICE_IP=$(kubectl get svc --namespace default miservidor-nginx --template "{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}")
echo "NGINX URL: http://$SERVICE_IP/"
És possible que en executar aquesta ordre digui que no hi ha cap tiller preparat per executar la tasca. Si és així i en executar `kubectl get pods –namespace kube-system` hi ha un pod que comença per _tiller-deploy-_ amb estat Pendent, es pot solucionar perquè s'executi de la manera següent:
# kubectl taint nodes --all node-role.kubernetes.io/master-Veiem que ens especifica els recursos de Kubernetes que ha creat (els que, si haguéssim vist el _chart_ de ngnix, hi estaven declarats). Podem comprovar-ho directament a `kubectl`:
NAME READY STATUS RESTARTS AGE
miservidor-nginx-7f6b9459c7-gfpf8 0/1 Pending 0 3m36sNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 443/TCP 92m
miservidor-nginx LoadBalancer 10.107.125.197 URL 80:31658/TCP 4m2sSi accedim a URL des d'un navegador web, veurem la típica pantalla d'inici de nginx:
Altres ordres útils de Helm:
- Llistar tots els _charts_ instal·lats:
# helm list- Eliminar completament un _chart_ i tots els seus fitxers:
# helm delete --purge miservidor- Ajuda:
# helm help