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

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 = 2Vagrant.configure(VAGRANT_API) do |config|config.vm.box = "bento/ubuntu-18.04"config.vm.box_check_update = falseconfig.vm.network "forwarded_port", guest: 6443, host: 6443, host_ip: "0.0.0.0"config.vm.provider "virtualbox" do |vb|vb.cpus = 1vb.gui = truevb.memory = "2048"vb.name = "k3s-master"endconfig.vm.provision :dockerconfig.vm.provision "shell", inline: <<-SHELLsudo modprobe vxlancurl -sfL https://get.k3s.io | sh -hostnamectl set-hostname k3s-masterSHELL
end

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

防火墙

小提示:Raspberry Pi需要连接到LAN中的本地计算机。在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 nodes
NAME         STATUS   ROLES    AGE     VERSION
k3s-master   Ready    <none>   4m51s   v1.13.3-k3s.6

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

root@k3s-master:~# kubectl label node k3s-master kubernetes.io/role=master
node/k3s-master labeled
root@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:NoSchedule
node/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=node
node/raspberrypi labeled
root@k3s-master:~# kubectl label node raspberrypi node-role.kubernetes.io/node=""
node/raspberrypi labeled

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

root@k3s-master:~# kubectl get nodes
NAME                                   STATUS   ROLES    AGE    VERSION
raspberrypi                            Ready    node     2m     v1.13.3-k3s.6
k3s-master                             Ready    master   20m    v1.13.3-k3s.6

部署一个测试NGINX容器

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

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

---
apiVersion: v1
kind: Service
metadata:name: nginx-unprivileged-testnamespace: default
spec:type: NodePortselector:app: nginx-unprivileged-testports:- protocol: TCPnodePort: 30123port: 8080name: httptargetPort: 8080
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:name: nginx-unprivileged-testnamespace: default
spec:replicas: 1template:metadata:labels:app: nginx-unprivileged-testspec:containers:- image: nginxinc/nginx-unprivilegedname: nginx-unprivileged-testports:- containerPort: 8080name: httplivenessProbe:httpGet:path: /port: httpinitialDelaySeconds: 3periodSeconds: 3

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

root@k3s-master:~# kubectl apply -f /root/nginx-test.yaml
service/nginx-unprivileged-test created
deployment.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在边缘计算场景的使用,对这一点我充分相信。

转载于:https://blog.51cto.com/12462495/2362190

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

  1. 边缘计算赋能智慧城市:机遇与挑战

    本文系国家重点研发计划项目和国家自然科学基金联合基金重点支持项目的阶段性研究成果,项目编号分别为:2018YFB0204100.U1911201:胡淼.吴润.陈嘉文.谢自轩等对本文亦有贡献. [摘要] ...

  2. 阿里云边缘云,驱动行业新价值

    简介:随着5G网络对移动宽带的增强,海量终端互联以及对于高可靠低时延连接的需求,边缘云的价值将日益凸显.在4月7日上午举办的分布式云报告会上,阿里云边缘云资深专家郝冲发表了<阿里云边缘云,驱动行 ...

  3. Atlassian发布Kubernetes节点自动化扩展工具Escalator

    \ 看新闻很累?看技术新闻更累?试试下载InfoQ手机客户端,每天上下班路上听新闻,有趣还有料! \ \\ Atlassian把他们的内部工具Escalator发布为开源项目.该工具针对Kuberne ...

  4. 【未来研究】城市云脑是互联网云脑的节点,城市云脑之间如何互补与支撑

    作者: 互联网进化论作者 ,计算机博士 刘锋 前言:本文是未来智能实验室的研究文章,重点探讨了基于类脑架构的智慧城市建设不应局限在城市内部,而是在互联网大背景下,不同城市之间也会发生智慧建设的协同效应 ...

  5. 边缘计算:智慧城市的下一个浪潮

    来源:资本实验室  作者:王进 目前,在全球,智慧城市建设处于一个概念到逐步落地的过程,而科技巨头与投资大佬是这一新浪潮重要的参与者. 2017年10月,Alphabet旗下城市创新部门Sidewal ...

  6. f4 stm32 神经网络_STM32神经网络开发工具箱将AI技术引入边缘和节点嵌入式设备...

    94 Microcontrolers & Embedded Systems 2019 年第2 期 www.mesnet.com.cn 全新Arm ISP技术为智能设备打造 更敏锐的数字眼 Ar ...

  7. kubernetes节点NotReady

    kubernetes节点NotReady 集群搭建后, 安装网络插件后,各节点都是 NotReady 状态. 查看服务运行日志 查看服务状态 查看详细信息 集群搭建后, 安装网络插件后,各节点都是 N ...

  8. 如何修改 Kubernetes 节点 IP 地址?

    如何修改 Kubernetes 节点 IP 地址? ✨博主介绍 前言 环境 操作 master 节点 node 节点 推荐操作 个人总结 ✨博主介绍

  9. post-mortem机制_发布Mortem:Kubernetes节点OOM

    post-mortem机制 生产问题从不有趣. 它们似乎总是在您不上班时发生,原因似乎总是很愚蠢. 我们最近在生产Kubernetes集群中遇到了节点内存不足的问题,但是该节点很快恢复了,没有任何明显 ...

最新文章

  1. python基础知识整理 第七节:单例设计模式、异常、模块、包、制作模块、文件
  2. Java ArrayDeque工作原理及实现
  3. (转)Objective-C Autorelease Pools(自动释放池)详解
  4. linux之拷贝文件/备份文件;按照原来的权限和日期拷贝.
  5. C++ 函数返回char*
  6. tft lcd驱动参数详解_LED拼接屏和LCD拼接屏的区别
  7. 怎么把arraylist集合的值放在实体类的属性了_原创 | 使用JPA实现DDD持久化-O/R映射元数据:类级映射-实体和值对象...
  8. Android 视频播放器 (二):使用MediaPlayer播放视频
  9. [转载] 使用Python中的NLTK和spaCy删除停用词与文本标准化
  10. Loaded runtime CuDNN library: 7103 (compatibility version 7100) but source was compiled with 7005 ..
  11. PIE SDK矢量数据的读取
  12. 搜索引擎为什么不收录原创文章
  13. Python全栈工程师系列学习之学习记录
  14. C# OpenXml组件
  15. 在线客服功能介绍-了解常见在线客服系统的功能点
  16. JavaFX:集成MarkDown
  17. Amino——框架层
  18. python——常见运算符号
  19. [已解决]为什么使用远程桌面无法打开雷电模拟器,OpenGL版本始终1.1.0?
  20. 陷维权风波,冲高端的小米手机过于激进?

热门文章

  1. 全国计算机等级考试职称,全国职称计算机考试与全国计算机等级考试有什么不同?...
  2. java ajax 导入excel_Ajax asp.net 导入Excel
  3. 计算机专业的三行情书,各专业三行情书,看懂你就是全能学霸!
  4. C++:14---虚继承,虚函数,多态
  5. thinkphp的快捷方法实例化对象
  6. clion中链接openssl库
  7. 上班族如何当老板 五大模式任你选
  8. 一个三流学校程序员的奋斗历程
  9. Visual C++利用Intel C++ 编译器提升多核性能与多媒体指令支持获取更高的程序效率与缩小程序体积
  10. 常见音视频格式(转载)