生產(chǎn)用例 | 百臺邊緣設備上的Kubernetes實踐

本文由11月7日晚曾永杰,上海全應科技運維經(jīng)理的技術分享整理而成澳眷。

曾永杰胡嘿,上海全應科技有限公司運維經(jīng)理,曾在華為西安研究所云計算部門承擔軟件測試工程師钳踊、項目交付衷敌、線上運維等工作職責,當前工作主要為CI/CD流程的建設與維護拓瞪、應用的容器化改革和容器云平臺的運維管理缴罗。

歡迎添加k3s中文社區(qū)助手微信(微信ID:k3s2019),加入k3s官方中文社區(qū)祭埂,和大家一起交流k3s使用經(jīng)驗面氓。

項目簡介

背 景

隨著國家政策的導向,互聯(lián)網(wǎng)基礎設施的普及,工業(yè)舌界、能源行業(yè)的智能化改造已經(jīng)進行的如火如荼掘譬,傳統(tǒng)行業(yè)的特點是信息化、智能化水平嚴重落后于其他行業(yè)呻拌,在進行信息化葱轩、智能化改造的過程中,首先第一步藐握,就是要獲取底層系統(tǒng)的全方位的數(shù)據(jù)酿箭。

為此,需要部署大量的邊緣設備來采集數(shù)據(jù)趾娃、分析數(shù)據(jù),通過這些數(shù)據(jù)進行建模缔御,大量的邊緣設備一般離散的分布在不同機房抬闷、廠區(qū)、甚至是不同的地理區(qū)域耕突,這對運維人員來講是令人恐懼的事情笤成,維護這些設備,管理其上運行的應用變得極其困難眷茁。

我們公司是國內(nèi)第一批投身于工業(yè)互聯(lián)網(wǎng)改革浪潮中一員炕泳,因此上面提到的問題,也是我們面臨的問題上祈。

公司從一開始就采用了微服務化的開發(fā)模式培遵,除了平臺框架核心應用之外,所有應用都是可插拔的微服務登刺。

與業(yè)務平臺不同的是籽腕,邊緣設備具有下面的特點:

  • 數(shù)量大,動輒有數(shù)十臺纸俭、數(shù)百臺設備皇耗;

  • 單點故障影響小,一個設備只負責一小塊區(qū)域的數(shù)據(jù)采集揍很、分析與計算郎楼,因此單臺設備的故障導致的局部數(shù)據(jù)的缺失,數(shù)據(jù)分析層面也進行了數(shù)據(jù)清洗窒悔,因此呜袁,單點故障對全局業(yè)務影響不大。

需 求

對于運維角色來講:

  • 管理這些邊緣設備简珠,保持邊緣設備上運行的服務的高可用性傅寡;

  • 快速的上線、升級

  • 配置的快速更改與應用

邏輯拓撲圖

下面的圖形簡單描述了項目基礎設施層的拓撲:

在這里插入圖片描述

其中,每一個邊緣側(cè)設備上運行的業(yè)務會和中樞業(yè)務系統(tǒng)通訊荐操,邊緣側(cè)所有設備在單獨的一個網(wǎng)絡平面中芜抒。

運維方案選型

在決定運維方式時,考慮過下面的幾種方式:

Ansible

我們在邊緣側(cè)設備上運行的應用大部分都是純Java應用托启,再加上一部分Python應用宅倒,因此部署和啟動非常簡單,外加上supervisord應用實現(xiàn)了應用的基本高可用方案屯耸。在公司還沒有進行容器化轉(zhuǎn)型之前拐迁,我們采用傳統(tǒng)的部署形式部署微服務,就是配置好宿主機的系統(tǒng)環(huán)境疗绣,直接將應用部署在宿主機系統(tǒng)上线召,在這種情況下,我們只需要解決的問題是大批量設備部署和維護的問題多矮,因為不管是部署還是更新升級缓淹、配置,所有邊緣側(cè)使用Ansible可以較好的滿足這一條件塔逃。

但是這種方法也有缺點讯壶,需要維護一套甚至多套ansible playbook,邊緣側(cè)設備所在的網(wǎng)絡條件比較差湾盗,異常狀況也比較差伏蚊,經(jīng)常掉電重啟或者斷網(wǎng),使用ansible 容易造成各個節(jié)點的配置不同步格粪。

kubeedge

kubeedge是由華為基于kubernetes開發(fā)并開源躏吊,專門用于邊緣容器編排的運維方案,其基本架構(gòu)如下:

在這里插入圖片描述

