Projected томи
У цьому документі описано спроєцьовані томи в Kubernetes. Рекомендується ознайомитися з томами для кращого розуміння.
Вступ
Том projected
відображає кілька наявних джерел томів в один каталог.
Зараз наступні типи джерел томів можуть бути спроєцьовані:
Всі джерела повинні бути в тому ж просторі імен, що й Pod. Для отримання додаткових відомостей дивіться документ з дизайну все-в-одному томі.
Приклад конфігурації з secret, downwardAPI та configMap
apiVersion: v1
kind: Pod
metadata:
name: volume-test
spec:
containers:
- name: container-test
image: busybox:1.28
command: ["sleep", "3600"]
volumeMounts:
- name: all-in-one
mountPath: "/projected-volume"
readOnly: true
volumes:
- name: all-in-one
projected:
sources:
- secret:
name: mysecret
items:
- key: username
path: my-group/my-username
- downwardAPI:
items:
- path: "labels"
fieldRef:
fieldPath: metadata.labels
- path: "cpu_limit"
resourceFieldRef:
containerName: container-test
resource: limits.cpu
- configMap:
name: myconfigmap
items:
- key: config
path: my-group/my-config
Приклад конфігурації: secret з встановленим нестандартним режимом дозволу
apiVersion: v1
kind: Pod
metadata:
name: volume-test
spec:
containers:
- name: container-test
image: busybox:1.28
command: ["sleep", "3600"]
volumeMounts:
- name: all-in-one
mountPath: "/projected-volume"
readOnly: true
volumes:
- name: all-in-one
projected:
sources:
- secret:
name: mysecret
items:
- key: username
path: my-group/my-username
- secret:
name: mysecret2
items:
- key: password
path: my-group/my-password
mode: 511
Кожне спроєцьоване джерело тому перераховане в специфікації в розділі sources
. Параметри майже такі ж, за винятком двох пунктів:
- Для секретів поле
secretName
було змінено наname
, щоб бути послідовним з назвою ConfigMap. defaultMode
можна вказати тільки на рівні спроєцьованого тому, а не для кожного джерела тому. Однак, як показано вище, ви можете явно встановитиmode
для кожної окремої проєкції.
Спроєцьовані томи serviceAccountToken
Ви можете впровадити токен для поточного service accountʼу в Pod за вказаним шляхом. Наприклад:
apiVersion: v1
kind: Pod
metadata:
name: sa-token-test
spec:
containers:
- name: container-test
image: busybox:1.28
command: ["sleep", "3600"]
volumeMounts:
- name: token-vol
mountPath: "/service-account"
readOnly: true
serviceAccountName: default
volumes:
- name: token-vol
projected:
sources:
- serviceAccountToken:
audience: api
expirationSeconds: 3600
path: token
Pod в прикладі має project том, що містить впроваджений токен service account. Контейнери в цьому Pod можуть використовувати цей токен для доступу до сервера API Kubernetes, автентифікуючись за відомостями service accountʼу Pod. Поле audience
містить призначену аудиторію токена. Отримувач токена повинен ідентифікувати себе за ідентифікатором, вказаним в аудиторії токена, інакше він повинен відхилити токен. Це поле є необовʼязковим, але стандартним для ідентифікації в API сервері.
Поле expirationSeconds
містить час, через який токен стане недійсним. Типовим є час в одну годину, але він має бути принаймні 10 хвилин (600 секунд). Адміністратор може обмежити максимальне значення вказавши параметр --service-account-max-token-expiration
в API сервері. Поле path
містить відносний шлях до точки монтування тому.
Примітка:
Контейнер, що використовує джерела project томів якsubPath
для монтування тому не отримуватиме оновлення для цих джерел.Спроєцьовані томи clusterTrustBundle
Kubernetes v1.29 [alpha]
Примітка:
Для використання цієї функції в Kubernetes {{ skew currentVersion }} вам потрібно увімкнути підтримку обʼєктів ClusterTrustBundle з функціональною можливістюClusterTrustBundle
та прапорецем --runtime-config=certificates.k8s.io/v1alpha1/clustertrustbundles=true
в kube-apiserver, а потім увімкнути функцію ClusterTrustBundleProjection
.Спроєцьований том clusterTrustBundle
дозволяє впроваджувати контент одного чи більше обʼєктів ClusterTrustBundle як автоматично оновлюваний файл у файловій системі контейнера.
ClusterTrustBundle може бути обраний за допомогою name або signer name.
Для вибору за імʼям використовуйте поле name
, щоб вказати один обʼєкт ClusterTrustBundle.
Для вибору за імʼям підписанта використовуйте поле signerName
(і, за необхідності, поле labelSelector
), щоб вказати набір обʼєктів ClusterTrustBundle, які використовують задане імʼя підписанта. Якщо labelSelector
відсутнє, то вибираються всі ClusterTrustBundle для цього підписанта.
Kubelet виконує відсіювання дублікатів сертифікатів у вибраних обʼєктах ClusterTrustBundle, нормалізує представлення PEM (видаляючи коментарі та заголовки), перегруповує сертифікати та записує їх у файл, вказаний полем path
. При зміні набору вибраних обʼєктів ClusterTrustBundle або їх вмісту kubelet підтримує актуальність файлу.
Типово kubelet запобігає запуску Podʼа, якщо заданий обʼєкт ClusterTrustBundle не знайдено, або якщо signerName
/ labelSelector
не відповідає жодному обʼєкту ClusterTrustBundle. Якщо ця поведінка не відповідає вашим вимогам, встановіть поле optional
в true
, і Pod буде запущено з порожнім файлом за шляхом path
.
apiVersion: v1
kind: Pod
metadata:
name: sa-ctb-name-test
spec:
containers:
- name: container-test
image: busybox
command: ["sleep", "3600"]
volumeMounts:
- name: token-vol
mountPath: "/root-certificates"
readOnly: true
serviceAccountName: default
volumes:
- name: token-vol
projected:
sources:
- clusterTrustBundle:
name: example
path: example-roots.pem
- clusterTrustBundle:
signerName: "example.com/mysigner"
labelSelector:
matchLabels:
version: live
path: mysigner-roots.pem
optional: true
Взаємодія SecurityContext
Пропозиція щодо обробки дозволів файлів у розширенні projected service account volume представляє, що projected файли мають відповідні набори дозволів власника.
Linux
У Podʼах Linux, які мають projected том та RunAsUser
вказано у SecurityContext
, projected файли мають правильно встановлені права власності, включаючи власника контейнера.
Коли у всіх контейнерах в Podʼі встановлено одне й те ж runAsUser
у їх
PodSecurityContext
або SecurityContext
, то kubelet гарантує, що вміст тому serviceAccountToken
належить цьому користувачеві, а файл токена має режим дозволів, встановлений в 0600
.
Примітка:
ефемерні контейнери додані до Podʼа після його створення не змінюють прав доступу до тому, які були встановлені при створенні Podʼа.
Якщо права доступу до тому serviceAccountToken
Podʼа були встановлені на 0600
, тому що всі інші контейнери в Podʼі мають одне і те ж runAsUser
, ефемерні контейнери повинні використовувати той самий runAsUser
, щоб мати змогу читати токен.
Windows
У Windows Podʼах, які мають projected том та RunAsUsername
вказано в SecurityContext
Podʼа, права власності не забезпечуються через спосіб управління користувачами у Windows. Windows зберігає та управляє локальними обліковими записами користувачів і груп у файлі бази даних, який називається Security Account Manager (SAM). Кожен контейнер підтримує свій власний екземпляр бази даних SAM, до якого хост не має доступу під час роботи контейнера. Контейнери Windows призначені для запуску режиму користувача операційної системи в ізоляції від хосту, тому не зберігають динамічну конфігурацію власності файлів хосту для облікових записів віртуалізованих контейнерів. Рекомендується розміщувати файли, які слід спільно використовувати з контейнером на машині-хості, в окремому змісті поза C:\
.
Типово у projected файлах буде встановлено наступні права, як показано для прикладу projected файлу тома:
PS C:\> Get-Acl C:\var\run\secrets\kubernetes.io\serviceaccount\..2021_08_31_22_22_18.318230061\ca.crt | Format-List
Path : Microsoft.PowerShell.Core\FileSystem::C:\var\run\secrets\kubernetes.io\serviceaccount\..2021_08_31_22_22_18.318230061\ca.crt
Owner : BUILTIN\Administrators
Group : NT AUTHORITY\SYSTEM
Access : NT AUTHORITY\SYSTEM Allow FullControl
BUILTIN\Administr
ators Allow FullControl
BUILTIN\Users Allow ReadAndExecute, Synchronize
Audit :
Sddl : O:BAG:SYD:AI(A;ID;FA;;;SY)(A;ID;FA;;;BA)(A;ID;0x1200a9;;;BU)
Це означає, що всі адміністратори, такі як ContainerAdministrator
, матимуть доступ на читання, запис та виконання, тоді як не-адміністратори матимуть доступ на читання та
виконання.
Примітка:
Загалом не рекомендується надавати контейнеру доступ до хосту, оскільки це може відкрити можливості для потенційних використань дірок безпеки.
Створення Windows Podʼа з RunAsUser
в його SecurityContext
призведе до того, що Pod буде застрягати на стадії ContainerCreating
назавжди. Таким чином, рекомендується не використовувати опцію RunAsUser
, яка призначена лише для Linux, з Windows Podʼами.