从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 定义: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
kubectl logs --follow ros2-1 consumer
关注来自消费者的消息。应用以下 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
kubectl logs --follow ros2-2-consumer
关注来自消费者的消息。我相信这篇 ubuntu.com 文章已经回答了这个问题:
此外,ROS 2 没有提供管理 RTPS 使用的端口的方法。例如,容器无法更改标准 RTPS 发现端口 7400,ROS 2 侦听器也无法选择默认端口以外的端口。因此,无法在同一 Pod 中运行的多个 ROS 2 容器之间协调端口使用,并且这些容器通常无法通信。