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

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 = 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中,确保转到设置=>安全和隐私=>防火墙,然后单击“关闭 ”按钮。

 
6000个边缘Kubernetes节点驱动城市80万次智能停车,如何成为可能?
 
对于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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/449190.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

英语学习之道小谈

想学好英语&#xff0c;首先要培养对英语的兴趣。兴趣是最好的老师&#xff0c;是学习英语的巨大动力&#xff0c;有了兴趣&#xff0c;学习就会事半功倍。我们都有这样的经验&#xff1a;喜欢的事&#xff0c;就容易坚持下去&#xff1b;不喜欢的事&#xff0c;是很难坚持下去…

2020-4-4

题目一 post方式get方式提交表单的主要区别? post一般用于传递较大的数据&#xff0c;在数据传递之前会有打包操作&#xff0c;所以可能会造成数据传递数据相对较慢的情况&#xff0c;不过传输的数据都能够被正确的解析&#xff0c;不会出现类似于中文乱码的状况。通过url链接…

python 进程与线程(理论部分)

一、理论部分 一 什么是进程 进程&#xff1a;正在进行的一个过程或者说一个任务。而负责执行任务则是cpu。 举例&#xff08;单核多道&#xff0c;实现多个进程的并发执行&#xff09;&#xff1a; egon在一个时间段内有很多任务要做&#xff1a;python备课的任务&#xff0c;…

Maven : 将 Jar 安装到本地仓库和 Jar 上传到私服

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Jar的maven配置 <dependency><groupId>org.apache.thrift</groupId><artifactId>libthrift</artifactId&g…

Flink 1.7.2 dataset transformation 示例

Flink 1.7.2 dataset transformation 示例 源码 https://github.com/opensourceteams/flink-maven-scala概述 Flink transformation示例map,flatMap,filter,reduce,groupBy,reduceGroup,combineGroup,Aggregate(sum,max,min)distinct,join,join funtion,leftOuterJoin,rightOut…

2020-4-5

题目一&#xff1a; <!DOCTYPE html> <html> <head> <meta charset" utf-8"> <script> window.onloadfunction(){let txtdocument.getElementById("txt");let stdocument.getElementById("st");let formdocumen…

肾脏的保养

饮食方面保养肾脏&#xff1a; 1、适量饮水不憋尿&#xff0c;每天需喝1500&#xff5e;2000ml的水&#xff0c;保持每天的尿量在1500ml左右。 2、饮食不要重口味&#xff0c;少吃不健康的腌制品或其他加工的食品。 不可纵欲&#xff1a; 纵欲会令肾脏受损害&#xff0c;…

sql 中 between 的边界问题 ---- between 边界:闭区间,not between 边界:开区间

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 BETWEEN 用以查询确定范围的值&#xff0c;这些值可以是数字&#xff0c;文本或日期 。BETWEEN 运算符是闭区间的&#xff1a;包括开始…

取代ZooKeeper!高并发下的分布式一致性开源组件StateSynchronizer

StateSynchronizer是开源分布式流存储平台Pravega的核心组件。StateSynchronizer组件以stream为基础&#xff0c;对外提供一致性状态共享服务。StateSynchronizer允许一组进程同时读写同一共享状态而不必担心一致性问题。本文将从共享状态和一致性的角度出发&#xff0c;详细描…

[51nod1773]A国的贸易

题目链接&#xff1a; 51nod1773 首先可以很简单的写出每一天的DP转移式&#xff1a; \(f[i][x]\sum f[i-1][x\ xor\ k](k0\ or\ k2^j,0\le j<n)\) 其中\(f[i][x]\)表示第\(i\)天\(x\)国货物数量\((0\le x<2^n)\)。 那么因为\(k\)有固定的取值&#xff0c;设数组\(A\)表示…

Linux基础学习导图

网上教程太多啦&#xff0c;先水一波导图&#xff0c;笔记日后慢慢上传~ 一款常用的软件很简单易用&#xff0c;推荐大家下载xmind vim学习相关的思维导图&#xff1a; 可以通过ubuntu自带的vim书学习&#xff08;终端输入vimtutor&#xff09;

一个学中医女生的保养身体法

首先是关于皮肤的外部保养法。1.关于头发 头发油是因为肝火太旺了&#xff0c;身体里内脏不能消化油脂&#xff0c;所以就把它排到脸上和头上了,办法是&#xff1a;每天晚上用滚烫的热水泡脚泡上半个小时&#xff0c;慢慢就会好了。注&#xff1a;水不会一直热&#xff0c;所以…

实现 SSH 无密码登录 、 ssh 常用命令

OpenSSH是互联网技术用户所依赖的SSH连接工具的免费版本。 telnet&#xff0c;rlogin 和 ftp 用户可能没有意识到他们的密码是通过互联网传输的&#xff0c;并且是未加密的。 但是 OpenSSH 加密所有流量&#xff08;包括密码&#xff09;以有效消除窃听&#xff0c;连接劫持和其…

团队项目冲刺第一天

今天&#xff0c;开了第一天的团队会议&#xff0c;我们把团队任务分配了一下&#xff0c;今天的任务是学习了一下Android开发的基础知识&#xff0c;看了哔哩哔哩上面的教学视频&#xff0c;对于一些转换页面&#xff0c;按钮&#xff0c;文本的配置有所了解&#xff0c;明天开…

简单的C语言五子棋(两种模式:移动光标输入坐标和移动光标按键)

五子棋&#xff1a; 需要的数据&#xff1a; 1、定义棋盘数组 2、定义变量用于记录棋子位置 3、定义角色变量 业务逻辑&#xff1a; 是否需要对数据进行初始化 for(;; ) { 1、清理屏幕&#xff0c;显示棋盘 2、落子 坐标要合法&#xff0c;原位置不能有棋子 3、检查是否形成五子…

nodejs-- vuex中mapActions

mapActions() 返回的是一个对象, 用了 ... 扩展符后&#xff0c;才可以放进一个对象里&#xff0c;和其他组件内定义的 method 在同一个 methods 对象。 { methods: mapActions() // 如果没有其它组件内的定义的方法,可以这样写}{ methods: { ...mapActions()&#xff0c;// 如…

怎样让手中的钱成为生财工具

大多数人之所以跟钱之间总有不可逾越的鸿沟&#xff0c;是因为他们不知道钱的活动能力。 钱&#xff0c;跟人一样是有生命的。每一块钱就是你的一个职员&#xff0c;你的目标是让你的职员勤奋工作&#xff0c;经过时间的沉淀&#xff0c;人员会日益壮大&#xff0c;工作效率会…

Android 开发知识集合目录

深入理解java的形参和实参&#xff1a; www.cnblogs.com/xuxinstyle/… sharepreference 与 数据库 区别&#xff1a; Android 各版特点&#xff1a; Android发展史&#xff08;Android各版本特性-知识篇&#xff09; blog.csdn.net/u012964796/…

mysql 查外键关联关系 (指定被引用表,查哪些表对其有外键引用)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 在一个业务功能中要求先清空一张基础表&#xff08;user表&#xff09;再插入一批新数据。 在删除过程中报错为其它表有外键引用&#…

Shell脚本语言基础总结

*** 一&#xff0c;shell教程 Shell 是一个用 C 语言编写的程序&#xff0c;它是用户使用 Linux 的桥梁。Shell 既是一种命令语言&#xff0c;又是一种程序设计语言 二&#xff0c;shell环境 跟 JavaScript、php 编程一样&#xff0c;只要有一个能编写代码的文本编辑器和一…