{"id":9967,"date":"2016-04-27T17:40:59","date_gmt":"2016-04-27T15:40:59","guid":{"rendered":"https:\/\/blog.zhaw.ch\/icclab\/?p=9967"},"modified":"2021-03-04T18:51:26","modified_gmt":"2021-03-04T16:51:26","slug":"challenges-with-running-ros-on-kubernetes","status":"publish","type":"post","link":"https:\/\/blog.zhaw.ch\/icclab\/challenges-with-running-ros-on-kubernetes\/","title":{"rendered":"Challenges with running ROS on Kubernetes"},"content":{"rendered":"<p>The goal of the <a href=\"https:\/\/blog.zhaw.ch\/icclab\/category\/research-approach\/themes\/cloud-robotics\/\">Cloud Robotics initiative<\/a> of the <a href=\"https:\/\/blog.zhaw.ch\/icclab\/category\/labs\/splab\/\">SPLab<\/a> is to ease the integration of Cloud Computing and Robotics workloads. One of the first things we need to sort out is how to leverage different networking models available on the cloud to support these mixed workloads.<\/p>\n<p>In this blog post we&#8217;ll see one little handy trick to have <strong>ROS nodes<\/strong> run as pods (and services) <strong>in any Kubernetes cluster<\/strong> so that they can transparently communicate using a ROS topic.<\/p>\n<p><!--more--><\/p>\n<p>We&#8217;re using the <a href=\"http:\/\/www.ros.org\/\">Robot Operating System (ROS) <\/a>on both robots and the cloud. As you\u00a0 (might not) know, ROS 1 uses a ROS master to act as registrar of other ROS nodes that act as <strong>publishers<\/strong> or <strong>subscribers<\/strong> on a <strong>topic<\/strong>. When a publisher creates a topic, and a subscriber subscribes to it, what actually happens is that the master informs the publisher, so that it\u00a0 directly sends unicast messages to the subscriber when there&#8217;s something to say (a pretty low-level pub\/sub implementation). See figure below (credits Clearpath Robotics, for more info <a href=\"http:\/\/www.clearpathrobotics.com\/guides\/ros\/Intro%20to%20the%20Robot%20Operating%20System.html\">click here<\/a>).<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" src=\"http:\/\/www.clearpathrobotics.com\/guides\/ros\/_images\/ros101three.png\" width=\"965\" height=\"693\" \/><\/p>\n<p>One of the assumptions of the figure above is that publishers and subscribers can directly address each other. ROS has some very specific <a href=\"http:\/\/wiki.ros.org\/ROS\/NetworkSetup\">networking requirements<\/a> for topic messages to be relayed correctly.<\/p>\n<p>Now, we want to deploy the same thing on a Kubernetes cluster running in the cloud, but, following the best practices of current cloud development, we&#8217;re packaging each ROS node in a separated Docker container. Consequently, we&#8217;re going to <strong>use a separate pod for each ROS node<\/strong> so as to allow nodes to be running on any cluster server. Also, we&#8217;d be very happy <strong>not to need any specific network setup<\/strong> and use <a href=\"https:\/\/github.com\/kubernetes\/kubernetes\/blob\/release-1.2\/docs\/design\/networking.md\">Kubernetes overlay networking<\/a> to do the work for us.<\/p>\n<p>Kubernetes has a nifty <a href=\"https:\/\/github.com\/kubernetes\/kubernetes\/blob\/release-1.2\/cluster\/addons\/dns\/README.md\">discovery mechanism based on DNS<\/a> that lets your pods find <a href=\"http:\/\/kubernetes.io\/docs\/user-guide\/services\"><strong>services<\/strong><\/a> <strong>by name<\/strong> rather than meddling with IPs. This is a very important feature in a cloud where the assumption is that pods might disappear any time, but services are entities that might exist independently of the supporting implementation in a pod.<\/p>\n<p>According to the <a href=\"https:\/\/github.com\/kubernetes\/kubernetes\/blob\/release-1.2\/cluster\/addons\/dns\/README.md\">Kubernetes DNS documentation<\/a>, &#8220;the only objects to which we are assigning DNS names are Services&#8221;, hence if we want our ROS nodes to find each other without implementing a discovery mechanism, we need to create a service for each ROS node we intend to deploy.<\/p>\n<p>This is quite straightforward for the ROS Master. Here&#8217;s the pod specification:<\/p>\n<pre><code>apiVersion: v1\r\nkind: Pod\r\nmetadata:\r\n\u00a0 name: master\r\n\u00a0 labels:\r\n\u00a0\u00a0\u00a0 name: master\r\nspec:\r\n\u00a0 containers: \r\n\u00a0\u00a0 -\u00a0 name: master\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 image: ros:indigo\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 ports:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 - containerPort: 11311\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 name: master\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 args:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 - roscore<\/code><\/pre>\n<p>No big surprises. We&#8217;re using the excellent &#8220;official&#8221; ROS containers from Docker Hub (<a href=\"https:\/\/hub.docker.com\/_\/ros\/\">https:\/\/hub.docker.com\/_\/ros\/<\/a>) and exposing port 11311 where the ROS master will accept incoming connections from other nodes.<\/p>\n<p>Here&#8217;s the ROS Master service specification:<\/p>\n<pre><code>apiVersion: v1\r\nkind: Service\r\nmetadata: \r\n  name: master\r\nspec: \r\n  clusterIP: None\r\n  ports: \r\n    - port: 11311\r\n      protocol: TCP\r\n  selector: \r\n    name: master\r\n  type: ClusterIP\r\n<\/code><\/pre>\n<p>We are creating a service on port 11311 of type &#8220;ClusterIP&#8221;. This will create a Virtual IP in the Kubernetes network and make sure that all the traffic to that <strong>IP and port<\/strong> are forwarded by the Kube-Proxies to the right pod(s).<\/p>\n<figure style=\"width: 638px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"\" src=\"http:\/\/image.slidesharecdn.com\/kubernetesintro-public-kubernetesusergroup4-21-2015-150423132519-conversion-gate02\/95\/kubernetes-intro-public-kubernetes-user-group-4212015-26-638.jpg?cb=1429799133\" width=\"638\" height=\"360\" \/><figcaption class=\"wp-caption-text\">How services get a virtual IP and port in Kubernetes. Credits: Kubernetes Introduction &#8211; talk given by Daniel Smith at Kubenetes User Group meetup #2 in Mountain View on 4\/21\/2015<\/figcaption><\/figure>\n<p>However, the problem comes when trying to do the same with the publisher and the subscriber. In fact, if one takes a look at the Python implementation of <a href=\"https:\/\/github.com\/ros\/ros_comm\/tree\/indigo-devel\/clients\/rospy\/src\/rospy\">ROS publishers and subscribers<\/a>, they use <strong>dynamic ports<\/strong> and register those as reachable endpoints to the master. Unfortunately Kubernetes services currently do not support dynamic ports (nor port ranges for that matter) and routing would not work.<\/p>\n<p>Luckily for us, the concept of <a href=\"http:\/\/kubernetes.io\/docs\/user-guide\/services\/#headless-services\"><strong>headless services<\/strong><\/a> lets us:<\/p>\n<ul>\n<li>Still register a pod so that it can be resolved by DNS, and<\/li>\n<li>Avoid forwarding only a specific set of ports through Kube Proxies<\/li>\n<\/ul>\n<p>So, here&#8217;s the publisher pod:<\/p>\n<pre><code>apiVersion: v1\r\nkind: Pod\r\nmetadata:\r\n\u00a0 name: talker\r\n\u00a0 labels:\r\n\u00a0\u00a0\u00a0 name: talker\r\nspec:\r\n\u00a0 containers: \r\n\u00a0\u00a0 -\u00a0 name: talker\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 image: ros:indigo-ros-core\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 env:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 - name: ROS_HOSTNAME\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value: talker\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 - name: ROS_MASTER_URI\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value: http:\/\/master:11311\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 args:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 - rostopic \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 - pub \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 - \"-r\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 - \"1\" \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 - my_topic\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 - std_msgs\/String\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 - \"SPLab+ICClab\"<\/code><\/pre>\n<p>Notice how we use environmental variables to tell the publisher the URI of the ROS master, and its own <strong>ROS_HOSTNAME which has to be equal to the service name<\/strong> we&#8217;ll declare next.<\/p>\n<p>Here&#8217;s the publisher service specification:<\/p>\n<pre><code>apiVersion: v1\r\nkind: Service\r\nmetadata: \r\n\u00a0 name: talker\r\nspec:\r\n\u00a0 clusterIP: None\r\n\u00a0 ports: \r\n\u00a0\u00a0\u00a0 - port: 11311\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 protocol: TCP\r\n\u00a0 selector: \r\n\u00a0\u00a0\u00a0 name: talker\r\n\u00a0 type: ClusterIP<\/code><\/pre>\n<p>Notice the &#8220;clusterIP: None&#8221; entry. That&#8217;s what makes the service <strong>&#8220;headless&#8221;<\/strong>. So, any pod that might ask the DNS to respond with the IP of a service called &#8220;talker&#8221;, will receive as a response the list of IPs of the pods matching the &#8220;talker&#8221; service selector. Since <strong>pods can directly each other by IP<\/strong>, this means that publisher and subscriber can now directly communicate with each other by name. As for the port, we are still required to expose a port, we just left the same as for the master.<\/p>\n<p>You&#8217;ll find the repository with the whole example implementation <a href=\"https:\/\/github.com\/icclab\/ros_on_kubernetes\">here on our github<\/a>.<\/p>\n<p>TL;DR here&#8217;s how you run it:<\/p>\n<p>Clone the repo:<\/p>\n<pre><code>git clone https:\/\/github.com\/icclab\/ros_on_kubernetes.git\r\n<\/code><\/pre>\n<p>Create all pods and services (&#8220;ros-on-kubernetes&#8221; is the directory you just cloned)<\/p>\n<pre><code>kubectl create -f ros_on_kubernetes\r\n<\/code><\/pre>\n<p>Check that pods and services are created<\/p>\n<pre><code>kubectl get all\r\n<\/code><\/pre>\n<p>Connect to the listener pod and listen to the talker:<\/p>\n<pre><code>kubectl exec -it listener bash\r\nroot@listener:\/# source \/opt\/ros\/indigo\/setup.bash\r\nroot@listener:\/# rostopic echo \/my_topic\r\n<\/code><\/pre>\n<p>You should see the messages coming through the topic:<\/p>\n<pre><code>root@listener:\/# rostopic echo \/my_topic\r\ndata: SPLab+ICClab\r\n---\r\ndata: SPLab+ICClab\r\n---\r\ndata: SPLab+ICClab\r\n<\/code><\/pre>\n<p>We&#8217;re currently already working at the components needed to <strong>bridge a ROS environment in the cloud with ROS environments on premises<\/strong>, in robots or edge nodes. Those will be the actual enablers of cloud robotics using ROS.<\/p>\n<p>Stay tuned for more!<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<div class=\"pt-sm\">Schlagw\u00f6rter: <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/cloud-robotics\/\">cloud robotics<\/a>, <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/cna\/\">CNA<\/a>, <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/container\/\">container<\/a>, <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/docker\/\">docker<\/a>, <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/kubernetes\/\">kubernetes<\/a>, <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/ros\/\">ROS<\/a>, <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/splab\/\">splab<\/a><br><\/div>","protected":false},"excerpt":{"rendered":"<p>The goal of the Cloud Robotics initiative of the SPLab is to ease the integration of Cloud Computing and Robotics workloads. One of the first things we need to sort out is how to leverage different networking models available on the cloud to support these mixed workloads. In this blog post we&#8217;ll see one little [&hellip;]<\/p>\n","protected":false},"author":173,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[1,943],"tags":[743,770,725,484,483,741,769],"features":[],"class_list":["post-9967","post","type-post","status-publish","format-standard","hentry","category-allgemein","category-cloud-robotics-articles","tag-cloud-robotics","tag-cna","tag-container","tag-docker","tag-kubernetes","tag-ros","tag-splab"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Challenges with running ROS on Kubernetes - Service Engineering (ICCLab &amp; SPLab)<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.zhaw.ch\/icclab\/challenges-with-running-ros-on-kubernetes\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Challenges with running ROS on Kubernetes\" \/>\n<meta property=\"og:description\" content=\"The goal of the Cloud Robotics initiative of the SPLab is to ease the integration of Cloud Computing and Robotics workloads. One of the first things we need to sort out is how to leverage different networking models available on the cloud to support these mixed workloads. In this blog post we&#8217;ll see one little [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.zhaw.ch\/icclab\/challenges-with-running-ros-on-kubernetes\/\" \/>\n<meta property=\"og:site_name\" content=\"Service Engineering (ICCLab &amp; SPLab)\" \/>\n<meta property=\"article:published_time\" content=\"2016-04-27T15:40:59+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-03-04T16:51:26+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.clearpathrobotics.com\/guides\/ros\/_images\/ros101three.png\" \/>\n<meta name=\"author\" content=\"toff\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"toff\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/challenges-with-running-ros-on-kubernetes\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/challenges-with-running-ros-on-kubernetes\/\"},\"author\":{\"name\":\"toff\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/74df05bfae7fb875d9ea5d48ae234738\"},\"headline\":\"Challenges with running ROS on Kubernetes\",\"datePublished\":\"2016-04-27T15:40:59+00:00\",\"dateModified\":\"2021-03-04T16:51:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/challenges-with-running-ros-on-kubernetes\/\"},\"wordCount\":877,\"commentCount\":2,\"image\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/challenges-with-running-ros-on-kubernetes\/#primaryimage\"},\"thumbnailUrl\":\"http:\/\/www.clearpathrobotics.com\/guides\/ros\/_images\/ros101three.png\",\"keywords\":[\"cloud robotics\",\"CNA\",\"container\",\"docker\",\"kubernetes\",\"ROS\",\"splab\"],\"articleSection\":[\"*.*\",\"Cloud Robotics\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/blog.zhaw.ch\/icclab\/challenges-with-running-ros-on-kubernetes\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/challenges-with-running-ros-on-kubernetes\/\",\"url\":\"https:\/\/blog.zhaw.ch\/icclab\/challenges-with-running-ros-on-kubernetes\/\",\"name\":\"Challenges with running ROS on Kubernetes - Service Engineering (ICCLab &amp; SPLab)\",\"isPartOf\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/challenges-with-running-ros-on-kubernetes\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/challenges-with-running-ros-on-kubernetes\/#primaryimage\"},\"thumbnailUrl\":\"http:\/\/www.clearpathrobotics.com\/guides\/ros\/_images\/ros101three.png\",\"datePublished\":\"2016-04-27T15:40:59+00:00\",\"dateModified\":\"2021-03-04T16:51:26+00:00\",\"author\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/74df05bfae7fb875d9ea5d48ae234738\"},\"breadcrumb\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/challenges-with-running-ros-on-kubernetes\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.zhaw.ch\/icclab\/challenges-with-running-ros-on-kubernetes\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/challenges-with-running-ros-on-kubernetes\/#primaryimage\",\"url\":\"http:\/\/www.clearpathrobotics.com\/guides\/ros\/_images\/ros101three.png\",\"contentUrl\":\"http:\/\/www.clearpathrobotics.com\/guides\/ros\/_images\/ros101three.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/challenges-with-running-ros-on-kubernetes\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\/\/blog.zhaw.ch\/icclab\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Challenges with running ROS on Kubernetes\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/#website\",\"url\":\"https:\/\/blog.zhaw.ch\/icclab\/\",\"name\":\"Service Engineering (ICCLab &amp; SPLab)\",\"description\":\"A Blog of the ZHAW Zurich University of Applied Sciences\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.zhaw.ch\/icclab\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/74df05bfae7fb875d9ea5d48ae234738\",\"name\":\"toff\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/files\/2014\/12\/gio_barca-150x150.jpg\",\"url\":\"https:\/\/blog.zhaw.ch\/icclab\/files\/2014\/12\/gio_barca-150x150.jpg\",\"contentUrl\":\"https:\/\/blog.zhaw.ch\/icclab\/files\/2014\/12\/gio_barca-150x150.jpg\",\"caption\":\"toff\"},\"url\":\"https:\/\/blog.zhaw.ch\/icclab\/author\/toff\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Challenges with running ROS on Kubernetes - Service Engineering (ICCLab &amp; SPLab)","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.zhaw.ch\/icclab\/challenges-with-running-ros-on-kubernetes\/","og_locale":"en_US","og_type":"article","og_title":"Challenges with running ROS on Kubernetes","og_description":"The goal of the Cloud Robotics initiative of the SPLab is to ease the integration of Cloud Computing and Robotics workloads. One of the first things we need to sort out is how to leverage different networking models available on the cloud to support these mixed workloads. In this blog post we&#8217;ll see one little [&hellip;]","og_url":"https:\/\/blog.zhaw.ch\/icclab\/challenges-with-running-ros-on-kubernetes\/","og_site_name":"Service Engineering (ICCLab &amp; SPLab)","article_published_time":"2016-04-27T15:40:59+00:00","article_modified_time":"2021-03-04T16:51:26+00:00","og_image":[{"url":"http:\/\/www.clearpathrobotics.com\/guides\/ros\/_images\/ros101three.png","type":"","width":"","height":""}],"author":"toff","twitter_card":"summary_large_image","twitter_misc":{"Written by":"toff","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.zhaw.ch\/icclab\/challenges-with-running-ros-on-kubernetes\/#article","isPartOf":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/challenges-with-running-ros-on-kubernetes\/"},"author":{"name":"toff","@id":"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/74df05bfae7fb875d9ea5d48ae234738"},"headline":"Challenges with running ROS on Kubernetes","datePublished":"2016-04-27T15:40:59+00:00","dateModified":"2021-03-04T16:51:26+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/challenges-with-running-ros-on-kubernetes\/"},"wordCount":877,"commentCount":2,"image":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/challenges-with-running-ros-on-kubernetes\/#primaryimage"},"thumbnailUrl":"http:\/\/www.clearpathrobotics.com\/guides\/ros\/_images\/ros101three.png","keywords":["cloud robotics","CNA","container","docker","kubernetes","ROS","splab"],"articleSection":["*.*","Cloud Robotics"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blog.zhaw.ch\/icclab\/challenges-with-running-ros-on-kubernetes\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blog.zhaw.ch\/icclab\/challenges-with-running-ros-on-kubernetes\/","url":"https:\/\/blog.zhaw.ch\/icclab\/challenges-with-running-ros-on-kubernetes\/","name":"Challenges with running ROS on Kubernetes - Service Engineering (ICCLab &amp; SPLab)","isPartOf":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/challenges-with-running-ros-on-kubernetes\/#primaryimage"},"image":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/challenges-with-running-ros-on-kubernetes\/#primaryimage"},"thumbnailUrl":"http:\/\/www.clearpathrobotics.com\/guides\/ros\/_images\/ros101three.png","datePublished":"2016-04-27T15:40:59+00:00","dateModified":"2021-03-04T16:51:26+00:00","author":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/74df05bfae7fb875d9ea5d48ae234738"},"breadcrumb":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/challenges-with-running-ros-on-kubernetes\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.zhaw.ch\/icclab\/challenges-with-running-ros-on-kubernetes\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blog.zhaw.ch\/icclab\/challenges-with-running-ros-on-kubernetes\/#primaryimage","url":"http:\/\/www.clearpathrobotics.com\/guides\/ros\/_images\/ros101three.png","contentUrl":"http:\/\/www.clearpathrobotics.com\/guides\/ros\/_images\/ros101three.png"},{"@type":"BreadcrumbList","@id":"https:\/\/blog.zhaw.ch\/icclab\/challenges-with-running-ros-on-kubernetes\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/blog.zhaw.ch\/icclab\/"},{"@type":"ListItem","position":2,"name":"Challenges with running ROS on Kubernetes"}]},{"@type":"WebSite","@id":"https:\/\/blog.zhaw.ch\/icclab\/#website","url":"https:\/\/blog.zhaw.ch\/icclab\/","name":"Service Engineering (ICCLab &amp; SPLab)","description":"A Blog of the ZHAW Zurich University of Applied Sciences","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.zhaw.ch\/icclab\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/74df05bfae7fb875d9ea5d48ae234738","name":"toff","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blog.zhaw.ch\/icclab\/files\/2014\/12\/gio_barca-150x150.jpg","url":"https:\/\/blog.zhaw.ch\/icclab\/files\/2014\/12\/gio_barca-150x150.jpg","contentUrl":"https:\/\/blog.zhaw.ch\/icclab\/files\/2014\/12\/gio_barca-150x150.jpg","caption":"toff"},"url":"https:\/\/blog.zhaw.ch\/icclab\/author\/toff\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/posts\/9967","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/users\/173"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/comments?post=9967"}],"version-history":[{"count":16,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/posts\/9967\/revisions"}],"predecessor-version":[{"id":9987,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/posts\/9967\/revisions\/9987"}],"wp:attachment":[{"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/media?parent=9967"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/categories?post=9967"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/tags?post=9967"},{"taxonomy":"features","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/features?post=9967"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}