從上面的架構(gòu)圖中可以看到帐萎,kubeedge實現(xiàn)了一個邊緣側(cè)完整的框架颜阐,對我們公司來講,我們自行實現(xiàn)了例如“DeviceTwin”吓肋、“EventBus”凳怨、“ServiceBus”以及基于MQTT收發(fā)消息。因此:

  1. 一部分組件與kubeedge重疊了是鬼;

  2. 部署不方便肤舞,kubeedge要求在各個節(jié)點上以kubeadmin部署kubernetes集群(0.6版本,現(xiàn)在已經(jīng)更新至1.1版本均蜜,不知道現(xiàn)在是否有更簡便快捷的形式)李剖,對網(wǎng)絡環(huán)境不好的邊緣側(cè)設備有較大難度;

  3. kubeedge組件與kubernetes組件基本一致囤耳,對于邊緣設備寸土寸金的資源來說篙顺,不太友好偶芍。

通過實踐,第2點和第3點原因直接打消了我采用kubeedge的念頭德玫。

k3s簡介

什么是k3s?

k3s is 5 less then k8s,直接翻譯過來就是k3s比k8s少了5個字符匪蟀,引申一下就是k3s就是k8s的簡化版≡咨可以看做k8s的一個衍生版材彪,特點就是輕量。

k3s的特點有哪些琴儿?

apiserver段化、controller manager、scheduler造成、kubelet显熏、flannel等組件這到一個進程中(通過指定是server或者agent選項來控制節(jié)點上需要啟動哪些組件,server相當于k8s的master節(jié)點晒屎,agent相當于worker節(jié)點)喘蟆,占用的內(nèi)存更少了,整個k3s server進程需要的內(nèi)存在500MB以下夷磕。

$ systemctl status k3s-server
● k3s-server.service - Lightweight Kubernetes
   Loaded: loaded (/usr/lib/systemd/system/k3s-server.service; enabled; vendor preset: disabled)
   Active: active (running) since 一 2019-10-28 11:35:25 CST; 1 weeks 3 days ago
     Docs: https://k3s.io
 Main PID: 1534 (k3s-server)
    Tasks: 0
   Memory: 210.2M
   CGroup: /system.slice/k3s-server.service
           ? 1534 /usr/bin/k3s server --docker --bind-address=10.0.0.201 --cluster-cidr=10.128.0.0/16 ...

11月 07 14:21:35 test01-201 k3s[1534]: I1107 14:21:35.426083    1534 trace.go:81] Trace[193609352...ms):
11月 07 14:21:35 test01-201 k3s[1534]: Trace[1936093523]: [575.582721ms] [575.489216ms] Listing f...done
11月 07 14:22:14 test01-201 k3s[1534]: W1107 14:22:14.958361    1534 reflector.go:289] object-"te...978)
11月 07 14:23:32 test01-201 k3s[1534]: W1107 14:23:32.403901    1534 reflector.go:289] object-"te...043)
11月 07 14:23:52 test01-201 k3s[1534]: W1107 14:23:52.762578    1534 reflector.go:289] object-"te...061)
11月 07 14:24:08 test01-201 k3s[1534]: W1107 14:24:08.159614    1534 reflector.go:289] object-"ku...074)
11月 07 14:24:20 test01-201 k3s[1534]: W1107 14:24:20.815875    1534 reflector.go:289] object-"te...086)
11月 07 14:24:21 test01-201 k3s[1534]: W1107 14:24:21.038295    1534 reflector.go:289] object-"te...086)
11月 07 14:26:17 test01-201 k3s[1534]: W1107 14:26:17.367497    1534 reflector.go:289] object-"te...183)
11月 07 14:26:27 test01-201 k3s[1534]: W1107 14:26:27.321999    1534 reflector.go:289] object-"te...192)
Hint: Some lines were ellipsized, use -l to show in full.
[asadmin@test01-201 ~]$

從上面看出k3s server進程當前占用的內(nèi)存是210MB。

去除了k8s中的一些實驗特性仔沿、非必須的組件坐桩,例如云廠商的驅(qū)動、存儲插件封锉,k3s在默認狀態(tài)下只會啟動除自身進程之外的兩個應用:

  • coredns:提供集群內(nèi)部的DNS解析服務绵跷。

  • traefik:ingress controller的角色。

k3s server默認使用本地(已集成)的sqllite作為后端數(shù)據(jù)存儲成福,通訊效率更高一些碾局。

占用資源少:k3s默認使用containerd(server節(jié)點,不可更改)作為容器運行時奴艾,不在需要中間層的docker engine净当,占用資源更少。

