Kubernetes (6)


Kubernetes (5): здесь.

Декларативное управление объектами Kubernetes с использованием файла конфигурации

Объекты Kubernetes могут рекурсивно создаваться, модифицироваться и удаляться при помощи множества хранимых файлов конфигурации в каталоге и при помощи средства командной строки kubectl. При этом, сохраняются записи сделанные на живых объектах без внесения изменений обратно в файл конфигурации.

Предварительно проверить изменения можно при помощи команды kubectl diff , а затем можно сделать изменения командой apply .

Обзор

Декларативное управление объектами требует твёрдого знания определений объектов и конфигураций.

Перед тем, как приступать к подобным операциям, следует тщательно изучить предыдущие разделы Kubernetes (1), (2), (3), (4) и (5).

В документе используются следующие определения терминов:

  • Файл конфигурации объекта (object configuration file / configuration file): файл, который определяет конфигурацию объекта Kubernetes. Файл конфигурации применяется к объекту при помощи команды kubectl apply. Файлы конфигурации обычно хранятся в депозиториях, таких как Git.
  • Конфигурация живого объекта (live object configuration / live configuration): величины конфигурации живого объекта обысно хранятся в системе хранения Kubernetes, обычно etcd.
  • Источник декларативной конфигурации (declarative configuration writer / declarative writer): пользователь или программа, которая производит изменения живого объекта. Чтобы внести изменения используется команды kubectl apply.

Создание объектов

Команда kubectl apply применяется ко всем объектам, кроме тех, которые уже существуют, и определены в файлах конфигурации в указанных каталогах (directory):

kubectl apply -f <directory>/

Эта команда устанавливает аннотацию конфигурации на каждом оюъекте kubectl.kubernetes.io/last-applied-configuration: '{...}'. Аннотация конфигурации содержит данные по конфигурации объекта, которая использовалась при создании объекта.

Примечание: для рекурсии процесса обработки каталогов нужно установить флаг -R .

Например:

application/simple_deployment.yaml 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  minReadySeconds: 5
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

Для вывода объекта, который будет создан, применяется команда kubectl diff:

kubectl diff -f https://k8s.io/examples/application/simple_deployment.yaml

Примечание:

Команда diff использует функцию server-side dry-run, которую нужно запустить на сервере kube-apiserver. Поскольку команда diff производит запрос apply на стороне сервера в режиме dry-run mode, она требует наличия разрешений PATCHCREATE и UPDATE. Подробнее: Dry-Run Authorization .

Создание объекта:

kubectl apply -f https://k8s.io/examples/application/simple_deployment.yaml

Вывод результата при помощи kubectl get:

kubectl get -f https://k8s.io/examples/application/simple_deployment.yaml -o yaml

Вывод результатов показывает, что аннотация  kubectl.kubernetes.io/last-applied-configuration была предписана живой конфигурации, и она соответствует файлу конфигурации:

kind: Deployment
metadata:
  annotations:
    # ...
    # This is the json representation of simple_deployment.yaml
    # It was written by kubectl apply when the object was created
   kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"apps/v1","kind":"Deployment",
      "metadata":{"annotations":{},"name":"nginx-deployment","namespace":"default"},
      "spec":{"minReadySeconds":5,"selector":{"matchLabels":{"app":nginx}},"template":{"metadata":{"labels":{"app":"nginx"}},
      "spec":{"containers":[{"image":"nginx:1.14.2","name":"nginx",
      "ports":[{"containerPort":80}]}]}}}}      
  # ...
spec:
  # ...
  minReadySeconds: 5
  selector:
    matchLabels:
      # ...
      app: nginx
  template:
    metadata:
      # ...
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.14.2
        # ...
        name: nginx
        ports:
        - containerPort: 80
        # ...
      # ...
    # ...
  # ...

Модификация объекта

Команду kubectl apply можно также использовать для всех объектов, определённых в каталоге (directory), даже если эти объекты уже существуют. Это делается следующим образом:

  1. Устанавливает поля, которые появляются в файле конфигурации
  2. Очищает поля, удалённые из файла конфигурации, при конфигурировании живого объекта

kubectl diff -f <directory>/

kubectl apply -f <directory>/

Примечание: для рекурсивной обработки каталогов добавляется флаг -R flag.

Пример файла конфигурации:

application/simple_deployment.yaml 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  minReadySeconds: 5
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

Создание объекта при помощи команды kubectl apply:

kubectl apply -f https://k8s.io/examples/application/simple_deployment.yaml

Примечание: для иллюстрации, предыдущая команда отоносится к одиночному файлу конфигурации, а не каталогу (directory).

Вывод файла конфигурации: kubectl get:

kubectl get -f https://k8s.io/examples/application/simple_deployment.yaml -o yaml

В выводе показано, что аннотация kubectl.kubernetes.io/last-applied-configuration была написана для конфигурации живого объекта, и она соответствует файлу конфигурации:

