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

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

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

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

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

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

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

  • 生产级Kubernetes:K3s是一个符合标准的、已获CNCF官方认证的Kubernetes发行版。
  • 一个没有主机依赖的二进制文件:在任何设备上安装Kubernetes所需的一切都包含在这一个40MB的二进制文件当中,不须要像KuberSpray、KubeADM或者RKE这样的外部安装程序。只须要一个命令,用户就能够配置或者升级单节点K3s集群。
  • 一条命令,向集群添加节点:若想向集群添加其余节点,管理员只需在新节点上运行一条命令,指向原始服务器,经过安全token传递便可。
  • 自动生成证书:集群启动时,在Kubernetes主服务器和节点之间创建TLS所需的全部证书都会被自动建立,还会自动建立服务帐号的加密密钥。

准备工做ubuntu

在这篇文章中,我将使用K3s的第一个版本v0.1.0。若是你想要按照个人文章来尝试同样的操做,你须要准备:windows

  • Raspberry Pi 3 B+型号,带有闪存了Raspbian Stretch Lite 的microSD卡。
  • 本地网络:为了方便起见,我将在家里使用本身的局域网。
  • 在你的笔记本电脑本地安装的Vagrant:也可使用Docker for Mac,不过本质上来讲,K3s二进制文件仍是为了Linux、arm64和armhf架构而构建的。

Vagrantapi

若是您正在使用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
     SHELL
end

至此,你将安装好了Docker以及K3s二进制文件。安装脚本也能够方便地将kubectl二进制文件符号连接到K3s,由于它是内置的。

防火墙

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

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

https://www.lifewire.com/how-...

运行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-test
  namespace: default
spec:
  type: NodePort
  selector:
    app: nginx-unprivileged-test
  ports:
  - protocol: TCP
    nodePort: 30123
    port: 8080
    name: http
    targetPort: 8080
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-unprivileged-test
  namespace: default
spec:
  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.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在边缘计算场景的使用,对这一点我充分相信。

相关文章
相关标签/搜索