Настройка приложения с помощью Kustomize

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

Введение

Helm упаковывает шаблоны Kubernetes в виде релизов. Kustomize использует другой подход: он берет обычные YAML-файлы Kubernetes и накладывает изменения поверх них без использования выражений шаблонизации. Это удобно, когда вам нужна общая база и небольшие различия в зависимости от окружения, такие как имена, пространства имен, количество реплик или патчи.

В этой лабораторной работе вы создадите базовый Deployment и Service, отрендерите эту базу с помощью Kustomize, а затем создадите производственный оверлей (overlay), который изменит имя, пространство имен, количество реплик и сообщение приложения. В завершение вы развернете оверлей с помощью kubectl apply -k и протестируете полученный Service.

Подготовка рабочего пространства Kustomize

На этом этапе вы подготовите пространство имен и убедитесь, что поддержка Kustomize доступна через kubectl.

Начните работу в директории /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...

Дождитесь, пока Pod сетевого плагина кластера перейдет в состояние Ready. В конце лабораторной работы вы будете тестировать Service, поэтому сетевая инфраструктура кластера должна быть исправна.

kubectl wait --namespace kube-system --for=condition=Ready pod -l k8s-app=calico-node --timeout=120s

Ожидаемый вывод:

pod/calico-node-... condition met

Создайте пространство имен ckad-prep-kustomize и установите его в качестве текущего:

kubectl create namespace ckad-prep-kustomize
kubectl config set-context --current --namespace=ckad-prep-kustomize

Проверьте пространство имен и убедитесь, что kubectl kustomize доступен. Команда kubectl kustomize выполняет рендеринг директорий Kustomize без их применения в кластере.

kubectl config view --minify --output 'jsonpath={..namespace}'; echo
kubectl kustomize --help | sed -n '1,3p'

Ожидаемый вывод:

ckad-prep-kustomize
Build a set of KRM resources...

Создание переиспользуемой базы

На этом этапе вы создадите базу Kustomize из обычных YAML-файлов Kubernetes.

База — это общая отправная точка. Она должна содержать полные и корректные объекты Kubernetes до внесения каких-либо специфических для окружения настроек. В данном случае база содержит один Deployment и один Service. Приложение записывает значение переменной окружения MESSAGE на небольшую веб-страницу.

Создайте директорию для базы:

mkdir -p kustomize-demo/base

Создайте базовый Deployment:

cat > kustomize-demo/base/deployment.yaml <<'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kustomize-web
  labels:
    app: kustomize-web
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kustomize-web
  template:
    metadata:
      labels:
        app: kustomize-web
    spec:
      terminationGracePeriodSeconds: 0
      containers:
      - name: web
        image: busybox:1.36
        env:
        - name: MESSAGE
          value: base-v1
        command:
        - /bin/sh
        - -c
        - |
          mkdir -p /www
          echo "$MESSAGE" > /www/index.html
          httpd -f -p 8080 -h /www
        ports:
        - containerPort: 8080
        readinessProbe:
          httpGet:
            path: /
            port: 8080
          initialDelaySeconds: 1
          periodSeconds: 2
EOF

Создайте базовый Service. Его селектор соответствует метке Pod из Deployment.

cat > kustomize-demo/base/service.yaml <<'EOF'
apiVersion: v1
kind: Service
metadata:
  name: kustomize-web
spec:
  selector:
    app: kustomize-web
  ports:
  - port: 80
    targetPort: 8080
EOF

Создайте базовый файл kustomization.yaml. Этот файл указывает Kustomize, какие ресурсы относятся к базе.

cat > kustomize-demo/base/kustomization.yaml <<'EOF'
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
- service.yaml
EOF

Отрендерите базу без применения:

kubectl kustomize kustomize-demo/base | sed -n '1,120p'

Ожидаемый вывод включает Service с именем kustomize-web, Deployment с именем kustomize-web, replicas: 1 и value: base-v1.

Добавление производственного оверлея

На этом этапе вы создадите оверлей, который настраивает базу для развертывания в производственной среде.

Оверлей ссылается на базу и добавляет изменения. Этот оверлей поместит объекты в пространство имен ckad-prep-kustomize, добавит префикс prod- к именам, масштабирует Deployment до трех реплик и изменит значение MESSAGE на prod-v2.

Создайте директорию для оверлея:

mkdir -p kustomize-demo/overlays/prod

Создайте патч для Deployment. Патч ссылается на исходный базовый объект kustomize-web. Kustomize сопоставляет патч до того, как добавит префикс prod-.

cat > kustomize-demo/overlays/prod/deployment-patch.yaml <<'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kustomize-web
spec:
  replicas: 3
  template:
    spec:
      containers:
      - name: web
        env:
        - name: MESSAGE
          value: prod-v2
EOF

Создайте файл kustomization.yaml для оверлея. Секция resources указывает на базу, а namespace, namePrefix и patches описывают настройки.

cat > kustomize-demo/overlays/prod/kustomization.yaml <<'EOF'
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: ckad-prep-kustomize
namePrefix: prod-
resources:
- ../../base
patches:
- path: deployment-patch.yaml
EOF

Отрендерите производственный оверлей:

kubectl kustomize kustomize-demo/overlays/prod | sed -n '1,160p'

Ожидаемый вывод:

name: prod-kustomize-web
namespace: ckad-prep-kustomize
replicas: 3
value: prod-v2

Развертывание и тестирование настроенного приложения

На этом этапе вы примените производственный оверлей и протестируете созданный им Service.

Команда kubectl apply -k выполняет рендеринг директории Kustomize и отправляет полученные объекты в API-сервер Kubernetes. Вам не нужно создавать временный YAML-файл.

Примените производственный оверлей:

kubectl apply -k kustomize-demo/overlays/prod

Ожидаемый вывод:

service/prod-kustomize-web created
deployment.apps/prod-kustomize-web created

Дождитесь готовности настроенного Deployment:

kubectl rollout status deployment/prod-kustomize-web --timeout=120s

Ожидаемый вывод:

deployment "prod-kustomize-web" successfully rolled out

Проверьте объекты, созданные из оверлея:

kubectl get deployment,service prod-kustomize-web

Ожидаемый вывод:

deployment.apps/prod-kustomize-web   3/3
service/prod-kustomize-web

Создайте клиентский Pod и протестируйте Service. Ответ должен быть prod-v2, что доказывает, что патч оверлея изменил конфигурацию запущенного приложения.

kubectl run kustomize-client --image=busybox:1.36 --restart=Never --command -- sleep 3600
kubectl wait --for=condition=Ready pod/kustomize-client --timeout=120s
kubectl exec kustomize-client -- wget -qO- http://prod-kustomize-web

Ожидаемый вывод:

prod-v2

Резюме

Вы создали базу Kustomize из обычных YAML-файлов Deployment и Service, а затем создали производственный оверлей, который изменил пространство имен, имена объектов, количество реплик и сообщение приложения. Вы выполнили рендеринг базы и оверлея перед применением оверлея с помощью kubectl apply -k, а затем проверили настроенное приложение через его Service.