<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="FeedCreator 1.8" -->
<?xml-stylesheet href="http://178.140.10.58:8080/lib/exe/css.php?s=feed" type="text/css"?>
<rdf:RDF
    xmlns="http://purl.org/rss/1.0/"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
    xmlns:dc="http://purl.org/dc/elements/1.1/">
    <channel rdf:about="http://178.140.10.58:8080/feed.php">
        <title>Библиотека знаний - system:kubernetes</title>
        <description>Заметки IT программиста</description>
        <link>http://178.140.10.58:8080/</link>
        <image rdf:resource="http://178.140.10.58:8080/lib/exe/fetch.php?media=wiki:dokuwiki.svg" />
       <dc:date>2026-04-17T12:20:55+00:00</dc:date>
        <items>
            <rdf:Seq>
                <rdf:li rdf:resource="http://178.140.10.58:8080/doku.php?id=system:kubernetes:services"/>
            </rdf:Seq>
        </items>
    </channel>
    <image rdf:about="http://178.140.10.58:8080/lib/exe/fetch.php?media=wiki:dokuwiki.svg">
        <title>Библиотека знаний</title>
        <link>http://178.140.10.58:8080/</link>
        <url>http://178.140.10.58:8080/lib/exe/fetch.php?media=wiki:dokuwiki.svg</url>
    </image>
    <item rdf:about="http://178.140.10.58:8080/doku.php?id=system:kubernetes:services">
        <dc:format>text/html</dc:format>
        <dc:date>2024-08-26T21:06:36+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>Сервисы Kubernetes</title>
        <link>http://178.140.10.58:8080/doku.php?id=system:kubernetes:services</link>
        <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;сервисы_kubernetes&quot;&gt;Сервисы Kubernetes&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Сервис в Kubernetes — это высокоуровневая абстракция, предназначенная для обеспечения доступа к одному или нескольким подам, работающим в кластере. Сервисы упрощают процесс взаимодействия между различными компонентами приложения и предоставляют удобный интерфейс для доступа к ресурсам. Проще говоря, сервис в Kubernetes выступает в роли стабильной сетевой точки входа для приложений, которые работают в кластере.
&lt;/p&gt;

&lt;p&gt;
Важно упомянуть, что сервисы используют селекторы для идентификации подов, которые должны быть частью данного сервиса. Селекторы позволяют группировать поды по определённым критериям, таким, как метки или имена.
&lt;/p&gt;

&lt;p&gt;
Каждый сервис имеет уникальное имя и может быть сконфигурирован для работы в разных режимах доступа. Например, service может быть настроен на внутренний доступ только внутри кластера или он может быть настроен на внешний доступ через внешний балансировщик нагрузки. В связи с такой вариативностью сервисы разделили на несколько типов:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 ClusterIP: самый простой тип сервиса, доступный только внутри кластера.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 NodePort: доступен снаружи кластера по определённому порту на всех нодах.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 LoadBalancer: автоматически создаёт внешний балансировщик нагрузки.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 ExternalName: маппинг на внешний ресурс посредством CNAME-записи.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u0435\u0440\u0432\u0438\u0441\u044b Kubernetes&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u0435\u0440\u0432\u0438\u0441\u044b_kubernetes&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-2284&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit2&quot; id=&quot;clusterip&quot;&gt;ClusterIP&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
ClusterIP — это дефолтный тип сервиса в кубах, он поднимает вам сервис внутри кластера на внутрекластеровом IP. Доступа для внешнего трафика нет, только внутри кластера.
&lt;/p&gt;

&lt;p&gt;
YAML для ClusterIP выглядит как-то так:
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://178.140.10.58:8080/lib/exe/detail.php?id=system%3Akubernetes%3Aservices&amp;amp;media=system:image-4.png&quot; class=&quot;media&quot; title=&quot;system:image-4.png&quot;&gt;&lt;img src=&quot;http://178.140.10.58:8080/lib/exe/fetch.php?w=600&amp;amp;tok=f9a475&amp;amp;media=system:image-4.png&quot; class=&quot;media&quot; loading=&quot;lazy&quot; alt=&quot;&quot; width=&quot;600&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;pre class=&quot;code yaml&quot;&gt;&lt;span class=&quot;co3&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;sy2&quot;&gt;: &lt;/span&gt;v1&lt;span class=&quot;co3&quot;&gt;
kind&lt;/span&gt;&lt;span class=&quot;sy2&quot;&gt;: &lt;/span&gt;Service&lt;span class=&quot;co3&quot;&gt;
metadata&lt;/span&gt;&lt;span class=&quot;sy2&quot;&gt;: &lt;/span&gt; &lt;span class=&quot;co3&quot;&gt;
  name&lt;/span&gt;&lt;span class=&quot;sy2&quot;&gt;: &lt;/span&gt;my-internal-service&lt;span class=&quot;co4&quot;&gt;
