如果您阅读过我以前的一些文章,您可能会认为我永远不会写这篇文章,对吧? :)好了。

我们得到的一个常见问题是“您可以在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

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