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řeshelm template --set ingress.enabled=falseukažte, že zmizí. - Použijte
required "content.message je povinné" .Values.content.messagea podívejte se, co ohlásíhelm template --set content.message=null. - Zvedněte
versionvChart.yamlna0.2.0a zabalte znovu.
Úklid
helm uninstall myshop myshop2 fromtgz -n shop
kubectl delete ns shop