部署簡單:對環(huán)境依賴少蕴潦,可離線也可在線部署(不過國內(nèi)的網(wǎng)絡環(huán)境不推薦在線部署像啼。),離線部署時潭苞,只需要下載一個大約40MB的二進制文件和一個200MB不到的離線鏡像包忽冻,啟動k3s節(jié)點幾乎是秒級的。

上手無代價:

  • 使用k3s與kubernetes習慣完全一致此疹,對于使用kubernetes的人來講使用k3s沒有任何代價僧诚;

  • 支持部署helm tiller服務端(盡管tiller端會在helm 3.x版本中被干掉)遮婶,直接使用原有charts部署應用無障礙;

擴縮容方便:增刪節(jié)點極其方便湖笨,幾乎是分鐘以內(nèi)就可以完成旗扑;

兼容arm架構(gòu)設備:對于部分有此種類型的設備的集群友好。

下面是k3s的架構(gòu)圖:

在這里插入圖片描述

k3s集群的所有數(shù)據(jù)存儲在server(master)節(jié)點本地的SQLite數(shù)據(jù)庫中赶么,當然也支持存儲在諸如MySQL肩豁、etcd中,都是支持按照需求在部署節(jié)點時選擇配置的辫呻。server節(jié)點與agent節(jié)點之間采用tunnel隧道通信清钥,增強了安全性,同時也提升了效率放闺。agent與server節(jié)點即使斷開網(wǎng)絡連接鞋怀,也不影響相互各自的業(yè)務。

因此通過上面的對比和實踐驗證衣洁,我們決定采用k3s來管理邊緣設備集群距帅。

運維架構(gòu)簡介

下面是一張完整的運維架構(gòu)圖:

在這里插入圖片描述

部署k3s集群

由于集群節(jié)點一般存在多個,一臺臺手工安裝部署會占用大量的時間匾寝,吃力不討好搬葬,因此,我寫成了ansible playbook來完成k3s集群的多節(jié)點快速自動化部署艳悔,如有需要急凰,可以聯(lián)系yj.zeng@aliyun.com

各個組件版本信息:

  • k3s: v0.9.1

  • docker: 18.09.9

  • helm: v2.14.3

  • OS:CentOS Linux release 7.6.1810 (Core)

  • Ansible: 2.8.3(在多節(jié)點下猜年,用來快速批量部署集群節(jié)點)

本次實踐在Centos 7上完成抡锈,由于部署k3s節(jié)點需要root用戶權限,因此本實踐中所有操作均直接使用root用戶登錄后進行乔外。

獲取k3s以及離線鏡像包

k3s GitHub主頁:

https://github.com/rancher/k3s/releases

由于國內(nèi)訪問GitHub的速度很慢床三,在線安裝耗時很長,因此推薦采用離線部署方式部署杨幼。

以v0.8.1版本為例撇簿,下載下面的兩個文件:

  • k3s

  • k3s-airgap-images-amd64.tar

準備工作

假定下載到的文件已經(jīng)上傳到服務器節(jié)點的~/packages目錄下面。

將k3s二進制文件放置到/usr/local/bin目錄下差购,并賦予可執(zhí)行權限:

# cp ~/packages/k3s /usr/local/bin/ 
# chmod +x /usr/local/bin/k3s

將離線鏡像包放置到指定的位置:

# mkdir -p /var/lib/rancher/k3s/agent/images/
# cp ~/packages/k3s-airgap-images-amd64.tar /var/lib/rancher/k3s/agent/images/

需要在k3s集群所有節(jié)點上都放置上面的離線文件补疑。

在部署k3s集群之前,需要對所有節(jié)點做如下的基礎配置歹撒。

如果沒有專門的域名服務器提供主機名解析服務莲组,那么在每一臺節(jié)點的/etc/hosts文件中。寫入本節(jié)點的IP與主機名映射暖夭。

給所有節(jié)點安裝并配置相同的NTP服務器锹杈,保證服務器時間的正確性撵孤。

# yum -y install ntp && systemctl start ntpd && systemctl enable ntpd

為了方便我們直接關閉防火墻服務:

# systemctl stop firewalld && systemctl disable firewalld

至此,準備工作完成竭望。

部署k3s server節(jié)點

提醒:

截止目前邪码,k3s server節(jié)點并不支持HA。

k3s server節(jié)點安裝時咬清,可以選在同時在本地安裝一個k3s agent節(jié)點用以承載工作負載闭专,如果選擇不在server節(jié)點上安裝agent節(jié)點,則除了k3s集成的kuberntes組件(如kubelet旧烧、api server)之外影钉,其余的插件、應用均不會被調(diào)度到server節(jié)點上掘剪。

