手把手實(shí)操教程!使用k3s運(yùn)行輕量級VM

前 言

k3s作為輕量級的Kubernetes發(fā)行版抡诞,運(yùn)行容器是基本功能。VM的管理原本是IaaS平臺的基本能力渗勘,隨著Kubernetes的不斷發(fā)展沐绒,VM也可以納入其管理體系。結(jié)合Container和VM的各自優(yōu)勢旺坠,又發(fā)展出輕量級VM的理念乔遮,兼具容器的輕量特性,又有VM的隔離安全性取刃,這其中kata-container是時下比較受關(guān)注的開源項目蹋肮。那么輕量級的k3s和輕量級VM碰撞,又有怎樣的效果璧疗,結(jié)合兩者進(jìn)行實(shí)踐坯辩,謹(jǐn)以此文進(jìn)行說明。

請注意崩侠,本文部署時使用的主要軟件版本是:

k8s v1.17.2+k3s.1漆魔,kata-containers v1.9.3。

環(huán)境準(zhǔn)備

kata-containers既可以在純Docker上運(yùn)行却音,也可以運(yùn)行在Kubernetes中改抡,但本文只關(guān)注Kubernetes場景。kubelet本身可以支持多種滿足CRI接口的runtime系瓢,包括CRI-O和CRI-Containerd阿纤,Kubernetes的RuntimeClaas可以配置Pod使用那種運(yùn)行時,創(chuàng)建容器時對應(yīng)的runtime調(diào)用runc創(chuàng)建容器夷陋,創(chuàng)建VM時調(diào)用kata-runtime創(chuàng)建VM欠拾。kata-runtime支持多種形式的輕量VM,kata-qemu是默認(rèn)支持選項骗绕,另外也可以使用firecracker(另一種MicroVM)藐窄。整體調(diào)用關(guān)系如下圖所示:

在這里插入圖片描述

無論哪種VM,KVM的支持是需要的爹谭,現(xiàn)在主流的MicroVM技術(shù)都是基于KVM枷邪,所以我們的環(huán)境需要準(zhǔn)備支持KVM的Host。你可以用Bare Metal诺凡,也可以用支持KVM的PC server东揣,還可以用嵌套虛擬化方式。Host開啟KVM支持后腹泌,可以用以下命令檢查:

# 檢測虛擬化情況(需要>0)
grep -cw vmx /proc/cpuinfo

安裝k3s和kata-containers

k3s的安裝部署非常簡單嘶卧,直接參考官方文檔即可:

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

筆者使用GCP的Host,并開啟嵌套虛擬化凉袱,所以采用在線腳本安裝方式:

curl -sfL https://get.k3s.io | sh -
 
# 備份 containerd原始配置芥吟,后面會用到
cd /var/lib/rancher/k3s/agent/etc/containerd/
cp config.toml config.toml.base

