kubernetes. ReplicaSet - теория. часть2

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

ReplicaSet гаран­ти­ру­ет, что опре­де­лен­ное коли­че­ство экзем­пля­ров подов (Pods) будет запу­ще­но в кла­сте­ре Kubernetes в любой момент вре­ме­ни. Давай­те разберемся!

Сра­зу сто­ит ска­зать, что деп­лой­мент (Deployment), кото­рый мы рас­смот­рим в сле­ду­ю­щей ста­тье, пред­став­ля­ет собой абстрак­цию более высо­ко­го уров­ня, кото­рая управ­ля­ет ReplicaSets и предо­став­ля­ет рас­ши­рен­ный функ­ци­о­нал управ­ле­ния кон­тей­не­ра­ми. Раз­ра­бот­чи­ки Kubernetesсове­ту­ют исполь­зо­вать имен­но Deployments, если не нуж­на спе­ци­фи­че­ская настрой­ка оркест­ра­ции (или если вооб­ще не тре­бу­ет­ся обнов­ле­ние подов). При исполь­зо­ва­нии Deployments, вам не нуж­но бес­по­ко­ить­ся об управ­ле­нии созда­ва­е­мы­ми ReplicaSets - деп­лой­мент все сде­ла­ет за вас.

Фак­ти­че­ски это зна­чит, что вам (воз­мож­но) и не при­дет­ся мани­пу­ли­ро­вать объ­ек­та­ми ReplicaSet: доста­точ­но будет деп­лой­мен­та с опи­са­ни­ем свойств при­ло­же­ния в раз­де­ле spec.

ReplicaSet - это сле­ду­ю­щее поко­ле­ние Replication Controller. Един­ствен­ная раз­ни­ца меж­ду ReplicaSet и Replication Controller - это под­держ­ка селек­то­ра. ReplicaSet под­дер­жи­ва­ет мно­же­ствен­ный выбор в селек­то­ре, тогда как Replication Controller под­дер­жи­ва­ет в селек­то­ре толь­ко выбор на осно­ве равенства.

Как и для всех дру­гих API-объ­ек­тов Kubernetes, для опре­де­ле­ния ReplicaSet в yaml-фай­ле нуж­ны поля apiVersionkind и metadata. Кро­ме того, в ReplicaSet так­же долж­на при­сут­ство­вать сек­ция .spec.

Далее, в сек­ции .spec обя­за­тель­но долж­на при­сут­ство­вать вло­жен­ная сек­ция .spec.template - шаб­лон пода (Pod). Он име­ет точ­но такой же фор­мат, как опи­са­ние пода (Pod) без сек­ций apiVersion и kind. Кро­ме обя­за­тель­ных полей, в сек­ции .spec.template при опи­са­нии ReplicaSetнуж­но ука­зы­вать соот­вет­ству­ю­щие мет­ки (.spec.template.metadata.labels) и поли­ти­ку пере­за­пус­ка (един­ствен­ным допу­сти­мым зна­че­ни­ем для .spec.template.spec.restartPolicy явля­ет­ся Always, кото­рое соот­вет­ству­ет зна­че­нию по умолчанию).

Сек­ция .spec.selector опи­сы­ва­ет селек­тор меток. ReplicaSet управ­ля­ет все­ми пода­ми (Pods) с мет­ка­ми, кото­рые соот­вет­ству­ют опи­сан­но­му селек­то­ру - неваж­но, созда­ва­лись ли эти поды самим ReplicaSet, дру­гим про­цес­сом (напри­мер, деп­лой­мен­том) или адми­ни­стра­то­ром вруч­ную. Такой под­ход поз­во­ля­ет изме­нять ReplicaSet, не затра­ги­вая запу­щен­ные поды в кластере.

При опи­са­нии ReplicaSet сто­ит ука­зать, сколь­ко экзем­пля­ров подов долж­но рабо­тать одно­вре­мен­но (а ина­че какой смысл в исполь­зо­ва­нии ReplicaSet), уста­но­вив пара­метр .spec.replicas. Если это­го не сде­лать, то будет запу­щен толь­ко один экзем­пляр пода -.spec.replicas по умол­ча­нию рав­но еди­ни­це.

ReplicaSet может сам иметь мет­ки - они долж­ны быть уста­нов­ле­ны в раз­де­ле .metadata.labels. Как пра­ви­ло, их нуж­но уста­нав­ли­вать по ана­ло­гии с уста­нов­кой меток в сек­ции .spec.template.metadata.labels, но сами мет­ки могут быть раз­ны­ми, пото­му что .metadata.labels не вли­я­ют на пове­де­ние ReplicaSet.

При­мер опи­са­ния ReplicaSet:

Пред­ло­жен­ный мани­фест мож­но сохра­нить в файл frontend.yaml и запу­стить в кла­сте­ре Kubernetes с помо­щью ути­ли­ты команд­ной строки:

Про­смот­реть деталь­ное состо­я­ние запу­щен­но­го выше ReplicaSet мож­но с помо­щью коман­ды kubectl describe rs/frontend, резуль­тат выпол­не­ния коман­ды будет при­мер­но следующим:

Для уда­ле­ния ReplicaSet и всех его подов, нуж­но исполь­зо­вать коман­ду kubectl delete .... При этом ути­ли­та kubectl выпол­нит мас­шта­би­ро­ва­ние коли­че­ства реплик до нуля, дождет­ся уда­ле­ния каж­до­го пода и уда­лит сам ReplicaSet. При исполь­зо­ва­нии REST API все три шага нуж­но выпол­нять отдель­но и в пра­виль­ной очередности.

Есть воз­мож­ность уда­лить ReplicaSet, не затра­ги­вая ни один из его подов, для это­го сле­ду­ет исполь­зо­вать kubectl delete с допол­ни­тель­ным пара­мет­ром --cascade=false.

Поды (Pods) могут быть уда­ле­ны из набо­ра ReplicaSet путем изме­не­ния их меток - этот вари­ант может при­го­дить­ся при отлад­ке, вос­ста­нов­ле­нии дан­ных и т. д. Поды, кото­рые уда­ля­ют­ся таким обра­зом, будут авто­ма­ти­че­ски заме­не­ны (при усло­вии, что коли­че­ство реплик в набо­ре ReplicaSet так­же не изменяется).

ReplicaSet мож­но лег­ко мас­шта­би­ро­вать (вверх или вниз), про­сто меняя зна­че­ние поля .spec.replicas.

Сто­ит отме­тить, что набо­ры ReplicaSet могут исполь­зо­вать­ся для гори­зон­таль­но­го мас­шта­би­ро­ва­ния подов (автос­кей­лин­га, HPA). При­мер настрой­ки тако­го мас­шта­би­ро­ва­ния (в зави­си­мо­сти от исполь­зо­ва­ния CPU) для создан­но­го ранее ReplicaSet будет выгля­деть так:

Сохра­ня­ем пред­ло­жен­ный мани­фест в файл hpa-rs.yaml и запус­ка­ем его в кла­сте­ре Kubernetes:

Аль­тер­на­ти­вы исполь­зо­ва­ния ReplicaSet:

  • Deployment (реко­мен­ду­е­мый);
  • Job (для подов, кото­рые долж­ны “завер­шать­ся” само­сто­я­тель­но после выпол­не­ния опре­де­лен­ной задачи);
  • DaemonSet (для запус­ка подов на каж­дой ноде кластера)..