Что такое Kustomize?

Когда мы начинаем работу с 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, я буду рад их прочитать. Вы можете использовать те же ссылки, если захотите связаться со мной или захотите сотрудничать со мной.

Оцените статью
Procodings.ru
Добавить комментарий