Lab 21 – Vlastní chart

Lab 21 – Vlastní chart

Cíl: zabalit aplikaci tak, aby šla nainstalovat vícekrát s jinými hodnotami. Kapitola: Helm charty

# 1 – kostra a co v ní je
cd ~
helm create shop
find shop -type f | sort
cat shop/Chart.yaml
head -30 shop/values.yaml

helm create dá funkční nginx chart s mnohem víc mašinerií, než potřebujete. Přečíst si ji stojí za to: ukazuje konvence, které dodržuje každý veřejný chart.

# 2 – vyrenderujte výchozí chart, než něco změníte
helm template shop | head -40
helm lint shop

helm template nepotřebuje cluster ani síť. Spouštějte ho po každé úpravě – je rychlejší než jakákoli instalace a ukáže skutečné YAML.

Udělejte si ho po svém

# 3 – osekejte kostru
cd shop
rm -f templates/hpa.yaml templates/ingress.yaml templates/serviceaccount.yaml
rm -rf templates/tests

Upravte values.yaml:

replicaCount: 2

image:
  repository: nginx
  tag: "1.27"
  pullPolicy: IfNotPresent

service:
  type: NodePort
  port: 80
  nodePort: 30081

content:
  message: "Shop z chartu"

serviceAccount:
  create: false

Přidejte templates/configmap.yaml:

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ include "shop.fullname" . }}-content
data:
  index.html: |
    <h1>{{ .Values.content.message }}</h1>
    <p>release: {{ .Release.Name }} / chart: {{ .Chart.Name }}-{{ .Chart.Version }}</p>

Dvě věci k povšimnutí. include "shop.fullname" . je makro z templates/_helpers.tpl, které staví jméno z názvu release – díky němu jde chart nainstalovat dvakrát bez kolize. A .Release.Name není známé dřív než při instalaci, což je přesně důvod, proč je chart šablona, a ne manifest.

V templates/deployment.yaml tuhle ConfigMapu připojte do kontejneru (volumes + volumeMounts na /usr/share/nginx/html) a v templates/service.yaml doplňte nodePort: {{ .Values.service.nodePort }}.

# 4 – smyčka: lint → render → dry-run → install
helm lint .
helm template myshop . | less
helm install myshop . --dry-run --debug | head -40
helm install myshop . -n shop --create-namespace
kubectl get all,cm -n shop
curl -s http://worker01:30081
# 5 – smysl chartu: stejný balíček, jiné hodnoty
helm install myshop2 . -n shop \
  --set content.message="Druhá instance" \
  --set service.nodePort=30082 \
  --set replicaCount=1
curl -s http://worker01:30082
helm list -n shop

Stejné šablony, dvě release, žádné kolize jmen, žádné kopírované YAML. Tohle byste jinak řešili adresářem na každé prostředí.

# 6 – upgrade změnou hodnoty
helm upgrade myshop . --set content.message="Povýšeno" -n shop
curl -s http://worker01:30081
helm history myshop -n shop
# 7 – zabalte to
cd ~
helm package shop
ls -l shop-0.1.0.tgz
helm install fromtgz ./shop-0.1.0.tgz -n shop --set service.nodePort=30083
curl -s http://worker01:30083

.tgz je artefakt na rozeslání – nahrajte ho do chart repozitáře nebo OCI registru a ostatní si nainstalují přesně tuhle verzi.

Pokud zbude čas

  • Obalte volitelný objekt do {{- if .Values.ingress.enabled }} a přes helm template --set ingress.enabled=false ukažte, že zmizí.
  • Použijte required "content.message je povinné" .Values.content.message a podívejte se, co ohlásí helm template --set content.message=null.
  • Zvedněte version v Chart.yaml na 0.2.0 a zabalte znovu.

Úklid

helm uninstall myshop myshop2 fromtgz -n shop
kubectl delete ns shop