如何将AI能力与大数据技术结合,助力数据分析治理等工作的效率大幅提升,优化大数据引擎的性能及成本? 了解详情
写点什么

6000 个边缘 Kubernetes 节点驱动城市 80 万次智能停车,如何成为可能?

  • 2020-04-23
  • 本文字数:4034 字

    阅读完需:约 13 分钟

6000个边缘Kubernetes节点驱动城市80万次智能停车,如何成为可能?

城市的街道因为汽车数量的增长越来越繁忙,对于驾车一族而言,在热门区域寻找停车场更是无比头痛的事情。然而与此同时,其实也许很多办公楼、住宅楼、酒店和公共车库中仍有许多付费停车的资源未被充分利用。


ParkBee 就是这样一家为城市提供智能停车解决方案的公司。ParkBee 平台上显示着每位车主定位附近的可使用的停车场,停车价格、停车位的空余情况等都是实时更新。ParkBee“打开”了城市中的所有停车场,解决了停车难题,既节约车主时间,又帮助停车场最大限度创收。


ParkBee 近期开始尝试在边缘位置进行容器部署。因为 ParkBee 的整体业务的一个重要部分就是大量的停车场,与 ParkBee 合作的停车场有 6000 多家,截至目前我们已服务于 80 万次 停车服务。我们必须确保每一个停车场的容器都能按预期工作,因此部署包含业务逻辑的应用程序至关重要。


ParkBee 目前使用 Kops 部署 Kubernetes,公有云选择的是 AWS。虽然这种方法适用于我们的基于云的服务,但对于我们的边缘部署而言,事情却并不是那么简单。我们的理想目标是:在 ParkBee 合作的每一个停车场上都有一个 Kubernetes 集群,集群中包含停车点位置的边缘 Kubernetes 节点以及 AWS 中的 Kubernetes 主节点。


半个月前,Rancher Labs发布了K3s——一个被认为是史上最轻量的Kubernetes发行版。K3s 的设计初衷就是为了能让像树莓派一样的低资源计算平台更容易安装和维护 Kubernetes。


本质上讲,K3s 有望成为一个轻量级的、易于使用、只使用一个二进制文件的 Kubernetes provisioner。K3s 的发布公告里写到它的主要功能包括:


  • 生产级 Kubernetes: K3s 是一个符合标准的、已获 CNCF 官方认证的 Kubernetes 发行版。

  • 一个没有主机依赖的二进制文件: 在任何设备上安装 Kubernetes 所需的一切都包含在这一个 40MB 的二进制文件当中,不需要像 KuberSpray、KubeADM 或者 RKE 这样的外部安装程序。只需要一个命令,用户就可以配置或者升级单节点 K3s 集群。

  • 一条命令,向集群添加节点: 若想向集群添加其他节点,管理员只需在新节点上运行一条命令,指向原始服务器,通过安全 token 传递即可。

  • 自动生成证书: 集群启动时,在 Kubernetes 主服务器和节点之间建立 TLS 所需的所有证书都会被自动创建,还会自动创建服务账号的加密密钥。


准备工作

在这篇文章中,我将使用 K3s 的第一个版本 v0.1.0。如果你想要按照我的文章来尝试一样的操作,你需要准备:


  • Raspberry Pi 3 B+型号,带有闪存了 Raspbian Stretch Lite 的 microSD 卡。

  • 本地网络:为了方便起见,我将在家里使用自己的局域网。

  • 在你的笔记本电脑本地安装的 Vagrant:也可以使用 Docker for Mac,不过本质上来说,K3s 二进制文件还是为了 Linux、arm64 和 armhf 架构而构建的。


Vagrant

如果您正在使用 Vagrant,则可以在 test 目录中使用以下内容创建一个 Vagrantfile:


# -*- mode: ruby -*-# vi: set ft=ruby :
VAGRANT_API = 2
Vagrant.configure(VAGRANT_API) do |config| config.vm.box = "bento/ubuntu-18.04" config.vm.box_check_update = false config.vm.network "forwarded_port", guest: 6443, host: 6443, host_ip: "0.0.0.0"
config.vm.provider "virtualbox" do |vb| vb.cpus = 1 vb.gui = true vb.memory = "2048" vb.name = "k3s-master" end
config.vm.provision :docker
config.vm.provision "shell", inline: <<-SHELL sudo modprobe vxlan curl -sfL https://get.k3s.io | sh - hostnamectl set-hostname k3s-master SHELLend
复制代码


至此,你将安装好了 Docker 以及 K3s 二进制文件。安装脚本也可以方便地将 kubectl 二进制文件符号链接到 K3s,因为它是内置的。


防火墙

小提示:Raspberry Pi 需要连接到 LAN 中的本地计算机。在 macOS 中,确保转到 设置=>安全和隐私=>防火墙 ,然后单击“ 关闭 ”按钮。