spec&lt;/span&gt;:&lt;span class=&quot;co3&quot;&gt;
  selector&lt;/span&gt;&lt;span class=&quot;sy2&quot;&gt;: &lt;/span&gt;   &lt;span class=&quot;co3&quot;&gt;
    app&lt;/span&gt;&lt;span class=&quot;sy2&quot;&gt;: &lt;/span&gt;my-app&lt;span class=&quot;co3&quot;&gt;
  type&lt;/span&gt;&lt;span class=&quot;sy2&quot;&gt;: &lt;/span&gt;ClusterIP&lt;span class=&quot;co3&quot;&gt;
  ports&lt;/span&gt;&lt;span class=&quot;sy2&quot;&gt;: &lt;/span&gt; &lt;span class=&quot;co3&quot;&gt;
  - name&lt;/span&gt;&lt;span class=&quot;sy2&quot;&gt;: &lt;/span&gt;http&lt;span class=&quot;co3&quot;&gt;
    port&lt;/span&gt;&lt;span class=&quot;sy2&quot;&gt;: &lt;/span&gt;80&lt;span class=&quot;co3&quot;&gt;
    targetPort&lt;/span&gt;&lt;span class=&quot;sy2&quot;&gt;: &lt;/span&gt;80&lt;span class=&quot;co3&quot;&gt;
    protocol&lt;/span&gt;&lt;span class=&quot;sy2&quot;&gt;: &lt;/span&gt;TCP&lt;/pre&gt;
&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;co4&quot;&gt;$ &lt;/span&gt;kubectl proxy &lt;span class=&quot;re5&quot;&gt;--port&lt;/span&gt;=&lt;span class=&quot;nu0&quot;&gt;8080&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;
Когда использовать ClusterIP для открытия внешнего доступа?
Есть парочка вариантов применения, когда стоит пускать трафик на сервис через kubernetes proxy:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Когда надо дебажить сервисы, подключаясь к ним напрямую
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Когда надо получить доступ к какому-либо сервису
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;ClusterIP&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;clusterip&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;2285-3436&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit3&quot; id=&quot;nodeport&quot;&gt;NodePort&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
NodePort — наиболее простой и “тупой” способ пустить внешний трафик на сервис. Название “NodePort” говорит само за себя — просто открывается порт на ноде для доступа извне, а трафик уже маршрутизируется на сам сервис.
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://178.140.10.58:8080/lib/exe/detail.php?id=system%3Akubernetes%3Aservices&amp;amp;media=system:image-5.png&quot; class=&quot;media&quot; title=&quot;system:image-5.png&quot;&gt;&lt;img src=&quot;http://178.140.10.58:8080/lib/exe/fetch.php?w=600&amp;amp;tok=38e00c&amp;amp;media=system:image-5.png&quot; class=&quot;media&quot; loading=&quot;lazy&quot; alt=&quot;&quot; width=&quot;600&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;pre class=&quot;code yaml&quot;&gt;&lt;span class=&quot;co3&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;sy2&quot;&gt;: &lt;/span&gt;v1&lt;span class=&quot;co3&quot;&gt;
kind&lt;/span&gt;&lt;span class=&quot;sy2&quot;&gt;: &lt;/span&gt;Service&lt;span class=&quot;co3&quot;&gt;
metadata&lt;/span&gt;&lt;span class=&quot;sy2&quot;&gt;: &lt;/span&gt; &lt;span class=&quot;co3&quot;&gt;
  name&lt;/span&gt;&lt;span class=&quot;sy2&quot;&gt;: &lt;/span&gt;my-nodeport-service&lt;span class=&quot;co4&quot;&gt;
