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

Объекты Kubernetes могут рекурсивно создаваться, модифицироваться и удаляться при помощи множества хранимых файлов конфигурации в каталоге и при помощи средства командной строки kubectl. При этом, сохраняются записи сделанные на живых объектах без внесения изменений обратно в файл конфигурации.
Предварительно проверить изменения можно при помощи команды kubectl diff , а затем можно сделать изменения командой apply .
Обзор
Декларативное управление объектами требует твёрдого знания определений объектов и конфигураций.
Перед тем, как приступать к подобным операциям, следует тщательно изучить предыдущие разделы Kubernetes (1), (2), (3), (4) и (5).
В документе используются следующие определения терминов:
- Файл конфигурации объекта (object configuration file / configuration file): файл, который определяет конфигурацию объекта Kubernetes. Файл конфигурации применяется к объекту при помощи команды
kubectlapply.Файлы конфигурации обычно хранятся в депозиториях, таких как 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/v1kind: Deploymentmetadata:name: nginx-deploymentspec:selector:matchLabels:app: nginxminReadySeconds: 5template:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.14.2ports:- 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, она требует наличия разрешений PATCH, CREATE и 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: Deploymentmetadata:annotations:# ...# This is the json representation of simple_deployment.yaml# It was written by kubectl apply when the object was createdkubectl.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: 5selector:matchLabels:# ...app: nginxtemplate:metadata:# ...labels:app: nginxspec:containers:- image: nginx:1.14.2# ...name: nginxports:- containerPort: 80# ...# ...# ...# ...
Модификация объекта
Команду kubectl apply можно также использовать для всех объектов, определённых в каталоге (directory), даже если эти объекты уже существуют. Это делается следующим образом:
- Устанавливает поля, которые появляются в файле конфигурации
- Очищает поля, удалённые из файла конфигурации, при конфигурировании живого объекта
kubectl diff -f <directory>/
kubectl apply -f <directory>/
Примечание: для рекурсивной обработки каталогов добавляется флаг -R flag.
Пример файла конфигурации:
application/simple_deployment.yaml
apiVersion: apps/v1kind: Deploymentmetadata:name: nginx-deploymentspec:selector:matchLabels:app: nginxminReadySeconds: 5template:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.14.2ports:- 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: Deploymentmetadata:annotations:# ...# This is the json representation of simple_deployment.yaml# It was written by kubectl apply when the object was createdkubectl.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: 5selector:matchLabels:# ...app: nginxtemplate:metadata:# ...labels:app: nginxspec:containers:- image: nginx:1.14.2# ...name: nginxports:- 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/v1kind: Deploymentmetadata:annotations:# ...# note that the annotation does not contain replicas# because it was not updated through applykubectl.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: 5selector:matchLabels:# ...app: nginxtemplate:metadata:# ...labels:app: nginxspec:containers:- image: nginx:1.14.2# ...name: nginxports:- containerPort: 80# ...
Модификация файла конфигурации simple_deployment.yaml для изменения образа из nginx:1.14.2 в nginx:1.16.1, и удаление поля the minReadySeconds:
application/update_deployment.yaml
apiVersion: apps/v1kind: Deploymentmetadata:name: nginx-deploymentspec:selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.16.1 # update the imageports:- 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, установленное командойkubectlscale(файл конфигурации был не изменялся). - Поле
imageмодифицировано вnginx:1.16.1изnginx:1.14.2. - Аннотация
last-applied-configurationбыла модифицирована в новый образ. - Поле
minReadySecondsсброшено. - Аннотация
last-applied-configurationбольше не содержит поляminReadySeconds.
apiVersion: apps/v1kind: Deploymentmetadata:annotations:# ...# The annotation contains the updated image to nginx 1.11.9,# but does not contain the updated replicas to 2kubectl.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: nginxtemplate:metadata:# ...labels:app: nginxspec:containers:- image: nginx:1.16.1 # Set by `kubectl apply`# ...name: nginxports:- containerPort: 80# ...# ...# ...# ...
Прдупреждение: использование команды kubectl apply вместе с командами императивной конфигурации create и replace невозможно, поскольку create и replace не сохраняют аннотацию kubectl.kubernetes.io/last-applied-configuration, которая используется в команде kubectl apply для расчёта можификаций.
Удаление объектов
Есть два подхода к удалению объектов в команде kubectl apply.
Рекомендуемый: kubectl delete -f <filename>
Ручное удаление объектов императивной командой, поскольку можно более точно указать, что именно удаляется, и здесь меньше верятности того, что пользователь сделает что-то не то.
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