#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"
. Это просто неизмененный контент