spec&lt;/span&gt;:&lt;span class=&quot;co3&quot;&gt;
  selector&lt;/span&gt;&lt;span class=&quot;sy2&quot;&gt;: &lt;/span&gt;   &lt;span class=&quot;co3&quot;&gt;
    app&lt;/span&gt;&lt;span class=&quot;sy2&quot;&gt;: &lt;/span&gt;my-app&lt;span class=&quot;co3&quot;&gt;
  type&lt;/span&gt;&lt;span class=&quot;sy2&quot;&gt;: &lt;/span&gt;NodePort&lt;span class=&quot;co3&quot;&gt;
  ports&lt;/span&gt;&lt;span class=&quot;sy2&quot;&gt;: &lt;/span&gt; &lt;span class=&quot;co3&quot;&gt;
  - name&lt;/span&gt;&lt;span class=&quot;sy2&quot;&gt;: &lt;/span&gt;http&lt;span class=&quot;co3&quot;&gt;
    port&lt;/span&gt;&lt;span class=&quot;sy2&quot;&gt;: &lt;/span&gt;80&lt;span class=&quot;co3&quot;&gt;
    targetPort&lt;/span&gt;&lt;span class=&quot;sy2&quot;&gt;: &lt;/span&gt;80&lt;span class=&quot;co3&quot;&gt;
    nodePort&lt;/span&gt;&lt;span class=&quot;sy2&quot;&gt;: &lt;/span&gt;30036&lt;span class=&quot;co3&quot;&gt;
    protocol&lt;/span&gt;&lt;span class=&quot;sy2&quot;&gt;: &lt;/span&gt;TCP&lt;/pre&gt;

&lt;p&gt;
Как можно было заметить, в описании фигурирует параметр nodePort, который задаёт номер порта для открытия. Если его не задавать, то выберется рандомный порт в диапазоне 30000-32767.
&lt;/p&gt;

&lt;p&gt;
Когда использовать NodePort?
Для начала, у этого метода сразу несколько минусов:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Один порт — один сервис
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Диапазон 30000-32767 (хоть и изменяемый, но делать это надо крайне осторожно)
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Если IP ноды может измениться (например, в GKE или AWS при автоскейлинге), то это тоже надо учитывать
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
В общем, не рекомендую использовать этот метод в продакшне. Конечно, если это какой-то демо-сервис и от него не требуется 100% доступность, вполне можно использовать NodePort.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;NodePort&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;nodeport&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;3437-5245&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit4&quot; id=&quot;loadbalancer&quot;&gt;LoadBalancer&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
LoadBalancer — это, можно сказать, стандартный и самый простой способ пустить внешний трафик на сервис. Правда, работает он только в облаках, т.к. использует нативные облачные решения текущего провайдера. Например, при использовании в GKE будет поднят Network Load Balancer с отдельным внешним IP-адресом, который будет маршрутизировать весь трафик на указанный сервис.
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://178.140.10.58:8080/lib/exe/detail.php?id=system%3Akubernetes%3Aservices&amp;amp;media=system:image-6.png&quot; class=&quot;media&quot; title=&quot;system:image-6.png&quot;&gt;&lt;img src=&quot;http://178.140.10.58:8080/lib/exe/fetch.php?w=600&amp;amp;tok=8e901b&amp;amp;media=system:image-6.png&quot; class=&quot;media&quot; loading=&quot;lazy&quot; alt=&quot;&quot; width=&quot;600&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
Когда использовать LoadBalancer?
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Элемент ненумерованного списка
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Если надо дать прямой доступ к сервису извне, это ваш выбор. Весь трафик на выбранный порт будет маршрутизироваться на сервис. Это значит, что можно пускать практически любой вид трафика: HTTP, TCP, UDP, Websockets, gRPC и т.п.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Огромный минус в том, что для каждого сервиса будет использоваться свой LoadBalancer со своим внешним IP, и придётся в результате платить сразу за несколько LoadBalancer’ов.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;LoadBalancer&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;loadbalancer&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:3,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;5246-6743&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit5&quot; id=&quot;ingress&quot;&gt;Ingress&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
В отличие от других приведённых выше примеров Ingress — вообще не сервис как таковой. Его нельзя задать как type в описании сервиса. На деле Ingress поднимается между сервисами и внешним миром и выступает в роли некоего умного маршрутизатора, который является точкой входа в кластер.
&lt;/p&gt;

