Как исправить массив данных файла yaml k8s при условии, используя yq?

#kubernetes #yaml #yq

Вопрос:

У меня есть проект, который нуждается в обновлении cloneset yaml

Документ YAML что-то вроде:

 apiVersion: apps.kruise.io/v1alpha1
kind: CloneSet
metadata:
  generation: 1
  ...
spec:
  ...
  ...
  volumeClaimTemplates:
  - metadata:
      creationTimestamp: null
      name: data1
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 60G
  - metadata:
      creationTimestamp: null
      name: data2
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 60G
status:
  availableReplicas: 1
 

Я хочу исправить объемные таблички на основе metadata.name

Если имя не указано, обновляются хранилища для всех таблиц объемных требований, и если имя указано и совпадает, обновляются хранилища для определенного имени, если имя указано, но имя не совпадает, возвращается ошибка

 matchVolumeTemplateName=${1-all}
storage="$2"
if [[ ${matchVolumeTemplateName} == "all" ]]; then
  ./bin/yq e -i ".spec.volumeClaimTemplates[].spec.resources.requests.storage = "${storage}"" "cloneset_modifystorage.yml"
else
  ./bin/yq e -i ".spec.volumeClaimTemplates[] | select(.metadata.name == ""${matchVolumeTemplateName}"").spec.resources.requests.storage |= "${storage}"" "cloneset_modifystorage.yml"
fi
 

Однако в приведенном выше коде будет выведена только часть данных YAML, если a match is found для указанного имени, и файл будет пустым, если имя не совпадает, например matchVolumeTemplateName=data3

 # cloneset_modifystorage.yml
# matchVolumeTemplateName = data1   storage = 90G

# Other data of K8S YAML is lost
metadata:
  creationTimestamp: null
  name: data1
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 90G
 

В результате другие данные о K8S отсутствуют, и вместо ошибки при сбое сопоставления имен выводится пустой файл.

Я действительно ценю любую помощь в этом.

Комментарии:

1. Помог ли вам предоставленный ответ?

2. Я заметил, что ответ был удален, поэтому предлагаю начать с самого начала. Не могли бы вы предоставить версию Kubernetes, которую вы используете, и как вы настроили кластер? Вы использовали установку с голым металлом или какой-то облачный провайдер?

Ответ №1:

Вам просто не хватает скобок — поэтому сначала выполняется фильтрация yaml, а затем обновление (вместо обновления определенной части yaml):

 ./bin/yq e -i "(.spec.volumeClaimTemplates[] | select(.metadata.name == ""${matchVolumeTemplateName}"").spec.resources.requests.storage) |= "${storage}"" "cloneset_modifystorage.yml"
 

Раскрытие информации: Я написал yq

Комментарии:

1. Это действительно удобный инструмент. Существует ли метод, который возвращает ошибку при сбое сопоставления, как в примере matchVolumeTemplateName=data3

2. Да, для этого есть флаг «- е»

3. -e, кажется, только для ключа. Я протестировал следующий метод, но не получил ошибки. export matchVolumeTemplateName=data3amp;amp;export storage=50Gamp;amp;./bin/yq e -e "(.spec.volumeClaimTemplates[] | select(.metadata.name == ""${matchVolumeTemplateName}"").spec.resources.requests.storage) |= "${storage}"" "ez-auth-token.yml" . Это просто неизмененный контент