k3s支持使用多種容器運行時環(huán)境平委,server默認以containerd作為運行時,不支持更改夺谁。agent節(jié)點可以使用contained也可以使用docker廉赔,推薦使用docker,因為docker人機更友好匾鸥,可以方便的管理鏡像和容器以及查錯蜡塌。所以如果選擇agent節(jié)點以docker作為容器運行時,那么必須要提前安裝并配置好docker服務勿负。

現(xiàn)在馏艾,我們可以啟動k3s server節(jié)點:

# k3s server \
    --docker \
    --bind-address=10.0.0.201 \
    --cluster-cidr=10.128.0.0/16 \
    --service-cidr=10.129.0.0/16 \
    --kube-apiserver-arg service-node-port-range=1000-65000 \
    --write-kubeconfig=/root/.kube/config \
    --write-kubeconfig-mode=644 \
    --node-label asrole=worker

參數(shù)說明:

  • --docker: k3s server組件以containerd作為容器運行時“驶罚可以順便在k3s server節(jié)點上啟動一個agent節(jié)點攒至,agent節(jié)點可以使用docker作為容器運行時厚者,這樣k3s server節(jié)點也可以當做工作節(jié)點用躁劣。當然也可以不在server節(jié)點上啟動agent節(jié)點(添加參數(shù)--disable-agent即可)。

  • --bind-address:k3s監(jiān)聽的IP地址库菲,非必選账忘,默認是localhost。

  • --cluster-cidr:與kubernetes一樣熙宇,也就是pod所在網(wǎng)絡平面鳖擒,非必選,默認是10.42.0.0/16.

  • --service-cidr:與kubernetes一樣烫止,服務所在的網(wǎng)絡平面蒋荚,非必選,默認是10.43.0.0/16.

  • --kube-apiserver-arg:額外的api server配置參數(shù)馆蠕,具體可以參考kuberntes官方網(wǎng)站了解支持的配置選項期升,非必選惊奇。

  • --write-kubeconfig:安裝時順便寫一個kubeconfig文件,方便使用kubectl工具直接訪問播赁。如果不加此參數(shù)颂郎,則默認的配置文件路徑為/etc/rancher/k3s/k3s.yaml,默認只有root用戶能讀容为。

  • --write-kubeconfig-mode:與--write-kubeconfig一起使用乓序,指定kubeconfig文件的權限。

  • --node-label:順便給節(jié)點打上一個asrole=worker的label坎背,非必選替劈。

k3s支持眾多的安裝參數(shù)和選型,詳細請參考官方文檔:

https://rancher.com/docs/k3s/latest/en/installation/

完成之后沼瘫,檢查集群狀態(tài):

# k3s kubectl get nodes
NAME         STATUS   ROLES    AGE   VERSION
test01-201   Ready    master   11m   v1.15.4-k3s.1

可見節(jié)點已經(jīng)呈就緒狀態(tài)抬纸。

檢查pod的狀態(tài):

# k3s kubectl get po --all-namespaces
NAMESPACE     NAME                         READY   STATUS      RESTARTS   AGE
kube-system   helm-install-traefik-fhr87   0/1     Completed   0          3m4s
kube-system   svclb-traefik-zlgwx          3/3     Running     0          54s
kube-system   coredns-66f496764-x9svh      1/1     Running     0          3m4s
kube-system   traefik-d869575c8-kvwbc      0/1     Running     0          54s

可以看到,系統(tǒng)命名空間下所有的應用都已經(jīng)啟動了耿戚,server節(jié)點已經(jīng)就緒湿故,接下來可以部署k3s agent工作節(jié)點了。

在上面的命令中膜蛔,我們均是以k3s kubectl開頭的命令坛猪,是否可以直接使用kubectl客戶端呢?當然可以皂股,只需要下載一個對應版本的kubectl二進制文件放到系統(tǒng)的path中墅茉,賦予可執(zhí)行權限即可,使用起來與使用kubernetes集群一模一樣呜呐!

由于上面的命令是在前臺執(zhí)行的就斤,一旦斷開SSH鏈接或者終止shell進程,k3s server就停止運行了蘑辑,因此我們給他配置一個systemd服務洋机,用以像管理系統(tǒng)服務一樣管理k3s server節(jié)點。

創(chuàng)建文件/usr/lib/systemd/system/k3s-server.service,內(nèi)容為:

[Unit]
Description=Lightweight Kubernetes
Documentation=https://k3s.io
After=network-online.target

