Це стабільна функція в Kubernetes, яка загальнодоступна починаючи з версії v1.36. Вперше вона зʼявилась у випуску v1.33. Ви більше не можете вимкнути або відмовитися від цієї функції чи поведінки (це заблоковано); якщо ви явно встановите значення для повʼязаної функціональної можливості DeclarativeValidation, Kubernetes проігнорує це, але не повідомить про помилку.
Kubernetes 1.37 використовує декларативну перевірку для дедалі більшого набору API. Замість рукописного коду Go (validation.go) автори API оголошують правила перевірки як теґи коментарів у визначеннях типів (types.go), наприклад +k8s:minimum=0. Генератор коду, validation-gen, перетворює ці теґи на код перевірки.
Це в першу чергу стосується учасників Kubernetes та авторів серверів API розширень, але адміністратори кластерів повинні знати, як це працює під час міграції наявної рукописної перевірки.
Для нових полів API використовуйте теґ безпосередньо, наприклад +k8s:minimum=1. Такі теґи завжди застосовуються.
Міграція наявної рукописної перевірки є ризикованішою, оскільки згенерований код має поводитися точно так само, як код, який він замінює. Такі міграції обгортають теґ у префікс життєвого циклу (+k8s:alpha або +k8s:beta), який керує тим, чи є декларативний результат авторитетним.
| Форма теґа | Поведінка |
|---|---|
+k8s:minimum=1 (без префікса) | Застосовується. Декларативний результат є авторитетним. |
+k8s:beta(since:"1.37")=+k8s:minimum=1 | Застосовується, коли функціональну можливість DeclarativeValidationBeta увімкнено (стандартно), і в тіньовому режимі інакше. |
+k8s:alpha(since:"1.36")=+k8s:minimum=1 | Завжди в тіньовому режимі. Рукописна перевірка залишається авторитетною. |
У тіньовому режимі декларативна перевірка все одно виконується, але API-сервер не повертає її помилки. Він порівнює їх із рукописними помилками, реєструє та підраховує будь-які відмінності, тому перенесене правило можна оцінити на робочому кластері до того, як воно почне відхиляти запити.
DeclarativeValidation: змушує API-сервер порівнювати декларативні та рукописні результати для правил +k8s:alpha і +k8s:beta та звітувати про невідповідності. Декларативна перевірка виконується у будь-якому разі; ця функціональна можливість керує лише звітуванням.
DeclarativeValidationBeta: глобальний вимикач безпеки для правил +k8s:beta. Якщо увімкнено, вони застосовуються; якщо вимкнено, вони повертаються в тіньовий режим.
DeclarativeValidationTakeover: замінено на DeclarativeValidationBeta і більше не враховується. Її встановлення все ще приймається.
Див. Функціональні можливості для інформації про те, як їх встановлювати.
API-сервер надає такі метрики:
| Метрика | Опис |
|---|---|
declarative_validation_mismatch_total | Кількість випадків, коли результати декларативної перевірки відрізнялися від результатів рукописної перевірки. |
declarative_validation_parity_discrepancies_total | Ті самі розбіжності, з міткою validation_identifier, яка записує групу, версію, вид, субресурс та операцію. |
declarative_validation_panic_total | Кількість випадків, коли декларативна перевірка викликала паніку. |
declarative_validation_panics_total | Ті самі паніки, з міткою validation_identifier. |
Невідповідності також реєструються в журналі. Для правила, що застосовується (+k8s:beta), запис у журналі пропонує вимкнути DeclarativeValidationBeta, щоб зберегти дані в etcd узгодженими з попередніми версіями Kubernetes.
Розгляньте можливість встановлення DeclarativeValidationBeta=false, якщо ви бачите:
Неочікувану поведінку перевірки: відхилені запити, які мали бути дійсними, або прийняті обʼєкти, які раніше відхилялися.
Погіршення продуктивності: збільшення затримок (наприклад, у apiserver_request_duration_seconds), яке корелює з цією функціональною можливістю.
Високий рівень невідповідностей: часті інкременти declarative_validation_mismatch_total, які впливають на ваші робочі навантаження.
Щоб повернути правила +k8s:beta у тіньовий режим, передайте --feature-gates=DeclarativeValidationBeta=false.
Вимкнення функціональної можливості є механізмом безпеки, але зауважте один малоймовірний крайній випадок: якщо помилка дозволила декларативній перевірці зберегти недійсний обʼєкт, вимкнення функціональної можливості робить правильну рукописну перевірку знову авторитетною, що може потім блокувати подальші оновлення цього обʼєкта. Виправлення може потребувати редагування збереженого обʼєкта безпосередньо.
Кожен теґ має рівень стабільності — Alpha, Beta або Stable, — що описує зрілість самого теґа. Це окремо від префіксів життєвого циклу +k8s:alpha та +k8s:beta, які описують зрілість одного застосування теґа.
Лінтер генератора використовує рівень стабільності, щоб вирішити, де теґ дозволений:
У пакунку GA (наприклад, v1) теґ без префікса має бути Stable.
У пакунку beta теґи Beta без префікса також дозволені.
У пакунку alpha теґи Alpha та Beta без префікса також дозволені.
Усередині +k8s:alpha=... дозволені теґи Alpha; усередині +k8s:beta=... — теґи Beta.
Усередині +k8s:ifEnabled(...) або +k8s:ifDisabled(...) теґи Beta дозволені навіть у пакунку GA, оскільки опція вже керує перевіркою.
Кожен запис також перелічує області застосування, де теґ може зʼявлятися: поля структур, визначення типів, значення списків, ключі мап, значення мап або значення констант.
| Теґ | Опис | Стабільність |
|---|---|---|
+k8s:alpha | Переводить теґ перевірки в тіньовий режим (тільки метрики). | Beta |
+k8s:beta | Переводить теґ перевірки в режим застосування (можна вимкнути через DeclarativeValidationBeta). | Beta |
+k8s:customUnique | Вказує, що рукописна перевірка забезпечує унікальність для списку. | Stable |
+k8s:customValidation | Викликає рукописну функцію перевірки зі згенерованого коду обходу. | Stable |
+k8s:dependentForbidden | Вказує, що коли це поле встановлено, іменоване сусіднє поле не повинно бути встановлене. | Alpha |
+k8s:dependentRequired | Вказує, що коли це поле встановлено, іменоване сусіднє поле також має бути встановлене. | Alpha |
+k8s:eachKey | Оголошує перевірку для кожного ключа в мапі. | Stable |
+k8s:eachVal | Оголошує перевірку для кожного значення в мапі або списку. | Stable |
+k8s:enum | Вказує, що рядковий тип є переліком. | Stable |
+k8s:enumExclude | Виключає константу зі значень переліку її типу. | Alpha |
+k8s:forbidden | Вказує, що поле не може бути вказане. | Beta |
+k8s:format | Вказує, що рядкове поле має певний формат. | Stable |
+k8s:ifDisabled | Оголошує перевірку, яка застосовується лише коли опцію вимкнено. | Stable |
+k8s:ifEnabled | Оголошує перевірку, яка застосовується лише коли опцію увімкнено. | Stable |
+k8s:ifMode | Оголошує перевірку, яка застосовується лише для заданого значення дискримінатора режиму. | Stable |
+k8s:immutable | Вказує, що поле не може бути оновлене. | Stable |
+k8s:isSubresource | Вказує, що перевірки в пакеті застосовуються лише до конкретного субресурсу. | Stable |
+k8s:item | Оголошує перевірку для елемента зрізу, оголошеного як +k8s:listType=map. | Stable |
+k8s:listMapKey | Оголошує іменоване підполе типу значення списку частиною ключа list-map. | Stable |
+k8s:listType | Оголошує семантичний тип поля списку. | Stable |
+k8s:maxBytes | Вказує, що рядкове поле має обмеження на довжину в байтах. | Stable |
+k8s:maxItems | Вказує, що список має обмеження на розмір. | Stable |
+k8s:maxLength | Вказує, що рядкове поле має обмеження на довжину в символах. | Stable |
+k8s:maxProperties | Вказує, що мапа має обмеження на кількість записів. | Stable |
+k8s:maximum | Вказує, що числове поле має максимальне значення. | Stable |
+k8s:minItems | Вказує, що список має мінімальний розмір. | Stable |
+k8s:minLength | Вказує, що рядкове поле має мінімальну довжину в символах. | Stable |
+k8s:minProperties | Вказує, що мапа має мінімальну кількість записів. | Stable |
+k8s:minimum | Вказує, що числове поле має мінімальне значення. | Stable |
+k8s:modeDiscriminator | Вказує, що це поле є дискримінатором для перевірки на основі стану. | Stable |
+k8s:monotonic | Гарантує, що значення поля ніколи не зменшується під час оновлення. | Alpha |
+k8s:neq | Перевіряє, що значення поля не дорівнює конкретному забороненому значенню. | Alpha |
+k8s:opaqueType | Вказує, що генератор ігнорує будь-які перевірки, оголошені для посиланого типу. | Stable |
+k8s:optional | Вказує, що поле є необовʼязковим для клієнтів. | Stable |
+k8s:required | Вказує, що поле має бути вказане клієнтами. | Stable |
+k8s:subfield | Оголошує перевірку для підполя структури. | Stable |
+k8s:supportsSubresource | Оголошує підтримуваний субресурс для типів у межах пакета. | Stable |
+k8s:unionDiscriminator | Вказує, що це поле є дискримінатором для обʼєднання. | Beta |
+k8s:unionMember | Вказує, що це поле є членом групи обʼєднання. | Stable |
+k8s:unique | Оголошує, що елементи поля списку є унікальними. | Stable |
+k8s:update | Обмежує, які переходи оновлення дозволені для поля. | Stable |
+k8s:zeroOrOneOfMember | Вказує, що це поле є членом групи нуль-або-один-з. | Stable |
+k8s:alphaОпис:
Переводить правило перевірки у тіньовий режим, першу фазу життєвого циклу перевірки. Використовуйте його лише під час міграції наявної рукописної перевірки, а не для нових полів.
Рукописна перевірка залишається авторитетною; декларативне правило виконується поряд із нею, а невідповідності та паніки записуються як метрики. Це підтверджує, що обидві поводяться однаково, перш ніж ви підвищите правило до Beta.
API-сервер ніколи не застосовує правила +k8s:alpha, незалежно від функціональних можливостей.
Рівень стабільності: Beta
Області застосування: поля структур, визначення типів, значення списків, ключі мап, значення мап
Аргументи:
since (string, опціонально): версія Kubernetes, у якій перевірку вперше переведено в тіньовий режим.Корисне навантаження:
<validation-tag> (обовʼязково): теґ декларативної перевірки, який потрібно перевести в тіньовий режим.Приклад використання:
type MyStruct struct {
// +k8s:alpha(since:"1.36")=+k8s:minimum=1
MyField int `json:"myField"`
}
+k8s:betaОпис:
Переводить перенесене правило перевірки у режим застосування, другу фазу життєвого циклу перевірки. Використовуйте його лише під час міграції наявної рукописної перевірки, а не для нових полів.
Коли DeclarativeValidationBeta увімкнено (стандартно), правило є авторитетним, і API-сервер відкидає рукописні помилки, які воно покриває. Вимкнення функціональної можливості повертає правило в тіньовий режим.
Рівень стабільності: Beta
Області застосування: поля структур, визначення типів, значення списків, ключі мап, значення мап
Аргументи:
since (string, опціонально): версія Kubernetes, у якій перевірку підвищено до Beta.Корисне навантаження:
<validation-tag> (обовʼязково): теґ декларативної перевірки, який потрібно застосовувати.Приклад використання:
type MyStruct struct {
// +k8s:beta(since:"1.37")=+k8s:minimum=1
MyField int `json:"myField"`
}
+k8s:customUniqueОпис:
Вказує, що спеціальна рукописна перевірка реалізує перевірку унікальності для цього списку. Це вимикає генерацію перевірки унікальності для списку, яку в іншому випадку передбачають +k8s:listType=set, +k8s:listType=map та +k8s:unique.
Рівень стабільності: Stable
Області застосування: поля структур, визначення типів, значення списків, ключі мап, значення мап
Приклад використання:
type MyStruct struct {
// +k8s:listType=map
// +k8s:listMapKey=key
// +k8s:customUnique
MyList []Item `json:"myList"`
}
У цьому прикладі генератор записує, що MyList є list-map, але не видає перевірку унікальності для нього; за цю перевірку відповідає рукописний код.
+k8s:customValidationОпис:
Викликає рукописну функцію перевірки зі згенерованого коду обходу. Використовуйте цей теґ для логіки, яку неможливо виразити іншими теґами.
Функція має знаходитися у згенерованому пакунку, з такою сигнатурою:
func(ctx context.Context, op operation.Operation, fldPath *field.Path, value, oldValue <ValueType>) field.ErrorList
<ValueType> — це тип значення, який можна присвоїти значенням nil: вказівник, наприклад *string, або сам тип, якщо він уже допускає значення nil (фрагмент, мапа, вказівник). Кожен згенерований пакунок потребує власного визначення, оскільки кожна копія викликає функцію, розташовану поруч із нею.
У назві функції <Type> і <Field> є ідентифікаторами Go (Replicas, а не replicas):
Область поля: ValidateCustom_<Type>_<Field> перевіряє одне поле. Під час оновлення вона пропускається, якщо це поле не змінювалося.
Область типу: ValidateCustom_<Type> перевіряє поля групи. Вона не пропускається під час оновлення, тому дорога перевірка має повертатися рано, коли value та oldValue рівні.
Для перевірок поелементного типу позначте тип елемента або використовуйте область поля та цикл усередині функції.
Рівень стабільності: Stable
Області застосування: поля структур, визначення типів
Приклад використання:
// +k8s:customValidation
type MyStruct struct {
// +k8s:customValidation
StringField string `json:"stringField"`
// Обидві перевірки виконуються для цього поля.
// +k8s:maxLength=3
// +k8s:customValidation
MaxLengthField string `json:"maxLengthField"`
}
+k8s:dependentForbiddenОпис:
Вказує, що коли це поле встановлено, іменоване сусіднє поле не повинно бути встановлене. Поле вважається "встановленим", коли воно є ненульовим вказівником, непорожнім зрізом або мапою або ненульовим вбудованим типом. Залежності є односторонніми. Повторіть теґ, щоб заборонити кілька сусідніх полів.
Рівень стабільності: Alpha
Області застосування: поля структур
Аргументи:
<sibling-field-json-name> (string, обовʼязково): JSON-імʼя сусіднього поля.Приклад використання:
type MyStruct struct {
// +k8s:optional
// +k8s:dependentForbidden("dependentA")
// +k8s:dependentForbidden("dependentB")
Trigger *string `json:"trigger"`
// +k8s:optional
DependentA *string `json:"dependentA"`
// +k8s:optional
DependentB *string `json:"dependentB"`
}
У цьому прикладі, якщо trigger встановлено, ні dependentA, ні dependentB не можуть
бути встановлені.
+k8s:dependentRequiredОпис:
Вказує, що коли це поле встановлено, іменоване сусіднє поле також має бути встановлене. Поле вважається "встановленим", коли воно є ненульовим вказівником, непорожнім зрізом або мапою або ненульовим вбудованим типом. Залежності є односторонніми. Повторіть теґ, щоб вимагати кілька сусідніх полів.
Рівень стабільності: Alpha
Області застосування: поля структур
Аргументи:
<sibling-field-json-name> (string, обовʼязково): JSON-імʼя сусіднього поля.Приклад використання:
type MyStruct struct {
// +k8s:optional
// +k8s:dependentRequired("dependent")
Trigger *string `json:"trigger"`
// +k8s:optional
Dependent *string `json:"dependent"`
}
У цьому прикладі, якщо trigger встановлено, dependent також має бути встановлений. Встановлення
самого dependent дозволене.
+k8s:eachKeyОпис:
Оголошує перевірку для кожного ключа в мапі.
Рівень стабільності: Stable
Області застосування: поля структур, визначення типів, значення списків, ключі мап, значення мап
Корисне навантаження:
<validation-tag> (обовʼязково): теґ для оцінки кожного ключа.Приклад використання:
type MyStruct struct {
// +k8s:eachKey=+k8s:minimum=1
MyMap map[int]string `json:"myMap"`
}
+k8s:eachValОпис:
Оголошує перевірку для кожного значення в мапі або списку.
Рівень стабільності: Stable
Області застосування: поля структур, визначення типів, значення списків, ключі мап, значення мап
Корисне навантаження:
<validation-tag> (обовʼязково): теґ для оцінки кожного значення.Приклад використання:
type MyStruct struct {
// +k8s:eachVal=+k8s:minimum=1
MyMap map[string]int `json:"myMap"`
// +k8s:eachVal=+k8s:maxLength=10
MyList []string `json:"myList"`
}
+k8s:enumОпис:
Вказує, що рядковий тип є переліком. Усі константні значення цього типу є значеннями переліку, якщо ви не виключите їх за допомогою +k8s:enumExclude.
Рівень стабільності: Stable
Області застосування: визначення типів
Приклад використання:
Спочатку визначте новий рядковий тип і кілька констант цього типу:
// +k8s:enum
type MyEnum string
const (
MyEnumA MyEnum = "A"
MyEnumB MyEnum = "B"
)
Потім використовуйте цей тип в іншій структурі:
type MyStruct struct {
MyField MyEnum `json:"myField"`
}
Логіка перевірки гарантує, що MyField є одним з визначених значень переліку ("A" або "B").
+k8s:enumExcludeОпис:
Вказує, що константне значення не є частиною переліку, навіть якщо тип константи має теґ +k8s:enum. Ви можете зробити виключення умовним, вклавши теґ усередину +k8s:ifEnabled або +k8s:ifDisabled. Якщо ви використовуєте кілька умовних теґів, генератор виключає значення, якщо виконана будь-яка з умов.
Рівень стабільності: Alpha
Області застосування: значення констант
Приклад використання:
// +k8s:enum
type MyEnum string
const (
MyEnumA MyEnum = "A"
// Ніколи не є дійсним значенням.
// +k8s:enumExclude
MyEnumB MyEnum = "B"
// Є дійсним значенням лише поки "MyFeature" вимкнено.
// +k8s:ifEnabled(MyFeature)=+k8s:enumExclude
MyEnumC MyEnum = "C"
)
+k8s:forbiddenОпис:
Вказує, що поле не може бути вказане.
Рівень стабільності: Beta
Області застосування: поля структур
Приклад використання:
type MyStruct struct {
// +k8s:forbidden
MyField string `json:"myField"`
}
+k8s:formatОпис:
Вказує, що рядкове поле має певний формат.
Рівень стабільності: Stable
Області застосування: поля структур, визначення типів, значення списків, ключі мап, значення мап
Корисні навантаження:
| Навантаження | Значення |
|---|---|
k8s-extended-resource-name | Імʼя розширеного ресурсу Kubernetes: імʼя з доменним префіксом, яке не повинно мати префікс kubernetes.io або requests.. Коли ви додаєте префікс requests., результат має бути дійсним ключем мітки, як використовується квотою. |
k8s-label-key | Ключ мітки Kubernetes. |
k8s-label-value | Значення мітки Kubernetes. |
k8s-long-name | "Довга назва" Kubernetes, також відома як значення "DNS піддомену". |
k8s-long-name-caseless | Застаріло: "довга назва" Kubernetes без урахування регістру. |
k8s-path-segment-name | Значення "імені сегмента шляху" Kubernetes. |
k8s-prefixed-label-key | Ключ мітки Kubernetes, з обовʼязковим префіксом. |
k8s-resource-fully-qualified-name | Непорожні префікс та імʼя, розділені слешем (наприклад, prefix/name). Префікс має бути DNS піддоменом, а імʼя — C-ідентифікатором довжиною не більше 32 символів. |
k8s-resource-pool-name | Одна або кілька частин "довгої назви" Kubernetes, розділених /, загальною довжиною не більше 253 символів. |
k8s-short-name | "Коротка назва" Kubernetes, також відома як значення "DNS мітки". |
k8s-uuid | UUID, що відповідає RFC 4122. |
Приклад використання:
type MyStruct struct {
// +k8s:format=k8s-long-name
Subdomain string `json:"subdomain"`
// +k8s:format=k8s-short-name
Label string `json:"label"`
// +k8s:format=k8s-uuid
ID string `json:"id"`
}
+k8s:ifDisabledОпис:
Оголошує перевірку, яка застосовується лише коли опцію вимкнено. Опції відповідають опціям перевірки, які API-сервер виводить із функціональних можливостей.
Рівень стабільності: Stable
Області застосування: поля структур, визначення типів, значення списків, ключі мап, значення мап, значення констант
Аргументи:
<option> (string, обовʼязково): імʼя опції.Корисне навантаження:
<validation-tag> (обовʼязково): теґ перевірки для оцінки лише тоді, коли опцію вимкнено.Приклад використання:
type MyStruct struct {
// +k8s:ifDisabled(MyFeature)=+k8s:required
MyField string `json:"myField"`
}
+k8s:ifEnabledОпис:
Оголошує перевірку, яка застосовується лише коли опцію увімкнено. Опції відповідають опціям перевірки, які API-сервер виводить із функціональних можливостей.
Рівень стабільності: Stable
Області застосування: поля структур, визначення типів, значення списків, ключі мап, значення мап, значення констант
Аргументи:
<option> (string, обовʼязково): імʼя опції.Корисне навантаження:
<validation-tag> (обовʼязково): теґ перевірки для оцінки лише тоді, коли опцію увімкнено.Приклад використання:
type MyStruct struct {
// +k8s:ifEnabled(MyFeature)=+k8s:required
MyField string `json:"myField"`
}
+k8s:ifModeОпис:
Оголошує перевірку, яка застосовується лише коли дискримінатор режиму структури має конкретне значення. Це виражає перевірку на основі стану, де форма обʼєкта залежить від поля режиму.
Поле, яке несе щонайменше один теґ +k8s:ifMode, неявно заборонене у кожному режимі, який не називає жоден з його теґів.
Рівень стабільності: Stable
Області застосування: поля структур
Аргументи:
<mode> (string, позиційний): значення дискримінатора, для якого ця перевірка застосовується.modality (string, опціонально): імʼя групи дискримінаторів, коли структура має більше ніж одну групу.mode (string, опціонально): значення дискримінатора, як іменована альтернатива позиційному аргументу.Корисне навантаження:
<validation-tag> (обовʼязково): теґ для оцінки, коли режим збігається.Приклад використання:
type MyStruct struct {
// +k8s:modeDiscriminator
Mode string `json:"mode"`
// Обовʼязкове в режимі "A", а також з обмеженням довжини.
// +k8s:ifMode("A")=+k8s:required
// +k8s:ifMode("A")=+k8s:maxLength=5
FieldA *string `json:"fieldA,omitempty"`
// Необовʼязкове в режимі "B", неявно заборонене в усіх інших режимах.
// +k8s:ifMode("B")=+k8s:optional
FieldB *string `json:"fieldB,omitempty"`
}
+k8s:immutableОпис:
Вказує, що поле не може бути оновлене. На відміну від +k8s:update, який пропонує точніші переходи, +k8s:immutable забороняє будь-яку зміну значення після створення.
Рівень стабільності: Stable
Області застосування: поля структур, визначення типів, значення списків, значення мап
Приклад використання:
type MyStruct struct {
// +k8s:immutable
StringField string `json:"stringField"`
// +k8s:immutable
SliceField []string `json:"sliceField"`
}
// +k8s:immutable
type ImmutableType string
+k8s:isSubresourceОпис:
Теґ рівня пакунка, який обмежує правила перевірки пакунка одним субресурсом, тому вони не застосовуються до кореневого обʼєкта чи будь-якого іншого субресурсу. Це дозволяє тримати перевірку, специфічну для субресурсу, в окремому пакунку, окремо від типів API.
Рівень стабільності: Stable
Область застосування: пакунок
Корисне навантаження:
<subresource-path>: шлях субресурсу, до якого застосовуються перевірки цього пакунка (наприклад, "/status" або "/scale").Приклад використання:
У файлі staging/src/k8s.io/api/apps/v1/doc.go оголосіть, що тип підтримує
/scale:
// +k8s:supportsSubresource="/scale"
package v1
У файлі staging/src/k8s.io/api/apps/v1/validations/scale/doc.go визначте правила, які виконуються лише для /scale:
// +k8s:isSubresource="/scale"
package scale
+k8s:itemОпис:
Оголошує перевірку для елемента зрізу, оголошеного як +k8s:listType=map. Ви оголошуєте елемент для зіставлення, надаючи аргументи у вигляді пар поле-значення, де поле є listMapKey. Ви маєте вказати всі поля listMapKey.
Рівень стабільності: Stable
Області застосування: поля структур, визначення типів, значення списків, ключі мап, значення мап
Використання:
+k8s:item(<listMapKey-JSON-field-name>: <value>,...)=<validation-tag>
+k8s:item(stringKey: "value", intKey: 42, boolKey: true)=<validation-tag>
Називайте аргументи JSON-іменами полів ключів list-map. Значення можуть бути рядками, цілими числами або булевими значеннями.
Корисне навантаження:
<validation-tag> (обовʼязково): теґ для оцінки відповідного елемента списку.Приклад використання:
type MyStruct struct {
// +k8s:listType=map
// +k8s:listMapKey=type
// +k8s:item(type: "Approved")=+k8s:zeroOrOneOfMember
// +k8s:item(type: "Denied")=+k8s:zeroOrOneOfMember
MyConditions []MyCondition `json:"conditions"`
}
type MyCondition struct {
Type string `json:"type"`
Status string `json:"status"`
}
У цьому прикладі умови з type "Approved" та "Denied" є членами однієї групи нуль-або-один-з, тому щонайбільше одна з них може бути присутня.
+k8s:listMapKeyОпис:
Оголошує іменоване підполе типу значення списку частиною ключа list-map. Цей теґ обовʼязковий, коли ви використовуєте +k8s:listType=map або +k8s:unique=map. Ви можете використовувати кілька теґів +k8s:listMapKey, щоб вказати, що список ключується за кількома полями.
Рівень стабільності: Stable
Області застосування: поля структур, визначення типів, значення списків, ключі мап, значення мап
Корисне навантаження:
<field-json-name> (обовʼязково): JSON-імʼя поля для використання як ключа.Приклад використання:
// +k8s:listType=map
// +k8s:listMapKey=keyFieldOne
// +k8s:listMapKey=keyFieldTwo
type MyList []MyItem
type MyItem struct {
KeyFieldOne string `json:"keyFieldOne"`
KeyFieldTwo string `json:"keyFieldTwo"`
ValueField string `json:"valueField"`
}
Ключем є комбінація keyFieldOne та keyFieldTwo.
+k8s:listTypeОпис:
Оголошує семантичний тип поля списку та поведінку володіння:
atomic: єдине володіння; список розглядається як єдине значення.set: спільне володіння з унікальністю; кожен елемент має бути унікальним.map: спільне володіння з унікальністю на основі ключа; вимагає +k8s:listMapKey.Рівень стабільності: Stable
Області застосування: поля структур, визначення типів, значення списків, ключі мап, значення мап
Корисне навантаження:
atomic | map | set (обовʼязково)Приклад використання:
// +k8s:listType=map
// +k8s:listMapKey=keyField
type MyList []MyItem
type MyItem struct {
KeyField string `json:"keyField"`
ValueField string `json:"valueField"`
}
Кожен елемент MyList має мати унікальний keyField.
+k8s:maxBytesОпис:
Вказує, що рядкове поле має обмеження на довжину в байтах. Це може дозволити щонайменше N/4 багатобайтових символів. Щоб обмежити кількість символів натомість, використовуйте +k8s:maxLength.
Рівень стабільності: Stable
Області застосування: поля структур, визначення типів, значення списків, ключі мап, значення мап
Корисне навантаження:
<невідʼємне ціле число> (обовʼязково): це поле не повинно бути довшим за X байтів.Приклад використання:
type MyStruct struct {
// +k8s:maxBytes=1024
MyString string `json:"myString"`
}
+k8s:maxItemsОпис:
Вказує, що список має обмеження на розмір.
Рівень стабільності: Stable
Області застосування: поля структур, визначення типів, значення списків, значення мап
Корисне навантаження:
<невідʼємне ціле число> (обовʼязково): цей список не повинен містити більше X елементів.Приклад використання:
type MyStruct struct {
// +k8s:maxItems=5
MyList []string `json:"myList"`
}
+k8s:maxLengthОпис:
Вказує, що рядкове поле має обмеження на довжину в символах. Це може дозволити до 4*N байтів, якщо значення використовує багатобайтові символи. Щоб обмежити кількість байтів натомість, використовуйте +k8s:maxBytes.
Рівень стабільності: Stable
Області застосування: поля структур, визначення типів, значення списків, ключі мап, значення мап
Корисне навантаження:
<невідʼємне ціле число> (обовʼязково): це поле не повинно бути довшим за X символів.Приклад використання:
type MyStruct struct {
// +k8s:maxLength=10
MyString string `json:"myString"`
}
+k8s:maxPropertiesОпис:
Надає обмеження на властивості обʼєкта, як визначено JSON Schema. У Kubernetes ви можете використовувати його лише для обмеження кількості записів у полі, визначеному як мапа Go.
Рівень стабільності: Stable
Області застосування: поля структур, визначення типів
Корисне навантаження:
<невідʼємне ціле число> (обовʼязково): ця мапа не повинна мати більше X властивостей (де X <= 100000).Приклад використання:
type MyStruct struct {
// +k8s:maxProperties=32
MyMap map[string]string `json:"myMap"`
}
+k8s:maximumОпис:
Вказує, що числове поле має максимальне значення.
Рівень стабільності: Stable
Області застосування: поля структур, визначення типів, значення списків, ключі мап, значення мап
Корисне навантаження:
<ціле число> (обовʼязково): це поле має бути меншим або рівним X.Приклад використання:
type MyStruct struct {
// +k8s:maximum=100
MyInt int `json:"myInt"`
}
+k8s:minItemsОпис:
Вказує, що список має мінімальний розмір.
Рівень стабільності: Stable
Області застосування: поля структур, визначення типів, значення списків, значення мап
Корисне навантаження:
<невідʼємне ціле число> (обовʼязково): цей список має містити щонайменше X елементів.Приклад використання:
type MyStruct struct {
// +k8s:minItems=1
MyList []string `json:"myList"`
}
+k8s:minLengthОпис:
Вказує, що рядкове поле має мінімальну довжину в символах. Якщо значення використовує багатобайтові символи, мінімальний розмір у байтах становить від X до 4X.
Рівень стабільності: Stable
Області застосування: поля структур, визначення типів, значення списків, ключі мап, значення мап
Корисне навантаження:
<ціле число> (обовʼязково): це поле має бути щонайменше X символів завдовжки.Приклад використання:
type MyStruct struct {
// +k8s:minLength=3
MyString string `json:"myString"`
}
+k8s:minPropertiesОпис:
Надає нижнє обмеження на властивості обʼєкта, як визначено JSON Schema. У Kubernetes ви можете використовувати його лише для обмеження кількості записів у полі, визначеному як мапа Go.
Рівень стабільності: Stable
Області застосування: поля структур, визначення типів
Корисне навантаження:
<невідʼємне ціле число> (обовʼязково): ця мапа має містити щонайменше X властивостей (де X <= 100000).Приклад використання:
type MyStruct struct {
// +k8s:minProperties=1
MyMap map[string]string `json:"myMap"`
}
+k8s:minimumОпис:
Вказує, що числове поле має мінімальне значення.
Рівень стабільності: Stable
Області застосування: поля структур, визначення типів, значення списків, ключі мап, значення мап
Корисне навантаження:
<ціле число> (обовʼязково): це поле має бути більшим або рівним X.Приклад використання:
type MyStruct struct {
// +k8s:minimum=0
MyInt int `json:"myInt"`
}
+k8s:modeDiscriminatorОпис:
Вказує, що це поле є дискримінатором для перевірки на основі стану: його значення вибирає, які правила +k8s:ifMode застосовуються до сусідніх полів тієї самої структури.
Дискримінатор має бути не-вказівником string або bool. Структура може мати більше ніж одну групу дискримінаторів; назвіть додаткові групи аргументом modality. Назва групи default зарезервована, а назви груп мають відповідати ^[a-zA-Z][a-zA-Z0-9_]*$.
Рівень стабільності: Stable
Області застосування: поля структур
Аргументи:
modality (string, опціонально): назва групи дискримінаторів, якщо така існує більше ніж одна.Приклад використання:
type MyStruct struct {
// +k8s:modeDiscriminator
Mode string `json:"mode"`
// +k8s:modeDiscriminator(modality:"Legacy")
Legacy bool `json:"legacy"`
// +k8s:ifMode("A")=+k8s:required
FieldA *string `json:"fieldA,omitempty"`
// +k8s:ifMode(modality:"Legacy", mode:"true")=+k8s:required
FieldB *string `json:"fieldB,omitempty"`
}
+k8s:monotonicОпис:
Гарантує, що значення числового поля ніколи не зменшується під час оновлення.
Рівень стабільності: Alpha
Області застосування: поля структур, визначення типів
Приклад використання:
type MyStruct struct {
// +k8s:minimum=0
// +k8s:monotonic
Generation int64 `json:"generation"`
}
+k8s:neqОпис:
Перевіряє, що значення поля не дорівнює конкретному забороненому значенню. Підтримує рядкові, цілі та булеві типи.
Рівень стабільності: Alpha
Області застосування: поля структур, визначення типів, значення списків, ключі мап, значення мап
Корисне навантаження:
<value> (обовʼязково): заборонене значення. Парсер виводить тип (string, int, bool).Приклад використання:
type MyStruct struct {
// +k8s:neq="disallowed"
MyString string `json:"myString"`
// +k8s:neq=0
MyInt int `json:"myInt"`
// +k8s:neq=true
MyBool bool `json:"myBool"`
}
+k8s:opaqueTypeОпис:
Вказує, що генератор ігнорує будь-які перевірки, оголошені для вказаного типу. Якщо поточні прапорці генератора не включають пакунок вказаного типу, ви маєте встановити цей теґ, інакше генерація коду завершиться невдачею (що запобігає мовчазним помилкам). Якщо генератор не повинен ігнорувати перевірки, додайте пакунок типу до генератора за допомогою прапорця --readonly-pkg.
Рівень стабільності: Stable
Області застосування: поля структур, визначення типів, значення списків, ключі мап, значення мап
Приклад використання:
import "some/external/package"
type MyStruct struct {
// +k8s:opaqueType
ExternalField package.ExternalType `json:"externalField"`
}
+k8s:optionalОпис:
Вказує, що поле є необовʼязковим для клієнтів.
Рівень стабільності: Stable
Області застосування: поля структур
Приклад використання:
type MyStruct struct {
// +k8s:optional
MyField string `json:"myField"`
}
+k8s:requiredОпис:
Вказує, що поле має бути вказане клієнтами.
Рівень стабільності: Stable
Області застосування: поля структур
Приклад використання:
type MyStruct struct {
// +k8s:required
MyField string `json:"myField"`
}
+k8s:subfieldОпис:
Оголошує перевірку для підполя структури. Іменоване підполе має бути прямим полем структури або полем вбудованої структури.
Рівень стабільності: Stable
Області застосування: поля структур, визначення типів, значення списків, ключі мап, значення мап
Аргументи:
<field-json-name> (string, обовʼязково): JSON-імʼя підполя.Корисне навантаження:
<validation-tag> (обовʼязково): теґ для оцінки для підполя.Приклад використання:
type MyStruct struct {
// +k8s:subfield(mySubfield)=+k8s:required
Inner MyInnerStruct `json:"inner"`
}
type MyInnerStruct struct {
MySubfield string `json:"mySubfield"`
}
+k8s:supportsSubresourceОпис:
Теґ рівня пакунка, який реєструє шлях субресурсу у функції диспетчера, щоб запити до нього можна було маршрутизувати до реалізації перевірки. Повторіть теґ для кількох субресурсів.
Без жодного теґа +k8s:supportsSubresource перевіряється лише кореневий ресурс, а запити до субресурсів завершуються помилкою "no validation found". З цим теґом, але без відповідного +k8s:isSubresource, субресурс використовує правила кореневого обʼєкта.
Рівень стабільності: Stable
Область застосування: пакунок
Корисне навантаження:
<subresource-path>: шлях субресурсу для підтримки (наприклад, "/status" або "/scale").Приклад використання:
У файлі staging/src/k8s.io/api/core/v1/doc.go, щоб обробляти /status та /scale для типів у пакунку v1:
// +k8s:supportsSubresource="/status"
// +k8s:supportsSubresource="/scale"
package v1
+k8s:unionDiscriminatorОпис:
Вказує, що це поле є дискримінатором для обʼєднання. Значення дискримінатора вибирає, який член обʼєднання має бути присутнім.
Рівень стабільності: Beta
Області застосування: поля структур, значення списків
Аргументи:
union (string, опціонально): імʼя обʼєднання, якщо таких більше ніж одне.Приклад використання:
type MyStruct struct {
TypeMeta int
// +k8s:unionDiscriminator
D D `json:"d"`
// +k8s:unionMember
// +k8s:optional
M1 *M1 `json:"m1"`
// +k8s:unionMember
// +k8s:optional
M2 *M2 `json:"m2"`
}
type D string
const (
DM1 D = "M1"
DM2 D = "M2"
)
type M1 struct{}
type M2 struct{}
Значення D визначає, який член, M1 або M2, має бути присутнім.
+k8s:unionMemberОпис:
Вказує, що це поле є членом обʼєднання. Рівно один член обʼєднання має бути встановлений.
Рівень стабільності: Stable
Області застосування: поля структур, значення списків
Аргументи:
union (string, опціонально): імʼя обʼєднання, якщо таких більше ніж одне.memberName (string, опціонально): значення дискримінатора для цього члена. Стандартно — імʼя поля.Приклад використання:
type MyStruct struct {
// +k8s:unionMember(union: "union1")
// +k8s:optional
M1 *M1 `json:"u1m1"`
// +k8s:unionMember(union: "union1")
// +k8s:optional
M2 *M2 `json:"u1m2"`
}
type M1 struct{}
type M2 struct{}
+k8s:uniqueОпис:
Оголошує, що елементи поля списку є унікальними. Ви можете використовувати цей теґ разом із +k8s:listType=atomic, щоб додати обмеження унікальності без зміни семантики злиття списку, або незалежно, щоб вказати семантику унікальності.
Рівень стабільності: Stable
Області застосування: поля структур, визначення типів, значення списків, ключі мап, значення мап
Корисне навантаження:
map | set (обовʼязково). З map ідентичність елемента походить із полів +k8s:listMapKey; з set — з усього значення елемента.Приклад використання:
type MyStruct struct {
// +k8s:listType=atomic
// +k8s:unique=set
Names []string `json:"names"`
// +k8s:listType=atomic
// +k8s:unique=map
// +k8s:listMapKey=key
Items []Item `json:"items"`
}
+k8s:updateОпис:
Надає обмеження на дозволені операції оновлення поля. Ви можете вказати кілька обмежень, використовуючи кілька теґів.
| Обмеження | Ефект |
|---|---|
NoSet | Запобігає переходам від невстановленого до встановленого. |
NoUnset | Запобігає переходам від встановленого до невстановленого. |
NoModify | Запобігає змінам значення, але дозволяє переходи встановлення та зняття. |
NoAddItem | Запобігає додаванню елементів до зрізу або мапи. |
NoRemoveItem | Запобігає видаленню елементів зі зрізу або мапи. |
Для не-вказівникових структур NoSet і NoUnset не мають ефекту, оскільки ви не можете зняти ці поля. Для полів зрізів і мап "не встановлено" означає len == 0. Ідентичність елемента зрізу для NoAddItem і NoRemoveItem походить із +k8s:listType, +k8s:listMapKey та +k8s:unique; для мап ідентичністю елемента є ключ.
NoModify не підтримується безпосередньо для зрізів або мап; використовуйте +k8s:eachVal=+k8s:update=NoModify для незмінності окремих елементів. Для списків +k8s:eachVal=+k8s:update=NoModify вимагає listType=map або unique=map, оскільки інакше зміни вмісту неможливо виявити.
Рівень стабільності: Stable
Області застосування: поля структур, значення списків, значення мап
Корисне навантаження:
NoSet | NoUnset | NoModify | NoAddItem | NoRemoveItemПриклад використання:
type MyStruct struct {
// Встановлюється один раз: може бути встановлене будь-коли, але ніколи не змінюється чи очищується.
// +k8s:update=NoModify
// +k8s:update=NoUnset
SetOnce *string `json:"setOnce,omitempty"`
// Має бути встановлене під час створення або ніколи.
// +k8s:update=NoSet
AtCreationOnly *string `json:"atCreationOnly,omitempty"`
// Заморозьте форму списку; окремі елементи все ще можуть змінюватися.
// +k8s:listType=map
// +k8s:listMapKey=key
// +k8s:update=NoAddItem
// +k8s:update=NoRemoveItem
FrozenShape []Item `json:"frozenShape"`
}
+k8s:zeroOrOneOfMemberОпис:
Вказує, що це поле є членом обʼєднання нуль-або-один-з. Таке обʼєднання дозволяє встановити щонайбільше одного члена. На відміну від звичайних обʼєднань, відсутність встановлених членів є дійсною.
Рівень стабільності: Stable
Області застосування: поля структур, значення списків
Аргументи:
union (string, опціонально): імʼя обʼєднання, якщо таких більше ніж одне.memberName (string, опціонально): спеціальне імʼя члена для цього члена. Стандартно — імʼя поля.Приклад використання:
type MyStruct struct {
// +k8s:listType=map
// +k8s:listMapKey=type
// +k8s:item(type: "Approved")=+k8s:zeroOrOneOfMember
// +k8s:item(type: "Denied")=+k8s:zeroOrOneOfMember
Conditions []MyCondition `json:"conditions"`
}
type MyCondition struct {
Type string `json:"type"`
Status string `json:"status"`
}
У цьому прикладі щонайбільше одна з умов "Approved" та "Denied" може бути присутня. Також дійсно, якщо жодна з них не присутня.