<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://noname.com.ua/mediawiki/index.php?action=history&amp;feed=atom&amp;title=K8s_Q_A_PodPresets</id>
	<title>K8s Q A PodPresets - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://noname.com.ua/mediawiki/index.php?action=history&amp;feed=atom&amp;title=K8s_Q_A_PodPresets"/>
	<link rel="alternate" type="text/html" href="https://noname.com.ua/mediawiki/index.php?title=K8s_Q_A_PodPresets&amp;action=history"/>
	<updated>2026-04-04T08:44:59Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.36.1</generator>
	<entry>
		<id>https://noname.com.ua/mediawiki/index.php?title=K8s_Q_A_PodPresets&amp;diff=12429&amp;oldid=prev</id>
		<title>Sirmax в 11:07, 9 января 2024</title>
		<link rel="alternate" type="text/html" href="https://noname.com.ua/mediawiki/index.php?title=K8s_Q_A_PodPresets&amp;diff=12429&amp;oldid=prev"/>
		<updated>2024-01-09T11:07:59Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://noname.com.ua/mediawiki/index.php?title=K8s_Q_A_PodPresets&amp;amp;diff=12429&amp;amp;oldid=12413&quot;&gt;Внесённые изменения&lt;/a&gt;</summary>
		<author><name>Sirmax</name></author>
	</entry>
	<entry>
		<id>https://noname.com.ua/mediawiki/index.php?title=K8s_Q_A_PodPresets&amp;diff=12413&amp;oldid=prev</id>
		<title>Sirmax: Новая страница: «Категория:K8s Категория:K8s_Вопросы_И_Ответы Категория:Требуется форматирование текс...»</title>
		<link rel="alternate" type="text/html" href="https://noname.com.ua/mediawiki/index.php?title=K8s_Q_A_PodPresets&amp;diff=12413&amp;oldid=prev"/>
		<updated>2024-01-09T08:26:56Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «&lt;a href=&quot;/mediawiki/index.php/%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:K8s&quot; title=&quot;Категория:K8s&quot;&gt;Категория:K8s&lt;/a&gt; &lt;a href=&quot;/mediawiki/index.php/%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:K8s_%D0%92%D0%BE%D0%BF%D1%80%D0%BE%D1%81%D1%8B_%D0%98_%D0%9E%D1%82%D0%B2%D0%B5%D1%82%D1%8B&quot; title=&quot;Категория:K8s Вопросы И Ответы&quot;&gt;Категория:K8s_Вопросы_И_Ответы&lt;/a&gt; Категория:Требуется форматирование текс...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Категория:K8s]]&lt;br /&gt;
