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在邊緣計算場景的使用,對這一點我充分相信。

相關文章
相關標籤/搜索