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, она требует наличия разрешений 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: 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), даже если эти объекты уже существуют. Это делается следующим образом:
- Устанавливает поля, которые появляются в файле конфигурации
- Очищает поля, удалённые из файла конфигурации, при конфигурировании живого объекта
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 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