确保 macOS 中的防火墙是关闭的,不然无法完成测试


对于 Windows,您可以参考 Lifewire 关于在 Windows 中关闭防火墙的文章:


https://www.lifewire.com/how-to-disable-the-windows-firewall-2624505


运行 K3s 主节点

我们将先使用 Vagrant 机器作为 K3s 主节点; 一旦它开始正常工作,我们将尝试将 Raspberry Pi 连接到本地 LAN 上的 K3s 主节点。


与任何 Vagrant 机器一样,只需运行 vagrant up,一切就开始启动了。Vagrant 将运行 K3s 自动安装脚本,打开本地计算机上的 6443 端口,以便 K3s 节点加入,并创建稍后所需的连接令牌。


首先,验证主节点安装是否成功:


root@k3s-master:~# kubectl get nodesNAME         STATUS   ROLES    AGE     VERSIONk3s-master   Ready    <none>   4m51s   v1.13.3-k3s.6
复制代码


默认情况下,K3s 安装脚本不会将 k3s-master 标记为主节点;但因为我们已经预先安装好了 kubectl 二进制文件,我们现在可以解决这个问题:


root@k3s-master:~# kubectl label node k3s-master kubernetes.io/role=masternode/k3s-master labeledroot@k3s-master:~# kubectl label node k3s-master node-role.kubernetes.io/master=""node/k3s-master labeled
复制代码


K3s 安装也 不会污染 NoSchedule 的主节点 。在此次测试中,我们希望确保 Raspberry Pi 能够接收测试部署,因此使用以下方法污染主节点:


root@k3s-master:~# kubectl taint nodes k3s-master node-role.kubernetes.io/master=effect:NoSchedulenode/k3s-master tainted
复制代码


接下来,我们需要 token,来将 K3s 节点连接到新主节点。该 k3s server 命令应该已经为您创建了这个/var/lib/rancher/k3s/server/node-token。运行以下命令:


root@k3s-master:~# cat /var/lib/rancher/k3s/server/node-token<some-long-node-token>
复制代码


在 Raspberry Pi 上运行 K3s 节点

首先,我们需要为树莓派准备一些初始步骤。首先,使用以下命令来禁用 swap:


dphys-swapfile swapoff && \dphys-swapfile uninstall && \update-rc.d dphys-swapfile remove
复制代码


然后,将以下文本附加到/boot/cmdline.txt 的第一行:


cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory
复制代码


然后,reboot 树莓派。返回时,重新登录,然后运行以下命令下载 k3s 二进制文件。


curl -fSL "https://github.com/rancher/k3s/releases/download/v0.1.0/k3s-armhf" \    -o /usr/local/bin/k3s && \chmod +x /usr/local/bin/k3s
复制代码


因为 K3s 使用的是 containerd,因此我们无需安装 Docker ,但最好还是验证一下是不是所有 pod 都在正常运行。通过运行以下命令可以快速安装 Docker:


curl -fsSL https://get.docker.com | sh - && \usermod -aG docker pi
复制代码


获取从主服务器创建的 token,并将其导出为环境变量:


export NODE_TOKEN="<some-long-node-token>"
复制代码


最后,运行 k3s agent 命令以启动代理程序,然后加入主节点。在我的这次使用中,192.168.0.10 是我网络中本地笔记本电脑上运行的 Vagrant 机器的地址。记得务必使用适当的地址替换该值。


k3s agent \--docker \--server https://192.168.0.10:6443 \--token ${NODE_TOKEN} \> /root/logs.txt 2>&1 &
复制代码


与 K3s 主节点类似,这次安装 不会 使用正确的节点标签标记 Raspberry Pi。在 k3s-master 上,在 Raspberry Pi 加入集群后运行以下命令:


root@k3s-master:~# kubectl label node raspberrypi kubernetes.io/role=nodenode/raspberrypi labeledroot@k3s-master:~# kubectl label node raspberrypi node-role.kubernetes.io/node=""node/raspberrypi labeled
复制代码


如果 Raspberry Pi 成功加入,则在主服务器上运行该命令时应该会看到类似以下内容:


root@k3s-master:~# kubectl get nodesNAME                                   STATUS   ROLES    AGE    VERSIONraspberrypi                            Ready    node     2m     v1.13.3-k3s.6k3s-master                             Ready    master   20m    v1.13.3-k3s.6
复制代码


部署一个测试 NGINX 容器

为了确保 K3s 集群能真正正常工作,我们可以部署一个测试 NGINX pod 和 NodePort 服务,以确保 Raspberry Pi 创建了 pod,并成功打开了端口。


在 K3s 主 Vagrant 机器上,使用以下内容在/root/nginx-test.yaml 上创建一个文件:


