(7) Служба основных ресурсов K8S

1. Что такое сервисное обслуживание

Услуга

Сервис в Kubernetes (K8s) — это абстракция, используемая для определения методов доступа и сетевых правил для набора подов. Он обеспечивает стабильную сетевую конечную точку, позволяя приложениям получать доступ к серверным экземплярам Pod через имена служб.

Сервис предоставляет единую запись для группы модулей с одинаковой функцией, скрывая детали за модулями. С помощью службы приложения могут использовать DNS-имя или IP-адрес кластера для доступа к внутреннему поду без прямого раскрытия IP-адреса пода. Таким образом, при изменении IP-адреса модуля приложение по-прежнему может получить доступ к серверному модулю через Службу.

Сервис также поддерживает балансировку нагрузки, которая может равномерно распределять запросы на несколько экземпляров Pod на серверной части, тем самым обеспечивая высокую доступность и горизонтальное расширение. Он может направлять запросы к разным модулям на основе различных стратегий балансировки нагрузки, таких как циклический перебор, хеширование IP-адресов и т. д.

В Kubernetes существует множество типов сервисов, включая ClusterIP, NodePort и LoadBalancer. Каждый тип предоставляет различные методы доступа и конфигурации сети для удовлетворения различных требований приложений.

Короче говоря, служба Kubernetes — это уровень абстракции для определения и управления методами доступа приложений к сети, а также для обеспечения балансировки нагрузки и стабильных конечных точек сети. Это сетевая абстракция, построенная поверх модулей, обеспечивающая легкий доступ и масштабируемость для приложений.

Классификация услуг

  • ClusterIP — это тип службы по умолчанию, который предоставляет службу на виртуальном IP-адресе внутри кластера. Другие поды или службы могут взаимодействовать со службой через виртуальный IP-адрес и указанный порт. Сервис типа ClusterIP доступен только внутри кластера и невидим для внешней сети.
  • NodePort используется для приложений внешнего доступа.На основе ClusterIP привяжите порт для службы на каждой машине, и вы сможете получить доступ к службе через: ip+NodePort
  • LoadBalancer (план оплаты) На основе NodePort создать внешний балансировщик нагрузки с помощью общедоступного облака и перенаправить запрос в NodePort
    для достижения другого решения для доступа к сервисам вне кластера, но не все кластеры k8s будут его поддерживать, большинство из которых поддерживаются в кластерах общедоступного облачного хостинга
  • ExternalName (используется редко) вводит службы вне кластера в кластер и использует их непосредственно внутри кластера. Никаких прокси-серверов не создается, это поддерживается только kube-dns для Kubernetes 1.7 или выше.

Отношения между Сервисом и подом

Сервис и модуль связаны через selector.app

пример ямла:

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  name: svc
spec:
  ports:
  - port: 80  # service服务端口
    protocol: TCP
    targetPort: 80 # pod端口,常规和容器内部端口一致
  selector: # 标签选择器,确定当前service代理控制哪些pod
    app: nginx-pod
status:
  loadBalancer: {
    
    }

2. Несколько различий портов

О концептуальном различии портов в K8S

  • port — это сервисный порт, то есть порт доступа между сервисами в k8s, а clusterIP:port — это запись для клиентов внутри кластера для доступа к сервису.
  • nodePort Порт узла узла, на котором расположен контейнер, доступный узлам кластера через службу типа nodeport, и порт, доступный извне.
  • targetPort – это порт модуля. Трафик из портов и узловых портов поступает в targetPort внутреннего модуля через kube-proxy и, наконец, попадает в контейнер.
  • containerPort — это порт контейнера внутри модуля, а targetPort сопоставляется с containerPort.

Подведем итог:

  • Функции четырех портов различны, порт и порт узла являются служебными портами.
  • Port предоставляется клиентам в кластере для доступа к службам, а nodePort предоставляется клиентам за пределами кластера для доступа к службам.
  • Данные, поступающие из этих двух портов, должны поступать в targetPod внутреннего модуля через обратный прокси-сервер kube-proxy, чтобы достичь контейнера в модуле.

пример ямла;

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: dev
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.20
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80 #容器端口,不指定则为默认
---
apiVersion: apps/v1
kind: Service
metadata:
  name: nginx
spec:
  type: NodePort # 有配置NodePort,外部可访问k8s中的服务 ,
  ports:
  - name: nginx
    port: 80  # 服务service的访问端口
    protocol: TCP
    targetPort: 80  # pod端口,映射到容器端口
    nodePort: 30015  # NodePort,通过nodeport类型的service暴露给集群外部访问
  selector:
    app: nginx

3. ClusterIP сервисной службы K8S