[Service]
Type=notify
EnvironmentFile=/etc/systemd/system/k3s.service.env
ExecStart=/usr/local/bin/k3s server --docker --bind-address=10.0.0.201 --cluster-cidr=10.128.0.0/16 --service-cidr=10.129.0.0/16 --kube-apiserver-arg service-node-port-range=1000-65000
KillMode=process
Delegate=yes
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
TimeoutStartSec=0
Restart=always
RestartSec=5s

[Install]
WantedBy=multi-user.target

然后設置服務開機自啟:

# systemctl enable k3s-server

CTRL+C結(jié)束在前臺執(zhí)行的命令洋魂,我們看到服務文件中引用了一個環(huán)境變量文件/etc/systemd/system/k3s.service.env绷旗,這個文件并不存在需要先創(chuàng)建一個然后才能啟動服務:

# touch /etc/systemd/system/k3s.service.env
# systemctl start k3s-server

查看服務狀態(tài):

# systemctl status k3s-server
● k3s-server.service - Lightweight Kubernetes
   Loaded: loaded (/usr/lib/systemd/system/k3s-server.service; disabled; vendor preset: disabled)
   Active: active (running) since 五 2019-10-11 09:37:09 CST; 15min ago
     Docs: https://k3s.io
 Main PID: 10841 (k3s-server)
    Tasks: 0
   Memory: 223.3M
   CGroup: /system.slice/k3s-server.service
           ? 10841 /usr/local/bin/k3s server --docker --bind-address=10.0.0.201 --cluster-cidr=10.128.0.0/16 --service-cidr=10.129.0.0/16 --...