kata-containers部署有些需要注意的地方,kata-deploy(https://github.com/kata-containers/packaging/tree/master/kata-deploy)是官方維護(hù)的部署腳本专甩,可以幫助部署kata-containers钟鸵。但是,kata-deploy的k3s支持有些問題涤躲,盡管已經(jīng)有PR提交聲明支持了k3s棺耍,筆者整理了這一部署過程遇到的問題,僅作參考种樱。

首先設(shè)置RBAC蒙袍,先安裝文檔中默認(rèn)的RBAC yaml,再做一些修改:

kubectl apply -f https://raw.githubusercontent.com/kata-containers/packaging/master/kata-deploy/kata-rbac/base/kata-rbac.yaml
 
# 編輯 clusterrole node-labeler嫩挤,添加新的api授權(quán)
# 新增coordination.k8s.io的leases授權(quán) 
kubectl edit clusterrole node-labeler
...
...
rules:
- apiGroups:
  - ""
  resources:
  - nodes
  verbs:
  - get
  - patch
- apiGroups:
  - coordination.k8s.io
  resources:
  - leases
  verbs:
  - get
  - list

部署kata害幅,依然是先安裝文檔中默認(rèn)的yaml:

kubectl apply -k github.com/kata-containers/packaging/kata-deploy/kata-deploy/overlays/k3s

查看kata-deploy Pod的運(yùn)行情況,基本上你肯定會看到出錯信息:

crictl ps -a | grep kube-kata
crictl logs <kube-kata-container-id>
...
...
Failed to restart containerd.service: Unit containerd.service not found.

這時候發(fā)現(xiàn)containerd雖然配置完成岂昭,但是重啟失敗以现。k3s目前的containerd是內(nèi)置在k3s管理的,并不是通過systemd约啊,而kata-deploy無法識別邑遏,這需要我們手動來完成這個過程:


# 創(chuàng)建/var/lib/rancher/k3s/agent/etc/containerd/config.toml.tmpl
 
# 使用之前保留的原始配置
cat config.toml.base > config.toml.tmpl
 
# 在config.toml.tmpl末尾追加
# 你可以篩選加入你使用的runtimes,也可以全部添加
[plugins.cri.containerd.runtimes.kata]
  runtime_type = "io.containerd.kata.v2"
[plugins.cri.containerd.runtimes.kata.options]
  ConfigPath = "/opt/kata/share/defaults/kata-containers/configuration.toml"
 
[plugins.cri.containerd.runtimes.kata-fc]
  runtime_type = "io.containerd.kata-fc.v2"
[plugins.cri.containerd.runtimes.kata-fc.options]
  ConfigPath = "/opt/kata/share/defaults/kata-containers/configuration-fc.toml"
 
[plugins.cri.containerd.runtimes.kata-qemu]
  runtime_type = "io.containerd.kata-qemu.v2"
[plugins.cri.containerd.runtimes.kata-qemu.options]
  ConfigPath = "/opt/kata/share/defaults/kata-containers/configuration-qemu.toml"
 
[plugins.cri.containerd.runtimes.kata-qemu-virtiofs]
  runtime_type = "io.containerd.kata-qemu-virtiofs.v2"
[plugins.cri.containerd.runtimes.kata-qemu-virtiofs.options]
  ConfigPath = "/opt/kata/share/defaults/kata-containers/configuration-qemu-virtiofs.toml"
 
[plugins.cri.containerd.runtimes.kata-nemu]
  runtime_type = "io.containerd.kata-nemu.v2"
[plugins.cri.containerd.runtimes.kata-nemu.options]
  ConfigPath = "/opt/kata/share/defaults/kata-containers/configuration-nemu.toml"

由于kata-deploy每次啟動都會重寫k3s containerd配置棍苹,為了避免干擾无宿,在一切就緒后,我們可以刪除kata-deploy枢里,并重啟k3s:


# 由于kata-deploy stop時會清理安裝的kata相關(guān)程序孽鸡,所以刪除kata-deploy前,我們先去掉這個機(jī)制
# 編輯kata-deploy栏豺,刪除lifecycle preStop
 
lifecycle:
  preStop:
    exec:
      command:
      - bash
      - -c
      - /opt/kata-artifacts/scripts/kata-deploy.sh cleanup
 
 
kubectl delete -k github.com/kata-containers/packaging/kata-deploy/kata-deploy/overlays/k3s
 
systemctl restart k3s.service

運(yùn)行demo

添加RuntimeClass彬碱,目前經(jīng)過筆者測試,k3s只支持kata-qemu奥洼,所以我們只安裝kata-qemu-runtimeClass:

kubectl apply -f https://raw.githubusercontent.com/kata-containers/packaging/master/kata-deploy/k8s-1.14/kata-qemu-runtimeClass.yaml

添加workload

kubectl apply -f https://raw.githubusercontent.com/kata-containers/packaging/master/kata-deploy/examples/test-deploy-kata-qemu.yaml
 
kubectl get deploy php-apache-kata-qemu
NAME                   READY   UP-TO-DATE   AVAILABLE   AGE
php-apache-kata-qemu   1/1     1            1           1m

確認(rèn)kata-qemu正常創(chuàng)建VM:

ps aux| grep qemu
root      3589  0.9  0.9 2490176 151368 ?      Sl   06:49   0:15 /opt/kata/bin/qemu-system-x86_64
 
# 進(jìn)入VM
crictl ps | grep php-apache
crictl exec -it <php-apache-container-id> bash
# uname -r
4.19.75
# exit
 
# 查看Host kernel
uname -r
5.0.0-1029-gcp

我們可以看到通過k3s創(chuàng)建的每個kata容器都具有獨(dú)立的內(nèi)核巷疼,沒有共享主機(jī)內(nèi)核。

后 記

隨著k3s的進(jìn)一步發(fā)展灵奖,越來越多的軟件不僅僅支持完整的Kubernetes嚼沿,也會支持在k3s中安裝部署估盘。k3s除了會在devops領(lǐng)域和邊緣計算領(lǐng)域外不斷發(fā)展外,作為軟件運(yùn)行載體也在不斷被各個開源產(chǎn)品接受骡尽,k3s輔助其他軟件給用戶提供輕量級的交付體驗遣妥,開箱即用的使用感受。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末攀细,一起剝皮案震驚了整個濱河市箫踩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谭贪,老刑警劉巖境钟,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異俭识,居然都是意外死亡慨削,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門鱼的,熙熙樓的掌柜王于貴愁眉苦臉地迎上來理盆,“玉大人,你說我怎么就攤上這事凑阶≡彻妫” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵宙橱,是天一觀的道長姨俩。 經(jīng)常有香客問我,道長师郑,這世上最難降的妖魔是什么环葵? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮宝冕,結(jié)果婚禮上张遭,老公的妹妹穿的比我還像新娘。我一直安慰自己地梨,他們只是感情好菊卷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著宝剖,像睡著了一般洁闰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上万细,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天扑眉,我揣著相機(jī)與錄音,去河邊找鬼。 笑死腰素,一個胖子當(dāng)著我的面吹牛聘裁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播耸弄,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼咧虎,長吁一口氣:“原來是場噩夢啊……” “哼卓缰!你這毒婦竟也來了计呈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤征唬,失蹤者是張志新(化名)和其女友劉穎捌显,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體总寒,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡扶歪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了摄闸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片善镰。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖年枕,靈堂內(nèi)的尸體忽然破棺而出炫欺,到底是詐尸還是另有隱情,我是刑警寧澤熏兄,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布品洛,位于F島的核電站,受9級特大地震影響摩桶,放射性物質(zhì)發(fā)生泄漏桥状。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一硝清、第九天 我趴在偏房一處隱蔽的房頂上張望辅斟。 院中可真熱鬧,春花似錦芦拿、人聲如沸士飒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽变汪。三九已至,卻和暖如春蚁趁,著一層夾襖步出監(jiān)牢的瞬間裙盾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留番官,地道東北人庐完。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像徘熔,于是被迫代替她去往敵國和親门躯。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354

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

  • Kubelet 可通過配置項 container-runtime酷师,container-runtime-endpoi...
    陳sir的知識圖譜閱讀 5,046評論 0 2
  • Moby(Docker)社區(qū) Docker在17年4月的時候推出了名為Moby項目,Moby著眼于“一個將組件裝配...
    marshalzxy閱讀 1,722評論 1 3
  • 容器技術(shù)近年來越來越火讶凉,作為云原生技術(shù)的最底層基石,要開發(fā)云原生應(yīng)用山孔,就有必要對于容器技術(shù)有一個更加深入的了解懂讯。容...
    暴走的初號機(jī)閱讀 29,424評論 2 24
  • 今天很忙,事情特別多的時候台颠,感覺時間過得特別快褐望,就像一個惡作劇的人,在等著看笑話一樣串前。 上午瘫里,在一個文案學(xué)習(xí)群里的...
    云海白閱讀 170評論 0 4
  • 這個月是今年以來寫文章最少的一個月,除了作業(yè)荡碾,額外只寫了兩篇文章 比較慚愧谨读,還好有我們007在,大家相互激勵 00...
    少東閱讀 1,129評論 0 2