Я пытаюсь написать приложение, в котором все модули связаны друг с другом.Я прочитал в документации :
Порядковые номера модулей, имена хостов, записи SRV и имена записей A не изменились, но IP-адреса, связанные с модулями, могли измениться,В кластере, используемом для этого урока, они есть.Вот почему важно не настраивать другие приложения для подключения к модулям в StatefulSet по IP-адресу.
Если вам нужно найти и подключиться к активным членам StatefulSet, вам следует запросить CNAMEБезголовая служба (nginx.default.svc.cluster.local
).Записи SRV, связанные с CNAME, будут содержать только модули в StatefulSet, которые работают и готовы.
Если в вашем приложении уже реализована логика подключения, которая проверяет работоспособность и готовность, вы можете использовать записи SRV модулей.(web-0.nginx.default.svc.cluster.local
, web-1.nginx.default.svc.cluster.local
), поскольку они стабильны, и ваше приложение сможет обнаруживать адреса модулей, когда они переходят в состояние «Выполнено» и «Готово».
Хотя я могу это сделатьследующим образом:
- Поиск SRV-записей службы для проверки того, какие модули готовы
- Подключение ко всем готовым пакетам
- Открытие порта, который означает готовность
Однако, когда я начал реализовывать его на мини-кубе, он показался мне грубым, и когда я запрашиваю записи A / SRV:
- На первом узле я не вижу ошибок, обнаруженных в записях (звучит нормально) до того, как я открою порт
- На втором узле иногда я не получаю ни одной записи, иногда одну запись
- На третьем узле я иногда получаю одну запись и такmetimes две записи
Мне кажется, что существует гонка между обновлением DNS-записей и запуском Statefulset.Я не совсем уверен, что я делаю неправильно и как неправильно понял документацию.
apiVersion: v1
kind: Service
metadata:
name: hello-world-lb
labels:
app: hello-world-lb
spec:
ports:
- port: 8080
name: web
type: LoadBalancer
selector:
app: hello-world
---
apiVersion: v1
kind: Service
metadata:
name: hello-world
labels:
app: hello-world
spec:
ports:
- port: 8080
name: web
- port: 3080
name: hello-world
clusterIP: None
selector:
app: hello-world
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: hello-world
spec:
selector:
matchLabels:
app: hello-world
serviceName: "hello-world"
replicas: 3
template:
metadata:
labels:
app: hello-world
spec:
terminationGracePeriodSeconds: 10
containers:
- name: hello-world
image: hello-world
imagePullPolicy: Never
ports:
- containerPort: 8080
name: web
- containerPort: 3080
name: hello-world
livenessProbe:
tcpSocket:
port: 8080
РЕДАКТИРОВАТЬ В настоящее время код выглядит следующим образом:
- Запросить записи A / SRV
hello-world.default.svc.cluster.local.
/ _hello-world._tcp.hello-world.default.svc.cluster.local.
и распечатать их для отладки - Привязать к порту 3080 и начать слушать (логика подключения не реализована)
- Открыть порт 8080
Я ожидал, что записи A / SRV для hello-world-0
будут пустыми, для hello-world-1
будет содержать hello-world-0, а для hello-world-N+1
будет содержать от hello-world-0
до hello-world-N
.Во время непрерывного обновления записи A / SRV будут содержать все другие одноранговые узлы.
Однако кажется, что записи DNS обновляются асинхронно, поэтому даже при обнаружении работоспособности модуля n
и запуске модуля n + 1
это не так.гарантирует, что pod n + 1
увидит адрес pod n
в DNS.