10月 11 09:37:22 test01-201 k3s[10841]: I1011 09:37:22.920359   10841 event.go:258] Event(v1.ObjectReference{Kind:"Node", Namespace:"", Nam...
10月 11 09:37:22 test01-201 k3s[10841]: I1011 09:37:22.927021   10841 controller_utils.go:1036] Caches are synced for persistent vo...ntroller
10月 11 09:37:22 test01-201 k3s[10841]: I1011 09:37:22.934842   10841 controller_utils.go:1036] Caches are synced for attach detach controller
10月 11 09:37:22 test01-201 k3s[10841]: I1011 09:37:22.940745   10841 controller_utils.go:1036] Caches are synced for garbage colle...ntroller
10月 11 09:37:22 test01-201 k3s[10841]: I1011 09:37:22.956261   10841 controller_utils.go:1036] Caches are synced for garbage colle...ntroller
10月 11 09:37:22 test01-201 k3s[10841]: I1011 09:37:22.956292   10841 garbagecollector.go:137] Garbage collector: all resource moni... garbage
10月 11 09:37:22 test01-201 k3s[10841]: I1011 09:37:22.959183   10841 controller_utils.go:1036] Caches are synced for cidrallocator controller
10月 11 09:37:23 test01-201 k3s[10841]: I1011 09:37:23.292627   10841 controller.go:606] quota admission added evaluator for: jobs.batch
10月 11 09:38:02 test01-201 k3s[10841]: I1011 09:38:02.930061   10841 event.go:258] Event(v1.ObjectReference{Kind:"Node", Namespace...NotReady
10月 11 09:38:02 test01-201 k3s[10841]: E1011 09:38:02.970568   10841 daemon_controller.go:302] kube-system/svclb-traefik failed wi...Link:"/a
Hint: Some lines were ellipsized, use -l to show in full.

提醒:如果出現(xiàn)錯誤,可以通過journalctl -u k3s-server查看日志副砍。

部署k3s agent節(jié)點

在server節(jié)點部署完成之后衔肢,在server節(jié)點的/var/lib/rancher/k3s/server/目錄下面生成一個node-token文件,該文件存儲了k3s agent節(jié)點加入集群時所需的token豁翎。

在server節(jié)點上角骤,獲取token:

# cat /var/lib/rancher/k3s/server/node-token 
K10e3dc328c9e2cbb07c195542da31ab435dbe0182b1c99c613f460097b5173dbc7::node:0595ee334f5d2847542b5b1c9300f363

在作為k3s agent節(jié)點的系統(tǒng)中,以root用戶執(zhí)行下面的命令啟動k3s agent節(jié)點心剥,但是邦尊,因為我們采用了docker作為agent節(jié)點的容器運行時硼控,所以我們先將離線鏡像導入到docker中:

# docker load -i ~/packages/k3s-airgap-images-amd64.tar 
fb61a074724d: Loading layer [==================================================>]  479.7kB/479.7kB
ed9e1db7c0e6: Loading layer [==================================================>]  40.16MB/40.16MB
Loaded image: coredns/coredns:1.3.0
faf7c252da57: Loading layer [==================================================>]    236kB/236kB
d27d00a62b62: Loading layer [==================================================>]  71.48MB/71.48MB
Loaded image: traefik:1.7.12
d9ff549177a9: Loading layer [==================================================>]  4.671MB/4.671MB
d635f458a6f8: Loading layer [==================================================>]  7.586MB/7.586MB
9ce3955d3fa8: Loading layer [==================================================>]  73.36MB/73.36MB
6c5cc370be91: Loading layer [==================================================>]  4.608kB/4.608kB
Loaded image: rancher/klipper-helm:v0.1.5
767f936afb51: Loading layer [==================================================>]  4.672MB/4.672MB
d9f07b03cc3c: Loading layer [==================================================>]  1.786MB/1.786MB
4d018801281b: Loading layer [==================================================>]  3.072kB/3.072kB
Loaded image: rancher/klipper-lb:v0.1.1
e17133b79956: Loading layer [==================================================>]  744.4kB/744.4kB
Loaded image: k8s.gcr.io/pause:3.1

然后執(zhí)行下面的命令安裝k3s-agent節(jié)點

# k3s agent \
    --docker \
    --server https://10.0.0.201:6443 \
    --token K10e3dc328c9e2cbb07c195542da31ab435dbe0182b1c99c613f460097b5173dbc7::node:0595ee334f5d2847542b5b1c9300f363 \
    --node-ip=10.0.0.202 \
    --node-label asrole=worker

參數(shù)說明:

  • --docker:k3s agent以docker作為容器運行時。

  • --server:k3s server節(jié)點監(jiān)聽的url胳赌,必選參數(shù)牢撼。

  • --token:k3s server安裝時生成的token,必選參數(shù)疑苫。

  • --node-ip:k3s agent節(jié)點的IP地址熏版,非必選參數(shù)。

  • --node-label:同樣給k3s agent節(jié)點打上一個asrole=worker的標簽捍掺,非必選參數(shù)撼短。

稍等一會兒,在server節(jié)點上查看agent節(jié)點是否已經(jīng)加入到了集群中:

# k3s kubectl get nodes
NAME         STATUS   ROLES    AGE   VERSION
test01-201   Ready    master   12h   v1.15.4-k3s.1
test02-202   Ready    worker   11h   v1.15.4-k3s.1

可以看到節(jié)點已經(jīng)成功加入到了集群中挺勿。

同樣給agent節(jié)點配置成systemd可以管理的系統(tǒng)服務曲横,創(chuàng)建/usr/lib/systemd/system/k3s-agent.service,內(nèi)容如下:

[Unit]
Description=Lightweight Kubernetes
Documentation=https://k3s.io
After=network-online.target

[Service]
Type=notify
EnvironmentFile=/etc/systemd/system/k3s.service.env
ExecStart=/usr/local/bin/k3s agent --docker --server https://10.0.0.201:6443 --token K10e3dc328c9e2cbb07c195542da31ab435dbe0182b1c99c613f460097b5173dbc7::node:0595ee334f5d2847542b5b1c9300f363 --node-ip=10.0.0.202 --node-label asrole=worker
KillMode=process
Delegate=yes
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
TimeoutStartSec=0
Restart=always
RestartSec=5s

[Install]
WantedBy=multi-user.target

我們終止前臺執(zhí)行的命令不瓶,執(zhí)行下面的命令通過systemd重新啟動服務:

# touch /etc/systemd/system/k3s.service.env
# systemctl daemon-reload && systemctl enable k3s-agent
# systemctl enable k3s-agent
Created symlink from /etc/systemd/system/multi-user.target.wants/k3s-agent.service to /usr/lib/systemd/system/k3s-agent.service.
# systemctl start k3s-agent
# systemctl status k3s-agent
● k3s-agent.service - Lightweight Kubernetes
   Loaded: loaded (/usr/lib/systemd/system/k3s-agent.service; enabled; vendor preset: disabled)
   Active: active (running) since 五 2019-10-11 10:05:12 CST; 1min 30s ago
     Docs: https://k3s.io
 Main PID: 13631 (k3s-agent)
    Tasks: 0
   Memory: 149.0M
   CGroup: /system.slice/k3s-agent.service
           ? 13631 /usr/local/bin/k3s agent --docker --server https://10.0.0.201:6443 --token K10e3dc328c9e2cbb07c195542da31ab435dbe0182b1c9...

10月 11 10:05:13 test02-202 k3s[13631]: I1011 10:05:13.074705   13631 cpu_manager.go:156] [cpumanager] reconciling every 10s
10月 11 10:05:13 test02-202 k3s[13631]: I1011 10:05:13.074731   13631 policy_none.go:42] [cpumanager] none policy: Start
10月 11 10:05:13 test02-202 k3s[13631]: I1011 10:05:13.079218   13631 plugin_manager.go:116] Starting Kubelet Plugin Manager
10月 11 10:05:13 test02-202 k3s[13631]: I1011 10:05:13.350068   13631 kube.go:134] Node controller sync successful
10月 11 10:05:13 test02-202 k3s[13631]: I1011 10:05:13.350282   13631 vxlan.go:120] VXLAN config: VNI=1 Port=0 GBP=false DirectRouting=false
10月 11 10:05:13 test02-202 k3s[13631]: I1011 10:05:13.353705   13631 flannel.go:75] Wrote subnet file to /run/flannel/subnet.env
10月 11 10:05:13 test02-202 k3s[13631]: I1011 10:05:13.353740   13631 flannel.go:79] Running backend.
10月 11 10:05:13 test02-202 k3s[13631]: I1011 10:05:13.353767   13631 vxlan_network.go:60] watching for new subnet leases
10月 11 10:05:13 test02-202 k3s[13631]: I1011 10:05:13.412763   13631 reconciler.go:203] operationExecutor.VerifyControllerAttachedVolume s...
10月 11 10:05:14 test02-202 k3s[13631]: I1011 10:05:14.215209   13631 reconciler.go:150] Reconciler: start to sync state
Hint: Some lines were ellipsized, use -l to show in full.