Использовать сервис типа ClusterIP в Kubernetes очень просто. Вы можете выполнить следующие действия:

Как создать и использовать:

1. Создайте файл определения службы (формат YAML), укажите имя службы, селектор, порт и другую информацию. Вот пример

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
    - name: http
      port: 80
      targetPort: 8080

2. Используйте команду kubectl для создания службы:

kubectl apply -f service-definition.yaml

3. Подождите, пока служба будет успешно создана. Вы можете проверить статус службы с помощью следующей команды:

kubectl get service my-service

Доступ к связанным модулям через ClusterIP службы. Внутри кластера вы можете использовать ClusterIP службы в качестве цели доступа, не раскрывая напрямую IP-адрес пода.
Например, в модулях в том же пространстве имен вы можете использовать ClusterIP службы для доступа к другим модулям следующим образом:

curl <cluster-ip>:<port>

Замените <cluster-ip> и <port> фактическим IP-адресом кластера и портом службы.
Примечание. По умолчанию Служба типа ClusterIP доступна только внутри кластера и недоступна снаружи кластера. Если вам необходимо получить доступ к службе извне кластера, рассмотрите возможность использования других типов службы, таких как NodePort или LoadBalancer.

4. NodePort и EndPoint сервисной службы K8S

NodePort

Функции:

NodePort — это тип службы в Kubernetes, который позволяет перенаправлять трафик в поды в службе через определенные порты на узлах кластера.

1. NodePort — это тип Сервиса, который предоставляет фиксированный порт (NodePort) и перенаправляет трафик на порт (TargetPort), определенный в Сервисе.

2. При создании службы типа NodePort Kubernetes назначит случайный номер порта (диапазон 30000–32767) каждому узлу и сопоставит этот порт с TargetPort службы.

3. Доступ к Сервису типа NodePort возможен из-за пределов кластера. Трафик можно перенаправить в поды в службе, обратившись к IP-адресу и порту NodePort любого узла в кластере.

Как создать и использовать:

4. Создайте образец файла определения службы типа NodePort следующим образом:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: NodePort
  selector:
    app: my-app
  ports:
    - name: http
      port: 80
      targetPort: 8080
      nodePort: 30080

Поле nodePort в приведенном выше примере указывает номер порта NodePort как 30080.

5. Используйте команду kubectl для создания службы типа NodePort:

kubectl apply -f service-definition.yaml

6. При доступе к сервису типа NodePort из-за пределов кластера вы можете использовать IP-адрес любого узла и указанный порт NodePort. Например:

curl <node-ip>:<node-port>

Обратите внимание, что тип службы NodePort обычно используется в среде тестирования или разработки и не подходит для непосредственного использования в производственной среде. В производственной среде рекомендуется использовать службу типа LoadBalancer или использовать контроллер Ingress для достижения более гибкого и надежного управления трафиком.

Конечная точка (эп.)

Обзор:

1. Это ресурсный объект в k8s, хранящийся в etcd (базе данных хранилища) и записывающий адреса доступа всех подов, соответствующих службе 2. В нем есть
список конечных точек, который является записью службы пода, которую текущий служба может загружаться в
3. служба и связь между модулями достигается через конечные точки
4. Просмотрите список конечных точекkubectl get ep svc-nodeport-nginx1 -n dev -o wide

Kubernetes предлагает две стратегии балансировки нагрузки.

  • Циклический перебор: в соответствии со стратегией балансировки нагрузки с циклическим перебором каждый запрос последовательно распределяется по внутренним модулям. При наличии нескольких бэкэнд-модулей каждый запрос будет последовательно отправляться разным модулям в циклическом режиме, чтобы обеспечить равномерную обработку запросов каждым модулем.

  • Сходство сеансов: в соответствии со стратегией балансировки нагрузки сродства сеансов Kubernetes будет направлять запросы в течение определенного периода времени в один и тот же внутренний модуль в соответствии с исходным IP-адресом клиента. Целью этого является поддержание непрерывности сеанса с одним и тем же клиентом и обеспечение того, чтобы все запросы, обрабатываемые клиентом в одном поде, принадлежали к одному и тому же сеансу.

Эти две стратегии балансировки нагрузки можно указать в конфигурации службы. Для политики циклического перебора вы можете установить для поля .spec.sessionAffinity службы значение None (значение по умолчанию), указывающее, что сходство сеансов не включено; для политики сходства сеансов вы можете установить для поля .spec.sessionAffinity значение ClientIP, указывающий, что клиент основан на исходном IP-адресе для привязки сеанса.

Je suppose que tu aimes

Origine blog.csdn.net/csdn570566705/article/details/130722821
conseillé
Classement