城市的街道由於汽車數量的增加愈來愈繁忙,對於駕車一族而言,在熱門區域尋找停車場更是無比頭痛的事情。然而與此同時,其實也許不少辦公樓、住宅樓、酒店和公共車庫中仍有許多付費停車的資源未被充分利用。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
準備工做ubuntu
在這篇文章中,我將使用K3s的第一個版本v0.1.0。若是你想要按照個人文章來嘗試同樣的操做,你須要準備:windows
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的過程當中注意到了一些事項,在此想要提醒:
K3s將極大地促進Kubernetes在邊緣計算場景的使用,對這一點我充分相信。