kind: Deployment
metadata:
  annotations:
    # ...
    # This is the json representation of simple_deployment.yaml
    # It was written by kubectl apply when the object was created
    kubectl.kubernetes.io/last-applied-configuration: 
      {"apiVersion":"apps/v1","kind":"Deployment",
      "metadata":{"annotations":{},"name":"nginx-deployment","namespace":"default"},
      "spec":{"minReadySeconds":5,"selector":{"matchLabels":{"app":nginx}},"template":{"metadata":{"labels":{"app":"nginx"}},
      "spec":{"containers":[{"image":"nginx:1.14.2","name":"nginx",
      "ports":[{"containerPort":80}]}]}}}}      
  # ...
spec:
  # ...
  minReadySeconds: 5
  selector:
    matchLabels:
      # ...
      app: nginx
  template:
    metadata:
      # ...
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.14.2
        # ...
        name: nginx
        ports:
        - containerPort: 80
        # ...
      # ...
    # ...
  # ...

Прямая модификация поля replicas в живой конфигурации при помощи kubectl scale (команда kubectl apply не применима):

kubectl scale deployment/nginx-deployment --replicas=2

Вывод живой конфигурации при помощи kubectl get:

kubectl get deployment nginx-deployment -o yaml

В выводе показано, что поле replicas установлено в значение «2», и аннотация last-applied-configuration не содержит поля реплика replicas field:

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    # ...
    # note that the annotation does not contain replicas
    # because it was not updated through apply
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"apps/v1","kind":"Deployment",
      "metadata":{"annotations":{},"name":"nginx-deployment","namespace":"default"},
      "spec":{"minReadySeconds":5,"selector":{"matchLabels":{"app":nginx}},"template":{"metadata":{"labels":{"app":"nginx"}},
      "spec":{"containers":[{"image":"nginx:1.14.2","name":"nginx",
      "ports":[{"containerPort":80}]}]}}}}      
  # ...
spec:
  replicas: 2 # written by scale
  # ...
  minReadySeconds: 5
  selector:
    matchLabels:
      # ...
      app: nginx
  template:
    metadata:
      # ...
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.14.2
        # ...
        name: nginx
        ports:
        - containerPort: 80
      # ...

Модификация файла конфигурации simple_deployment.yaml  для изменения образа из  nginx:1.14.2 в nginx:1.16.1, и удаление поля the minReadySeconds:

application/update_deployment.yaml 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.16.1 # update the image
        ports:
        - containerPort: 80
 

Применим изменения в файле конфигурации:

kubectl diff -f https://k8s.io/examples/application/update_deployment.yaml
kubectl apply -f https://k8s.io/examples/application/update_deployment.yaml

Вывод конфигурации при помощи kubectl get:

kubectl get -f https://k8s.io/examples/application/update_deployment.yaml -o yaml

В выводе показаны следующие изменения к конфигурации:

  • Поле replicas сохраняет значение 2, установленное командой kubectl scale (файл конфигурации был не изменялся).
  • Поле image модифицировано в nginx:1.16.1 из nginx:1.14.2.
  • Аннотация last-applied-configuration была модифицирована в новый образ.
  • Поле minReadySeconds сброшено.
  • Аннотация last-applied-configuration больше не содержит поля minReadySeconds .
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    # ...
    # The annotation contains the updated image to nginx 1.11.9,
    # but does not contain the updated replicas to 2
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"apps/v1","kind":"Deployment",
      "metadata":{"annotations":{},"name":"nginx-deployment","namespace":"default"},
      "spec":{"selector":{"matchLabels":{"app":nginx}},"template":{"metadata":{"labels":{"app":"nginx"}},
      "spec":{"containers":[{"image":"nginx:1.16.1","name":"nginx",
      "ports":[{"containerPort":80}]}]}}}}      
    # ...
spec:
  replicas: 2 # Set by `kubectl scale`.  Ignored by `kubectl apply`.
  # minReadySeconds cleared by `kubectl apply`
  # ...
  selector:
    matchLabels:
      # ...
      app: nginx
  template:
    metadata:
      # ...
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.16.1 # Set by `kubectl apply`
        # ...
        name: nginx
        ports:
        - containerPort: 80
        # ...
      # ...
    # ...
  # ...

Прдупреждение: использование команды  kubectl apply вместе с командами императивной конфигурации create и replace невозможно, поскольку create и replace не сохраняют аннотацию kubectl.kubernetes.io/last-applied-configuration, которая используется в команде kubectl apply для расчёта можификаций.

Удаление объектов

Есть два подхода к удалению объектов в команде kubectl apply.

Ручное удаление объектов императивной командой, поскольку можно более точно указать, что именно удаляется, и здесь меньше верятности того, что пользователь сделает что-то не то.

kubectl delete -f <filename>

 Альтернативный: 

kubectl apply -f <directory/> --prune -l your=label

Это способ можно использовать, если точно знать, что делать.

Предупреждение: kubectl apply --prune относится к «альфа»-версии ПО и в последующих версиях будут сделаны усовершенствования.

Предупреждение: С этой командой нужно быть осторожным, чтобы не удалить что-нибудь нужное случайно.

Просмотр конфигурации объекта

Для просмотра конфигурации живого объекта используется команда kubectl get с -o yaml :

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

Об авторе Алексей Шалагинов

Независимый эксперт
Запись опубликована в рубрике NFV, цифровая трансформация с метками , , , , . Добавьте в закладки постоянную ссылку.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.