Kubernetes. описание Endpoints

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

Итак, Service — это абстрак­ция Kubernetes, кото­рая, исполь­зуя labels, выби­ра­ет поды, на кото­рые сле­ду­ет пере­на­прав­лять трафик

Как толь­ко в кла­сте­ре появ­ля­ет­ся новый под, лейб­лы кото­ро­го сов­па­да­ют с селек­то­ром Сер­ви­са, в дан­ном при­ме­ре app=MyApp — Service нач­нёт роутить тра­фик на него.

Реа­ли­зу­ет­ся это путём добав­ле­ния IP-адре­са пода в спи­сок Endpoints, кото­рый исполь­зу­ет­ся Сервисом.

Созда­дим про­стей­ший пример:

Тут созда­ёт­ся под с NGINX, и для него — Сер­вис с дефолт­ным типом ClusterIP.

Созда­ём их:

kubectl apply -f svc-example.yaml

Про­ве­ря­ем Сервис:

Kubernetes Endpoints

Теперь рас­смот­рим этот Сер­вис детальнее:

В кон­це мы соб­ствен­но и видим Endpoints это­го сер­ви­са — IP-адрес пода.

Про­ве­рим под:

Вот и наш IP.

А теперь про­ве­рим енд­по­ин­ты, кото­рые явля­ют­ся отдель­ны­ми объ­ек­та­ми API-сер­ве­ра — Endpoints, и с кото­ры­ми мож­но рабо­тать так же, как с Services и Pods:

Если мы доба­вим ещё один под с той же лей­б­лой, в Deployment или про­сто опи­шем вто­рым объ­ек­том — он будет добав­лен в этот же Ендпоинт:

kubectl apply -f svc-example.yaml

И про­ве­ря­ем ендпоинт:

Тут у нас остал­ся ста­рый под 10.21.56.143:80, и появи­лось два новых, кото­рые ука­за­ны в replicas наше­го деплоймента.

Най­дём их исполь­зуя --selector — ана­ло­гич­но Сер­вис ищет поды для добав­ле­ния в Ендпоинты:

Custom Endpoint

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

К при­ме­ру, опи­шем такой сервис:

Обра­ти­те вни­ма­ние, что тут мы не опи­сы­ва­ем selector.

К нему опи­сы­ва­ем Endpoints:

Тут:

  1. name: долж­но быть таким же, как у Service
  2. addresses: адрес, на кото­рый шлём тра­фик, в этом при­ме­ре — IP адрес сер­ве­ра в DigitalOcean, на кото­ром рабо­та­ет блог мож­но ука­зать несколь­ко — тогда Service будет выпол­нять load balancing меж­ду ними
  3. ports.port и ports.name такие же, как у Service

Созда­ём:

kubectl apply -f external-endpoint.yaml

Про­ве­ря­ем Service и его Endpoints:

Запус­ка­ем для про­вер­ки под:

kubectl run pod --rm -i --tty --image ubuntu -- bash

Уста­нав­ли­ва­ем в нём curl:

root@pod:/# apt update && apt -y install curl

И про­ве­ря­ем по име­ни сервиса:

root@pod:/# curl -Ls external-svc | grep \<title\>
<title>test: Linux, DevOps, and system administration</title>
Или по его FQDN:
root@pod:/# curl -Ls external-svc.default.svc.cluster.local | grep \<title\>
<title>test: Linux, DevOps, and system administration</title>

 

externalName

Дру­гой вари­ант для досту­па к внеш­ним ресур­сам — исполь­зо­вать Service с типом externalName:

При­ме­ня­ем, и проверяем:

root@pod:/# curl -Ls test-service | grep \<title\>
<title>test: Linux, DevOps, and system administration</title>