Развертывание локального чарта Helm

KubernetesBeginner
Практиковаться сейчас

Введение

В предыдущих лабораторных работах по развертыванию использовались непосредственно манифесты 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.