前 言
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輔助其他軟件給用戶提供輕量級的交付體驗遣妥,開箱即用的使用感受。