Являются ли вызовы Kubernetes API секретным обновлением и обновлением configmap для атомарных вызовов? - PullRequest
1 голос
/ 23 октября 2019

Является ли client.Secrets (пространство имен) .Update (secret) атомарным вызовом? Если этот вызов каким-то образом завершится неудачно, будет ли поврежден исходный секрет, хранящийся на сервере API Kubernetes?

https://github.com/kubernetes/client-go/blob/d1b30110f1abd3b2fb21c5c2daad4345ede8a9fc/kubernetes/typed/core/v1/secret.go#L41

Аналогично, это core.ConfigMaps (пространство имен) .Update (configmap) атомарный вызов? Если этот вызов завершится неудачно, будет ли поврежден существующий файл конфигурации?

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

client-go UPDATE - это HTTP PUT, поэтому он заменит объект и является атомарной операцией. Однако при этом необходимо учитывать обстоятельства, например, если на одном и том же объекте работают несколько клиентов ... вы должны посмотреть в этом связанном примере client-go альтернативные решения:

https://github.com/kubernetes/client-go/blob/master/examples/create-update-delete-deployment/main.go#L109-L123

0 голосов
/ 24 октября 2019

Согласно документации Kubernetes в разделе о применении на стороне сервера вы можете найти следующее:

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


И некоторая информация о стратегии слияния.

Стратегия слияния

Стратегия слияния, реализованная с помощью Server Side Apply, обеспечивает в целом более стабильный жизненный цикл объекта. Прикладная программа на стороне сервера пытается объединить поля, основываясь на том, кто ими управляет, вместо того, чтобы игнорировать только на основе значений. Таким образом, он призван упростить и сделать более стабильным для нескольких действующих лиц обновление одного и того же объекта путем создания менее неожиданных помех.

Когда пользователь отправляет объект «полностью определенное намерение» конечной точке Apply на стороне сервера,сервер объединяет его с живым объектом, предпочитая значение в применяемом конфиге, если оно указано в обоих местах. Если набор элементов, присутствующих в примененной конфигурации, не является надмножеством элементов, примененных одним и тем же пользователем в прошлый раз, каждый отсутствующий элемент, не управляемый другими поставщиками, удаляется. Для получения дополнительной информации о том, как схема объекта используется для принятия решений при объединении, см. sigs.k8s.io / structd-merge-diff .

Надеюсь, это поможет.


Редактировать: Да, применить и обновить использовать эти функции.

Применить и обновить

Для этой функции рассматриваются два типа операций: Apply (PATCH с типом содержимого application/apply-patch+yaml) и Update (все другие операции, которые изменяют объект). Обе операции обновляют managedFields, но ведут себя немного по-разному.

Например, при конфликтах происходит сбой только операции применения, а обновление - нет. Кроме того, для применения идентификаторов требуются операции применения, предоставляя параметр запроса fieldManager, в то время как параметр запроса является необязательным для операций обновления. Наконец, при использовании операции apply у вас не может быть managedFields в объекте, который применяется.

...