K8s
середина Headless Service
из ЗаметокHeadless Service
из Краткое введениеHeadless Service
создаватьHeadless Service
верноотвечать Pod
списокиз DemoКак только возникает осознание, страсть отступает. -----Ангке Ди Болонг: «Исследование Убнеги», том 2, стр. 216 ----- «Мир как воля и представление»
В некоторых сценариях, если мы хотим контролировать Pod Примеризбалансировка нагрузки
стратегию или желание напрямую общаться с Pod Если вы не хотите взаимодействовать через сопоставление портов, например, база данных выполняет некоторое разделение чтения и записи в зависимости от ситуации, или некоторые приложения выполняют управление потоком на клиенте и т. д., не используйте его. Service
предоставлено Kube-proxy
реализация проксиизпо умолчаниюбалансировка нагрузки
из Функция。надеюсь понятно из каких именно pod
Обеспечить возможность, т.е. непосредственно через Pod
издательские услуги, вместо одного кластер IP Cluster IP
Или используйте NodePort
、LoadBalancer
、ExternalName
публиковать услуги.
В это время K8s предоставил Headless Service
, то есть не для Service
настраивать ClusterIP (входной IP-адрес)
,также называется Безголовый сервис, здесь есть две ситуации
Во-первых, существует соответствующий поставщик возможностей службы, то есть соответствующая внутренняя возможность выбирается с помощью селектора тегов, например pod
,deployment
,statefulset
ждать
существуют В этом случае,встречапроходитьLabel Selector
будет выбраниззадняя часть Pod Список возвращается вызывающему клиенту, K8s Не для этого Service назначить любой IP, DNS встречадля ЭтиService из Name
Добавить серию из Запись (ААА) (IP Адрес указывает на), непосредственно указывает на сопоставление серверной части Pod。 Конечно, предпосылка проходить Селектор тегов выбран верно, pod。
Kube-prosy
Не будет обрабатывать этот тип из Service
, здесь нет механизма балансировки нагрузки и сопоставления запросов. Endpoint Controller
все равно создам pod
верноотвечатьиз Endpoint
, в то же время Kubernetes Плоскость управления будет находиться в Kubernetes API Создано в EndpointSlice
объект
EndpointSlices
Представляет подмножество (срез) конечной точки внутренней сети, которая является существующей 1.21 Версия отображается только в приложении, это простой способ отслеживания. Kubernetes конечная точка кластерсерединаизсети (сеть endpoints)。EndpointSlices для Endpoints предоставилмасштабируемыйи Расширяемыйизальтернативы。
существовать Kubernetes Средний,Конечная точкаSlice Содержит набор ссылок на конечные точки сети. Панель управления автоматически выберет оператора из Kubernetes Service создавать EndpointSlice,EndpointSlice будет содержать пары с Service Оператор выбора соответствует всем Pod из цитаты. EndpointSlice укажите уникальный протокол, номер порта и Service Имя объединяет конечные точки сети.
Headless Service проходитьнезащищенныйиз Endpoints список В приложении можно реализовать кодировку клиентской дисбалансировки. нагрузки。
Во-вторых, не существует надежного поставщика возможностей из Служить, т. е. нет оператора выбора метода, который в настоящее время может получать возможность кластеризации, в это время система не будет реагировать Endpoint
и создатель не будет из EndpointSlice
.
В этом случае система DNS ищет и настраивает один из следующих
type: ExternalName
Служить, найти и настроить его CNAME
ЗаписыватьService
готовая конечная точкавсе IP Адрес,поиск и настройка DNS A / AAAA полоска Записыватьопределить Service Внутри ClusterIP для None и имеет Selector Селектор тегов, вот так Service для Headlsee Service
Посмотреть текущий k8s середина Стоит ли сохранятьсуществовать Headlsee
┌──[root@vms81.liruilongs.github.io]-[~]
└─$kubectl get svc -A | grep None
awx awx-demo-postgres-13 ClusterIP None <none> 5432/TCP 52d
kube-system liruilong-kube-prometheus-kubelet ClusterIP None <none> 10250/TCP,10255/TCP,4194/TCP 324d
Обычно SatefulSet
нуждаться Headless Service осознать Pod из сети из согласованности (должен создать эту Служить), чтобы клиент стал обслуживать несколько клиентских адресов. Вы можете видеть, что на данный момент существует два изкластерсередина. Headless Service
, Одно из них — приложение с отслеживанием состояния (SatefulSet). postgres Создать базу данных, нужно построить prometheus
кластер «создан».
┌──[root@vms81.liruilongs.github.io]-[~]
└─$kubectl get svc awx-demo-postgres-13 -o yaml
apiVersion: v1
kind: Service
metadata:
..................
name: awx-demo-postgres-13
namespace: awx
spec:
clusterIP: None
clusterIPs:
- None
internalTrafficPolicy: Cluster
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- port: 5432
protocol: TCP
targetPort: 5432
selector:
app.kubernetes.io/component: database
app.kubernetes.io/instance: postgres-13-awx-demo
app.kubernetes.io/managed-by: awx-operator
app.kubernetes.io/name: postgres-13
app.kubernetes.io/part-of: awx-demo
sessionAffinity: None
type: ClusterIP
status:
loadBalancer: {}
Здесь мы примерно можем увидеть Headless
Определение файла ресурсов, правда этоиз Service Посетите и получите один из них Селектор совпадений из всех Pod список
,Затем клиент переходит визиметь дело с Эти Pod список。вышеиз Service , клиентский доступ postgres
База данных будет соответствовать текущему селектору из всех postgres pod。
Давайте посмотрим на некоторые реальные демо
для С состоянием Служить Давайте поговорим об этом,нуждатьсясоздавать StatefulSet
для, который предоставляет возможности, определения файлов ресурсов, просто Demo , поэтому у нас здесь нет определения Связано с объемом хранилища.
apiVersion: apps/v1
kind: StatefulSet
metadata:
creationTimestamp: null
labels:
app: web-headless
name: web
spec:
serviceName: web-headless
replicas: 3
selector:
matchLabels:
app: web-headless
template:
metadata:
creationTimestamp: null
labels:
app: web-headless
spec:
containers:
- image: nginx
name: nginx-web
ports:
- containerPort: 80
name: nginx-web
resources: {}
проходить Файл ресурсовсоздавать С состояниемиз pod
┌──[root@vms81.liruilongs.github.io]-[~/ansible]
└─$kubectl get statefulsets.apps web -o wide
NAME READY AGE CONTAINERS IMAGES
web 3/3 96s nginx-web nginx
┌──[root@vms81.liruilongs.github.io]-[~/ansible]
└─$kubectl get pods -o wide | grep web*
web-0 1/1 Running 0 2m13s 10.244.217.10 vms155.liruilongs.github.io <none> <none>
web-1 1/1 Running 0 2m11s 10.244.194.67 vms156.liruilongs.github.io <none> <none>
web-2 1/1 Running 0 114s 10.244.217.11 vms155.liruilongs.github.io <none> <none>
После этого мы нуждатьсясоздаватьверно из Headless Service
, здесь нуждаться в заметкеиз есть clusterIP: None
,селектор:app: web-headless
┌──[root@vms81.liruilongs.github.io]-[~/ansible]
└─$cat headless.yaml
apiVersion: v1
kind: Service
metadata:
name: web-headless
labels:
app: nginx_headless
spec:
ports:
- port: 30088
targetPort: 80
name: nginx-web-headless
clusterIP: None
selector:
app: web-headless
создаватьверноотвечатьиз Headless SVC
┌──[root@vms81.liruilongs.github.io]-[~/ansible]
└─$kubectl apply -f headless.yaml
service/web-headless configured
┌──[root@vms81.liruilongs.github.io]-[~/ansible]
└─$kubectl get svc web-headless
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
web-headless ClusterIP None <none> 30088/TCP 24h
Видно, что у него есть все pod Всесоздавать Понятноверноотвечатьиз Endpoint
┌──[root@vms81.liruilongs.github.io]-[~/ansible]
└─$kubectl describe svc web-headless
Name: web-headless
Namespace: awx
Labels: app=nginx_headless
Annotations: <none>
Selector: app=web-headless
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: None
IPs: None
Port: nginx-web-headless 30088/TCP
TargetPort: 80/TCP
Endpoints: 10.244.194.67:80,10.244.217.10:80,10.244.217.11:80
Session Affinity: None
Events: <none>
Можетпроходитьдругойизметод получения Headless Service из Pod список。
Может быть вызван напрямую через процесс Rest интерфейсиз метод получения Headless верноотвечатьиз Конечные точки, здесь для удобно выставлено Rest Служить,проходить kubectl proxy
Будьте штатным агентом.
┌──[root@vms81.liruilongs.github.io]-[~]
└─$nohup kubectl proxy --port=30021 &
[1] 109103
┌──[root@vms81.liruilongs.github.io]-[~]
└─$nohup: Игнорировать ввод и добавлять вывод в «nohup.out».
протестируй это
┌──[root@vms81.liruilongs.github.io]-[~]
└─$curl http://localhost:30021/api/ -s
{
"kind": "APIVersions",
"versions": [
"v1"
],
"serverAddressByClientCIDRs": [
{
"clientCIDR": "0.0.0.0/0",
"serverAddress": "192.168.26.81:6443"
}
]
}
для 1.21 Предыдущая из версии получать endpoins,Можетпроходить Endpoints
изметод получения
┌──[root@vms81.liruilongs.github.io]-[~/ansible]
└─$kubectl describe endpoints web-headless
Name: web-headless
Namespace: awx
Labels: app=nginx_headless
service.kubernetes.io/headless=
Annotations: endpoints.kubernetes.io/last-change-trigger-time: 2022-12-09T07:13:15Z
Subsets:
Addresses: 10.244.194.67,10.244.217.10,10.244.217.11
NotReadyAddresses: <none>
Ports:
Name Port Protocol
---- ---- --------
nginx-web-headless 80 TCP
Events: <none>
проходить curl позвоните, верно, из REST интерфейс
┌──[root@vms81.liruilongs.github.io]-[~/ansible]
└─$curl -s http://localhost:30021/api/v1/namespaces/awx/endpoints/web-headless | jq .subsets
[
{
"addresses": [
{
"ip": "10.244.194.67",
"hostname": "web-1",
"nodeName": "vms156.liruilongs.github.io",
"targetRef": {
"kind": "Pod",
"namespace": "awx",
"name": "web-1",
"uid": "d71722db-1c41-44ee-a55d-0042c7d2086e",
"resourceVersion": "14843070"
}
},
{
"ip": "10.244.217.10",
"hostname": "web-0",
"nodeName": "vms155.liruilongs.github.io",
"targetRef": {
"kind": "Pod",
"namespace": "awx",
"name": "web-0",
"uid": "7fa21492-d0f5-4840-8517-a05ed04651a4",
"resourceVersion": "14843008"
}
},
{
"ip": "10.244.217.11",
"hostname": "web-2",
"nodeName": "vms155.liruilongs.github.io",
"targetRef": {
"kind": "Pod",
"namespace": "awx",
"name": "web-2",
"uid": "7b262352-b12c-4ad2-8d83-8143c71e8c27",
"resourceVersion": "14843135"
}
}
],
"ports": [
{
"name": "nginx-web-headless",
"port": 80,
"protocol": "TCP"
}
]
}
]
Если использовать из 1.21 и позже из версии мы можем использовать EndpointSlicp
Приходитьполучатьверноотвечатьиз pod список
┌──[root@vms81.liruilongs.github.io]-[~/ansible]
└─$kubectl describe endpointslices web-headless-888xr
Name: web-headless-888xr
Namespace: awx
Labels: app=nginx_headless
endpointslice.kubernetes.io/managed-by=endpointslice-controller.k8s.io
kubernetes.io/service-name=web-headless
service.kubernetes.io/headless=
Annotations: endpoints.kubernetes.io/last-change-trigger-time: 2022-12-09T07:13:15Z
AddressType: IPv4
Ports:
Name Port Protocol
---- ---- --------
nginx-web-headless 80 TCP
Endpoints:
- Addresses: 10.244.217.10
Conditions:
Ready: true
Hostname: web-0
TargetRef: Pod/web-0
NodeName: vms155.liruilongs.github.io
Zone: <unset>
- Addresses: 10.244.194.67
Conditions:
Ready: true
Hostname: web-1
TargetRef: Pod/web-1
NodeName: vms156.liruilongs.github.io
Zone: <unset>
- Addresses: 10.244.217.11
Conditions:
Ready: true
Hostname: web-2
TargetRef: Pod/web-2
NodeName: vms155.liruilongs.github.ioweb
Zone: <unset>
Events: <none>
проходить curl позвоните, верно, из REST интерфейс
┌──[root@vms81.liruilongs.github.io]-[~/ansible]
└─$curl -s http://localhost:30021/apis/discovery.k8s.io/v1/namespaces/awx/endpointslices/web-headless-888xr | jq .endpoints
[
{
"addresses": [
"10.244.217.10"
],
"conditions": {
"ready": true,
"serving": true,
"terminating": false
},
"hostname": "web-0",
"targetRef": {
"kind": "Pod",
"namespace": "awx",
"name": "web-0",
"uid": "7fa21492-d0f5-4840-8517-a05ed04651a4",
"resourceVersion": "14843008"
},
"nodeName": "vms155.liruilongs.github.io"
},
{
"addresses": [
"10.244.194.67"
],
"conditions": {
"ready": true,
"serving": true,
"terminating": false
},
"hostname": "web-1",
"targetRef": {
"kind": "Pod",
"namespace": "awx",
"name": "web-1",
"uid": "d71722db-1c41-44ee-a55d-0042c7d2086e",
"resourceVersion": "14843070"
},
"nodeName": "vms156.liruilongs.github.io"
},
{
"addresses": [
"10.244.217.11"
],
"conditions": {
"ready": true,
"serving": true,
"terminating": false
},
"hostname": "web-2",
"targetRef": {
"kind": "Pod",
"namespace": "awx",
"name": "web-2",
"uid": "7b262352-b12c-4ad2-8d83-8143c71e8c27",
"resourceVersion": "14843135"
},
"nodeName": "vms155.liruilongs.github.io"
}
]
для безголового Служить, клиент может подключиться к Служитьиз DNS имя для подключения pod, как при использовании обычного Служить, потому что для DNS возвращаться pod из IP, клиент подключается напрямую к pod,так что нетпроходить Служитьактерское мастерство。здесьпроходить DNS анализироватьполучатьиз Pod список,Headless Услуги по-прежнему доступны во всех регионах. Pod из Балансировка нагрузки, но это всего лишь DNS Реализация механизма циркуляции, дисбалансировка нагрузка. вместо sessionAffinity
Соответствующая конфигурация
Можетпроходить верно Служитьиз DNS разобрать, чтобы получить POD список。
создатель Тестовый модуль
┌──[root@vms81.liruilongs.github.io]-[~/ansible]
└─$kubectl run tmp01 --image=tutum/dnsutils -- sleep infinity
pod/tmp01 created
Получить из того же командного пространства headless Service из Pod список
┌──[root@vms81.liruilongs.github.io]-[~/ansible]
└─$kubectl exec tmp01 -it -- /bin/bash
root@tmp01:/# nslookup web-headless
Server: 10.96.0.10
Address: 10.96.0.10#53
Name: web-headless.awx.svc.cluster.local
Address: 10.244.194.67
Name: web-headless.awx.svc.cluster.local
Address: 10.244.217.10
Name: web-headless.awx.svc.cluster.local
Address: 10.244.217.11
Получить из разных пространств имен headless Service из Pod список
┌──[root@vms81.liruilongs.github.io]-[~/ansible]
└─$kubectl exec tmp01 -it -- /bin/bash
root@tmp01:/# nslookup web-headless.awx
Server: 10.96.0.10
Address: 10.96.0.10#53
Name: web-headless.awx.svc.cluster.local
Address: 10.244.217.11
Name: web-headless.awx.svc.cluster.local
Address: 10.244.194.67
Name: web-headless.awx.svc.cluster.local
Address: 10.244.217.10
root@tmp01:/# nslookup web-headless.awx.svc.cluster.local.
Server: 10.96.0.10
Address: 10.96.0.10#53
Name: web-headless.awx.svc.cluster.local
Address: 10.244.217.11
Name: web-headless.awx.svc.cluster.local
Address: 10.244.194.67
Name: web-headless.awx.svc.cluster.local
Address: 10.244.217.10
о Безгражданстваиз Headless Service Здесь мы также Краткое введение,и,С статусмиз не имеет значения, правда, должен из SVC До сих пор использую его раньше web-headless
, существовать StatefulSet
из На основе нашего создателя deloyment
Предоставление сервисных возможностей
┌──[root@vms81.liruilongs.github.io]-[~/ansible]
└─$cat deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: web-headless
name: web
spec:
replicas: 3
selector:
matchLabels:
app: web-headless
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: web-headless
spec:
containers:
- image: nginx
name: nginx-web
ports:
- containerPort: 80
name: nginx-web
resources: {}
status: {}
проходить DNS получать IP, можно найти, правда будет из A записи добавлены в 6
┌──[root@vms81.liruilongs.github.io]-[~/ansible]
└─$kubectl exec tmp01 -it -- /bin/bash
root@tmp01:/# nslookup web-headless.awx
Server: 10.96.0.10
Address: 10.96.0.10#53
Name: web-headless.awx.svc.cluster.local
Address: 10.244.194.67
Name: web-headless.awx.svc.cluster.local
Address: 10.244.217.11
Name: web-headless.awx.svc.cluster.local
Address: 10.244.217.10
Name: web-headless.awx.svc.cluster.local
Address: 10.244.194.69
Name: web-headless.awx.svc.cluster.local
Address: 10.244.194.70
Name: web-headless.awx.svc.cluster.local
Address: 10.244.217.12
root@tmp01:/# exit
exit
о Headless Service
Поделитесь этим здесь с друзьями, проходить Безголовый Служить, можем провести Servcie динамично воспринимать Pod Копирование изменений, мониторинг Pod из статуса, реализуя динамическое построение частично распределенной кластеризации, в то же времясуществовать С состояниеприложение середина будет задействовано Headless Service
。
https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/#headless-services
https://stackoverflow.com/questions/52707840/what-is-a-headless-service-what-does-it-do-accomplish-and-what-are-some-legiti
https://cloud.tencent.com/developer/article/1638722
https://kubernetes.io/docs/reference/kubernetes-api/service-resources/endpoints-v1/
https://kubernetes.io/docs/reference/kubernetes-api/service-resources/endpoint-slice-v1/