使用K8S作为Unikernels运行Linux应用程序
如果您阅读过我以前的一些文章,您可能会认为我永远不会写这篇文章,对吧? :)好了。我们得到的一个常见问题是“您可以在K8S中使用unikernel吗?” 答案是肯定的,但是有一些警告。 即,将unikernels打包为虚拟机,并且在许多情况下,在虚拟机之上的公共云中提供了k8。 另外,您还应该意识到,在k8s下配置unikernel会带来安全风险,而这些风险本来就不需要处理。 由于来宾是un...
如果您阅读过我以前的一些文章,您可能会认为我永远不会写这篇文章,对吧? :)好了。
我们得到的一个常见问题是“您可以在K8S中使用unikernel吗?” 答案是肯定的,但是有一些警告。 即,将unikernels打包为虚拟机,并且在许多情况下,在虚拟机之上的公共云中提供了k8。 另外,您还应该意识到,在k8s下配置unikernel会带来安全风险,而这些风险本来就不需要处理。 由于来宾是unikernel,而不是linux来宾,但这些仍然大大减少了。
现在,如果您拥有自己的服务器或者在裸机上运行k8,这就是在k8s下运行Nanos unikernel的方式。
对于本文,您需要一台真正的物理机器和OPS。 虽然您可以使用嵌套虚拟化,但不会,因为您将遭受相当大的性能损失。 Google Cloud在其某些实例上具有此功能 ,如果您在Amazon上,则可以在“ metal”实例上执行此示例(我尚未检查),但是请记住,这两个选项都不会与仅旋转t2纳米或微型实例(相比之下,您可以使用unikernels轻松完成)相比,它便宜。
在本示例中,我们将运行Go unikernel,但您可以使用任何OPS示例进行后续操作。 这里有一个简单的go网络服务器,位于端口8083上:
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc( "/" , func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Welcome to my website!" )
})
fs := http.FileServer(http.Dir( "static/" ))
http.Handle( "/static/" , http.StripPrefix( "/static/" , fs))
http.ListenAndServe( ":8083" , nil)
}
好的-看起来不错。 我们可以快速构建图像,并确保一切正常进行。 我们在这里使用“每晚”构建选项:
ops run -n -p 8083 goweb
Ops build也可以在这里运行,但是运行会自动为您运行,以确保它首先在本地运行。 现在我们需要将其放入k8使用的格式。 首先,我们用XZ压缩它(sudo apt-get install xz-utils):
cp .ops/images/goweb.img .
xz goweb.img
从那里,我们需要将其放入k8导入的地方。 我把它扔到一个云桶中,为了使本文尽可能简单,我们将其保持打开状态。 ( 显然,您不希望在实际的生产场景中执行此操作。 )
现在让我们安装kubectl :
curl -LO https: //storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl
chmod +x ./kubectl
mv kubectl /usr/local/bin/.
sudo mv kubectl /usr/local/bin/.
kubectl version --client
现在,我们安装minikube 。 我在这里使用minikube希望最大程度地减少全新安装所需执行的步骤,但您可以随意使用所需的任何内容。
curl -Lo minikube https: //storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && chmod +x minikube
minikube start --vm-driver=kvm2
然后安装kvm2驱动程序。 对于此框,我需要安装工具的libvirt套件:
sudo apt-get install libvirt-daemon-system libvirt-clients bridge-utils
Libvirt是一个相当古老且讨厌的库,用于与WVM进行交互,尽管它集成了大量的功能,并且没有太多替代方案。
如果您在执行此步骤后遇到问题,可以运行此快速验证检查以确保一切都已设置:
virt-host-validate
另外,请确保您处于与KVM交互的正确组中:
groups
安装完所有这些之后,您可能会发现需要重置会话(最快捷的方法是再次注销/登录)。
接下来,让我们安装kubevirt运算符 。 这才是真正将房间联系在一起的东西。
export KUBEVIRT_VERSION=$(curl -s https: //api.github.com/repos/kubevirt/kubevirt/releases | grep tag_name | grep -v -- - | sort -V | tail -1 | awk -F':' '{print $2}' | sed 's/,//' | xargs)
echo $KUBEVIRT_VERSION
kubectl create -f https: //github.com/kubevirt/kubevirt/releases/download/${KUBEVIRT_VERSION}/kubevirt-operator.yaml
然后让我们创建一个资源:
kubectl create -f https: //github.com/kubevirt/kubevirt/releases/download/${KUBEVIRT_VERSION}/kubevirt-cr.yaml
现在让我们安装virtctl。 我们累了吗?
curl -L -o virtctl https: //github.com/kubevirt/kubevirt/releases/download/${KUBEVIRT_VERSION}/virtctl-${KUBEVIRT_VERSION}-linux-amd64
chmod +x virtctl
然后,我们将使用CDI导入。
wget https: //raw.githubusercontent.com/kubevirt/kubevirt.github.io/master/labs/manifests/storage-setup.yml
kubectl create -f storage-setup.yml
export VERSION=$(curl -s https: //github.com/kubevirt/containerized-data-importer/releases/latest | grep -o "v[0-9]\.[0-9]*\.[0-9]*")
kubectl create -f https: //github.com/kubevirt/containerized-data-importer/releases/download/$VERSION/cdi-operator.yaml
kubectl create -f https: //github.com/kubevirt/containerized-data-importer/releases/download/$VERSION/cdi-cr.yaml
kubectl get pods -n cdi
好! ! 如果您完成所有这些工作,那么我们几乎到了终点。 让我们为持续的批量声明获取一个模板:
wget https: //raw.githubusercontent.com/kubevirt/kubevirt.github.io/master/labs/manifests/pvc_fedora.yml
现在,编辑该行以显示原始磁盘映像的填充位置。 在我的示例中,它看起来像这样(再次,这只是使事情变得简单的一个示例-在现实生活中您不会/不应该这样做):
cdi.kubevirt.io/storage.import.endpoint: "https://storage.googleapis.com/totally-insecure/goweb.img.xz"
创建它:
kubectl create -f pvc_fedora.yml
kubectl get pvc fedora -o yaml
您可以随时检查导入,但是请等到看到成功消息:
cdi.kubevirt.io/storage.pod.phase: Succeeded
现在我们可以创建实际的vm:
wget https: //raw.githubusercontent.com/kubevirt/kubevirt.github.io/master/labs/manifests/vm1_pvc.yml
kubectl create -f vm1_pvc.yml
现在,如果您:
kubectl get vmi
您应该看到实例正在运行。
如果您有minikube,现在可以执行以下操作:
哇! 我们刚刚向K8S部署了一个Unikernel。 简单? 好吧,我让你决定。
当然,如果您使用的是诸如AWS或GCP之类的公共云,而又不想经历所有麻烦,那么这2个命令将轻松部署同一台Web服务器,而麻烦却更少,安全性更高,更多性能,浪费少:
ops image create -c config.json -a goweb
ops instance create -z us-west2-a -i goweb-image
直到下一次。
From: https://hackernoon.com/running-linux-applications-as-unikernels-with-k8s-gl2p3yfr
更多推荐
所有评论(0)