[[Категория:K8s_Вопросы_И_Ответы]]&lt;br /&gt;
[[Категория:Требуется форматирование текста]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Знакомство с Kubernetes. Часть 18: PodPresets&lt;br /&gt;
&lt;br /&gt;
Oct 1, 2018 06:01 · 654 words · 4 minute read&lt;br /&gt;
KUBERNETES&lt;br /&gt;
В этой статье рассмотрим использование PodPresets - объектов, с помощью которых можно добавлять определенную информацию в поды во время их создания. Информация может включать в себя секреты, тома и переменные окружения. Давайте разберемся!&lt;br /&gt;
&lt;br /&gt;
Для указания подов (Pods), к которым должен применяться API ресурс PodPresets используются селекторы меток. Использование PodPresets позволяет значительно сократить размеры манифестов и избавиться от копипасты.&lt;br /&gt;
&lt;br /&gt;
В Kubernetes существует контроллер (admission controller) PodPreset, который, если включен, применяет PodPresets к запросам на создание подов. При этом выполняются следующие действия:&lt;br /&gt;
&lt;br /&gt;
проверяются все доступные PodPresets;&lt;br /&gt;
проверяется соответствие селекторов меток любого PodPreset меткам создаваемого контейнера;&lt;br /&gt;
делается попытка добавить информацию (настройки), определенную в PodPreset, в создаваемый под;&lt;br /&gt;
при ошибке добавления информации из PodPreset под создается без каких-либо вложенных ресурсов из PodPreset и записывается сообщение об ошибке;&lt;br /&gt;
при успешном добавлении информации из PodPreset в описание пода также добавляется аннотация (чтобы понимать, что под модифицирован с помощью PodPreset). Аннотации выглядят так podpreset.admission.kubernetes.io/podpreset-&amp;lt;pod-preset name&amp;gt;: &amp;quot;&amp;lt;resource version&amp;gt;&amp;quot;.&lt;br /&gt;
Каждому поду (Pod) можно сопоставить ноль или более PodPreset; каждый PodPreset может быть применен к нулю или нескольким подам. При добавлении из PodPreset данных, содержащихся в Env, EnvFrom и VolumeMounts изменяется спецификация КАЖДОГО контейнера в поде; при добавлении данных, содержащихся в Volume, меняется спецификация пода.&lt;br /&gt;
&lt;br /&gt;
Для использования PodPreset необходимо:&lt;br /&gt;
&lt;br /&gt;
включить API settings.k8s.io/v1alpha1/podpreset. Например, добавлением параметра settings.k8s.io/v1alpha1=true к опции --runtime-config API-сервера;&lt;br /&gt;
включить контроллер PodPreset, например добавив значение PodPreset в параметр --enable-admission-plugins API-сервера;&lt;br /&gt;
создать объект PodPreset в соответствующем неймспейсе.&lt;br /&gt;
Рассмотрим конкретный пример. Создадим файл preset.yaml следующего содержимого:&lt;br /&gt;
&lt;br /&gt;
apiVersion: settings.k8s.io/v1alpha1&lt;br /&gt;
kind: PodPreset&lt;br /&gt;
metadata:&lt;br /&gt;
  name: allow-database&lt;br /&gt;
spec:&lt;br /&gt;
  selector:&lt;br /&gt;
    matchLabels:&lt;br /&gt;
      role: frontend&lt;br /&gt;
  env:&lt;br /&gt;
    - name: DB_PORT&lt;br /&gt;
      value: &amp;quot;6379&amp;quot;&lt;br /&gt;
  volumeMounts:&lt;br /&gt;
    - mountPath: /cache&lt;br /&gt;
      name: cache-volume&lt;br /&gt;
  volumes:&lt;br /&gt;
    - name: cache-volume&lt;br /&gt;
      emptyDir: {}&lt;br /&gt;
Создадим данный объект в кластере Kubernetes:&lt;br /&gt;
&lt;br /&gt;
kubectl create -f preset.yaml&lt;br /&gt;
Проверим наличие объекта:&lt;br /&gt;
&lt;br /&gt;
kubectl get podpreset&lt;br /&gt;
NAME             AGE&lt;br /&gt;
allow-database   1m&lt;br /&gt;
Теперь при создании подов с меткой role: frontend к ним будет добавляться информация из данного PodPreset. Проверим данное утверждение - создаем файл pod.yaml с таким содержимым:&lt;br /&gt;
&lt;br /&gt;
apiVersion: v1&lt;br /&gt;
kind: Pod&lt;br /&gt;
metadata:&lt;br /&gt;
  name: website&lt;br /&gt;
  labels:&lt;br /&gt;
    app: website&lt;br /&gt;
    role: frontend&lt;br /&gt;
spec:&lt;br /&gt;
  containers:&lt;br /&gt;
    - name: website&lt;br /&gt;
      image: nginx&lt;br /&gt;
      ports:&lt;br /&gt;
        - containerPort: 80&lt;br /&gt;
Создаем под:&lt;br /&gt;
&lt;br /&gt;
kubectl create -f pod.yaml&lt;br /&gt;
Убедимся, что под создан и запущен:&lt;br /&gt;
&lt;br /&gt;
kubectl get pods&lt;br /&gt;
NAME      READY     STATUS    RESTARTS   AGE&lt;br /&gt;
website   1/1       Running   0          4m&lt;br /&gt;
Получим подробное описание пода с помощью команды:&lt;br /&gt;
&lt;br /&gt;
kubectl get pod website -o yaml&lt;br /&gt;
&lt;br /&gt;
apiVersion: v1&lt;br /&gt;
kind: Pod&lt;br /&gt;
metadata:&lt;br /&gt;
  name: website&lt;br /&gt;
  labels:&lt;br /&gt;
    app: website&lt;br /&gt;
    role: frontend&lt;br /&gt;
  annotations:&lt;br /&gt;
    podpreset.admission.kubernetes.io/podpreset-allow-database: &amp;quot;resource version&amp;quot;&lt;br /&gt;
spec:&lt;br /&gt;
  containers:&lt;br /&gt;
    - name: website&lt;br /&gt;
      image: nginx&lt;br /&gt;
      volumeMounts:&lt;br /&gt;
        - mountPath: /cache&lt;br /&gt;
          name: cache-volume&lt;br /&gt;
      ports:&lt;br /&gt;
        - containerPort: 80&lt;br /&gt;
      env:&lt;br /&gt;
        - name: DB_PORT&lt;br /&gt;
          value: &amp;quot;6379&amp;quot;&lt;br /&gt;
  volumes:&lt;br /&gt;
    - name: cache-volume&lt;br /&gt;
      emptyDir: {}&lt;br /&gt;
Как и ожидалось, к поду была добавлена информация из PodPreset.&lt;br /&gt;
&lt;br /&gt;
Более сложный пример (с использованием ConfigMap). Описание пода выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
apiVersion: v1&lt;br /&gt;
kind: Pod&lt;br /&gt;
metadata:&lt;br /&gt;
  name: website&lt;br /&gt;
  labels:&lt;br /&gt;
    app: website&lt;br /&gt;
    role: frontend&lt;br /&gt;
spec:&lt;br /&gt;
  containers:&lt;br /&gt;
    - name: website&lt;br /&gt;
      image: nginx&lt;br /&gt;
      ports:&lt;br /&gt;
        - containerPort: 80&lt;br /&gt;
Описание конфигмапа (ConfigMap) выглядит так:&lt;br /&gt;
&lt;br /&gt;
apiVersion: v1&lt;br /&gt;
kind: ConfigMap&lt;br /&gt;
metadata:&lt;br /&gt;
  name: etcd-env-config&lt;br /&gt;
data:&lt;br /&gt;
  number_of_members: &amp;quot;1&amp;quot;&lt;br /&gt;
  initial_cluster_state: new&lt;br /&gt;
  initial_cluster_token: DUMMY_ETCD_INITIAL_CLUSTER_TOKEN&lt;br /&gt;
  discovery_token: DUMMY_ETCD_DISCOVERY_TOKEN&lt;br /&gt;
  discovery_url: http://etcd_discovery:2379&lt;br /&gt;
  etcdctl_peers: http://etcd:2379&lt;br /&gt;
  duplicate_key: FROM_CONFIG_MAP&lt;br /&gt;
  REPLACE_ME: &amp;quot;a value&amp;quot;&lt;br /&gt;
Содержимое файла с описанием PodPreset будет теперь таким:&lt;br /&gt;
&lt;br /&gt;
apiVersion: settings.k8s.io/v1alpha1&lt;br /&gt;
kind: PodPreset&lt;br /&gt;
metadata:&lt;br /&gt;
  name: allow-database&lt;br /&gt;
spec:&lt;br /&gt;
  selector:&lt;br /&gt;
    matchLabels:&lt;br /&gt;
      role: frontend&lt;br /&gt;
  env:&lt;br /&gt;
    - name: DB_PORT&lt;br /&gt;
      value: &amp;quot;6379&amp;quot;&lt;br /&gt;
    - name: duplicate_key&lt;br /&gt;
      value: FROM_ENV&lt;br /&gt;
    - name: expansion&lt;br /&gt;
      value: $(REPLACE_ME)&lt;br /&gt;
  envFrom:&lt;br /&gt;
    - configMapRef:&lt;br /&gt;
        name: etcd-env-config&lt;br /&gt;
  volumeMounts:&lt;br /&gt;
    - mountPath: /cache&lt;br /&gt;
      name: cache-volume&lt;br /&gt;
    - mountPath: /etc/app/config.json&lt;br /&gt;
      readOnly: true&lt;br /&gt;
      name: secret-volume&lt;br /&gt;
  volumes:&lt;br /&gt;
    - name: cache-volume&lt;br /&gt;
      emptyDir: {}&lt;br /&gt;
    - name: secret-volume&lt;br /&gt;
      secret:&lt;br /&gt;
         secretName: config-details&lt;br /&gt;
После создания пода и добавления к его спецификации информации с PodPreset он будет выглядеть так:&lt;br /&gt;
&lt;br /&gt;
apiVersion: v1&lt;br /&gt;
kind: Pod&lt;br /&gt;
metadata:&lt;br /&gt;
  name: website&lt;br /&gt;
  labels:&lt;br /&gt;
    app: website&lt;br /&gt;
    role: frontend&lt;br /&gt;
  annotations:&lt;br /&gt;
    podpreset.admission.kubernetes.io/podpreset-allow-database: &amp;quot;resource version&amp;quot;&lt;br /&gt;
spec:&lt;br /&gt;
  containers:&lt;br /&gt;
    - name: website&lt;br /&gt;
      image: nginx&lt;br /&gt;
      volumeMounts:&lt;br /&gt;
        - mountPath: /cache&lt;br /&gt;
          name: cache-volume&lt;br /&gt;
        - mountPath: /etc/app/config.json&lt;br /&gt;
          readOnly: true&lt;br /&gt;
          name: secret-volume&lt;br /&gt;
      ports:&lt;br /&gt;
        - containerPort: 80&lt;br /&gt;
      env:&lt;br /&gt;
        - name: DB_PORT&lt;br /&gt;
          value: &amp;quot;6379&amp;quot;&lt;br /&gt;
        - name: duplicate_key&lt;br /&gt;
          value: FROM_ENV&lt;br /&gt;
        - name: expansion&lt;br /&gt;
          value: $(REPLACE_ME)&lt;br /&gt;
      envFrom:&lt;br /&gt;
        - configMapRef:&lt;br /&gt;
            name: etcd-env-config&lt;br /&gt;
  volumes:&lt;br /&gt;
    - name: cache-volume&lt;br /&gt;
      emptyDir: {}&lt;br /&gt;
    - name: secret-volume&lt;br /&gt;
      secret:&lt;br /&gt;
         secretName: config-details&lt;br /&gt;
Чуть больше информации об использовании PodPreset можно найти тут.&lt;/div&gt;</summary>
		<author><name>Sirmax</name></author>
	</entry>
</feed>