Ответ
В Kubernetes нет прямого механизма наследования объектов, но есть несколько практик для повторного использования и композиции конфигураций.
Основные подходы:
-
Использование
kustomize(встроен вkubectl):- Базовая конфигурация (
base/): определяет общие ресурсы. - Оверлеи (
overlays/): наследуют отbaseи добавляют/модифицируют поля.
Структура проекта:
my-app/ ├── base/ │ ├── deployment.yaml │ ├── kustomization.yaml │ └── service.yaml └── overlays/ ├── production/ │ ├── kustomization.yaml # Указывает на base и добавляет patches │ └── replica-patch.yaml └── staging/ └── ...Пример
overlays/production/kustomization.yaml:bases: - ../../base patchesStrategicMerge: - replica-patch.yaml - Базовая конфигурация (
-
Helm Charts и зависимости (
dependencies):- Можно определить общий chart как зависимость и переопределять его
values.yaml.
- Можно определить общий chart как зависимость и переопределять его
-
Янки (YAML Anchors & Aliases) внутри одного файла:
# Определение якоря baseConfig: &base image: myapp:latest ports: - containerPort: 8080 # Использование алиаса и добавление полей apiVersion: apps/v1 kind: Deployment metadata: name: app-production spec: template: spec: containers: - name: app <<: *base # Наследование якоря env: - name: ENV value: "production"
Рекомендация: kustomize является стандартным и наиболее гибким способом для управления наследованием и окружениями в нативных Kubernetes-манифестах.
Ответ 18+ 🔞
Вот же ж, народ, слушайте сюда! В этом вашем Kubernetes, блядь, прямого наследования, как у какого-нибудь питончика, нихуя нету. Ну, то есть, чтобы один объект от другого, как сын от отца, всё перенял — такого не предусмотрели, мудяги. Но русский человек, он же хитрый, блядь! Находчивый! Поэтому народ придумал, как эту хуйню обойти и конфиги не копипастить, как последний распиздяй.
Основные лайфхаки, так сказать:
-
kustomize(он уже вkubectlвстроен, ёпта): Тут идея простая, как три копейки. Делаешь базовую конфигурацию (base/) — этакий фундамент, общий для всех. А потом на него, как дерьмо на вентилятор, набрасываешь оверлеи (overlays/) — они наследуют отbaseи что-то там своё допиливают или меняют.Структура папок получается примерно такая:
my-app/ ├── base/ <-- Здесь лежит святое, основа основ │ ├── deployment.yaml │ ├── kustomization.yaml │ └── service.yaml └── overlays/ <-- А тут уже пошла конкретика, под каждое окружение ├── production/ <-- Для продакшена, где всё серьёзно │ ├── kustomization.yaml # Тыкает пальцем на base и говорит: "Вот откуда брать!" │ └── replica-patch.yaml # И тут же свой патч подсовывает └── staging/ <-- Для тестов, где можно пошалить └── ... (ну вы поняли)Сам файл
overlays/production/kustomization.yamlвыглядит просто, блядь:bases: - ../../base # Смотри, мама, я наследую! patchesStrategicMerge: - replica-patch.yaml # А это мои личные доработки, чих-пых! -
Helm Charts и их зависимости (
dependencies): Ну, тут тоже понятно. Можно запилить общий chart, объявить его как зависимость в другом, а потом в своёмvalues.yamlпереопределять всё, что душе угодно. Как будто взял у соседа табуретку, но обил её новым дермантином, блядь. -
Янки-трюки (YAML Anchors & Aliases) внутри одного файла: Это для любителей всё в одну кучу, но с изяществом. Типа, объявил шаблон раз и юзаешь его где хочешь.
# Объявляем якорь, назовём его "база" baseConfig: &base image: myapp:latest ports: - containerPort: 8080 # А теперь используем, да ещё и своё добавляем! apiVersion: apps/v1 kind: Deployment metadata: name: app-production spec: template: spec: containers: - name: app <<: *base # Всё из якоря "база" сюда прилетело, магия, блядь! env: # А это уже наши личные понты - name: ENV value: "production"
Итог, ёпта: Если не хотите, чтобы ваши конфиги превратились в адское месиво, где ни хуя не разберёшься, то kustomize — ваш выбор, чуваки. Он нативный, гибкий, и им не надо ебаться с установкой кучи лишнего софта. Всем спасибо, я отдыхаю.