Введение
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.


