{"id":8716,"date":"2026-10-05T12:05:45","date_gmt":"2026-10-05T12:05:45","guid":{"rendered":"https:\/\/unwirednetworks.com\/?p=8716"},"modified":"2026-10-05T13:01:31","modified_gmt":"2026-10-05T13:01:31","slug":"kubernetes-on-the-vehicle-router","status":"publish","type":"post","link":"https:\/\/unwirednetworks.com\/en\/kubernetes-on-the-vehicle-router\/","title":{"rendered":"Kubernetes on the Vehicle Router."},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Your onboard application exists as a Helm chart, the pipeline is in place, your team knows Kubernetes. Only in the vehicle did that workflow stop short, at an additional compute box or at a rewrite of the application for the router. With Unwired Edge Compute for Kubernetes it now runs where it belongs: as a Kubernetes workload directly on the vehicle router.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Router Becomes the Platform for Your Applications.<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Passenger information, automatic passenger counting, diagnostics and video analytics stopped being single programs long ago. They are systems made of several services with their own databases, interfaces and release cycles. The people who build them work with manifests, Helm charts and GitOps. In the vehicle, that state of the art had to stay outside: either every application got its own box in the equipment cabinet, or the software was taken apart and adapted for the router.<\/p>\n\n\n\n<div class=\"l-ui-scene\" role=\"img\" aria-label=\"Onboard applications such as passenger information, automatic passenger counting and diagnostics run as containers on the vehicle router\"><link rel=\"stylesheet\" href=\"\/wp-content\/uploads\/wpcodebox\/49.css?v=1\">\n\n<div class=\"c-ui-scene c-ui-scene--onboard-apps c-ui-scene--system-bg js-ui-animated-scene\">\n  <div class=\"c-ui-bg-grid-fragment\" aria-hidden=\"true\"><\/div>\n\n  <div class=\"c-ui-chip-cluster c-ui-chip-cluster--oa-a\" aria-hidden=\"true\">\n    <span><\/span><span><\/span><span><\/span><span><\/span><span><\/span>\n  <\/div>\n  <div class=\"c-ui-chip-cluster c-ui-chip-cluster--oa-b\" aria-hidden=\"true\">\n    <span><\/span><span><\/span><span><\/span><span><\/span>\n  <\/div>\n  <div class=\"c-ui-chip-beam c-ui-chip-beam--oa\" aria-hidden=\"true\"><\/div>\n\n  <!-- Connector lines: router hub \u2192 each card -->\n  <svg class=\"c-ui-oa-connectors\" viewBox=\"0 0 450 450\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\">\n    <path class=\"c-ui-oa-connector\" d=\"M 96 276 C 70 200 90 130 105 76\" \/>\n    <path class=\"c-ui-oa-connector\" d=\"M 96 276 C 96 190 310 150 310 101\" \/>\n    <path class=\"c-ui-oa-connector\" d=\"M 96 276 C 220 276 342 255 342 221\" \/>\n    <path class=\"c-ui-oa-connector\" d=\"M 96 276 C 220 310 342 330 342 341\" \/>\n  <\/svg>\n\n  <!-- PIS card -->\n  <div class=\"c-ui-window c-ui-oa-card c-ui-oa-card--pis\">\n    <svg class=\"c-ui-oa-card__icon\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 -960 960 960\" aria-hidden=\"true\">\n      <path d=\"M720-440v-80h160v80H720Zm48 280-128-96 48-64 128 96-48 64Zm-80-480-48-64 128-96 48 64-128 96ZM200-200v-160h-40q-33 0-56.5-23.5T80-440v-80q0-33 23.5-56.5T160-600h160l200-120v480L320-360h-40v160h-80Zm240-182v-196l-98 58H160v80h182l98 58Zm120 36v-268q27 24 43.5 58.5T620-480q0 41-16.5 75.5T560-346ZM300-480Z\"\/>\n    <\/svg>\n    <span class=\"c-ui-oa-card__label\">PIS<\/span>\n  <\/div>\n\n  <!-- APC card -->\n  <div class=\"c-ui-window c-ui-oa-card c-ui-oa-card--apc\">\n    <svg class=\"c-ui-oa-card__icon\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 -960 960 960\" aria-hidden=\"true\">\n      <path d=\"M311.5-153Q231-186 169-249l57-57q51 51 117 78.5T481-200q72 0 137.5-27T735-305l56 56q-63 63-143 96t-168 33q-88 0-168.5-33ZM480-280q-56 0-107-21t-91-61l56-56q29 29 65.5 43.5T480-360q40 0 76.5-14.5T622-418l56 56q-40 40-91 61t-107 21ZM200-760v40h560v-40H200Zm124 120 12 40h288l12-40H324Zm12 120q-26 0-47-15.5T260-576l-20-64h-40q-33 0-56.5-23.5T120-720v-120h720v120q0 33-23.5 56.5T760-640h-40l-26 68q-9 23-29 37.5T620-520H336ZM200-760v40-40Z\"\/>\n    <\/svg>\n    <span class=\"c-ui-oa-card__label\">APC<\/span>\n  <\/div>\n\n  <!-- Diagnostics card -->\n  <div class=\"c-ui-window c-ui-oa-card c-ui-oa-card--diag\">\n    <svg class=\"c-ui-oa-card__icon\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 -960 960 960\" aria-hidden=\"true\">\n      <path d=\"M120-120v-80l80-80v160h-80Zm160 0v-240l80-80v320h-80Zm160 0v-320l80 81v239h-80Zm160 0v-239l80-80v319h-80Zm160 0v-400l80-80v480h-80ZM120-327v-113l280-280 160 160 280-280v113L560-447 400-607 120-327Z\"\/>\n    <\/svg>\n    <span class=\"c-ui-oa-card__label\">Diagnostics<\/span>\n  <\/div>\n\n  <!-- More card -->\n  <div class=\"c-ui-window c-ui-oa-card c-ui-oa-card--more\">\n    <svg class=\"c-ui-oa-card__icon\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n      <path d=\"M6 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"\/>\n    <\/svg>\n    <span class=\"c-ui-oa-card__label\">More<\/span>\n  <\/div>\n\n  <!-- Platform router \u2014 bottom left -->\n  <div class=\"c-ui-oa-router\" aria-hidden=\"true\">\n    <img decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/05\/uw_router-big-comp-200.png\" alt=\"\" width=\"200\" height=\"209\" \/>\n  <\/div>\n\n<\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Unwired Edge Compute for Kubernetes changes that. The vehicle router that already sits in the vehicle for <a href=\"https:\/\/unwirednetworks.com\/en\/solution-by-technology\/wan-bonding\/\">WAN bonding<\/a>, <a href=\"https:\/\/unwirednetworks.com\/en\/solution-by-application\/passenger-wi-fi-for-rail-operators\/\">passenger Wi-Fi<\/a> and the in-vehicle network now also runs a Kubernetes cluster with a standard API. Your application runs on it unchanged, with the standard Kubernetes API, with Helm and with the GitOps tool of your choice. For you, that means one piece of hardware less per vehicle, no special path for onboard software, and a deployment process that is the same from the data center to the train.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What You Get with Unwired Edge Compute for Kubernetes.<\/h2>\n\n\n\n<div class=\"l-ui-scene\" role=\"img\" aria-label=\"A vehicle router with a Kubernetes cluster: GPIO, GPS, RS485, USB, VLAN and SSD connect through pins on the router body\"><link rel=\"stylesheet\" href=\"\/wp-content\/uploads\/wpcodebox\/147.css?v=1\">\n<div class=\"c-ui-scene c-ui-scene--router-pins c-ui-scene--system-bg js-ui-animated-scene\" data-ui-mode=\"router-pins\">\n  <div class=\"c-ui-bg-grid-fragment\" aria-hidden=\"true\"><\/div>\n\n  <div class=\"c-ui-chip-cluster c-ui-chip-cluster--rp-a\" aria-hidden=\"true\">\n    <span><\/span><span><\/span>\n  <\/div>\n  <div class=\"c-ui-chip-cluster c-ui-chip-cluster--rp-b\" aria-hidden=\"true\">\n    <span><\/span><span><\/span>\n  <\/div>\n\n  <div class=\"c-ui-rp-halo\" aria-hidden=\"true\"><\/div>\n\n  <!-- Pins: router body \u2192 tile. Each packet duplicates its path `d`\n       inline (offset-path: url(#id) is unreliable across engines).\n       Pin dots mark the solder point on the router body. -->\n  <svg class=\"c-ui-rp-pins\" viewBox=\"0 0 450 450\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\">\n    <!-- left column -->\n    <path class=\"c-ui-rp-pin is-gpio\"  d=\"M 136 175 C 118 175, 112 137, 92 137\" \/>\n    <path class=\"c-ui-rp-pin is-gps\"   d=\"M 136 215 C 118 215, 112 217, 92 217\" \/>\n    <path class=\"c-ui-rp-pin is-rs485\" d=\"M 165 253 C 140 253, 125 297, 92 297\" \/>\n    <!-- right column -->\n    <path class=\"c-ui-rp-pin is-usb\"   d=\"M 314 165 C 332 165, 338 177, 358 177\" \/>\n    <path class=\"c-ui-rp-pin is-vlan\"  d=\"M 314 205 C 332 205, 338 257, 358 257\" \/>\n    <path class=\"c-ui-rp-pin is-ssd\"   d=\"M 280 245 C 305 245, 322 337, 358 337\" \/>\n\n    <circle class=\"c-ui-rp-pin-dot\" cx=\"136\" cy=\"175\" r=\"2.5\" \/>\n    <circle class=\"c-ui-rp-pin-dot\" cx=\"136\" cy=\"215\" r=\"2.5\" \/>\n    <circle class=\"c-ui-rp-pin-dot\" cx=\"165\" cy=\"253\" r=\"2.5\" \/>\n    <circle class=\"c-ui-rp-pin-dot\" cx=\"314\" cy=\"165\" r=\"2.5\" \/>\n    <circle class=\"c-ui-rp-pin-dot\" cx=\"314\" cy=\"205\" r=\"2.5\" \/>\n    <circle class=\"c-ui-rp-pin-dot\" cx=\"280\" cy=\"245\" r=\"2.5\" \/>\n\n    <circle class=\"c-ui-rp-packet is-gpio\"  r=\"3.2\" style=\"offset-path: path('M 136 175 C 118 175, 112 137, 92 137');\" \/>\n    <circle class=\"c-ui-rp-packet is-gps\"   r=\"3.2\" style=\"offset-path: path('M 136 215 C 118 215, 112 217, 92 217');\" \/>\n    <circle class=\"c-ui-rp-packet is-rs485\" r=\"3.2\" style=\"offset-path: path('M 165 253 C 140 253, 125 297, 92 297');\" \/>\n    <circle class=\"c-ui-rp-packet is-usb\"   r=\"3.2\" style=\"offset-path: path('M 314 165 C 332 165, 338 177, 358 177');\" \/>\n    <circle class=\"c-ui-rp-packet is-vlan\"  r=\"3.2\" style=\"offset-path: path('M 314 205 C 332 205, 338 257, 358 257');\" \/>\n    <circle class=\"c-ui-rp-packet is-ssd\"   r=\"3.2\" style=\"offset-path: path('M 280 245 C 305 245, 322 337, 358 337');\" \/>\n  <\/svg>\n\n  <!-- Big router, centred -->\n  <div class=\"c-ui-rp-router\" aria-hidden=\"true\">\n    <img decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/05\/uw_router-big-comp.png\" alt=\"\" width=\"250\" height=\"261\" \/>\n  <\/div>\n\n  <!-- Kubernetes cube on the router top face -->\n  <div class=\"c-ui-rp-cube\" aria-hidden=\"true\">\n    <img decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/09\/k8s-cube-comp.png\" alt=\"\" width=\"400\" height=\"434\" \/>\n  <\/div>\n\n  <!-- OS label -->\n  <div class=\"c-ui-rp-os\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n      <rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2\" \/>\n      <path d=\"M7 15l2.5-3L7 9M12 15h5\" \/>\n    <\/svg>\n    Unwired Edge Cloud OS\n  <\/div>\n\n  <!-- Interface tiles \u2014 left column -->\n  <div class=\"c-ui-rp-tile c-ui-rp-tile--gpio\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n      <circle cx=\"5\" cy=\"8\" r=\"2\" \/><circle cx=\"12\" cy=\"8\" r=\"2\" \/><circle cx=\"19\" cy=\"8\" r=\"2\" \/>\n      <circle cx=\"5\" cy=\"16\" r=\"2\" \/><circle cx=\"12\" cy=\"16\" r=\"2\" \/><circle cx=\"19\" cy=\"16\" r=\"2\" \/>\n    <\/svg>\n    GPIO\n  <\/div>\n  <div class=\"c-ui-rp-tile c-ui-rp-tile--gps\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n      <path d=\"M12 21s-6-5.4-6-11a6 6 0 0 1 12 0c0 5.6-6 11-6 11Z\" \/><circle cx=\"12\" cy=\"10\" r=\"2.2\" \/>\n    <\/svg>\n    GPS\n  <\/div>\n  <div class=\"c-ui-rp-tile c-ui-rp-tile--rs485\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n      <path d=\"M3 12h3l2-6 3 12 3-9 2 3h5\" \/>\n    <\/svg>\n    RS485\n  <\/div>\n\n  <!-- Interface tiles \u2014 right column -->\n  <div class=\"c-ui-rp-tile c-ui-rp-tile--right c-ui-rp-tile--usb\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n      <path d=\"M12 3v15M12 18l-4-3M12 15l4-3M8 15V9a2 2 0 1 1 0-.01M16 12V8h3v3\" \/><circle cx=\"12\" cy=\"20\" r=\"1.6\" \/>\n    <\/svg>\n    USB\n  <\/div>\n  <div class=\"c-ui-rp-tile c-ui-rp-tile--right c-ui-rp-tile--vlan\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n      <rect x=\"9\" y=\"3\" width=\"6\" height=\"5\" rx=\"1\" \/><rect x=\"3\" y=\"16\" width=\"6\" height=\"5\" rx=\"1\" \/><rect x=\"15\" y=\"16\" width=\"6\" height=\"5\" rx=\"1\" \/>\n      <path d=\"M12 8v4M12 12H6v4M12 12h6v4\" \/>\n    <\/svg>\n    VLAN\n  <\/div>\n  <div class=\"c-ui-rp-tile c-ui-rp-tile--right c-ui-rp-tile--ssd\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n      <rect x=\"3\" y=\"7\" width=\"18\" height=\"10\" rx=\"2\" \/><path d=\"M7 11v2M11 11v2M15 11v2\" \/>\n    <\/svg>\n    SSD\n  <\/div>\n<\/div>\n<\/div>\n\n\n\n<div class=\"l-grid-fixed v-cols-2 v-gap-24\">\n  <div class=\"c-card u-border-grad\">\n    <div class=\"c-card__body l-stack v-gap-8\">\n      <div class=\"c-icon-badge is-b600\"><svg class=\"c-icon-badge__icon\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 -960 960 960\" width=\"24\" height=\"24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M440-183v-274L200-596v274l240 139Zm80 0 240-139v-274L520-457v274Zm-40-343 237-137-237-137-237 137 237 137ZM160-252q-19-11-29.5-29T120-321v-318q0-22 10.5-40t29.5-29l280-161q19-11 40-11t40 11l280 161q19 11 29.5 29t10.5 40v318q0 22-10.5 40T800-252L520-91q-19 11-40 11t-40-11L160-252Zm320-228Z\"><\/path><\/svg><\/div>\n      <div class=\"fw-600\">Standard Kubernetes per Vehicle<\/div>\n      <div class=\"u-text-muted\">Control plane, kubelet and containerd run as a package of the Unwired Edge Cloud OS directly on the router and start with the device.<\/div>\n    <\/div>\n  <\/div>\n  <div class=\"c-card u-border-grad\">\n    <div class=\"c-card__body l-stack v-gap-8\">\n      <div class=\"c-icon-badge is-y600\"><svg class=\"c-icon-badge__icon\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 -960 960 960\" width=\"24\" height=\"24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M480-120q-75 0-140.5-28.5t-114-77q-48.5-48.5-77-114T120-480q0-75 28.5-140.5t77-114q48.5-48.5 114-77T480-840q82 0 155.5 35T760-706v-94h80v240H600v-80h110q-41-56-101-88t-129-32q-117 0-198.5 81.5T200-480q0 117 81.5 198.5T480-200q105 0 183.5-68T756-440h82q-15 137-117.5 228.5T480-120Zm112-192L440-464v-216h80v184l128 128-56 56Z\"><\/path><\/svg><\/div>\n      <div class=\"fw-600\">Application Updates Without a Firmware Build<\/div>\n      <div class=\"u-text-muted\">Operating system and applications have separate lifecycles: a new release needs no firmware build and no maintenance appointment.<\/div>\n    <\/div>\n  <\/div>\n  <div class=\"c-card u-border-grad u-grid-span v-span-2\">\n    <div class=\"c-card__body l-stack v-gap-8\">\n      <div class=\"c-icon-badge is-p700\"><svg class=\"c-icon-badge__icon\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 -960 960 960\" width=\"24\" height=\"24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M160-160v-80h109q-51-44-80-106t-29-134q0-112 68-197.5T400-790v84q-70 25-115 86.5T240-480q0 54 21.5 99.5T320-302v-98h80v240H160Zm440 0q-50 0-85-35t-35-85q0-48 33-82.5t81-36.5q17-36 50.5-58.5T720-480q53 0 91.5 34.5T858-360q42 0 72 29t30 70q0 42-29 71.5T860-160H600Zm116-360q-7-41-27-76t-49-62v98h-80v-240h240v80H691q43 38 70.5 89T797-520h-81ZM600-240h260q8 0 14-6t6-14q0-8-6-14t-14-6h-70v-50q0-29-20.5-49.5T720-400q-29 0-49.5 20.5T650-330v10h-50q-17 0-28.5 11.5T560-280q0 17 11.5 28.5T600-240Zm120-80Z\"><\/path><\/svg><\/div>\n      <div class=\"fw-600\">GitOps All the Way into the Vehicle<\/div>\n      <div class=\"u-text-muted\">You set up ArgoCD, Flux or Open Cluster Management yourself using the included Helm deployer. From then on, every vehicle pulls its desired state from your repository. One repository, hundreds of vehicles, no technician on site.<\/div>\n    <\/div>\n  <\/div>\n  <div class=\"c-card u-border-grad\">\n    <div class=\"c-card__body l-stack v-gap-8\">\n      <div class=\"c-icon-badge is-b600\"><svg class=\"c-icon-badge__icon\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 -960 960 960\" width=\"24\" height=\"24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"m480-400-80-80 80-80 80 80-80 80Zm-85-235L295-735l185-185 185 185-100 100-85-85-85 85ZM225-295 40-480l185-185 100 100-85 85 85 85-100 100Zm510 0L635-395l85-85-85-85 100-100 185 185-185 185ZM480-40 295-225l100-100 85 85 85-85 100 100L480-40Z\"><\/path><\/svg><\/div>\n      <div class=\"fw-600\">Access to the Vehicle Network<\/div>\n      <div class=\"u-text-muted\">With advanced networking, pods attach directly to VLANs or bridges of the in-vehicle network; the host firewall remains in control.<\/div>\n    <\/div>\n  <\/div>\n  <div class=\"c-card u-border-grad\">\n    <div class=\"c-card__body l-stack v-gap-8\">\n      <div class=\"c-icon-badge is-y600\"><svg class=\"c-icon-badge__icon\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 -960 960 960\" width=\"24\" height=\"24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"m422-232 207-248H469l29-227-185 267h139l-30 208ZM320-80l40-280H160l360-520h80l-40 320h240L400-80h-80Zm151-390Z\"><\/path><\/svg><\/div>\n      <div class=\"fw-600\">Access to the Hardware<\/div>\n      <div class=\"u-text-muted\">GPIO, GPS, RS485, USB, audio and DisplayPort are available to your containers through the integrated hardware access.<\/div>\n    <\/div>\n  <\/div>\n  <div class=\"c-card u-border-grad u-grid-span v-span-2\">\n    <div class=\"c-card__body l-stack v-gap-8\">\n      <div class=\"c-icon-badge is-p700\"><svg class=\"c-icon-badge__icon\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 -960 960 960\" width=\"24\" height=\"24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M120-240q-33 0-56.5-23.5T40-320q0-33 23.5-56.5T120-400h10.5q4.5 0 9.5 2l182-182q-2-5-2-9.5V-600q0-33 23.5-56.5T400-680q33 0 56.5 23.5T480-600q0 2-2 20l102 102q5-2 9.5-2h21q4.5 0 9.5 2l142-142q-2-5-2-9.5V-640q0-33 23.5-56.5T840-720q33 0 56.5 23.5T920-640q0 33-23.5 56.5T840-560h-10.5q-4.5 0-9.5-2L678-420q2 5 2 9.5v10.5q0 33-23.5 56.5T600-320q-33 0-56.5-23.5T520-400v-10.5q0-4.5 2-9.5L420-522q-5 2-9.5 2H400q-2 0-20-2L198-340q2 5 2 9.5v10.5q0 33-23.5 56.5T120-240Z\"><\/path><\/svg><\/div>\n      <div class=\"fw-600\">Observability Down to the Pod<\/div>\n      <div class=\"u-text-muted\">Logs and metrics stream in real time to the Unwired Edge Cloud via OpenTelemetry, and from there via OTLP or Prometheus remote_write into your existing monitoring. The firmware also watches the state of the Kubernetes service from the outside, even when nothing inside the cluster is reporting anymore.<\/div>\n    <\/div>\n  <\/div>\n  <div class=\"c-card u-border-grad\">\n    <div class=\"c-card__body l-stack v-gap-8\">\n      <div class=\"c-icon-badge is-b600\"><svg class=\"c-icon-badge__icon\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 -960 960 960\" width=\"24\" height=\"24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M120-160v-160h720v160H120Zm80-40h80v-80h-80v80Zm-80-440v-160h720v160H120Zm80-40h80v-80h-80v80Zm-80 280v-160h720v160H120Zm80-40h80v-80h-80v80Z\"><\/path><\/svg><\/div>\n      <div class=\"fw-600\">Persistent Storage<\/div>\n      <div class=\"u-text-muted\">Persistent Volumes live on a separate SSD or NVMe drive, apart from the operating system.<\/div>\n    <\/div>\n  <\/div>\n  <div class=\"c-card u-border-grad\">\n    <div class=\"c-card__body l-stack v-gap-8\">\n      <div class=\"c-icon-badge is-y600\"><svg class=\"c-icon-badge__icon\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 -960 960 960\" width=\"24\" height=\"24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M480-80q-139-35-229.5-159.5T160-516v-244l320-120 320 120v244q0 152-90.5 276.5T480-80Zm0-84q104-33 172-132t68-220v-189l-240-90-240 90v189q0 121 68 220t172 132Zm0-316Z\"><\/path><\/svg><\/div>\n      <div class=\"fw-600\">Failover Between Vehicles<\/div>\n      <div class=\"u-text-muted\">A sidecar container from Unwired manages a virtual service IP via VRRP across several routers; your application has a say through its health check.<\/div>\n    <\/div>\n  <\/div>\n  <div class=\"c-card u-border-grad u-grid-span v-span-2\">\n    <div class=\"c-card__body l-stack v-gap-8\">\n      <div class=\"c-icon-badge is-p700\"><svg class=\"c-icon-badge__icon\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 -960 960 960\" width=\"24\" height=\"24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"m344-60-76-128-144-32 14-148-98-112 98-112-14-148 144-32 76-128 136 58 136-58 76 128 144 32-14 148 98 112-98 112 14 148-144 32-76 128-136-58-136 58Zm34-102 102-44 104 44 56-96 110-26-10-112 74-84-74-86 10-112-110-24-58-96-102 44-104-44-56 96-110 24 10 112-74 86 74 84-10 114 110 24 58 96Zm102-318Zm-42 142 226-226-56-58-170 170-86-84-56 56 142 142Z\"><\/path><\/svg><\/div>\n      <div class=\"fw-600\">Maintained Base Services<\/div>\n      <div class=\"u-text-muted\">Networking, storage, observability, hardware access and failover come from Unwired as optional base services: tested, checked for vulnerabilities and kept current along with their dependencies. You can replace any of them with your own components.<\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">One Cluster per Vehicle.<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Every router runs its own single-node cluster. Multi-node clusters spanning several vehicles are deliberately not supported, and for good reason: a train is not an availability zone. Cars are coupled and uncoupled, links between vehicles break, devices fail one at a time. A cluster that had to hold a quorum across those boundaries would cause trouble exactly when you need it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That is why every cluster stays operational on its own, and high availability is built where it actually works in a vehicle: in the application itself and through the failover sidecar between devices. For your team, that means fewer edge cases in operation and behavior you can reproduce in the lab.<\/p>\n\n\n\n<div class=\"l-ui-scene\" role=\"img\" aria-label=\"Three cars of a train, each with a router running Kubernetes: the virtual service IP moves from master to backup via VRRP\"><link rel=\"stylesheet\" href=\"\/wp-content\/uploads\/wpcodebox\/149.css?v=1\">\n<div class=\"c-ui-scene c-ui-scene--service-ip c-ui-scene--system-bg js-ui-animated-scene\" data-ui-mode=\"service-ip\">\n  <div class=\"c-ui-bg-grid-fragment\" aria-hidden=\"true\"><\/div>\n\n  <div class=\"c-ui-chip-cluster c-ui-chip-cluster--vip-a\" aria-hidden=\"true\">\n    <span><\/span><span><\/span>\n  <\/div>\n  <div class=\"c-ui-chip-beam c-ui-chip-beam--vip\" aria-hidden=\"true\"><\/div>\n\n  <!-- Three coupled cars -->\n  <div class=\"c-ui-vip-train\" aria-hidden=\"true\">\n    <img decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/09\/train-with-cars-comp.png\" alt=\"\" width=\"1200\" height=\"740\" \/>\n  <\/div>\n\n  <!-- Arrows: pill bottom (~288\u2013324,116) \u2192 each cube's top vertex. Each packet\n       duplicates its path `d` inline (offset-path: url(#id) is unreliable\n       across engines). The marker id is scene-scoped so it stays unique\n       when several compositions share a page. -->\n  <svg class=\"c-ui-vip-arrows\" viewBox=\"0 0 450 450\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\">\n    <defs>\n      <marker id=\"c-ui-vip-arrowhead\" viewBox=\"0 0 10 10\" refX=\"8\" refY=\"5\" markerWidth=\"5\" markerHeight=\"5\" orient=\"auto-start-reverse\">\n        <path class=\"c-ui-vip-arrowhead\" d=\"M 0 0 L 10 5 L 0 10 z\" \/>\n      <\/marker>\n    <\/defs>\n    <path class=\"c-ui-vip-arrow is-car-1\" d=\"M 288 116 C 230 116, 175 96, 110 100\"  marker-end=\"url(#c-ui-vip-arrowhead)\" \/>\n    <path class=\"c-ui-vip-arrow is-car-2\" d=\"M 306 118 C 290 150, 262 165, 232 172\" marker-end=\"url(#c-ui-vip-arrowhead)\" \/>\n    <path class=\"c-ui-vip-arrow is-car-3\" d=\"M 324 118 C 334 160, 344 200, 344 242\" marker-end=\"url(#c-ui-vip-arrowhead)\" \/>\n    <circle class=\"c-ui-vip-packet is-car-1\" r=\"3.2\" style=\"offset-path: path('M 288 116 C 230 116, 175 96, 110 100');\" \/>\n    <circle class=\"c-ui-vip-packet is-car-2\" r=\"3.2\" style=\"offset-path: path('M 306 118 C 290 150, 262 165, 232 172');\" \/>\n    <circle class=\"c-ui-vip-packet is-car-3\" r=\"3.2\" style=\"offset-path: path('M 324 118 C 334 160, 344 200, 344 242');\" \/>\n  <\/svg>\n\n  <!-- Kubernetes cubes, one per car roof -->\n  <div class=\"c-ui-vip-cube c-ui-vip-cube--1\" aria-hidden=\"true\">\n    <img decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/09\/k8s-cube-comp.png\" alt=\"\" width=\"400\" height=\"434\" \/>\n  <\/div>\n  <div class=\"c-ui-vip-cube c-ui-vip-cube--2\" aria-hidden=\"true\">\n    <img decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/09\/k8s-cube-comp.png\" alt=\"\" width=\"400\" height=\"434\" \/>\n  <\/div>\n  <div class=\"c-ui-vip-cube c-ui-vip-cube--3\" aria-hidden=\"true\">\n    <img decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/09\/k8s-cube-comp.png\" alt=\"\" width=\"400\" height=\"434\" \/>\n  <\/div>\n\n  <!-- MASTER \/ BACKUP badges -->\n  <div class=\"c-ui-vip-status c-ui-vip-status--1\">\n    <span class=\"c-ui-vip-badge c-ui-vip-badge--master\"><span class=\"c-ui-vip-badge__dot\" aria-hidden=\"true\"><\/span>MASTER<\/span>\n    <span class=\"c-ui-vip-badge c-ui-vip-badge--backup\"><span class=\"c-ui-vip-badge__dot\" aria-hidden=\"true\"><\/span>BACKUP<\/span>\n  <\/div>\n  <div class=\"c-ui-vip-status c-ui-vip-status--2\">\n    <span class=\"c-ui-vip-badge c-ui-vip-badge--master\"><span class=\"c-ui-vip-badge__dot\" aria-hidden=\"true\"><\/span>MASTER<\/span>\n    <span class=\"c-ui-vip-badge c-ui-vip-badge--backup\"><span class=\"c-ui-vip-badge__dot\" aria-hidden=\"true\"><\/span>BACKUP<\/span>\n  <\/div>\n  <div class=\"c-ui-vip-status c-ui-vip-status--3\">\n    <span class=\"c-ui-vip-badge c-ui-vip-badge--master\"><span class=\"c-ui-vip-badge__dot\" aria-hidden=\"true\"><\/span>MASTER<\/span>\n    <span class=\"c-ui-vip-badge c-ui-vip-badge--backup\"><span class=\"c-ui-vip-badge__dot\" aria-hidden=\"true\"><\/span>BACKUP<\/span>\n  <\/div>\n\n  <!-- Floating Service-IP pill -->\n  <div class=\"c-ui-vip-pill\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n      <circle cx=\"12\" cy=\"12\" r=\"9\" \/><path d=\"M3 12h18M12 3c3 3.5 3 14.5 0 18M12 3c-3 3.5-3 14.5 0 18\" \/>\n    <\/svg>\n    Service-IP\n    <span class=\"c-ui-vip-pill__ip\">10.0.0.10<\/span>\n  <\/div>\n<\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Operations and Security from a Single Source.<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The Kubernetes service is part of the device configuration and is activated and rolled out through the <a href=\"https:\/\/unwirednetworks.com\/en\/solution-by-application\/device-management\/\">device management<\/a> of the Unwired Edge Cloud, just like modems, VLANs or WAN bonding. New Kubernetes versions arrive as package updates that Unwired releases regularly; before release, the operating system and the Kubernetes service go through automated tests, long-running tests on lab devices, and an SBOM and CVE check. You schedule operating system updates in rollout windows with limited concurrency, so the entire fleet never updates at the same time.<\/p>\n\n\n\n<div class=\"l-ui-scene\" role=\"img\" aria-label=\"A Helm chart from the Git repository is rolled out to the Kubernetes cluster on the train via GitOps\"><link rel=\"stylesheet\" href=\"\/wp-content\/uploads\/wpcodebox\/151.css?v=1\">\n\n<div class=\"c-ui-scene c-ui-scene--gitops c-ui-scene--system-bg js-ui-animated-scene\" data-ui-mode=\"gitops\">\n  <div class=\"c-ui-bg-grid-fragment\" aria-hidden=\"true\"><\/div>\n\n  <!-- Top-right cluster is a single row (2 chips) so nothing dark sits\n       behind the wire \/ GitOps pill \/ cube. -->\n  <div class=\"c-ui-chip-cluster c-ui-chip-cluster--gd-a\" aria-hidden=\"true\">\n    <span><\/span><span><\/span>\n  <\/div>\n  <div class=\"c-ui-chip-cluster c-ui-chip-cluster--gd-b\" aria-hidden=\"true\">\n    <span><\/span><span><\/span><span><\/span><span><\/span>\n  <\/div>\n  <div class=\"c-ui-chip-beam c-ui-chip-beam--gd\" aria-hidden=\"true\"><\/div>\n\n  <!-- Wire: Helm card (top-left) \u2192 cube on the train (bottom-right).\n       The dot duplicates the path `d` inline because\n       offset-path: url(#id) is unreliable across engines. -->\n  <svg class=\"c-ui-gd-connectors\" viewBox=\"0 0 450 450\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\">\n    <path id=\"c-ui-gd-path\" class=\"c-ui-gd-connector\" d=\"M 170 207 C 170 248, 255 237, 315 244\" \/>\n    <circle class=\"c-ui-gd-connector-dot\" r=\"3.5\" style=\"offset-path: path('M 170 207 C 170 248, 255 237, 315 244');\" \/>\n  <\/svg>\n\n  <!-- Helm chart card \u2014 the desired state in git -->\n  <div class=\"c-ui-window c-ui-window--gd-chart\">\n    <div class=\"c-ui-window__header\">\n      <span>Helm Chart<\/span>\n      <span class=\"c-ui-gd-branch\">\n        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n          <circle cx=\"6\" cy=\"5\" r=\"2.2\" \/><circle cx=\"6\" cy=\"19\" r=\"2.2\" \/><circle cx=\"18\" cy=\"8\" r=\"2.2\" \/>\n          <path d=\"M6 7.2v9.6M18 10.2c0 3.5-3 4.6-6 5.2-2.2.4-4.2 1-5.4 2.4\" \/>\n        <\/svg>\n        main\n      <\/span>\n    <\/div>\n    <div class=\"c-ui-window__body c-ui-gd-body\">\n      <div class=\"c-ui-gd-chart\">\n        <span class=\"c-ui-gd-chart__icon\" aria-hidden=\"true\">\n          <!-- Isometric box = \"chart \/ package\" glyph -->\n          <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n            <path d=\"M12 2.5 21 7v10l-9 4.5L3 17V7l9-4.5Z\" \/>\n            <path d=\"M3 7l9 4.5L21 7M12 11.5v10\" \/>\n          <\/svg>\n        <\/span>\n        <div class=\"c-ui-gd-chart__meta\">\n          <span class=\"c-ui-gd-chart__name\">app<\/span>\n          <span class=\"c-ui-gd-chart__version\">v2.3.1<\/span>\n        <\/div>\n      <\/div>\n\n      <div class=\"c-ui-gd-commit\">\n        <span class=\"c-ui-gd-commit__sha\">a3f9c1e<\/span>\n        <span class=\"c-ui-gd-commit__msg\">chore: bump image tag<\/span>\n      <\/div>\n\n      <div class=\"c-ui-gd-status\">\n        <span class=\"c-ui-gd-state c-ui-gd-state--pushed\">\n          <span class=\"c-ui-gd-state__dot\" aria-hidden=\"true\"><\/span>\n          Commit pushed\n        <\/span>\n        <span class=\"c-ui-gd-state c-ui-gd-state--syncing\">\n          <span class=\"c-ui-gd-state__dot\" aria-hidden=\"true\"><\/span>\n          Syncing to fleet<span class=\"c-ui-gd-ellipsis\" aria-hidden=\"true\"><\/span>\n        <\/span>\n        <span class=\"c-ui-gd-state c-ui-gd-state--synced\">\n          <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n            <path d=\"M4 12.5 9.5 18 20 7\" \/>\n          <\/svg>\n          Deployed \u00b7 in sync\n        <\/span>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <!-- \"GitOps\" pill on the wire -->\n  <div class=\"c-ui-gd-pill\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n      <circle cx=\"6\" cy=\"5\" r=\"2.2\" \/><circle cx=\"6\" cy=\"19\" r=\"2.2\" \/><circle cx=\"18\" cy=\"8\" r=\"2.2\" \/>\n      <path d=\"M6 7.2v9.6M18 10.2c0 3.5-3 4.6-6 5.2-2.2.4-4.2 1-5.4 2.4\" \/>\n    <\/svg>\n    GitOps\n  <\/div>\n\n  <!-- Train \u2014 bottom right -->\n  <div class=\"c-ui-gd-train\" aria-hidden=\"true\">\n    <img decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/09\/train-single.svg\" alt=\"\" width=\"342\" height=\"250\" \/>\n  <\/div>\n\n  <!-- Kubernetes cube on the train roof -->\n  <div class=\"c-ui-gd-cube\" aria-hidden=\"true\">\n    <img decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/09\/k8s-cube-comp.png\" alt=\"\" width=\"400\" height=\"434\" \/>\n  <\/div>\n<\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">For tenders and audits, that counts twice. Containers run isolated from the host system, workloads follow Pod Security Standards as non-root with resource limits, and <a href=\"https:\/\/unwirednetworks.com\/en\/solution-by-application\/observability\/\">observability<\/a> provides the version evidence that CRA, NIS2 and ISO 27001 demand across the lifecycle. You meet those requirements with the same platform you use to manage devices and network.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">When the Standard Edition Is Enough.<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Not every application needs Kubernetes. Unwired Edge Compute Standard runs lightweight OCI containers and is available across the entire device portfolio. For a single service with a clear job, such as an onboard portal or an interface integration, it is the right choice. The overview shows what a vehicle router does without Edge Compute, what the Standard edition adds, and what only comes with Kubernetes:<\/p>\n\n\n\n<div class=\"l-ui-scene\" role=\"img\" aria-label=\"Lightweight OCI containers run side by side on a vehicle router\"><link rel=\"stylesheet\" href=\"\/wp-content\/uploads\/wpcodebox\/54.css?v=1\">\n\n<div class=\"c-ui-scene c-ui-scene--containers c-ui-scene--system-bg js-ui-animated-scene\" data-ui-mode=\"containers\">\n  <div class=\"c-ui-bg-grid-fragment\" aria-hidden=\"true\"><\/div>\n\n  <div class=\"c-ui-chip-cluster c-ui-chip-cluster--con-a\" aria-hidden=\"true\">\n    <span><\/span><span><\/span><span><\/span><span><\/span><span><\/span>\n  <\/div>\n  <div class=\"c-ui-chip-cluster c-ui-chip-cluster--con-b\" aria-hidden=\"true\">\n    <span><\/span><span><\/span><span><\/span><span><\/span>\n  <\/div>\n  <div class=\"c-ui-chip-beam c-ui-chip-beam--con\" aria-hidden=\"true\"><\/div>\n\n  <div class=\"c-ui-con-group\" role=\"img\" aria-label=\"Three edge computing containers\">\n\n    <div class=\"c-ui-con-col\" aria-hidden=\"true\">\n      <div class=\"c-ui-con-pill c-ui-con-pill--cra\">\n        <svg class=\"c-ui-con-pill__icon\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 -960 960 960\" fill=\"currentColor\">\n          <path d=\"m438-338 226-226-57-57-169 169-84-84-57 57 141 141Zm42 258q-139-35-229.5-159.5T160-516v-244l320-120 320 120v244q0 152-90.5 276.5T480-80Zm0-84q104-33 172-132t68-220v-189l-240-90-240 90v189q0 121 68 220t172 132Zm0-316Z\"\/>\n        <\/svg>\n        CRA Ready\n      <\/div>\n      <div class=\"c-ui-con-item\">\n        <img decoding=\"async\" class=\"c-ui-con-img c-ui-con-img--1\" src=\"\/wp-content\/uploads\/2026\/05\/container-1.png\" alt=\"\" \/>\n        <div class=\"c-ui-con-floor\" aria-hidden=\"true\"><\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"c-ui-con-col c-ui-con-col--center\" aria-hidden=\"true\">\n      <div class=\"c-ui-con-pill c-ui-con-pill--analytics\">\n        <svg class=\"c-ui-con-pill__icon\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 -960 960 960\" fill=\"currentColor\">\n          <path d=\"M120-120v-80l80-80v160h-80Zm160 0v-240l80-80v320h-80Zm160 0v-320l80 81v239h-80Zm160 0v-239l80-80v319h-80Zm160 0v-400l80-80v480h-80ZM120-327v-113l280-280 160 160 280-280v113L560-447 400-607 120-327Z\"\/>\n        <\/svg>\n        Analytics &amp; Logs\n      <\/div>\n      <div class=\"c-ui-con-item\">\n        <img decoding=\"async\" class=\"c-ui-con-img c-ui-con-img--2\" src=\"\/wp-content\/uploads\/2026\/05\/container3_uw.png\" alt=\"\" \/>\n        <div class=\"c-ui-con-floor\" aria-hidden=\"true\"><\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"c-ui-con-col\" aria-hidden=\"true\">\n      <div class=\"c-ui-con-pill c-ui-con-pill--nis2\">\n        <svg class=\"c-ui-con-pill__icon\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 -960 960 960\" fill=\"currentColor\">\n          <path d=\"M240-640h360v-80q0-50-35-85t-85-35q-50 0-85 35t-35 85h-80q0-83 58.5-141.5T480-920q83 0 141.5 58.5T680-720v80h40q33 0 56.5 23.5T800-560v400q0 33-23.5 56.5T720-80H240q-33 0-56.5-23.5T160-160v-400q0-33 23.5-56.5T240-640Zm240 200q-33 0-56.5 23.5T400-360q0 33 23.5 56.5T480-280q33 0 56.5-23.5T560-360q0-33-23.5-56.5T480-440Z\"\/>\n        <\/svg>\n        NIS 2 Ready\n      <\/div>\n      <div class=\"c-ui-con-item\">\n        <img decoding=\"async\" class=\"c-ui-con-img c-ui-con-img--3\" src=\"\/wp-content\/uploads\/2026\/05\/container-2.png\" alt=\"\" \/>\n        <div class=\"c-ui-con-floor\" aria-hidden=\"true\"><\/div>\n      <\/div>\n    <\/div>\n\n  <\/div>\n<\/div>\n<\/div>\n\n\n\n<figure class=\"wp-block-table is-style-uw-compare\"><table><thead><tr><th><\/th><th>Without Edge Compute<\/th><th>Standard<\/th><th>Kubernetes<\/th><\/tr><\/thead><tbody><tr><td>Device management, WAN bonding, passenger Wi-Fi from the Unwired Edge Cloud<\/td><td><span class=\"c-compare__icon--yes\">\u2713<\/span><\/td><td><span class=\"c-compare__icon--yes\">\u2713<\/span><\/td><td><span class=\"c-compare__icon--yes\">\u2713<\/span><\/td><\/tr><tr><td>Observability for router and network<\/td><td><span class=\"c-compare__icon--yes\">\u2713<\/span><\/td><td><span class=\"c-compare__icon--yes\">\u2713<\/span><\/td><td><span class=\"c-compare__icon--yes\">\u2713<\/span><\/td><\/tr><tr><td>Applications run on the vehicle router instead of on separate hardware<\/td><td><span class=\"c-compare__icon--no\">\u2717<\/span><\/td><td><span class=\"c-compare__icon--yes\">\u2713<\/span><\/td><td><span class=\"c-compare__icon--yes\">\u2713<\/span><\/td><\/tr><tr><td>OCI containers, isolated from the host system<\/td><td><span class=\"c-compare__icon--no\">\u2717<\/span><\/td><td><span class=\"c-compare__icon--yes\">\u2713<\/span><\/td><td><span class=\"c-compare__icon--yes\">\u2713<\/span><\/td><\/tr><tr><td>Application updates without a firmware build<\/td><td><span class=\"c-compare__icon--no\">\u2717<\/span><\/td><td><span class=\"c-compare__icon--yes\">\u2713<\/span><\/td><td><span class=\"c-compare__icon--yes\">\u2713<\/span><\/td><\/tr><tr><td>Activation and rollout from the Unwired Edge Cloud<\/td><td><span class=\"c-compare__icon--no\">\u2717<\/span><\/td><td><span class=\"c-compare__icon--yes\">\u2713<\/span><\/td><td><span class=\"c-compare__icon--yes\">\u2713<\/span><\/td><\/tr><tr><td>Access to VLANs of the in-vehicle network<\/td><td><span class=\"c-compare__icon--no\">\u2717<\/span><\/td><td><span class=\"c-compare__icon--yes\">\u2713<\/span><\/td><td><span class=\"c-compare__icon--yes\">\u2713<\/span><\/td><\/tr><tr><td>Access to physical interfaces (CAN, RS485, GPIO, GPS, USB)<\/td><td><span class=\"c-compare__icon--no\">\u2717<\/span><\/td><td><span class=\"c-compare__icon--yes\">\u2713<\/span><\/td><td><span class=\"c-compare__icon--yes\">\u2713<\/span><\/td><\/tr><tr><td>Persistent storage on internal SSD<\/td><td><span class=\"c-compare__icon--no\">\u2717<\/span><\/td><td><span class=\"c-compare__icon--yes\">\u2713<\/span><\/td><td><span class=\"c-compare__icon--yes\">\u2713<\/span><\/td><\/tr><tr><td>Runs across the entire device portfolio, from 1 CPU core and 256 MB RAM<\/td><td><span class=\"c-compare__icon--yes\">\u2713<\/span><\/td><td><span class=\"c-compare__icon--yes\">\u2713<\/span><\/td><td><span class=\"c-compare__icon--no\">\u2717<\/span><\/td><\/tr><tr><td>Standard Kubernetes API, Helm charts, CRDs<\/td><td><span class=\"c-compare__icon--no\">\u2717<\/span><\/td><td><span class=\"c-compare__icon--no\">\u2717<\/span><\/td><td><span class=\"c-compare__icon--yes\">\u2713<\/span><\/td><\/tr><tr><td>GitOps deployment with ArgoCD, Flux or Open Cluster Management<\/td><td><span class=\"c-compare__icon--no\">\u2717<\/span><\/td><td><span class=\"c-compare__icon--no\">\u2717<\/span><\/td><td><span class=\"c-compare__icon--yes\">\u2713<\/span><\/td><\/tr><tr><td>Orchestration of multiple services (Deployments, StatefulSets)<\/td><td><span class=\"c-compare__icon--no\">\u2717<\/span><\/td><td><span class=\"c-compare__icon--no\">\u2717<\/span><\/td><td><span class=\"c-compare__icon--yes\">\u2713<\/span><\/td><\/tr><tr><td>Advanced networking, multiple network interfaces per pod<\/td><td><span class=\"c-compare__icon--no\">\u2717<\/span><\/td><td><span class=\"c-compare__icon--no\">\u2717<\/span><\/td><td><span class=\"c-compare__icon--yes\">\u2713<\/span><\/td><\/tr><tr><td>Persistent Volumes for Kubernetes workloads on SSD or NVMe<\/td><td><span class=\"c-compare__icon--no\">\u2717<\/span><\/td><td><span class=\"c-compare__icon--no\">\u2717<\/span><\/td><td><span class=\"c-compare__icon--yes\">\u2713<\/span><\/td><\/tr><tr><td>Failover between vehicles with a virtual service IP<\/td><td><span class=\"c-compare__icon--no\">\u2717<\/span><\/td><td><span class=\"c-compare__icon--no\">\u2717<\/span><\/td><td><span class=\"c-compare__icon--yes\">\u2713<\/span><\/td><\/tr><tr><td>Pod Security Standards, resource limits, probes<\/td><td><span class=\"c-compare__icon--no\">\u2717<\/span><\/td><td><span class=\"c-compare__icon--no\">\u2717<\/span><\/td><td><span class=\"c-compare__icon--yes\">\u2713<\/span><\/td><\/tr><tr><td>Container logs and metrics in real time to the Unwired Edge Cloud and on to your own monitoring systems<\/td><td><span class=\"c-compare__icon--no\">\u2717<\/span><\/td><td><span class=\"c-compare__icon--yes\">\u2713<\/span><\/td><td><span class=\"c-compare__icon--yes\">\u2713<\/span><\/td><\/tr><tr><td>Base services for networking, storage, observability, hardware access and failover, maintained by Unwired<\/td><td><span class=\"c-compare__icon--no\">\u2717<\/span><\/td><td><span class=\"c-compare__icon--no\">\u2717<\/span><\/td><td><span class=\"c-compare__icon--yes\">\u2713<\/span><\/td><\/tr><tr><td>Minimum requirements<\/td><td>none<\/td><td>1 core, 256 MB RAM<\/td><td>2 cores, 1 GB RAM, SSD or NVMe<\/td><\/tr><\/tbody><\/table><figcaption class=\"wp-element-caption\">Without Edge Compute = vehicle router for network and Wi-Fi, applications on separate hardware. Standard = Unwired Edge Compute Standard (lightweight OCI containers). Kubernetes = Unwired Edge Compute for Kubernetes (single-node cluster per vehicle).<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Unwired Edge Compute for Kubernetes pays off as soon as an application consists of several services, comes as a Helm chart, or your team already works with GitOps. It requires an x64 or arm64 router with SSD or NVMe; large rail routers and onboard servers have that on board. For such devices, Unwired recommends the Kubernetes edition for all new projects.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion.<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Kubernetes on the vehicle router means your onboard application rides into the train with the same toolbox it was built with. No additional box, no firmware build for a software update, no technician at the vehicle for a release. How both editions fit into the edge computing platform of the Unwired Edge Cloud is covered on our page on <a href=\"https:\/\/unwirednetworks.com\/en\/solution-by-technology\/edge-computing\/\">edge computing with a container runtime on vehicle routers<\/a>. Whether your application runs on your routers is something we can settle fastest together: <a href=\"https:\/\/unwirednetworks.com\/en\/see-demo\/\">start a demo<\/a> or <a href=\"https:\/\/unwirednetworks.com\/en\/contact\/\">get in touch<\/a>.<\/p>\n\n\n\n<div class=\"wp-block-group c-post-faq\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 id=\"faq\" class=\"wp-block-heading h1\">FAQ<\/h2>\n\n\n\n<div data-wp-context=\"{ &quot;autoclose&quot;: false, &quot;accordionItems&quot;: [] }\" data-wp-interactive=\"core\/accordion\" role=\"group\" class=\"wp-block-accordion c-faq c-faq--rankmath is-layout-flow wp-block-accordion-is-layout-flow\">\n<div data-wp-class--is-open=\"state.isOpen\" data-wp-context=\"{ &quot;id&quot;: &quot;accordion-item-1&quot;, &quot;openByDefault&quot;: false }\" data-wp-init=\"callbacks.initAccordionItems\" data-wp-on-window--hashchange=\"callbacks.hashChange\" class=\"wp-block-accordion-item is-layout-flow wp-block-accordion-item-is-layout-flow\">\n<h3 class=\"wp-block-accordion-heading\"><button aria-expanded=\"false\" aria-controls=\"accordion-item-1-panel\" data-wp-bind--aria-expanded=\"state.isOpen\" data-wp-on--click=\"actions.toggle\" id=\"accordion-item-1\" type=\"button\" class=\"wp-block-accordion-heading__toggle\"><span class=\"wp-block-accordion-heading__toggle-title\">Can you run Kubernetes on a vehicle router?<\/span><span class=\"wp-block-accordion-heading__toggle-icon\" aria-hidden=\"true\">+<\/span><\/button><\/h3>\n\n\n\n<div aria-labelledby=\"accordion-item-1\" data-wp-bind--hidden=\"state.isHidden\" data-wp-on--beforematch=\"actions.handleBeforeMatch\" id=\"accordion-item-1-panel\" role=\"region\" class=\"wp-block-accordion-panel is-layout-flow wp-block-accordion-panel-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Yes, if the router has enough resources and the operating system ships a Kubernetes service. A vehicle router is an industrial Linux device with modems, Ethernet and Wi-Fi; on capable models with two or more CPU cores, at least 1 GB RAM and an SSD, it can run a single-node Kubernetes cluster that executes onboard applications as pods. Unwired Edge Compute for Kubernetes delivers this service as a package of the Unwired Edge Cloud OS, activated through the device management of the Unwired Edge Cloud. Applications are described with standard Kubernetes manifests or Helm charts and rolled out via GitOps.<\/p>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<div data-wp-context=\"{ &quot;autoclose&quot;: false, &quot;accordionItems&quot;: [] }\" data-wp-interactive=\"core\/accordion\" role=\"group\" class=\"wp-block-accordion is-layout-flow wp-block-accordion-is-layout-flow\">\n<div data-wp-class--is-open=\"state.isOpen\" data-wp-context=\"{ &quot;id&quot;: &quot;accordion-item-2&quot;, &quot;openByDefault&quot;: false }\" data-wp-init=\"callbacks.initAccordionItems\" data-wp-on-window--hashchange=\"callbacks.hashChange\" class=\"wp-block-accordion-item is-layout-flow wp-block-accordion-item-is-layout-flow\">\n<h3 class=\"wp-block-accordion-heading\"><button aria-expanded=\"false\" aria-controls=\"accordion-item-2-panel\" data-wp-bind--aria-expanded=\"state.isOpen\" data-wp-on--click=\"actions.toggle\" id=\"accordion-item-2\" type=\"button\" class=\"wp-block-accordion-heading__toggle\"><span class=\"wp-block-accordion-heading__toggle-title\">Why Kubernetes in the vehicle and not in the data center or the cloud?<\/span><span class=\"wp-block-accordion-heading__toggle-icon\" aria-hidden=\"true\">+<\/span><\/button><\/h3>\n\n\n\n<div aria-labelledby=\"accordion-item-2\" data-wp-bind--hidden=\"state.isHidden\" data-wp-on--beforematch=\"actions.handleBeforeMatch\" id=\"accordion-item-2-panel\" role=\"region\" class=\"wp-block-accordion-panel is-layout-flow wp-block-accordion-panel-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Because many onboard applications have to run where the data and the hardware are. Passenger information, passenger counting, video analytics and diagnostics need access to cameras, sensors, GPS, serial interfaces and the in-vehicle network, and they have to keep working when the train or bus has no connection. Unwired Edge Compute for Kubernetes brings the deployment standard from the data center to that place: the same manifests, Helm charts and GitOps tools, just on the router instead of a server. The cloud stays responsible for device management, observability and distributing new versions, not for running the pods.<\/p>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<div data-wp-context=\"{ &quot;autoclose&quot;: false, &quot;accordionItems&quot;: [] }\" data-wp-interactive=\"core\/accordion\" role=\"group\" class=\"wp-block-accordion is-layout-flow wp-block-accordion-is-layout-flow\">\n<div data-wp-class--is-open=\"state.isOpen\" data-wp-context=\"{ &quot;id&quot;: &quot;accordion-item-3&quot;, &quot;openByDefault&quot;: false }\" data-wp-init=\"callbacks.initAccordionItems\" data-wp-on-window--hashchange=\"callbacks.hashChange\" class=\"wp-block-accordion-item is-layout-flow wp-block-accordion-item-is-layout-flow\">\n<h3 class=\"wp-block-accordion-heading\"><button aria-expanded=\"false\" aria-controls=\"accordion-item-3-panel\" data-wp-bind--aria-expanded=\"state.isOpen\" data-wp-on--click=\"actions.toggle\" id=\"accordion-item-3\" type=\"button\" class=\"wp-block-accordion-heading__toggle\"><span class=\"wp-block-accordion-heading__toggle-title\">Is Kubernetes on a router full Kubernetes or a stripped-down variant?<\/span><span class=\"wp-block-accordion-heading__toggle-icon\" aria-hidden=\"true\">+<\/span><\/button><\/h3>\n\n\n\n<div aria-labelledby=\"accordion-item-3\" data-wp-bind--hidden=\"state.isHidden\" data-wp-on--beforematch=\"actions.handleBeforeMatch\" id=\"accordion-item-3-panel\" role=\"region\" class=\"wp-block-accordion-panel is-layout-flow wp-block-accordion-panel-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Full Kubernetes in a single-node configuration. The router runs the control plane with embedded etcd, kubelet and containerd as the container runtime; the standard Kubernetes API is available, as are Deployments, StatefulSets, ConfigMaps, Secrets and CRDs. What is missing is the distribution of a cluster across several nodes. In Unwired Edge Compute for Kubernetes, the Unwired Kubernetes Service (unwired-ks) takes on this role; Helm, ArgoCD, Flux and Open Cluster Management work as they do on any other cluster.<\/p>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<div data-wp-context=\"{ &quot;autoclose&quot;: false, &quot;accordionItems&quot;: [] }\" data-wp-interactive=\"core\/accordion\" role=\"group\" class=\"wp-block-accordion is-layout-flow wp-block-accordion-is-layout-flow\">\n<div data-wp-class--is-open=\"state.isOpen\" data-wp-context=\"{ &quot;id&quot;: &quot;accordion-item-4&quot;, &quot;openByDefault&quot;: false }\" data-wp-init=\"callbacks.initAccordionItems\" data-wp-on-window--hashchange=\"callbacks.hashChange\" class=\"wp-block-accordion-item is-layout-flow wp-block-accordion-item-is-layout-flow\">\n<h3 class=\"wp-block-accordion-heading\"><button aria-expanded=\"false\" aria-controls=\"accordion-item-4-panel\" data-wp-bind--aria-expanded=\"state.isOpen\" data-wp-on--click=\"actions.toggle\" id=\"accordion-item-4\" type=\"button\" class=\"wp-block-accordion-heading__toggle\"><span class=\"wp-block-accordion-heading__toggle-title\">Why a single-node cluster per vehicle and not one cluster across the whole train?<\/span><span class=\"wp-block-accordion-heading__toggle-icon\" aria-hidden=\"true\">+<\/span><\/button><\/h3>\n\n\n\n<div aria-labelledby=\"accordion-item-4\" data-wp-bind--hidden=\"state.isHidden\" data-wp-on--beforematch=\"actions.handleBeforeMatch\" id=\"accordion-item-4-panel\" role=\"region\" class=\"wp-block-accordion-panel is-layout-flow wp-block-accordion-panel-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Because a train is not an availability zone. Multi-node Kubernetes relies on stable links between nodes to hold a quorum; in a vehicle, cars are coupled and uncoupled, links between vehicles break and devices fail one at a time. A cluster that had to reach consensus across those boundaries would be unstable exactly when it is needed. That is why Unwired Edge Compute for Kubernetes deliberately runs an independent cluster per router. High availability is built at the application level or through a failover sidecar that manages a virtual service IP via VRRP across several routers.<\/p>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<div data-wp-context=\"{ &quot;autoclose&quot;: false, &quot;accordionItems&quot;: [] }\" data-wp-interactive=\"core\/accordion\" role=\"group\" class=\"wp-block-accordion is-layout-flow wp-block-accordion-is-layout-flow\">\n<div data-wp-class--is-open=\"state.isOpen\" data-wp-context=\"{ &quot;id&quot;: &quot;accordion-item-5&quot;, &quot;openByDefault&quot;: false }\" data-wp-init=\"callbacks.initAccordionItems\" data-wp-on-window--hashchange=\"callbacks.hashChange\" class=\"wp-block-accordion-item is-layout-flow wp-block-accordion-item-is-layout-flow\">\n<h3 class=\"wp-block-accordion-heading\"><button aria-expanded=\"false\" aria-controls=\"accordion-item-5-panel\" data-wp-bind--aria-expanded=\"state.isOpen\" data-wp-on--click=\"actions.toggle\" id=\"accordion-item-5\" type=\"button\" class=\"wp-block-accordion-heading__toggle\"><span class=\"wp-block-accordion-heading__toggle-title\">What happens to Kubernetes in the vehicle when the connection drops?<\/span><span class=\"wp-block-accordion-heading__toggle-icon\" aria-hidden=\"true\">+<\/span><\/button><\/h3>\n\n\n\n<div aria-labelledby=\"accordion-item-5\" data-wp-bind--hidden=\"state.isHidden\" data-wp-on--beforematch=\"actions.handleBeforeMatch\" id=\"accordion-item-5-panel\" role=\"region\" class=\"wp-block-accordion-panel is-layout-flow wp-block-accordion-panel-is-layout-flow\">\n<p class=\"wp-block-paragraph\">The cluster keeps running, because the control plane and the workloads are local to the router and the Kubernetes API is reachable on the device. The connection to the cloud is needed for device management, forwarding logs and metrics, and syncing with the GitOps repository, not for running the pods. A pull-based GitOps tool such as ArgoCD or Flux fetches the desired state as soon as a connection is back. In Unwired Edge Compute for Kubernetes, the firmware additionally records the state of the Kubernetes service, so the Unwired Edge Cloud still reports whether service and node are running even when nothing is getting through inside the cluster itself.<\/p>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<div data-wp-context=\"{ &quot;autoclose&quot;: false, &quot;accordionItems&quot;: [] }\" data-wp-interactive=\"core\/accordion\" role=\"group\" class=\"wp-block-accordion is-layout-flow wp-block-accordion-is-layout-flow\">\n<div data-wp-class--is-open=\"state.isOpen\" data-wp-context=\"{ &quot;id&quot;: &quot;accordion-item-6&quot;, &quot;openByDefault&quot;: false }\" data-wp-init=\"callbacks.initAccordionItems\" data-wp-on-window--hashchange=\"callbacks.hashChange\" class=\"wp-block-accordion-item is-layout-flow wp-block-accordion-item-is-layout-flow\">\n<h3 class=\"wp-block-accordion-heading\"><button aria-expanded=\"false\" aria-controls=\"accordion-item-6-panel\" data-wp-bind--aria-expanded=\"state.isOpen\" data-wp-on--click=\"actions.toggle\" id=\"accordion-item-6\" type=\"button\" class=\"wp-block-accordion-heading__toggle\"><span class=\"wp-block-accordion-heading__toggle-title\">What hardware does Kubernetes on a vehicle router need?<\/span><span class=\"wp-block-accordion-heading__toggle-icon\" aria-hidden=\"true\">+<\/span><\/button><\/h3>\n\n\n\n<div aria-labelledby=\"accordion-item-6\" data-wp-bind--hidden=\"state.isHidden\" data-wp-on--beforematch=\"actions.handleBeforeMatch\" id=\"accordion-item-6-panel\" role=\"region\" class=\"wp-block-accordion-panel is-layout-flow wp-block-accordion-panel-is-layout-flow\">\n<p class=\"wp-block-paragraph\">An x64 or arm64 device with at least two CPU cores, 1 GB RAM and persistent storage such as SSD or NVMe. In Unwired Edge Compute for Kubernetes, the base system uses about 0.3 CPU cores and 500 MB RAM, with the rest available to your applications; for storage, plan at least 4 GB plus container images and data. Large rail routers and onboard servers have these reserves. Smaller routers with one CPU core and 256 MB RAM run containers with Unwired Edge Compute Standard. The <a href=\"https:\/\/unwirednetworks.com\/en\/supported-devices-unwired-edge-cloud\/\">list of supported devices<\/a> shows which devices are supported.<\/p>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<div data-wp-context=\"{ &quot;autoclose&quot;: false, &quot;accordionItems&quot;: [] }\" data-wp-interactive=\"core\/accordion\" role=\"group\" class=\"wp-block-accordion is-layout-flow wp-block-accordion-is-layout-flow\">\n<div data-wp-class--is-open=\"state.isOpen\" data-wp-context=\"{ &quot;id&quot;: &quot;accordion-item-7&quot;, &quot;openByDefault&quot;: false }\" data-wp-init=\"callbacks.initAccordionItems\" data-wp-on-window--hashchange=\"callbacks.hashChange\" class=\"wp-block-accordion-item is-layout-flow wp-block-accordion-item-is-layout-flow\">\n<h3 class=\"wp-block-accordion-heading\"><button aria-expanded=\"false\" aria-controls=\"accordion-item-7-panel\" data-wp-bind--aria-expanded=\"state.isOpen\" data-wp-on--click=\"actions.toggle\" id=\"accordion-item-7\" type=\"button\" class=\"wp-block-accordion-heading__toggle\"><span class=\"wp-block-accordion-heading__toggle-title\">Which onboard applications are suited to Kubernetes on the vehicle router?<\/span><span class=\"wp-block-accordion-heading__toggle-icon\" aria-hidden=\"true\">+<\/span><\/button><\/h3>\n\n\n\n<div aria-labelledby=\"accordion-item-7\" data-wp-bind--hidden=\"state.isHidden\" data-wp-on--beforematch=\"actions.handleBeforeMatch\" id=\"accordion-item-7-panel\" role=\"region\" class=\"wp-block-accordion-panel is-layout-flow wp-block-accordion-panel-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Applications made of several services that come as a Helm chart or are meant to be rolled out via GitOps: passenger information systems with a database and interfaces, automatic passenger counting with analysis, video analytics, diagnostics and telemetry stacks. A single service with a clear job, such as an onboard portal for passenger Wi-Fi, a VPN or an interface integration, does not need Kubernetes; lightweight OCI containers are enough for that, at Unwired the Edge Compute Standard edition. For capable devices, Unwired recommends Unwired Edge Compute for Kubernetes for all new projects.<\/p>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<div data-wp-context=\"{ &quot;autoclose&quot;: false, &quot;accordionItems&quot;: [] }\" data-wp-interactive=\"core\/accordion\" role=\"group\" class=\"wp-block-accordion is-layout-flow wp-block-accordion-is-layout-flow\">\n<div data-wp-class--is-open=\"state.isOpen\" data-wp-context=\"{ &quot;id&quot;: &quot;accordion-item-8&quot;, &quot;openByDefault&quot;: false }\" data-wp-init=\"callbacks.initAccordionItems\" data-wp-on-window--hashchange=\"callbacks.hashChange\" class=\"wp-block-accordion-item is-layout-flow wp-block-accordion-item-is-layout-flow\">\n<h3 class=\"wp-block-accordion-heading\"><button aria-expanded=\"false\" aria-controls=\"accordion-item-8-panel\" data-wp-bind--aria-expanded=\"state.isOpen\" data-wp-on--click=\"actions.toggle\" id=\"accordion-item-8\" type=\"button\" class=\"wp-block-accordion-heading__toggle\"><span class=\"wp-block-accordion-heading__toggle-title\">How are Kubernetes and the applications in the vehicle updated?<\/span><span class=\"wp-block-accordion-heading__toggle-icon\" aria-hidden=\"true\">+<\/span><\/button><\/h3>\n\n\n\n<div aria-labelledby=\"accordion-item-8\" data-wp-bind--hidden=\"state.isHidden\" data-wp-on--beforematch=\"actions.handleBeforeMatch\" id=\"accordion-item-8-panel\" role=\"region\" class=\"wp-block-accordion-panel is-layout-flow wp-block-accordion-panel-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Separately. Applications arrive via GitOps: a new commit in the repository, and every vehicle pulls the new version, with no firmware build and no maintenance appointment at the vehicle. The Kubernetes service itself is a package of the Unwired Edge Cloud OS in Unwired Edge Compute for Kubernetes; new versions arrive as package updates that Unwired releases regularly and secures beforehand with automated tests, long-running tests on lab devices, and an SBOM and CVE check. Operating system updates are scheduled in rollout windows and rolled out with limited concurrency, so the entire fleet never updates at the same time.<\/p>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<div data-wp-context=\"{ &quot;autoclose&quot;: false, &quot;accordionItems&quot;: [] }\" data-wp-interactive=\"core\/accordion\" role=\"group\" class=\"wp-block-accordion is-layout-flow wp-block-accordion-is-layout-flow\">\n<div data-wp-class--is-open=\"state.isOpen\" data-wp-context=\"{ &quot;id&quot;: &quot;accordion-item-9&quot;, &quot;openByDefault&quot;: false }\" data-wp-init=\"callbacks.initAccordionItems\" data-wp-on-window--hashchange=\"callbacks.hashChange\" class=\"wp-block-accordion-item is-layout-flow wp-block-accordion-item-is-layout-flow\">\n<h3 class=\"wp-block-accordion-heading\"><button aria-expanded=\"false\" aria-controls=\"accordion-item-9-panel\" data-wp-bind--aria-expanded=\"state.isOpen\" data-wp-on--click=\"actions.toggle\" id=\"accordion-item-9\" type=\"button\" class=\"wp-block-accordion-heading__toggle\"><span class=\"wp-block-accordion-heading__toggle-title\">How do containers on the vehicle router reach the in-vehicle network and hardware interfaces?<\/span><span class=\"wp-block-accordion-heading__toggle-icon\" aria-hidden=\"true\">+<\/span><\/button><\/h3>\n\n\n\n<div aria-labelledby=\"accordion-item-9\" data-wp-bind--hidden=\"state.isHidden\" data-wp-on--beforematch=\"actions.handleBeforeMatch\" id=\"accordion-item-9-panel\" role=\"region\" class=\"wp-block-accordion-panel is-layout-flow wp-block-accordion-panel-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Through additional network interfaces and device mappings that Kubernetes does not provide out of the box. In Unwired Edge Compute for Kubernetes, the default pod network attaches to a bridge in the router&#8217;s host network; through advanced networking, pods get further interfaces and connect directly to VLANs or bridges of the in-vehicle network, such as the passenger network or the operational network. The integrated hardware access passes GPIO, GPS, RS485, USB, audio and DisplayPort through to pods. Both are optional base services that Unwired tests and maintains. WAN bonding, VLANs and the firewall stay in the device management of the Unwired Edge Cloud.<\/p>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<div data-wp-context=\"{ &quot;autoclose&quot;: false, &quot;accordionItems&quot;: [] }\" data-wp-interactive=\"core\/accordion\" role=\"group\" class=\"wp-block-accordion is-layout-flow wp-block-accordion-is-layout-flow\">\n<div data-wp-class--is-open=\"state.isOpen\" data-wp-context=\"{ &quot;id&quot;: &quot;accordion-item-10&quot;, &quot;openByDefault&quot;: false }\" data-wp-init=\"callbacks.initAccordionItems\" data-wp-on-window--hashchange=\"callbacks.hashChange\" class=\"wp-block-accordion-item is-layout-flow wp-block-accordion-item-is-layout-flow\">\n<h3 class=\"wp-block-accordion-heading\"><button aria-expanded=\"false\" aria-controls=\"accordion-item-10-panel\" data-wp-bind--aria-expanded=\"state.isOpen\" data-wp-on--click=\"actions.toggle\" id=\"accordion-item-10\" type=\"button\" class=\"wp-block-accordion-heading__toggle\"><span class=\"wp-block-accordion-heading__toggle-title\">Does Kubernetes on the vehicle router help with NIS2, CRA and ISO 27001?<\/span><span class=\"wp-block-accordion-heading__toggle-icon\" aria-hidden=\"true\">+<\/span><\/button><\/h3>\n\n\n\n<div aria-labelledby=\"accordion-item-10\" data-wp-bind--hidden=\"state.isHidden\" data-wp-on--beforematch=\"actions.handleBeforeMatch\" id=\"accordion-item-10-panel\" role=\"region\" class=\"wp-block-accordion-panel is-layout-flow wp-block-accordion-panel-is-layout-flow\">\n<p class=\"wp-block-paragraph\">It provides the building blocks these frameworks demand across the lifecycle: isolated workloads, traceable versions and regular security updates. Containers run separately from the host system, workloads follow Pod Security Standards as non-root with resource limits, and every version is documented as a manifest or Helm chart in the repository. Unwired Edge Compute for Kubernetes adds the SBOM and CVE check of the operating system and the Kubernetes service, plus the observability of the Unwired Edge Cloud, which records versions and states centrally. The duty to provide evidence stays with the operator; the platform supplies the data for it.<\/p>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<script type=\"application\/ld+json\">{\"@context\":\"https:\/\/schema.org\",\"@type\":\"FAQPage\",\"mainEntity\":[{\"@type\":\"Question\",\"name\":\"Can you run Kubernetes on a vehicle router?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Yes, if the router has enough resources and the operating system ships a Kubernetes service. A vehicle router is an industrial Linux device with modems, Ethernet and Wi-Fi; on capable models with two or more CPU cores, at least 1 GB RAM and an SSD, it can run a single-node Kubernetes cluster that executes onboard applications as pods. Unwired Edge Compute for Kubernetes delivers this service as a package of the Unwired Edge Cloud OS, activated through the device management of the Unwired Edge Cloud. Applications are described with standard Kubernetes manifests or Helm charts and rolled out via GitOps.\"}},{\"@type\":\"Question\",\"name\":\"Why Kubernetes in the vehicle and not in the data center or the cloud?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Because many onboard applications have to run where the data and the hardware are. Passenger information, passenger counting, video analytics and diagnostics need access to cameras, sensors, GPS, serial interfaces and the in-vehicle network, and they have to keep working when the train or bus has no connection. Unwired Edge Compute for Kubernetes brings the deployment standard from the data center to that place: the same manifests, Helm charts and GitOps tools, just on the router instead of a server. The cloud stays responsible for device management, observability and distributing new versions, not for running the pods.\"}},{\"@type\":\"Question\",\"name\":\"Is Kubernetes on a router full Kubernetes or a stripped-down variant?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Full Kubernetes in a single-node configuration. The router runs the control plane with embedded etcd, kubelet and containerd as the container runtime; the standard Kubernetes API is available, as are Deployments, StatefulSets, ConfigMaps, Secrets and CRDs. What is missing is the distribution of a cluster across several nodes. In Unwired Edge Compute for Kubernetes, the Unwired Kubernetes Service (unwired-ks) takes on this role; Helm, ArgoCD, Flux and Open Cluster Management work as they do on any other cluster.\"}},{\"@type\":\"Question\",\"name\":\"Why a single-node cluster per vehicle and not one cluster across the whole train?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Because a train is not an availability zone. Multi-node Kubernetes relies on stable links between nodes to hold a quorum; in a vehicle, cars are coupled and uncoupled, links between vehicles break and devices fail one at a time. A cluster that had to reach consensus across those boundaries would be unstable exactly when it is needed. That is why Unwired Edge Compute for Kubernetes deliberately runs an independent cluster per router. High availability is built at the application level or through a failover sidecar that manages a virtual service IP via VRRP across several routers.\"}},{\"@type\":\"Question\",\"name\":\"What happens to Kubernetes in the vehicle when the connection drops?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"The cluster keeps running, because the control plane and the workloads are local to the router and the Kubernetes API is reachable on the device. The connection to the cloud is needed for device management, forwarding logs and metrics, and syncing with the GitOps repository, not for running the pods. A pull-based GitOps tool such as ArgoCD or Flux fetches the desired state as soon as a connection is back. In Unwired Edge Compute for Kubernetes, the firmware additionally records the state of the Kubernetes service, so the Unwired Edge Cloud still reports whether service and node are running even when nothing is getting through inside the cluster itself.\"}},{\"@type\":\"Question\",\"name\":\"What hardware does Kubernetes on a vehicle router need?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"An x64 or arm64 device with at least two CPU cores, 1 GB RAM and persistent storage such as SSD or NVMe. In Unwired Edge Compute for Kubernetes, the base system uses about 0.3 CPU cores and 500 MB RAM, with the rest available to your applications; for storage, plan at least 4 GB plus container images and data. Large rail routers and onboard servers have these reserves. Smaller routers with one CPU core and 256 MB RAM run containers with Unwired Edge Compute Standard. The list of supported devices shows which devices are supported.\"}},{\"@type\":\"Question\",\"name\":\"Which onboard applications are suited to Kubernetes on the vehicle router?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Applications made of several services that come as a Helm chart or are meant to be rolled out via GitOps: passenger information systems with a database and interfaces, automatic passenger counting with analysis, video analytics, diagnostics and telemetry stacks. A single service with a clear job, such as an onboard portal for passenger Wi-Fi, a VPN or an interface integration, does not need Kubernetes; lightweight OCI containers are enough for that, at Unwired the Edge Compute Standard edition. For capable devices, Unwired recommends Unwired Edge Compute for Kubernetes for all new projects.\"}},{\"@type\":\"Question\",\"name\":\"How are Kubernetes and the applications in the vehicle updated?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Separately. Applications arrive via GitOps: a new commit in the repository, and every vehicle pulls the new version, with no firmware build and no maintenance appointment at the vehicle. The Kubernetes service itself is a package of the Unwired Edge Cloud OS in Unwired Edge Compute for Kubernetes; new versions arrive as package updates that Unwired releases regularly and secures beforehand with automated tests, long-running tests on lab devices, and an SBOM and CVE check. Operating system updates are scheduled in rollout windows and rolled out with limited concurrency, so the entire fleet never updates at the same time.\"}},{\"@type\":\"Question\",\"name\":\"How do containers on the vehicle router reach the in-vehicle network and hardware interfaces?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Through additional network interfaces and device mappings that Kubernetes does not provide out of the box. In Unwired Edge Compute for Kubernetes, the default pod network attaches to a bridge in the router's host network; through advanced networking, pods get further interfaces and connect directly to VLANs or bridges of the in-vehicle network, such as the passenger network or the operational network. The integrated hardware access passes GPIO, GPS, RS485, USB, audio and DisplayPort through to pods. Both are optional base services that Unwired tests and maintains. WAN bonding, VLANs and the firewall stay in the device management of the Unwired Edge Cloud.\"}},{\"@type\":\"Question\",\"name\":\"Does Kubernetes on the vehicle router help with NIS2, CRA and ISO 27001?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"It provides the building blocks these frameworks demand across the lifecycle: isolated workloads, traceable versions and regular security updates. Containers run separately from the host system, workloads follow Pod Security Standards as non-root with resource limits, and every version is documented as a manifest or Helm chart in the repository. Unwired Edge Compute for Kubernetes adds the SBOM and CVE check of the operating system and the Kubernetes service, plus the observability of the Unwired Edge Cloud, which records versions and states centrally. The duty to provide evidence stays with the operator; the platform supplies the data for it.\"}}]}<\/script>\n<\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Kubernetes directly on the vehicle router: roll out onboard applications via GitOps, with no additional hardware and no firmware builds. What changes for your team.<\/p>\n","protected":false},"author":2,"featured_media":8715,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[44],"tags":[],"class_list":["post-8716","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-product-updates"],"acf":[],"_links":{"self":[{"href":"https:\/\/unwirednetworks.com\/en\/wp-json\/wp\/v2\/posts\/8716","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/unwirednetworks.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/unwirednetworks.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/unwirednetworks.com\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/unwirednetworks.com\/en\/wp-json\/wp\/v2\/comments?post=8716"}],"version-history":[{"count":1,"href":"https:\/\/unwirednetworks.com\/en\/wp-json\/wp\/v2\/posts\/8716\/revisions"}],"predecessor-version":[{"id":8717,"href":"https:\/\/unwirednetworks.com\/en\/wp-json\/wp\/v2\/posts\/8716\/revisions\/8717"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/unwirednetworks.com\/en\/wp-json\/wp\/v2\/media\/8715"}],"wp:attachment":[{"href":"https:\/\/unwirednetworks.com\/en\/wp-json\/wp\/v2\/media?parent=8716"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/unwirednetworks.com\/en\/wp-json\/wp\/v2\/categories?post=8716"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/unwirednetworks.com\/en\/wp-json\/wp\/v2\/tags?post=8716"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}