# Projected томи

LLMS index: [llms.txt](/llms.txt)

---

<!-- overview -->

У цьому документі описано _проєкційні томи_ в Kubernetes. Рекомендується ознайомитися з [томами](/docs/concepts/storage/volumes/) для кращого розуміння.

<!-- body -->

## Вступ {#introduction}

Том `projected` відображає кілька наявних джерел томів в одну теку.

Зараз наступні типи джерел томів можуть бути проєкційні:

* [`secret`](/docs/concepts/storage/volumes/#secret)
* [`downwardAPI`](/docs/concepts/storage/volumes/#downwardapi)
* [`configMap`](/docs/concepts/storage/volumes/#configmap)
* [`serviceAccountToken`](#serviceaccounttoken)
* [`clusterTrustBundle`](#clustertrustbundle)
* [`podCertificate`](#podcertificate)

Всі джерела повинні бути в тому ж просторі імен, що й Pod. Для отримання додаткових відомостей дивіться документ з дизайну [все-в-одному томі](https://git.k8s.io/design-proposals-archive/node/all-in-one-volume.md).

### Приклад конфігурації з secret, downwardAPI та configMap {#example-configuration-secret-downwardapi-configmap}


















<div class="highlight code-sample">
    <div class="copy-code-icon">
    <a href="https://raw.githubusercontent.com/kubernetes/website/main/content/uk/examples/pods/storage/projected-secret-downwardapi-configmap.yaml" download="pods/storage/projected-secret-downwardapi-configmap.yaml"><code>pods/storage/projected-secret-downwardapi-configmap.yaml</code>
    </a><img src="/images/copycode.svg" class="icon-copycode" onclick="copyCode('pods-storage-projected-secret-downwardapi-configmap-yaml')" title="Копіювати pods/storage/projected-secret-downwardapi-configmap.yaml до буферу обміну"></img></div>
    <div class="includecode" id="pods-storage-projected-secret-downwardapi-configmap-yaml"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">Pod</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">volume-test</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">containers</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">container-test</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">busybox:1.28</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">command</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;sleep&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;3600&#34;</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">volumeMounts</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">all-in-one</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">mountPath</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;/projected-volume&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">readOnly</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">all-in-one</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">projected</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">sources</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">secret</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">mysecret</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">items</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="nt">key</span><span class="p">:</span><span class="w"> </span><span class="l">username</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">my-group/my-username</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">downwardAPI</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">items</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;labels&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">fieldRef</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">fieldPath</span><span class="p">:</span><span class="w"> </span><span class="l">metadata.labels</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;cpu_limit&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">resourceFieldRef</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">containerName</span><span class="p">:</span><span class="w"> </span><span class="l">container-test</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">resource</span><span class="p">:</span><span class="w"> </span><span class="l">limits.cpu</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">configMap</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">myconfigmap</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">items</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="nt">key</span><span class="p">:</span><span class="w"> </span><span class="l">config</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">my-group/my-config</span><span class="w">
</span></span></span></code></pre></div></div>
</div>

### Приклад конфігурації: secret з встановленим нестандартним режимом дозволу {#example-configuration-secrets-nondefault-permission-mode}


















<div class="highlight code-sample">
    <div class="copy-code-icon">
    <a href="https://raw.githubusercontent.com/kubernetes/website/main/content/uk/examples/pods/storage/projected-secrets-nondefault-permission-mode.yaml" download="pods/storage/projected-secrets-nondefault-permission-mode.yaml"><code>pods/storage/projected-secrets-nondefault-permission-mode.yaml</code>
    </a><img src="/images/copycode.svg" class="icon-copycode" onclick="copyCode('pods-storage-projected-secrets-nondefault-permission-mode-yaml')" title="Копіювати pods/storage/projected-secrets-nondefault-permission-mode.yaml до буферу обміну"></img></div>
    <div class="includecode" id="pods-storage-projected-secrets-nondefault-permission-mode-yaml"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">Pod</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">volume-test</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">containers</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">container-test</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">busybox:1.28</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">command</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;sleep&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;3600&#34;</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">volumeMounts</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">all-in-one</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">mountPath</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;/projected-volume&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">readOnly</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">all-in-one</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">projected</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">sources</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">secret</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">mysecret</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">items</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="nt">key</span><span class="p">:</span><span class="w"> </span><span class="l">username</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">my-group/my-username</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">secret</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">mysecret2</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">items</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="nt">key</span><span class="p">:</span><span class="w"> </span><span class="l">password</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">my-group/my-password</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">mode</span><span class="p">:</span><span class="w"> </span><span class="m">0777</span><span class="w">
</span></span></span></code></pre></div></div>
</div>

Кожне джерело проєкційного тому перераховане в специфікації в розділі `sources`. Параметри майже такі ж, за винятком двох пунктів:

* Для секретів поле `secretName` було змінено на `name`, щоб бути послідовним з назвою ConfigMap.
* `defaultMode` можна вказати тільки на рівні проєкційного тому, а не для кожного джерела тому. Однак, як показано вище, ви можете явно встановити `mode` для кожної окремої проєкції.

## Проєкційні томи serviceAccountToken {#serviceaccounttoken}

Ви можете зробити інʼєкцію токена для поточного [service accountʼу](/docs/reference/access-authn-authz/authentication/#service-account-tokens) в Pod за вказаним шляхом. Наприклад:


















<div class="highlight code-sample">
    <div class="copy-code-icon">
    <a href="https://raw.githubusercontent.com/kubernetes/website/main/content/uk/examples/pods/storage/projected-service-account-token.yaml" download="pods/storage/projected-service-account-token.yaml"><code>pods/storage/projected-service-account-token.yaml</code>
    </a><img src="/images/copycode.svg" class="icon-copycode" onclick="copyCode('pods-storage-projected-service-account-token-yaml')" title="Копіювати pods/storage/projected-service-account-token.yaml до буферу обміну"></img></div>
    <div class="includecode" id="pods-storage-projected-service-account-token-yaml"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">Pod</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">sa-token-test</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">containers</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">container-test</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">busybox:1.28</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">command</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;sleep&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;3600&#34;</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">volumeMounts</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">token-vol</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">mountPath</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;/service-account&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">readOnly</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">serviceAccountName</span><span class="p">:</span><span class="w"> </span><span class="l">default</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">token-vol</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">projected</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">sources</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">serviceAccountToken</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">audience</span><span class="p">:</span><span class="w"> </span><span class="l">api</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">expirationSeconds</span><span class="p">:</span><span class="w"> </span><span class="m">3600</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">token</span><span class="w">
</span></span></span></code></pre></div></div>
</div>

Pod в прикладі має project том, що містить інʼєктований токен service account. Контейнери в цьому Pod можуть використовувати цей токен для доступу до сервера API Kubernetes, автентифікуючись за відомостями [service accountʼу Pod](/docs/tasks/configure-pod-container/configure-service-account/). Поле `audience` містить призначену аудиторію токена. Отримувач токена повинен ідентифікувати себе за ідентифікатором, вказаним в аудиторії токена, інакше він повинен відхилити токен. Це поле є необовʼязковим, але стандартним для ідентифікації в API сервері.

Поле `expirationSeconds` містить час, через який токен стане недійсним. Типовим є час в одну годину, але він має бути принаймні 10 хвилин (600 секунд). Адміністратор може обмежити максимальне значення вказавши параметр `--service-account-max-token-expiration` в API сервері. Поле `path` містить відносний шлях до точки монтування тому.


<div class="alert alert-info" role="note"><h4 class="alert-heading">Примітка:</h4>Контейнер, що використовує джерела project томів як <a href="/uk/docs/concepts/storage/volumes/#using-subpath"><code>subPath</code></a> для монтування тому не отримуватиме оновлення для цих джерел.</div>


## Проєкційні томи clusterTrustBundle {#clustertrustbundle}








  <div class="feature-state-notice feature-beta" title="Функціональна можливість: ClusterTrustBundleProjection">
              <span class="feature-state-name">СТАН ФУНКЦІОНАЛУ:</span> 
              <code>Kubernetes v1.33 [beta]</code>(стандартно вимкнено)</div>



<div class="alert alert-info" role="note"><h4 class="alert-heading">Примітка:</h4>Для використання цієї функції в Kubernetes {{ skew currentVersion }} вам потрібно увімкнути підтримку обʼєктів ClusterTrustBundle з <a href="/uk/docs/reference/command-line-tools-reference/feature-gates/">функціональною можливістю</a> <code>ClusterTrustBundle</code> та прапорцем <code>--runtime-config=certificates.k8s.io/v1beta1/clustertrustbundles=true</code> в kube-apiserver, а потім увімкнути функцію <code>ClusterTrustBundleProjection</code>.</div>


Проєкційний том `clusterTrustBundle` робить інʼєкцію вмісту одного чи більше обʼєктів [ClusterTrustBundle](/docs/reference/access-authn-authz/certificate-signing-requests/#cluster-trust-bundles) як автоматично оновлюваний файл у файловій системі контейнера.

ClusterTrustBundle може бути обраний за допомогою [name](/docs/reference/access-authn-authz/certificate-signing-requests#ctb-signer-unlinked) або [signer name](/docs/reference/access-authn-authz/certificate-signing-requests#ctb-signer-linked).

Для вибору за імʼям використовуйте поле `name`, щоб вказати один обʼєкт ClusterTrustBundle.

Для вибору за імʼям підписанта використовуйте поле `signerName` (і, за необхідності, поле `labelSelector`), щоб вказати набір обʼєктів ClusterTrustBundle, які використовують задане імʼя підписанта. Якщо `labelSelector` відсутнє, то вибираються всі ClusterTrustBundle для цього підписанта.

Kubelet виконує відсіювання дублікатів сертифікатів у вибраних обʼєктах ClusterTrustBundle, нормалізує представлення PEM (видаляючи коментарі та заголовки), перегруповує сертифікати та записує їх у файл, вказаний полем `path`. При зміні набору вибраних обʼєктів ClusterTrustBundle або їх вмісту kubelet підтримує актуальність файлу.

Типово kubelet запобігає запуску Podʼа, якщо заданий обʼєкт ClusterTrustBundle не знайдено, або якщо `signerName` / `labelSelector` не відповідає жодному обʼєкту ClusterTrustBundle. Якщо ця поведінка не відповідає вашим вимогам, встановіть поле `optional` в `true`, і Pod буде запущено з порожнім файлом за шляхом `path`.


















<div class="highlight code-sample">
    <div class="copy-code-icon">
    <a href="https://raw.githubusercontent.com/kubernetes/website/main/content/uk/examples/pods/storage/projected-clustertrustbundle.yaml" download="pods/storage/projected-clustertrustbundle.yaml"><code>pods/storage/projected-clustertrustbundle.yaml</code>
    </a><img src="/images/copycode.svg" class="icon-copycode" onclick="copyCode('pods-storage-projected-clustertrustbundle-yaml')" title="Копіювати pods/storage/projected-clustertrustbundle.yaml до буферу обміну"></img></div>
    <div class="includecode" id="pods-storage-projected-clustertrustbundle-yaml"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">Pod</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">sa-ctb-name-test</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">containers</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">container-test</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">busybox</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">command</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;sleep&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;3600&#34;</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">volumeMounts</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">token-vol</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">mountPath</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;/root-certificates&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">readOnly</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">serviceAccountName</span><span class="p">:</span><span class="w"> </span><span class="l">default</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">token-vol</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">projected</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">sources</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">clusterTrustBundle</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">example</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">example-roots.pem</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">clusterTrustBundle</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">signerName</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;example.com/mysigner&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">labelSelector</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">matchLabels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="l">live</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">mysigner-roots.pem</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">optional</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span></code></pre></div></div>
</div>

## Спроєцьовані томи podCertificate {#podcertificate}








  <div class="feature-state-notice feature-beta" title="Функціональна можливість: PodCertificateRequest">
              <span class="feature-state-name">СТАН ФУНКЦІОНАЛУ:</span> 
              <code>Kubernetes v1.35 [beta]</code>(стандартно вимкнено)</div>



<div class="alert alert-info" role="note"><h4 class="alert-heading">Примітка:</h4>В Kubernetes 1.36, ви повинні увімкнути підтримку Pod Certificates, використовуючи <a href="/uk/docs/reference/command-line-tools-reference/feature-gates/">функціональну можливість</a> <code>PodCertificateRequest</code> та прапорець <code>--runtime-config=certificates.k8s.io/v1beta1/podcertificaterequests=true</code> kube-apiserver.</div>


Спроєцьовані томи `podCertificate` забезпечують безпечне надання приватного ключа та ланцюга сертифікатів X.509 для використання Podʼом як клієнтських, так і серверних облікових даних. Kubelet потім обробляє оновлення приватного ключа та ланцюга сертифікатів, коли вони наближаються до закінчення терміну дії. Застосунку просто потрібно переконатися, що він своєчасно перезавантажує файл, коли він змінюється, за допомогою механізму, такого як `inotify` або опитування.

Кожна проєкція `podCertificate` підтримує такі конфігураційні поля:

* `signerName`: [підписувач](/docs/reference/access-authn-authz/certificate-signing-requests#signers), який ви хочете використовувати для видачі сертифіката. Зверніть увагу, що підписувачі можуть мати свої власні вимоги до доступу і можуть відмовитися видавати сертифікати вашому Podʼу.
* `keyType`: Тип приватного ключа, який повинен бути згенерований. Дійсні значення: `ED25519`, `ECDSAP256`, `ECDSAP384`, `ECDSAP521`, `RSA3072` і `RSA4096`.
* `maxExpirationSeconds`: Максимальний термін дії, який ви приймете для сертифіката, виданого Podʼу. Якщо не вказано, стандартно це буде `86400` (24 години). Повинен бути не менше `3600` (1 година) і не більше `7862400` (91 день). Вбудовані підписувачі Kubernetes обмежені максимальним терміном дії `86400` (1 день). Підписувач має право видати сертифікат з терміном дії, коротшим за вказаний вами.
* `credentialBundlePath`: Відносний шлях у межах проєкції, куди має бути записаний пакет облікових даних. Пакет облікових даних — це файл у форматі PEM, де перший блок — це блок "PRIVATE KEY", що містить приватний ключ у форматі PKCS#8, а решта блоків — це блоки "CERTIFICATE", які складають ланцюг сертифікатів (сертифікат листа та будь-які проміжні сертифікати).
* `keyPath` і `certificateChainPath`: Окремі шляхи, куди Kubelet має записати _тільки_ приватний ключ або ланцюг сертифікатів.
* `userAnnotations`: мапа, яка дозволяє передавати додаткову інформацію до реалізації підписувача. Вона копіюється дослівно в поле `spec.unverifiedUserAnnotations` обʼєктів [PodCertificateRequest](/docs/reference/access-authn-authz/certificate-signing-requests#pod-certificate-requests), яке створює Kubelet. Записи підлягають тій самій перевірці, що й анотації метаданих обʼєкта, з тим доповненням, що всі ключі повинні мати префікс домену. На значення не накладаються жодні обмеження, крім загального обмеження розміру всього поля. Окрім цих базових перевірок, сервер API не проводить жодних додаткових перевірок. Реалізації підписувача повинні бути дуже обережними при використанні цих даних. Підписувачі не повинні довіряти цим даним без попереднього виконання відповідних кроків перевірки. Підписувачі повинні документувати ключі та значення, які вони підтримують. Підписувачі повинні відхиляти запити, що містять ключі, які вони не розпізнають.


<div class="alert alert-info" role="note"><h4 class="alert-heading">Примітка:</h4>Більшість застосунків повинні віддавати перевагу використанню <code>credentialBundlePath</code>, якщо їм не потрібні ключ і сертифікати в окремих файлах з причин сумісності. Kubelet використовує атомарну стратегію запису на основі символічних посилань, щоб переконатися, що коли ви відкриваєте файли, для яких він виконує проєкцію, ви читаєте або старий вміст, або новий вміст. Однак, якщо ви читаєте ключ і ланцюг сертифікатів з окремих файлів, Kubelet може обернути облікові дані після вашого першого читання і до вашого другого читання, в результаті чого ваш застосунок завантажить невідповідний ключ і сертифікат.</div>



















<div class="highlight code-sample">
    <div class="copy-code-icon">
    <a href="https://raw.githubusercontent.com/kubernetes/website/main/content/uk/examples/pods/storage/projected-podcertificate.yaml" download="pods/storage/projected-podcertificate.yaml"><code>pods/storage/projected-podcertificate.yaml</code>
    </a><img src="/images/copycode.svg" class="icon-copycode" onclick="copyCode('pods-storage-projected-podcertificate-yaml')" title="Копіювати pods/storage/projected-podcertificate.yaml до буферу обміну"></img></div>
    <div class="includecode" id="pods-storage-projected-podcertificate-yaml"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Приклад специфікації Pod, яка використовує проекцію podCertificate для запиту приватного ключа ED25519,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># сертифіката від підписувача `coolcert.example.com/foo` та</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># запису результатів у `/var/run/my-x509-credentials/credentialbundle.pem`.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">Pod</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">namespace</span><span class="p">:</span><span class="w"> </span><span class="l">default</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">podcertificate-pod</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">serviceAccountName</span><span class="p">:</span><span class="w"> </span><span class="l">default</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">containers</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">debian</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">main</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">command</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;sleep&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;infinity&#34;</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">volumeMounts</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">my-x509-credentials</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">mountPath</span><span class="p">:</span><span class="w"> </span><span class="l">/var/run/my-x509-credentials</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">my-x509-credentials</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">projected</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">defaultMode</span><span class="p">:</span><span class="w"> </span><span class="m">0644</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">sources</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">podCertificate</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">keyType</span><span class="p">:</span><span class="w"> </span><span class="l">ED25519</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">signerName</span><span class="p">:</span><span class="w"> </span><span class="l">coolcert.example.com/foo</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">credentialBundlePath</span><span class="p">:</span><span class="w"> </span><span class="l">credentialbundle.pem</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">userAnnotations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">example.com/annotation1</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;value1&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">example.com/annotation2</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;value2&#34;</span><span class="w">
</span></span></span></code></pre></div></div>
</div>

## Взаємодія SecurityContext {#securitycontext-interactions}

[Пропозиція](https://git.k8s.io/enhancements/keps/sig-storage/2451-service-account-token-volumes#proposal) щодо обробки дозволів файлів у розширенні projected service account volume представляє, що projected файли мають відповідні набори дозволів власника.

### Linux

У Podʼах Linux, які мають projected том та `RunAsUser` вказано у [`SecurityContext`](/docs/reference/kubernetes-api/workload-resources/pod-v1/#security-context), projected файли мають правильно встановлені права власності, включаючи власника контейнера.

Коли у всіх контейнерах в Podʼі встановлено одне й те ж `runAsUser` у їх
[`PodSecurityContext`](/docs/reference/kubernetes-api/workload-resources/pod-v1/#security-context) або [`SecurityContext`](/docs/reference/kubernetes-api/workload-resources/pod-v1/#security-context-1), то kubelet гарантує, що вміст тому `serviceAccountToken` належить цьому користувачеві, а файл токена має режим дозволів, встановлений в `0600`.


<div class="alert alert-info" role="note"><h4 class="alert-heading">Примітка:</h4><p><a class='glossary-tooltip' title='Тип контейнера, який можна тимчасово запустити всередині Podʼа.' data-bs-toggle='tooltip' data-bs-placement='top' href='/uk/docs/concepts/workloads/pods/ephemeral-containers/' target='_blank' aria-label='ефемерні контейнери'>ефемерні контейнери</a> додані до Podʼа після його створення <em>не</em> змінюють прав доступу до тому, які були встановлені при створенні Podʼа.</p>
<p>Якщо права доступу до тому <code>serviceAccountToken</code> Podʼа були встановлені на <code>0600</code>, тому що всі інші контейнери в Podʼі мають одне і те ж <code>runAsUser</code>, ефемерні контейнери повинні використовувати той самий <code>runAsUser</code>, щоб мати змогу читати токен.</p>
</div>


### Windows

У Windows Podʼах, які мають projected том та `RunAsUsername` вказано в `SecurityContext` Podʼа, права власності не забезпечуються через спосіб управління користувачами у Windows. Windows зберігає та управляє локальними обліковими записами користувачів і груп у файлі бази даних, який називається Security Account Manager (SAM). Кожен контейнер підтримує свій власний екземпляр бази даних SAM, до якого хост не має доступу під час роботи контейнера. Контейнери Windows призначені для запуску режиму користувача операційної системи в ізоляції від хосту, тому не зберігають динамічну конфігурацію власності файлів хосту для облікових записів віртуалізованих контейнерів. Рекомендується розміщувати файли, які слід спільно використовувати з контейнером на машині-хості, в окремому змісті поза `C:\`.

Типово у projected файлах буде встановлено наступні права, як показано для прикладу projected файлу тома:

```powershell
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`, матимуть доступ на читання, запис та виконання, тоді як не-адміністратори матимуть доступ на читання та
виконання.


<div class="alert alert-info" role="note"><h4 class="alert-heading">Примітка:</h4><p>Загалом не рекомендується надавати контейнеру доступ до хосту, оскільки це може відкрити можливості для потенційних використань дірок безпеки.</p>
<p>Створення Windows Podʼа з <code>RunAsUser</code> в його <code>SecurityContext</code> призведе до того, що Pod буде застрягати на стадії <code>ContainerCreating</code> назавжди. Таким чином, рекомендується не використовувати опцію <code>RunAsUser</code>, яка призначена лише для Linux, з Windows Podʼами.</p>
</div>
