Введение
В предыдущих лабораторных работах по развертыванию использовались непосредственно манифесты Kubernetes. Helm добавляет уровень упаковки поверх этих манифестов. Чарт Helm объединяет связанные шаблоны Kubernetes, предоставляет возможность переиспользования настроек через values.yaml и устанавливает отрендеренные объекты как именованный релиз.
В этой лабораторной работе вы создадите небольшой локальный чарт вместо загрузки готового из репозитория. Вы напишете метаданные чарта, значения, шаблон Deployment и шаблон Service, выполните рендеринг чарта перед установкой, а затем обновите релиз, изменив значения. Это позволит сосредоточиться на навыке, необходимом для CKAD: понимании того, как локальный чарт превращается в обычные объекты Kubernetes.
Подготовка рабочего пространства Helm
На этом этапе вы подготовите пространство имен (namespace) и убедитесь, что все необходимые инструменты для работы с локальным чартом Helm готовы.
Начните работу в директории /home/labex/project. В этой лабораторной работе директория чарта, сгенерированные манифесты и все команды будут находиться в этом рабочем пространстве.
mkdir -p /home/labex/project
cd /home/labex/project
Проверьте доступность API-сервера Kubernetes. Если виртуальная машина только что запустилась и узел еще не готов, подождите несколько секунд и выполните команду снова.
kubectl get nodes --request-timeout=5s
Ожидаемый вывод:
NAME STATUS ROLES AGE VERSION
labex-v135 Ready control-plane ... v1.35...
Дождитесь готовности пода сетевого плагина кластера. Чарт создаст Service, поэтому для корректного тестирования трафика необходимо, чтобы поды приложения имели сетевую связность.
kubectl wait --namespace kube-system --for=condition=Ready pod -l k8s-app=calico-node --timeout=120s
Ожидаемый вывод:
pod/calico-node-... condition met
Создайте пространство имен ckad-prep-helm и установите его в качестве текущего:
kubectl create namespace ckad-prep-helm
kubectl config set-context --current --namespace=ckad-prep-helm
Проверьте текущее пространство имен и версию клиента Helm. Helm 3 работает с Kubernetes напрямую через ваш kubeconfig; отдельный серверный компонент Tiller больше не требуется.
kubectl config view --minify --output 'jsonpath={..namespace}'; echo
helm version --short
Ожидаемый вывод:
ckad-prep-helm
v...
Создание и рендеринг локального чарта
На этом этапе вы создадите минимальный локальный чарт Helm и выполните его рендеринг перед установкой.
Директория чарта состоит из нескольких важных частей. Chart.yaml описывает сам чарт. values.yaml содержит значения по умолчанию. Файлы в директории templates/ — это манифесты Kubernetes с шаблонными выражениями, такими как {{ .Values.replicaCount }}. Helm заменяет эти выражения конкретными значениями при рендеринге или установке чарта.
Создайте директорию чарта:
mkdir -p local-web-chart/templates
Создайте файл Chart.yaml. Имя чарта не совпадает с именем релиза; имя релиза выбирается позже при установке чарта.
cat > local-web-chart/Chart.yaml <<'EOF'
apiVersion: v2
name: local-web
description: A small local chart for CKAD deployment practice
type: application
version: 0.1.0
appVersion: "1.0"
EOF
Создайте файл values.yaml. Эти значения по умолчанию управляют количеством подов, образом контейнера, портами сервиса и сообщением, которое выдает приложение.
cat > local-web-chart/values.yaml <<'EOF'
replicaCount: 2
image:
repository: busybox
tag: "1.36"
service:
port: 80
targetPort: 8080
message: helm-v1
EOF
Создайте шаблон Deployment. Шаблон использует имя релиза в именах объектов и метках, поэтому один и тот же чарт можно устанавливать под разными именами релизов.
cat > local-web-chart/templates/deployment.yaml <<'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}-web
labels:
app.kubernetes.io/name: {{ .Chart.Name }}
app.kubernetes.io/instance: {{ .Release.Name }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app.kubernetes.io/name: {{ .Chart.Name }}
app.kubernetes.io/instance: {{ .Release.Name }}
template:
metadata:
labels:
app.kubernetes.io/name: {{ .Chart.Name }}
app.kubernetes.io/instance: {{ .Release.Name }}
spec:
terminationGracePeriodSeconds: 0
containers:
- name: web
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- |
mkdir -p /www
echo {{ .Values.message | quote }} > /www/index.html
httpd -f -p {{ .Values.service.targetPort }} -h /www
ports:
- containerPort: {{ .Values.service.targetPort }}
readinessProbe:
httpGet:
path: /
port: {{ .Values.service.targetPort }}
initialDelaySeconds: 1
periodSeconds: 2
EOF
Создайте шаблон Service. Обратите внимание, что селектор сервиса использует те же метки, что и шаблон пода.
cat > local-web-chart/templates/service.yaml <<'EOF'
apiVersion: v1
kind: Service
metadata:
name: {{ .Release.Name }}
labels:
app.kubernetes.io/name: {{ .Chart.Name }}
app.kubernetes.io/instance: {{ .Release.Name }}
spec:
selector:
app.kubernetes.io/name: {{ .Chart.Name }}
app.kubernetes.io/instance: {{ .Release.Name }}
ports:
- port: {{ .Values.service.port }}
targetPort: {{ .Values.service.targetPort }}
EOF
Запустите helm lint для проверки структуры чарта и корректности шаблонов:
helm lint ./local-web-chart
Ожидаемый вывод:
1 chart(s) linted, 0 chart(s) failed
Выполните рендеринг чарта локально. Команда helm template выводит YAML-манифесты Kubernetes, которые Helm отправил бы на API-сервер, но при этом не создает никаких объектов.
helm template local-web ./local-web-chart | sed -n '1,120p'
Ожидаемый вывод включает Service с именем local-web и Deployment с именем local-web-web.
Установка чарта как релиза
На этом этапе вы установите локальный чарт в пространство имен ckad-prep-helm.
Установка чарта создает релиз Helm. В этой лабораторной работе имя релиза — local-web. Helm сохраняет метаданные релиза, а Kubernetes получает обычные объекты, такие как Deployment и Service.
Установите чарт:
helm install local-web ./local-web-chart
Ожидаемый вывод:
NAME: local-web
STATUS: deployed
Дождитесь развертывания Deployment, созданного чартом:
kubectl rollout status deployment/local-web-web --timeout=120s
Ожидаемый вывод:
deployment "local-web-web" successfully rolled out
Проверьте релиз и созданные им объекты Kubernetes:
helm list
kubectl get deployment,service -l app.kubernetes.io/instance=local-web
Ожидаемый вывод:
local-web
deployment.apps/local-web-web
service/local-web
Создайте клиентский под и отправьте запрос к сервису. Это подтвердит, что чарт не только создал объекты, но и установленное приложение действительно доступно.
kubectl run chart-client --image=busybox:1.36 --restart=Never --command -- sleep 3600
kubectl wait --for=condition=Ready pod/chart-client --timeout=120s
kubectl exec chart-client -- wget -qO- http://local-web
Ожидаемый вывод:
helm-v1
Обновление релиза с новыми значениями
На этом этапе вы обновите существующий релиз, переопределив значения чарта.
Чарт уже содержит переиспользуемые шаблоны. Вам не нужно редактировать файлы шаблонов, чтобы изменить сообщение или количество реплик. Команда helm upgrade выполняет повторный рендеринг того же чарта с новыми значениями, обновляет объекты Kubernetes и записывает новую ревизию релиза.
Обновите релиз так, чтобы он выдавал helm-v2 и работал с тремя репликами:
helm upgrade local-web ./local-web-chart --set message=helm-v2 --set replicaCount=3
Ожидаемый вывод:
Release "local-web" has been upgraded.
STATUS: deployed
Дождитесь обновления Deployment:
kubectl rollout status deployment/local-web-web --timeout=120s
Ожидаемый вывод:
deployment "local-web-web" successfully rolled out
Проверьте историю релиза и значения, хранящиеся в текущем релизе:
helm history local-web
helm get values local-web
Ожидаемый вывод включает две ревизии и переопределенные значения:
REVISION
1
2
message: helm-v2
replicaCount: 3
Проверьте запущенный Deployment и ответ приложения:
kubectl get deployment local-web-web
kubectl exec chart-client -- wget -qO- http://local-web
Ожидаемый вывод:
3/3
helm-v2
Резюме
Вы создали локальный чарт Helm, используя метаданные, значения по умолчанию и шаблоны Kubernetes. Вы выполнили рендеринг чарта перед установкой, установили его как релиз, протестировали сервис и обновили релиз, переопределив значения. Ключевая идея заключается в том, что Helm упаковывает повторяющиеся задачи по развертыванию приложений, при этом создавая обычные объекты Kubernetes, которые можно проверить с помощью kubectl.