&lt;p&gt;
С Ingress’ом можно делать очень много разных штук, т.к. существует множество Ingress Controller’ов с разными возможностями. Например, в GKE дефолтный Ingress Controller поднимет HTTP(S) Load Balancer. Он позволяет роутить трафик на сервисы по путям URL’ов и поддоменам. Например, можно отправить всё, что приходит на foo.yourdomain.com на сервис foo, а всё, что приходит на yourdomain.com/bar/ на сервис bar
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://178.140.10.58:8080/lib/exe/detail.php?id=system%3Akubernetes%3Aservices&amp;amp;media=system:image-7.png&quot; class=&quot;media&quot; title=&quot;system:image-7.png&quot;&gt;&lt;img src=&quot;http://178.140.10.58:8080/lib/exe/fetch.php?w=600&amp;amp;tok=f5ba77&amp;amp;media=system:image-7.png&quot; class=&quot;media&quot; loading=&quot;lazy&quot; alt=&quot;&quot; width=&quot;600&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;pre class=&quot;code yaml&quot;&gt;&lt;span class=&quot;co3&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;sy2&quot;&gt;: &lt;/span&gt;extensions/v1beta1&lt;span class=&quot;co3&quot;&gt;
kind&lt;/span&gt;&lt;span class=&quot;sy2&quot;&gt;: &lt;/span&gt;Ingress&lt;span class=&quot;co4&quot;&gt;
metadata&lt;/span&gt;:&lt;span class=&quot;co3&quot;&gt;
  name&lt;/span&gt;&lt;span class=&quot;sy2&quot;&gt;: &lt;/span&gt;my-ingress&lt;span class=&quot;co4&quot;&gt;
spec&lt;/span&gt;:&lt;span class=&quot;co4&quot;&gt;
  backend&lt;/span&gt;:&lt;span class=&quot;co3&quot;&gt;
    serviceName&lt;/span&gt;&lt;span class=&quot;sy2&quot;&gt;: &lt;/span&gt;other&lt;span class=&quot;co3&quot;&gt;
    servicePort&lt;/span&gt;&lt;span class=&quot;sy2&quot;&gt;: &lt;/span&gt;8080&lt;span class=&quot;co4&quot;&gt;
  rules&lt;/span&gt;:&lt;span class=&quot;co3&quot;&gt;
  - host&lt;/span&gt;&lt;span class=&quot;sy2&quot;&gt;: &lt;/span&gt;foo.mydomain.com&lt;span class=&quot;co4&quot;&gt;
    http&lt;/span&gt;:&lt;span class=&quot;co4&quot;&gt;
      paths&lt;/span&gt;:&lt;span class=&quot;co4&quot;&gt;
      - backend&lt;/span&gt;:&lt;span class=&quot;co3&quot;&gt;
          serviceName&lt;/span&gt;&lt;span class=&quot;sy2&quot;&gt;: &lt;/span&gt;foo&lt;span class=&quot;co3&quot;&gt;
          servicePort&lt;/span&gt;&lt;span class=&quot;sy2&quot;&gt;: &lt;/span&gt;8080&lt;span class=&quot;co3&quot;&gt;
  - host&lt;/span&gt;&lt;span class=&quot;sy2&quot;&gt;: &lt;/span&gt;mydomain.com&lt;span class=&quot;co4&quot;&gt;
    http&lt;/span&gt;:&lt;span class=&quot;co4&quot;&gt;
      paths&lt;/span&gt;:&lt;span class=&quot;co3&quot;&gt;
      - path&lt;/span&gt;&lt;span class=&quot;sy2&quot;&gt;: &lt;/span&gt;/bar/*&lt;span class=&quot;co4&quot;&gt;
        backend&lt;/span&gt;:&lt;span class=&quot;co3&quot;&gt;
          serviceName&lt;/span&gt;&lt;span class=&quot;sy2&quot;&gt;: &lt;/span&gt;bar&lt;span class=&quot;co3&quot;&gt;
          servicePort&lt;/span&gt;&lt;span class=&quot;sy2&quot;&gt;: &lt;/span&gt;8080&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Ingress&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;ingress&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:3,&amp;quot;secid&amp;quot;:5,&amp;quot;range&amp;quot;:&amp;quot;6744-&amp;quot;} --&gt;</description>
    </item>
</rdf:RDF>
