kubernetes. namespaces — теория. часть5

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

Kubernetes под­дер­жи­ва­ет несколь­ко вир­ту­аль­ных кла­сте­ров, рабо­та­ю­щих в одном и том же физи­че­ском кла­сте­ре. Эти вир­ту­аль­ные кла­сте­ры назы­ва­ют­ся про­стран­ства­ми имен или нейм­с­пей­са­ми (namespaces)..

Нейм­с­пей­сы пред­на­зна­че­ны для исполь­зо­ва­ния в окру­же­ни­ях с мно­же­ством поль­зо­ва­те­лей, рас­пре­де­лен­ных меж­ду несколь­ки­ми коман­да­ми или про­ек­та­ми. Для кла­сте­ров Kubernetes с неболь­шим коли­че­ством поль­зо­ва­те­лей (несколь­ко десят­ков) созда­вать несколь­ко раз­ных нейм­с­пей­сов не име­ет смыс­ла. Нейм­с­пей­сы сто­ит начи­нать исполь­зо­вать в тот момент, когда пона­до­бит­ся функ­ци­о­нал, кото­рый они предоставляют.

Нейм­с­пей­сы, как мож­но дога­дать­ся с назва­ния, предо­став­ля­ют набор (или область) имен для ресур­сов. Име­на ресур­сов долж­ны быть уни­каль­ны­ми в пре­де­лах одно­го нейм­с­пей­са, но не в пре­де­лах все­го кла­сте­ра. Кро­ме того, нейм­с­пей­сы - это спо­соб раз­де­лить ресур­сы кла­сте­ра меж­ду поль­зо­ва­те­ля­ми (с исполь­зо­ва­ни­ем квот).

ПРИМЕЧАНИЕ: нет необ­хо­ди­мо­сти исполь­зо­вать раз­ные нейм­с­пей­сы для раз­де­ле­ния несколь­ких раз­ных ресур­сов, напри­мер, раз­ных вер­сий одно­го и того же ПО - здесь луч­ше вос­поль­зо­вать­ся мет­ка­ми и селек­то­ра­ми (для выде­ле­ния ресур­сов) в одном и том же про­стран­стве имен.

По умол­ча­нию в кла­сте­ре Kubernetes будет создан нейм­с­пейс default, в кото­ром и будут раз­ме­щать­ся запус­ка­е­мые объ­ек­ты (поды, сер­ви­сы, раз­вер­ты­ва­ния и т.д.). Нейм­с­пей­сы kube-public и kube-system исполь­зу­ют­ся для запус­ка слу­жеб­ных объ­ек­тов Kubernetes, необ­хо­ди­мых для кор­рект­ной рабо­ты кластера.

Посмот­реть спи­сок нейм­с­пей­сов в вашем кла­сте­ре мож­но с помо­щью такой команды:

Что­бы создать отдель­ный нейм­с­пейс, созда­дим файл namespace-dev.json (да, для раз­но­об­ра­зия исполь­зу­ем .json, а не .yaml) сле­ду­ю­ще­го содержания:

и выпол­ним команду:

Для вто­ро­го нейм­с­пей­са созда­дим файл с тем же содер­жи­мым, но заме­ним сло­ва “development” на “production” и при­ме­ним его:

Убе­дим­ся, что нейм­с­пей­сы успеш­но создались:

Далее, для удоб­ства, для каж­до­го из создан­ных нейм­с­пей­сов сде­ла­ем отдель­ный кон­текст. Для нача­ла, посмот­рим теку­щие настройки:

Созда­ем два отдель­ных кон­тек­ста (они будут отли­чать­ся нейм­с­пей­са­ми, а зна­че­ния полей cluster и user будут ско­пи­ро­ва­ны с теку­ще­го контекста):

После выпол­не­ния этих двух команд к кон­фи­гу­ра­ци­он­ном фай­ле ~/.kube/config будут созда­ны допол­ни­тель­ные кон­тек­сты. Теперь мож­но с лег­ко­стью пере­клю­чать­ся меж­ду ними исполь­зуя команды:

и

Кро­ме того, выпол­нять коман­ды с кон­крет­ным нейм­с­пей­сом мож­но даже не пере­клю­чая кон­текст - доста­точ­но исполь­зо­вать допол­ни­тель­ный пара­метр --namespace=, напри­мер:

или

Напо­сле­док сто­ит ска­зать, что при созда­нии сер­ви­са (service) в кла­сте­ре Kubernetes созда­ет­ся соот­вет­ству­ю­щая DNS-запись. Запись созда­ет­ся в фор­ма­те <service-name>.<namespace-name>.svc.cluster.local, а это озна­ча­ет, что если вы исполь­зу­е­те толь­ко часть <service-name> то это поз­во­лит “досту­чать­ся” до сер­ви­са толь­ко в пре­де­лах нейм­с­пей­са. Если вам необ­хо­ди­мо вза­и­мо­дей­ство­вать с сер­ви­сом, запу­щен­ным в дру­гом нейм­с­пей­се, сле­ду­ет исполь­зо­вать пол­ное домен­ное имя (FQDN).