K8s 上的 ROS 2:同一 pod 内多播失败,不同 pod 中成功

问题描述 投票:0回答:1

k8s讨论交叉发布。

集群信息:

Kubernetes版本:v1.17.1 使用的云:裸机 安装方法:kubeadm 主机操作系统:Ubuntu 18.04 LTS 服务器 CNI 和版本:weave/flannel/kube-router/calico(每个版本的最新版本) CRI 和版本:docker/containerd (19.03.5/1.2.10)

问题:

我正在尝试在 Kubernetes 上安装 ROS 2,最好在单个 pod 中使用多个容器。在底层,ROS 2 依赖 DDS 进行通信,而 DDS 基于 UDP 多播。

当我在生产者-消费者配置中使用两个容器进行简单的 Pod 部署时,消费者很少(如果有的话)从生产者那里收到消息。当我启动两个 Pod(每个容器都有一个具有相同生产者-消费者配置的容器)时,消费者始终会收到消息。

惊喜

每隔一段时间,消费者就会按预期启动并接收消息。

此外,如果使用

kubectl exec -it ros2-1 -c consumer /bin/bash
登录消费者,然后运行
/ros_entrypoint.sh ros2 run demo_nodes_cpp listener
,在单 pod 场景中有时会收到来自生产者的消息。

预期行为

成功的消息在消费者容器的日志中显示为:

[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]

实际行为

没有从消费者处观察到此类日志消息。

重现步骤:

同一 Pod 内发生故障

  1. 启动 kubernetes 集群
  2. 应用以下 pod 定义: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
    关注来自消费者的消息。

在不同的 Pod 中取得成功

  1. 启动 kubernetes 集群
  2. 应用以下 pod 定义: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. 是什么原因导致单 Pod 部署失败,但多 Pod 部署成功?
  2. 我不熟悉 Kubernetes 环境中的调试网络问题,但在裸机方面经验丰富。我应该如何在 flannel、weave 或 kube-router 下调查这个问题?
linux networking kubernetes ros multicast
1个回答
0
投票

我相信这篇 ubuntu.com 文章已经回答了这个问题:

此外,ROS 2 没有提供管理 RTPS 使用的端口的方法。例如,容器无法更改标准 RTPS 发现端口 7400,ROS 2 侦听器也无法选择默认端口以外的端口。因此,无法在同一 Pod 中运行的多个 ROS 2 容器之间协调端口使用,并且这些容器通常无法通信。

© www.soinside.com 2019 - 2024. All rights reserved.