Разница между "kubectl apply" и "kubectl создать"
Я создал стручок с kubectl create -f pod.xml
а также kubectl apply -f pod.xml
используя приведенный ниже yaml, и я не вижу никакой разницы, модуль создается с помощью обеих команд. В документе K8S упоминаются императивные и декларативные команды. Но все же создание и применение ведут себя одинаково.
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busybox
command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 3600']
Какая разница? Кроме того, как это kubectl apply
декларативный и kubectl create
императив? Оба они берут один или несколько файлов yaml с подробной информацией об объекте.
2 ответа
Существует тонкая разница между kubectl create
а также kubectl apply
команды.
kubectl create
Команда создает новый ресурс. Таким образом, если команда будет выполнена снова, она выдаст ошибку, поскольку имена ресурсов должны быть уникальными в пространстве имен.
kubectl get pods
No resources found.
kubectl create -f pod.xml
pod/myapp-pod created
kubectl create -f pod.xml
Error from server (AlreadyExists): error when creating "pod.xml": pods "myapp-pod" already exists
2) kubectl apply
Команда применяет конфигурацию к ресурсу. Если ресурса нет, он будет создан. kubectl apply
Команда может быть запущена во второй раз, так как она просто применяет конфигурацию, как показано ниже. В этом случае конфигурация не изменилась. Итак, стручок не изменился.
kubectl delete pod/myapp-pod
pod "myapp-pod" deleted
kubectl apply -f pod.xml
pod/myapp-pod created
kubectl apply -f pod.xml
pod/myapp-pod unchanged
в kubectl create
мы указываем определенное действие, в этом случае create
и так обязательно. в kubectl apply
Командой мы указываем целевое состояние системы и не указываем определенное действие и поэтому декларативное. Мы позволяем системе решать, какие действия предпринять. Если ресурса нет, он его создаст, если ресурс там, то он применит конфигурацию к существующему ресурсу.
С точки зрения исполнения, нет разницы, когда ресурс создается впервые между kubectl create
а также kubectl apply
как показано выше. Но во второй раз kubectl create
выдаст ошибку.
Мне потребовалось некоторое время, чтобы обойти это, но теперь это имеет смысл.
Проще говоря, create
а также apply
по сути одинаковы, если вы запускаете операцию над одним файлом для создания ресурсов. Тем не мение, apply
позволяет создавать и исправлять одновременно несколько файлов в каталоге.
Там также есть apply
удалить ресурсы из каталога, но он находится в альфа-версии на момент написания этой статьи:
kubectl apply -f <directory/> --prune -l your=label)
По этому вопросу есть и другие идеи: Kubectl apply vs kubectl create?
Это два разных подхода. kubectl create - это то, что мы называем императивным управлением. При таком подходе вы сообщаете API Kubernetes, что вы хотите создать, заменить или удалить, а не то, как вы хотите, чтобы ваш кластерный мир K8s выглядел.
kubectl apply является частью подхода декларативного управления, в котором изменения, которые вы, возможно, применили к живому объекту (т. е. через масштабирование), сохраняются, даже если вы применяете другие изменения к объекту.
Вы можете прочитать больше об императивном и декларативном управлении в документации по управлению объектами Kubernetes.