可以看到k3s agent節(jié)點已經(jīng)成功啟動了禾嫉。

如果還需要加入新的agent節(jié)點到集群中,可以按照上述方式配置啟動新節(jié)點蚊丐,完成后熙参,新節(jié)點自動加入到集群中。

部署應用

通過helm部署應用

一般情況下麦备,我們會通過helm chart安裝應用和升級應用孽椰,在k3s集群中,同樣可以采用helm來安裝部署應用凛篙。

下載helm的客戶端二進制文件后黍匾,放置到/usr/local/bin目錄下并賦予可執(zhí)行權限。執(zhí)行下面的命令初始化helm客戶端:

# k3s kubectl -n kube-system create serviceaccount tiller
serviceaccount/tiller created
# k3s kubectl create clusterrolebinding tiller \
>   --clusterrole=cluster-admin \
>   --serviceaccount=kube-system:tiller
clusterrolebinding.rbac.authorization.k8s.io/tiller created
# helm init --service-account tiller \
> --tiller-image registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.14.3 --skip-refresh
Creating /root/.helm 
Creating /root/.helm/repository 
Creating /root/.helm/repository/cache 
Creating /root/.helm/repository/local 
Creating /root/.helm/plugins 
Creating /root/.helm/starters 
Creating /root/.helm/cache/archive 
Creating /root/.helm/repository/repositories.yaml 
Adding stable repo with URL: https://kubernetes-charts.storage.googleapis.com 
Adding local repo with URL: http://127.0.0.1:8879/charts 
$HELM_HOME has been configured at /root/.helm.

Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.

Please note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy.
To prevent this, run `helm init` with the --tiller-tls-verify flag.
For more information on securing your installation see: https://docs.helm.sh/using_helm/#securing-your-helm-installation

查看helm信息:

# helm version --short
Client: v2.14.3+g0e7f3b6
Server: v2.14.3+g0e7f3b6

可見helm的服務端已經(jīng)在集群中創(chuàng)建成功了呛梆,下面就可以使用helm chart安裝應用了锐涯。在此我們進行演示:

#  helm repo add edge https://xxxx.xxxx.com
"edge" has been added to your repositories
# helm install edge/iotgateway
NAME:   idolized-wombat
LAST DEPLOYED: Fri Oct 11 11:26:04 2019
NAMESPACE: default
STATUS: DEPLOYED
...

查看pod的情況:

# k3s kubectl get po -o wide
NAME               READY   STATUS    RESTARTS   AGE     IP           NODE         NOMINATED NODE   READINESS GATES
iotgateway-6c242   1/1     Running   0          2m42s   10.0.0.201   test01-201   <none>           <none>
iotgateway-pqsx2   1/1     Running   0          2m38s   10.0.0.202   test02-202   <none>           <none>

可見應用已經(jīng)創(chuàng)建成功。

使用Rancher管理k3s集群

在Rancher上添加一個集群削彬,然后按照步驟將該集群導入到Rancher平臺中全庸,可以使用Rancher管理和維護集群:

在這里插入圖片描述

FAQ

1秀仲、在邊緣計算中融痛,往往涉及到訪問硬件資源,如何從容器內(nèi)部訪問硬件資源神僵?

