Kubepatch позволяет вам исправлять Kubernetes, не касаясь базовых манифестов

Kubepatch позволяет вам исправлять Kubernetes, не касаясь базовых манифестов

27 июня 2025 г.

ВстретитьсяKubepatch-Простой инструмент для развертывания Kubernetes проявляется с использованием подхода на основе патчей.

В отличие от инструментов, которые встраивают логику в YAML или требуют пользовательских языков шаблонов,,kubepatchсохраняетбазовые манифесты чистые и идиоматическиеПолем

  • Простой: Нет шаблонов, DSLS или логики в Yaml, Zero Magic
  • Предсказуемый: Нет строковых замен или хакерских хакерских островов
  • Безопасный: Только родные Kubernetes yaml Manifests - читаемые, действительные, нетронутые
  • Многослойный: Плач логика экстернатизируется и явно через патч JSON (RFC 6902)
  • Декларатив: Развертывание перекрестной среды с предсказуемыми, понятными изменениями

🛠 Пример

Учитывая базовый набор манифестов для развертывания основного микросервиса
Смотрите примеры

---
apiVersion: v1
kind: Service
metadata:
  name: myapp
  labels:
    app: myapp
spec:
  type: NodePort
  selector:
    app: myapp
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
  labels:
    app: myapp
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
        - name: myapp
          image: "localhost:5000/restapiapp:latest"

Аpatches/prod.yamlможет выглядеть как:

name: myapp-prod

labels:
  app: myapp-prod

patches:
  # deployment
  - target:
      kind: Deployment
      name: myapp
    patches:
      - op: replace
        path: /spec/replicas
        value: 1

      - op: replace
        path: /spec/template/spec/containers/0/image
        value: "localhost:5000/restapiapp:1.21"

      - op: add
        path: /spec/template/spec/containers/0/env
        value:
          - name: RESTAPIAPP_VERSION
            value: prod
          - name: LOG_LEVEL
            value: info

      - op: add
        path: /spec/template/spec/containers/0/resources
        value:
          limits:
            cpu: "500m"
            memory: "512Mi"
          requests:
            cpu: "64m"
            memory: "128Mi"

  # service
  - target:
      kind: Service
      name: myapp
    patches:
      - op: add
        path: /spec/ports/0/nodePort
        value: 30266

Аpatches/dev.yamlможет выглядеть как:

name: myapp-dev

labels:
  app: myapp-dev

patches:
  # deployment
  - target:
      kind: Deployment
      name: myapp
    patches:
      - op: add
        path: /spec/template/spec/containers/0/env
        value:
          - name: RESTAPIAPP_VERSION
            value: dev
          - name: LOG_LEVEL
            value: debug

  # service
  - target:
      kind: Service
      name: myapp
    patches:
      - op: add
        path: /spec/ports/0/nodePort
        value: 30265

Примените соответствующий набор исправлений на основе целевой среды.

kubepatch patch -f base/ -p patches/dev.yaml | kubectl apply -f -

Визуализированный манифест может выглядеть так (обратите внимание, что установлены все этикетки, а также применяются все патчи)

---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: myapp-dev
  name: myapp-dev
spec:
  ports:
    - nodePort: 30265
      port: 8080
      protocol: TCP
      targetPort: 8080
  selector:
    app: myapp-dev
  type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: myapp-dev
  name: myapp-dev
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp-dev
  template:
    metadata:
      labels:
        app: myapp-dev
    spec:
      containers:
        - env:
            - name: RESTAPIAPP_VERSION
              value: dev
            - name: LOG_LEVEL
              value: debug
          image: localhost:5000/restapiapp:1.22
          name: myapp

Установка

Ручная установка

  1. Загрузите последний двоичный файл для вашей платформы сСтраница выпускаПолем
  2. Поместите бинарку в свою системуPATH(например.,/usr/local/bin)

Установка сценария

(
set -euo pipefail

OS="$(uname | tr '[:upper:]' '[:lower:]')"
ARCH="$(uname -m | sed -e 's/x86_64/amd64/' -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/')"
TAG="$(curl -s https://api.github.com/repos/kubepatch/kubepatch/releases/latest | jq -r .tag_name)"

curl -L "https://github.com/kubepatch/kubepatch/releases/download/${TAG}/kubepatch_${TAG}_${OS}_${ARCH}.tar.gz" |
tar -xzf - -C /usr/local/bin && \
chmod +x /usr/local/bin/kubepatch
)

Установка на основе пакетов (подходящая в CI/CD)

Дебюн

sudo apt update -y && sudo apt install -y curl
curl -LO https://github.com/kubepatch/kubepatch/releases/latest/download/kubepatch_linux_amd64.deb
sudo dpkg -i kubepatch_linux_amd64.deb

Альпийский Linux

apk update && apk add --no-cache bash curl
curl -LO https://github.com/kubepatch/kubepatch/releases/latest/download/kubepatch_linux_amd64.apk
apk add kubepatch_linux_amd64.apk --allow-untrusted

✨ Ключевые функции

Только патч

Патчи применяются с использованиемJSON Patch:

- op: replace
  path: /spec/replicas
  value: 1

Каждый патч минимальный, явный и простой для понимания. Манипуляции по строке или шаблон текста не связана.

Простые Kubernetes Yaml Manifests

Ваши базовые манифесты на 100% чистые объекты Kubernetes - без логики, без аннотаций, без переопределения, без предварительной обработки. Этот
обеспечивает:

  • Легкое редактирование
  • Совместимость с другими инструментами
  • Чистые разницы в GIT

Развертывает перекрестное использование средств

РазвернутьdevВstaging, илиprodПросто выбрав правильный набор патчей. Вся логика живет в патчах, а не
Ваши базы проявляются.

Общие этикетки поддержка

Вводить общие этикетки (напримерenvВteamВapp), включая глубокие пути, такие как шаблоны стручков и селекторы.

Подстановка Env var (только в значениях патчей)

Вы можете вводить секреты и значения конфигурации непосредственно в файлы исправления:

- op: add
  path: /spec/template/spec/containers/0/env
  value:
    - name: PGPASSWORD
      value: ${IAM_SERVICE_PGPASS}

Строгая замена Env-Var (на основе префикса) разрешена только внутри патчей-никогда не в базовых манифестах.

Обратная связь

Есть запрос на функции или проблема? Не стесняйтесьОткройте проблемуИли отправьте PR!


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE