Как решить гонку между запуском модуля в сохранении состояния и поиском службы DNS - PullRequest
0 голосов
/ 26 мая 2019

Я пытаюсь написать приложение, в котором все модули связаны друг с другом.Я прочитал в документации :

Порядковые номера модулей, имена хостов, записи 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.

1 Ответ

0 голосов
/ 27 мая 2019

добавить приведенную ниже аннотацию к определению услуги

  annotations:
    service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
...