Іноді корисно, щоб контейнер мав інформацію про себе, не перебуваючи занадто повʼязаним із Kubernetes. Downward API дозволяє контейнерам використовувати інформацію про себе чи кластер, не використовуючи клієнт Kubernetes або API-сервер.
Прикладом є наявний застосунок, який передбачає, що певна добре відома змінна середовища містить унікальний ідентифікатор. Можна обгорнути застосунок, але це виснажливо, схильне до помилок і суперечить меті слабкого звʼязку. Кращий варіант — використовувати назву Podʼа як ідентифікатор і передати її в цю змінну середовища.
У Kubernetes є два способи надати поля Podʼа та контейнера запущеному контейнеру:
Разом ці два способи надання полів Podʼа та контейнера називають downward API.
Через downward API доступні лише деякі поля API Kubernetes. У цьому розділі перелічено поля, які ви можете зробити доступними.
Ви можете передавати інформацію з доступних полів рівня Podʼа, використовуючи fieldRef. На рівні API spec для Podʼа завжди визначає принаймні один Container. Ви можете передавати інформацію з доступних полів рівня Container, використовуючи
resourceFieldRef.
fieldRefДеякі поля рівня Podʼа ви можете передати контейнеру як змінну середовища або через том downwardAPI. Через обидва механізми доступні такі поля:
metadata.namemetadata.namespacemetadata.uidmetadata.annotations['<KEY>']<KEY> (наприклад, metadata.annotations['myannotation'])metadata.labels['<KEY>']<KEY> (наприклад, metadata.labels['mylabel'])Така інформація доступна через змінні середовища, але не як поле fieldRef у томі downwardAPI:
spec.serviceAccountNamespec.nodeNamestatus.hostIPstatus.hostIPsstatus.hostIP, перша завжди така сама, як і status.hostIP.status.podIPstatus.podIPsstatus.podIP, перша завжди така сама, як і status.podIPТака інформація доступна через fieldRef тому downwardAPI, але не як змінні середовища:
metadata.labelslabel-key="escaped-label-value" з однією міткою на рядокmetadata.annotationsannotation-key="escaped-annotation-value" з однією анотацією на рядокresourceFieldRefЦі поля рівня контейнера дозволяють надавати інформацію про запити та обмеження для ресурсів, таких як CPU та памʼять.
This is a stable feature in Kubernetes, and has been since version v1.35. It was first available in the v1.27 release. You can no longer disable or opt out of this feature or behavior (it is locked); if you explicitly set a value for the associated feature gate InPlacePodVerticalScaling, Kubernetes ignores it but does not report any error.
Ресурси CPU та памʼяті контейнера можуть бути змінені під час роботи контейнера. Якщо це станеться, буде оновлено том downward API, але змінні середовища не буде оновлено, доки контейнер не буде перезапущено. Докладніші відомості наведено у статті Зміна розміру ресурсів CPU та памʼяті, призначених контейнерам.
resource: limits.cpuresource: requests.cpuresource: limits.memoryresource: requests.memoryresource: limits.hugepages-*resource: requests.hugepages-*resource: limits.ephemeral-storageresource: requests.ephemeral-storageЯкщо обмеження CPU та памʼяті не вказані для контейнера, і ви намагаєтеся надати цю інформацію через downward API, kubelet стандартно надає максимальне доступне для розподілу значення CPU та памʼяті на основі розрахунку ресурсів вузла, доступних для розподілу.
Ви можете прочитати про томи downwardAPI.
Ви можете спробувати використовувати downward API щоб надати інформацію рівня контейнера чи Podʼа: