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-адресе для привязки сеанса.