Когда мы начинаем работу с Kubernetes и используем конфигурационные файлы YAML, обычно мы начинаем устанавливать их один за другим с помощью следующей команды.
kubectl apply -f <file>
Затем мы обнаруживаем, что вместо файла мы можем напрямую нацеливаться на целую папку
kubectl apply -f <folder>
Но если мы делаем это в каждой среде, которая у нас есть, то дублирование всех конфигураций или их обновление при каждом переключении может быстро надоесть. Вот почему в таких случаях мы начинаем использовать некоторые инструменты для динамической генерации конфигураций.
Сегодня мы поговорим об одном из них, Kustomize.
Что такое Kustomize?
Kustomize — это инструмент управления конфигурациями, встроенный в Kubernetes!
Так что если у вас уже настроен kubectl, вы можете использовать его напрямую.
В отличие от Helm, это не инструмент шаблонизации, а инструмент управления конфигурацией.
Чтобы дать вам быстрый пример для сравнения обоих инструментов, Helm будет использовать шаблон (как позади), а пользователь будет определять значение для каждой переменной.
apiVersion: apps/v1
kind: Deployment
metadata:
name: the-deployment
spec:
replicas: 5
template:
containers:
- name: {{ .Values.containerName }}
image: {{ .Values.containerImage }}
В этом примере пользователь может определить название контейнера и его изображение. Но он не может изменить количество реплик.
После вызова Helm сгенерирует yaml-файл на основе шаблона и значений, заданных пользователем.
Kustomize позволит пользователю отменить любое значение конфигурации. (Как это сделать, мы увидим позже).
Прежде чем продолжить, приведем контекст для наших следующих примеров.
- /kubernetes
- /application
- deployment.yaml
- configmap.yaml
deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
replicas: 1
template:
containers:
- name: my-container
image: ubuntu:latest
env:
- name: TEST
value: TOTO
volumeMounts:
- name: config-volume
mountPath: /configs/
volumes:
- name: config-volume
configMap:
name: example-config
configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: example-config
namespace: example
data:
config.json: |
{
"environment" : "test"
}
Как работает Kustomize?
Во-первых, Kustomize нужен файл kustomization.yaml, который будет содержать все конфигурации, которые ему необходимо знать.
База
В нашем примере контекста мы добавим этот файл в папку /application с таким содержанием :
resources:
- deployment.yaml
- configmap.yaml
Здесь мы указываем Kustomize, какие файлы являются конфигурационными файлами Kubernetes, которые мы хотим применить при вызове этого файла kustomization. Эта папка станет нашей базой для следующих конфигураций.
Поэтому, если мы используем одну из следующих команд, мы создадим развертывание и карту конфигурации, как определено в наших YAML-файлах.
kubectl kustomize .kubernetesapplication | kubectl apply -f -
# Or
kubectl apply -k .kubernetesapplication
Персонализация
Теперь, когда у нас есть база, мы можем создать свои собственные конфигурации для каждого окружения, которое у нас есть.
В папке /kubernetes мы создадим папку /environments. Затем в этой папке мы создаем две папки /dev и /prod (представляющие каждую среду, которая у нас есть), и создаем файл kustomization.yaml в обеих папках /dev и /prod.
В оба файла мы добавляем следующее содержимое
bases:
- ../../application
Этот блок определяет, что является основой конфигурации для нашей настройки. (В этом примере он нацелен на предыдущую папку, которую мы настроили).
Таким образом, если мы используем ту же команду для использования Kustomize, но нацеливаемся на одну из папок окружения, будет создано развертывание и конфигурационная карта, определенная в базе.
kubectl kustomize .kubernetesenvironmentsdev | kubectl apply -f -
# Or
kubectl apply -k .kubernetesenvironmentsdev
Возможные обновления
Просматривая документацию по Kustomize, вы увидите все возможные обновления, но сейчас мы рассмотрим только основные из них.
Патч
Патч в Kustomize — это файл, содержащий частичную конфигурацию компонента, которая отменяет базовую конфигурацию.
Например, в продакшене мы хотим увеличить количество реплик и определить, сколько ресурсов может использовать капсула. Поэтому мы создаем два следующих файла в папке /prod.
replica_count.yaml (Примечание: Kustomize не заботится об имени)
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment # Name of the deployment to update
spec:
replicas: 6 # The new value
resources.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
template:
containers:
- name: my-container
resources:
requests:
memory: "50Mi"
cpu: "50m"
limits:
memory: "500Mi"
cpu: "500m"
Теперь, чтобы быть уверенным, что они будут использоваться как патчи, мы должны добавить следующий блок кода в kustomization.yaml в папке /prod.
patches:
- replica_count.yaml
- resources.yaml
Мы перечислили два вновь созданных файла, содержащих новые значения.
Стратегическое слияние патчей
Иногда мы не хотим переопределять значение списка, а хотим добавить что-то в список. В этом случае мы используем patchesStrategicMerge.
Например, если я хочу добавить переменную окружения в свой контейнер, я должен :
- создать файл с новыми переменными окружения, которые нужно добавить в папку /prod
env.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
template:
containers:
- name: my-container
env:
- name: ENVIRONMENT
value: Production
- добавить следующий блок в kustomization.yaml
patchesStrategicMerge:
- env.yaml
Затем, когда он будет развернут в продакшене, контейнер будет иметь эти переменные окружения:
- TEST : TODO
- ENVIRONMENT : Production
Генераторы
В Kustomize существуют некоторые параметры для генерации карт конфигурации и секретов. Оба они похожи, поэтому мы рассмотрим пример с configMapGenerator.
configMapGenerator:
- name: example-config
namespace: example
#behavior: replace
files:
- configs/config.json
В этом коде, который мы можем найти в файле kustomization.yaml, в пространстве имен example* будет создана конфигурационная карта с именем «example-config» с содержимым **configs/config.json в качестве значения.
В закомментированной строке мы можем увидеть поведение параметра, который позволяет нам заменить существующую конфигурационную карту вместо создания новой.
Изображения
Последний параметр, который мы рассмотрим сегодня, позволяет нам сделать некоторые обновления изображений, используемых в наших конфигурациях.
Пример определения в kustomization.yaml
images:
- name: hello-world
newTag: linux
newName: ubuntu
В этом примере мы видим 3 параметра:
- name — Чтобы найти все изображения, соответствующие этому имени, где будет происходить переопределение
- newTag — Новый тег изображения для использования
- newName — Новое имя используемого изображения.
Если вы любопытны и хотите узнать больше, пожалуйста, ознакомьтесь с документацией. Мы рассмотрели только часть Kustomize.
Надеюсь, она вам поможет! 🍺
Не стесняйтесь давать мне отзывы здесь, в twitter или LinkedIn, я буду рад их прочитать. Вы можете использовать те же ссылки, если захотите связаться со мной или захотите сотрудничать со мной.