ROS 2 на K8s: многоадресная передача не выполняется в одном модуле, в других - PullRequest
1 голос
/ 24 января 2020

Кросс-пост от k8s обсудить .

Информация о кластере:

Версия Kubernetes: v1.17.1 Используемое облако: голое железо Метод установки: kubeadm Host OS : Ubuntu 18.04 LTS Server CNI и версия: weave / flannel / kube-router / calico (последние выпуски каждого) CRI и версия: docker / containerd (19.03.5 / 1.2.10)

Проблема:

Я пытаюсь запустить установку ROS 2 в Kubernetes, в идеале, используя несколько контейнеров в одном модуле. Под капотом ROS 2 полагается на DDS для связи, которая основана на многоадресной передаче UDP.

Когда я поднимаю простое развертывание модуля с двумя контейнерами в конфигурации производитель-потребитель, потребитель редко (если вообще когда-либо) получает сообщение от производителя. Когда я поднимаю два модуля, каждый с одним контейнером одинаковой конфигурации «производитель-потребитель», потребитель всегда получает сообщения.

Сюрпризы

Время от времени потребитель запускается и получать сообщения, как и ожидалось.

Кроме того, если войти в систему потребителю с помощью kubectl exec -it ros2-1 -c consumer /bin/bash, а затем выполнить /ros_entrypoint.sh ros2 run demo_nodes_cpp listener, сообщения иногда принимаются от производителя в сценарии с одним модулем.

Ожидается Поведение

Успешные сообщения появляются в журналах потребительского контейнера как:

[INFO] [1579805884.017171859] [listener]: I heard: [Hello World: 1]
[INFO] [1579805885.017168023] [listener]: I heard: [Hello World: 2]
[INFO] [1579805886.017025092] [listener]: I heard: [Hello World: 3]

Фактическое поведение

Никаких таких сообщений журнала не наблюдается от потребителя.

Действия по воспроизведению:

Ошибка в одном модуле

  1. Создайте кластер kubernetes
  2. Примените следующее определение модуля: ros2-1.yaml

    apiVersion: v1
    kind: Pod
    metadata:
      name: ros2-1
    spec:
      containers:
      - name: producer
        image: osrf/ros2:nightly
        args: ["ros2", "run", "demo_nodes_cpp", "talker"]
      - name: consumer
        image: osrf/ros2:nightly
        args: ["ros2", "run", "demo_nodes_cpp", "listener"]
      restartPolicy: Never
    
  3. Следите за сообщениями от потребителей с kubectl logs --follow ros2-1 consumer.

Успех в разных пакетах

  1. Создайте кластер kubernetes
  2. * 105 5 * Примените следующее определение модуля: ros2-2.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: ros2-2-producer
    spec:
      containers:
      - name: producer
        image: osrf/ros2:nightly
        args: ["ros2", "run", "demo_nodes_cpp", "talker"]
      restartPolicy: Never
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: ros2-2-consumer
    spec:
      containers:
      - name: consumer
        image: osrf/ros2:nightly
        args: ["ros2", "run", "demo_nodes_cpp", "listener"]
      restartPolicy: Never
    
  3. Следите за сообщениями от потребителей с kubectl logs --follow ros2-2-consumer.

Вопросы:

  1. Что приводит к сбою развертывания одного модуля, но успешному развертыванию нескольких модулей?
  2. Я не знаком с проблемами отладки сети в среде Kubernetes, хотя и довольно опытен на голом железе. Как мне go исследовать эту проблему под фланелью, переплетением или kube-router?
...