Імперативне керування обʼєктами Kubernetes за допомогою файлів конфігурації

Імперативне керування обʼєктами Kubernetes за допомогою файлів конфігурації

Обʼєкти Kubernetes можна створювати, оновлювати й видаляти за допомогою інструмента командного рядка kubectl разом із файлом конфігурації обʼєкта у форматі YAML або JSON. У цьому документі пояснено, як визначати обʼєкти й керувати ними за допомогою файлів конфігурації.

Перш ніж ви розпочнете

Встановіть kubectl.

Вам треба мати кластер Kubernetes, а також інструмент командного рядка kubectl має бути налаштований для роботи з вашим кластером. Рекомендується виконувати ці настанови у кластері, що має щонайменше два вузли, які не виконують роль вузлів управління. Якщо у вас немає кластера, ви можете створити його, за допомогою minikube або використовувати одну з цих пісочниць:

Для перевірки версії введіть kubectl version.

Компроміси

Інструмент kubectl підтримує три види керування обʼєктами:

  • Імперативні команди
  • Імперативне конфігурування обʼєктів
  • Декларативна конфігурація обʼєктів

Переваги й недоліки кожного виду керування обʼєктами розглянуто в розділі Управління обʼєктами Kubernetes.

Як створювати обʼєкти

Ви можете використовувати kubectl create -f, щоб створити обʼєкт з файлу конфігурації. Докладніше дивіться в довіднику API Kubernetes.

  • kubectl create -f <filename|url>

Як оновити обʼєкти

Попередження:

Оновлення обʼєктів за допомогою команди replace вилучає всі частини специфікації, не вказані у файлі конфігурації. Цю команду не слід використовувати з обʼєктами, чиї специфікації частково керуються кластером, наприклад із Services типу LoadBalancer, де поле externalIPs керується незалежно від файлу конфігурації. Поля, що керуються незалежно, потрібно скопіювати у файл конфігурації, щоб replace не вилучив їх.

Ви можете використовувати kubectl replace -f, щоб оновити живий обʼєкт відповідно до файлу конфігурації.

  • kubectl replace -f <filename|url>

Як видалити обʼєкти

Ви можете використовувати kubectl delete -f, щоб видалити обʼєкт, описаний у файлі конфігурації.

  • kubectl delete -f <filename|url>

Примітка:

Якщо файл конфігурації задає поле generateName у розділі metadata замість поля name, ви не можете видалити обʼєкт за допомогою kubectl delete -f <filename|url>. Для видалення обʼєкта доведеться використати інші прапорці. Наприклад:

kubectl delete <type> <name>
kubectl delete <type> -l <label>

Як переглянути обʼєкт

Ви можете використовувати kubectl get -f, щоб переглянути інформацію про обʼєкт, описаний у файлі конфігурації.

  • kubectl get -f <filename|url> -o yaml

Прапорець -o yaml вказує, що треба вивести повну конфігурацію обʼєкта. Використайте kubectl get -h, щоб побачити список параметрів.

Обмеження

Команди create, replace і delete добре працюють, коли конфігурація кожного обʼєкта повністю визначена й записана в його файлі конфігурації. Однак якщо живий обʼєкт оновлено, а оновлення не внесено до його файлу конфігурації, вони будуть втрачені під час наступного виконання replace. Це може статися, якщо контролер, як-от HorizontalPodAutoscaler, вносить оновлення безпосередньо в живий обʼєкт. Ось приклад:

  1. Ви створюєте обʼєкт з файлу конфігурації.
  2. Інше джерело оновлює обʼєкт, змінюючи якесь поле.
  3. Ви замінюєте обʼєкт з файлу конфігурації. Зміни, внесені іншим джерелом на кроці 2, втрачаються.

Якщо вам потрібна підтримка кількох записувачів для одного обʼєкта, можна використовувати kubectl apply для керування обʼєктом.

Створення та редагування обʼєкта за URL без збереження конфігурації

Припустимо, у вас є URL файлу конфігурації обʼєкта. Ви можете використати kubectl create --edit, щоб внести зміни до конфігурації перед створенням обʼєкта. Це особливо корисно для навчальних матеріалів і завдань, що вказують на файл конфігурації, який читач може змінити.

kubectl create -f <url> --edit

Міграція від імперативних команд до імперативного конфігурування обʼєктів

Міграція від імперативних команд до імперативного конфігурування обʼєктів складається з кількох кроків, які виконуються вручну.

  1. Експортуйте живий обʼєкт у локальний файл конфігурації обʼєкта:

    kubectl get <kind>/<name> -o yaml > <kind>_<name>.yaml
    
  2. Вручну вилучіть поле status із файлу конфігурації обʼєкта.

  3. Для подальшого керування обʼєктом використовуйте виключно replace.

    kubectl replace -f <kind>_<name>.yaml
    

Визначення селекторів контролерів та міток PodTemplate

Попередження:

Оновлювати селектори контролерів категорично не рекомендовано.

Рекомендований підхід — визначити одну незмінну мітку PodTemplate, яка використовується тільки селектором контролера без іншого семантичного значення.

Приклад мітки:

selector:
  matchLabels:
      controller-selector: "apps/v1/deployment/nginx"
template:
  metadata:
    labels:
      controller-selector: "apps/v1/deployment/nginx"

Що далі