Linux系統(tǒng)中雁刷,所有的硬件資源都體現(xiàn)為/dev/目錄下面的一個設備,因此只要能夠訪問/dev/目錄下面的設備文件即可保礼,有的同學會說沛励,那是不是將/dev/目錄掛載到容器里面就可以了呢责语?經(jīng)過我的實踐證明不行,因為掛載到容器里面目派,即便容器里面是以root用戶運行坤候,然是仍舊有可能無法訪問一些特殊資源文件,也就是說容器中的“root”用戶與宿主機的root用戶在訪問權限上還是有差別企蹭。只需要將容器的運行模式設置為“privileged”即可白筹,如下:

resources:
  limits:
    cpu: 300m
    memory: 512Mi
  requests:
    cpu: 50m
    memory: 256Mi
securityContext:
  privileged: true

2、如何備份集群數(shù)據(jù)谅摄?

k3s集群數(shù)據(jù)全部存儲在/var/lib/rancher下面徒河,在/etc/rancher、/etc/kubernetes下面會存儲一些配置文件和證書送漠,因此我們可以周期性備份這幾個目錄的數(shù)據(jù)即可顽照。也可以給k3s server節(jié)點掛載一個高可靠性的存儲設備。

3闽寡、節(jié)點宕機怎么恢復代兵?

對于agent節(jié)點,邊緣節(jié)點只負責一個小區(qū)域的業(yè)務爷狈,單個節(jié)點宕機對整個集群業(yè)務影響很有限奢人,只需要重新啟動將節(jié)點加入集群中即可恢復業(yè)務運行。對于server節(jié)點淆院,如果有數(shù)據(jù)備份何乎,可以用數(shù)據(jù)備份進行恢復(將備份數(shù)據(jù)放置到對應的目錄重新按照原有參數(shù)啟動server節(jié)點服務即可),如果沒有備份土辩,那么重新安裝一個server節(jié)點支救,更改agent節(jié)點的啟動參數(shù)中的token,重新將agent注冊到新的server節(jié)點拷淘,但是因為集群數(shù)據(jù)丟失各墨,可能需要重新安裝應用,因此盡可能對server節(jié)點的數(shù)據(jù)進行周期性備份并妥善存儲保管启涯。

4贬堵、k3s是否可以外部存儲系統(tǒng)?

當然是可以的结洼,如果涉及到應用必須要訪問持久化存儲黎做,那么也可以像kubernetes一樣給其接入外部存儲系統(tǒng),但是不推薦這么做松忍,因為邊緣設備一般比較分散蒸殿,網(wǎng)絡環(huán)境也不穩(wěn)定,外接存儲系統(tǒng)會導致性能打折扣,因此建議:

  • 對于必須將數(shù)據(jù)存儲在外部存儲上的應用宏所,可以通過nodeSelector限制其到某幾個特定的比較可靠穩(wěn)定的節(jié)點上酥艳,然后接入外部存儲系統(tǒng);

  • 對于daemonset類型的應用爬骤,非關鍵核心數(shù)據(jù)可以通過hostPath存儲在宿主機系統(tǒng)上

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末充石,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子霞玄,更是在濱河造成了極大的恐慌赫冬,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件溃列,死亡現(xiàn)場離奇詭異劲厌,居然都是意外死亡,警方通過查閱死者的電腦和手機听隐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門补鼻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人雅任,你說我怎么就攤上這事风范。” “怎么了沪么?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵硼婿,是天一觀的道長。 經(jīng)常有香客問我禽车,道長寇漫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任殉摔,我火速辦了婚禮州胳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘逸月。我一直安慰自己栓撞,他們只是感情好,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布碗硬。 她就那樣靜靜地躺著瓤湘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪恩尾。 梳的紋絲不亂的頭發(fā)上弛说,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天,我揣著相機與錄音特笋,去河邊找鬼剃浇。 笑死,一個胖子當著我的面吹牛猎物,可吹牛的內(nèi)容都是我干的虎囚。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼蔫磨,長吁一口氣:“原來是場噩夢啊……” “哼淘讥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起堤如,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤蒲列,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后搀罢,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蝗岖,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年榔至,在試婚紗的時候發(fā)現(xiàn)自己被綠了抵赢。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡唧取,死狀恐怖铅鲤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情枫弟,我是刑警寧澤邢享,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站淡诗,受9級特大地震影響骇塘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜韩容,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一绪爸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧宙攻,春花似錦奠货、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至溢陪,卻和暖如春萍虽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背形真。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工杉编, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留超全,地道東北人。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓邓馒,卻偏偏與公主長得像嘶朱,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子光酣,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容