Kubernetes.PodPresets - теория. часть10

Thank you for reading this post, don't forget to subscribe!

В этой ста­тье рас­смот­рим исполь­зо­ва­ние PodPresets - объ­ек­тов, с помо­щью кото­рых мож­но добав­лять опре­де­лен­ную инфор­ма­цию в поды во вре­мя их созда­ния. Инфор­ма­ция может вклю­чать в себя сек­ре­ты, тома и пере­мен­ные окру­же­ния. Давай­те разберемся!

Для ука­за­ния подов (Pods), к кото­рым дол­жен при­ме­нять­ся API ресурс PodPresets исполь­зу­ют­ся селек­то­ры меток. Исполь­зо­ва­ние PodPresets поз­во­ля­ет зна­чи­тель­но сокра­тить раз­ме­ры мани­фе­стов и изба­вить­ся от копипасты.

В Kubernetes суще­ству­ет кон­трол­лер (admission controller) PodPreset, кото­рый, если вклю­чен, при­ме­ня­ет PodPresets к запро­сам на созда­ние подов. При этом выпол­ня­ют­ся сле­ду­ю­щие действия:

  • про­ве­ря­ют­ся все доступ­ные PodPresets;
  • про­ве­ря­ет­ся соот­вет­ствие селек­то­ров меток любо­го PodPreset мет­кам созда­ва­е­мо­го контейнера;
  • дела­ет­ся попыт­ка доба­вить инфор­ма­цию (настрой­ки), опре­де­лен­ную в PodPreset, в созда­ва­е­мый под;
  • при ошиб­ке добав­ле­ния инфор­ма­ции из PodPreset под созда­ет­ся без каких-либо вло­жен­ных ресур­сов из PodPreset и запи­сы­ва­ет­ся сооб­ще­ние об ошибке;
  • при успеш­ном добав­ле­нии инфор­ма­ции из PodPreset в опи­са­ние пода так­же добав­ля­ет­ся анно­та­ция (что­бы пони­мать, что под моди­фи­ци­ро­ван с помо­щью PodPreset). Анно­та­ции выгля­дят так podpreset.admission.kubernetes.io/podpreset-<pod-preset name>: "<resource version>".

Каж­до­му поду (Pod) мож­но сопо­ста­вить ноль или более PodPreset; каж­дый PodPreset может быть при­ме­нен к нулю или несколь­ким подам. При добав­ле­нии из PodPreset дан­ных, содер­жа­щих­ся в EnvEnvFrom и VolumeMounts изме­ня­ет­ся спе­ци­фи­ка­ция КАЖДОГО кон­тей­не­ра в поде; при добав­ле­нии дан­ных, содер­жа­щих­ся в Volume, меня­ет­ся спе­ци­фи­ка­ция пода.

Для исполь­зо­ва­ния PodPreset необходимо:

  • вклю­чить API settings.k8s.io/v1alpha1/podpreset. Напри­мер, добав­ле­ни­ем пара­мет­ра settings.k8s.io/v1alpha1=true к опции --runtime-config API-сервера;
  • вклю­чить кон­трол­лер PodPreset, напри­мер доба­вив зна­че­ние PodPreset в пара­метр --enable-admission-plugins API-сервера;
  • создать объ­ект PodPreset в соот­вет­ству­ю­щем неймспейсе.

Рас­смот­рим кон­крет­ный при­мер. Созда­дим файл preset.yaml сле­ду­ю­ще­го содержимого:

Созда­дим дан­ный объ­ект в кла­сте­ре Kubernetes:

Про­ве­рим нали­чие объекта:

Теперь при созда­нии подов с мет­кой role: frontend к ним будет добав­лять­ся инфор­ма­ция из дан­но­го PodPreset. Про­ве­рим дан­ное утвер­жде­ние - созда­ем файл pod.yaml с таким содержимым:

Созда­ем под:

Убе­дим­ся, что под создан и запущен:

Полу­чим подроб­ное опи­са­ние пода с помо­щью команды:

Как и ожи­да­лось, к поду была добав­ле­на инфор­ма­ция из PodPreset.

Более слож­ный при­мер (с исполь­зо­ва­ни­ем ConfigMap). Опи­са­ние пода выгля­дит сле­ду­ю­щим образом:

Опи­са­ние кон­фиг­ма­па (ConfigMap) выгля­дит так:

Содер­жи­мое фай­ла с опи­са­ни­ем PodPreset будет теперь таким:

После созда­ния пода и добав­ле­ния к его спе­ци­фи­ка­ции инфор­ма­ции с PodPreset он будет выгля­деть так:

Чуть боль­ше инфор­ма­ции об исполь­зо­ва­нии PodPreset мож­но най­ти тут.