---apiVersion: v1kind: Servicemetadata:  name: nginx-unprivileged-test  namespace: defaultspec:  type: NodePort  selector:    app: nginx-unprivileged-test  ports:  - protocol: TCP    nodePort: 30123    port: 8080    name: http    targetPort: 8080---apiVersion: extensions/v1beta1kind: Deploymentmetadata:  name: nginx-unprivileged-test  namespace: defaultspec:  replicas: 1  template:    metadata:      labels:        app: nginx-unprivileged-test    spec:      containers:      - image: nginxinc/nginx-unprivileged        name: nginx-unprivileged-test        ports:        - containerPort: 8080          name: http        livenessProbe:          httpGet:            path: /            port: http          initialDelaySeconds: 3          periodSeconds: 3
复制代码


然后最终将其部署到集群:


root@k3s-master:~# kubectl apply -f /root/nginx-test.yamlservice/nginx-unprivileged-test createddeployment.extensions/nginx-unprivileged-test created
复制代码


因为这是一项 NodePort 服务,K3s 将在 Raspberry Pi 上打开一个端口 30123。在我的本地网络上,Raspberry Pi 位于 192.168.0.43。



结语

在我使用 K3s 的过程中注意到了一些事项,在此想要提醒:


  • 在部署 NGINX 测试容器时,我最初使用了 Docker Hub 中的常规 nginx:latest 镜像。但是,似乎 K3s 还不支持低于 1024 的端口。在默认情况下,nginx 镜像会尝试在容器内打开端口 80,而这会导致一些问题。

  • 本文中提到过,通常 Kubernetes 发行版中都包含 label 和 taint,但 K3s 暂时没有完全实现这一点。


K3s 将极大地促进 Kubernetes 在边缘计算场景的使用,对这一点我充分相信。


2020-04-23 17:23311

评论

发布
暂无评论
发现更多内容

oeasy 教您玩转 linux 010214 画面转文字 asciiview

o

音乐创作者必备软件,轻松玩转原创

奈奈的杂社

音乐制作 编曲 电音 作曲 乐团

云图说 | 华为云GPU共享型AI容器,让你用得起,用得好,用的放心

华为云开发者联盟

gpu caffe

区块链交易系统开发,期货合约平台搭建

甲方日常 14

句子

Java 工作 随笔杂谈 日常

高并发系列——CAS操作及CPU底层操作解析

诸葛小猿

CAS AtomicInteger compareAndSwap cmpxchg lock

解Bug之路-记一次JVM堆外内存泄露Bug的查找

无毁的湖光

Linux JVM heap memory GC Linux Kenel

拥抱K8S系列-07-部署K8S集群(Rancher)

张无忌

Kubernetes rancher

Spring 5 中文解析测试篇-WebTestClient

青年IT男

单元测试 Spring5

如何搭建第一个 Spring 项目?

小齐本齐

spring Spring Framework Spring Bean

设计模式只是一把锤子

博文视点Broadview

读书笔记 编程 面向对象 设计模式

所见即所得的用户增长技术背后是如何实现的

代立冬

大数据 用户增长 用户增长技术 ad-hoc技术

Spring IoC 到底是什么?

小齐本齐

spring 程序员 ioc Spring Framework Spring Bean

为什么区块链能成为全球贸易的助推器

CECBC

区块链 金融 国际贸易

STL总结与常见面试题

C语言与CPP编程

c c++ 编程 编程语言 stl

两年Java工作经验涨到23K,这究竟是怎么做到的?

Java架构师迁哥

不懂 ZooKeeper?没关系,这一篇给你讲的明明白白

大头星

Js 封装:阻止频繁重复操作

程序员与厨子

Spring事务是如何应用到你的业务场景中的?

AI乔治

Java spring 架构 微服务 springboot

Java String 面面观

keaper

Java string pool string

前端必会的七种排序算法

执鸢者

算法 大前端

欧洲央行近期将决定是否建立官方数字货币

CECBC

数字货币 欧央行

RabbitMQ 重要概念介绍

hepingfly

Java RabbitMQ 消息队列 JMS

知识点总结

Acker飏

我敢说,这个版本的斗地主你肯定没玩过?

华为云开发者联盟

命令行 游戏 斗地主

基于 Flink 的典型 ETL 场景实现方案

Apache Flink

flink

有关 HashMap 面试会问的一切

小齐本齐

Java 数据结构 算法

python——深入类和对象

菜鸟小sailor 🐕

一次代码评审,差点过不了试用期!

小傅哥

Java 小傅哥 代码质量 代码优化 代码规范

架构师期末作业

傻傻的帅

大作业

Geek_2e7dd7

6000个边缘Kubernetes节点驱动城市80万次智能停车,如何成为可能?_文化 & 方法_Rancher_InfoQ精选文章