热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用K8S将Linux应用程序作为Unikernel运行

如果您阅读过我以前的一些文章,您可能会认为我永远不会写这篇文章,对吧?:)好了。我们得到的一个常见问题是“您可以在K8S中使用uniker

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

我们得到的一个常见问题是“您可以在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 mainimport ("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 -p8083 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/kubectlchmod +x ./kubectlmv 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 minikubeminikube start --vm-driver=kvm2

然后安装kvm2驱动程序。 对于此框,我需要安装libvirt工具套件:

sudo apt-get install libvirt-daemon-system libvirt-clients bridge-utils

Libvirt是一个相当古老而讨厌的库,用于与w / KVM进行交互,尽管它是大量的集成,并且没有太多选择。

如果您在执行此步骤后遇到问题,可以运行此快速验证检查以确保一切都已设置:

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_VERSIONkubectl 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-amd64chmod +x virtctl

然后,我们将使用CDI导入。

wget https://raw.githubusercontent.com/kubevirt/kubevirt.github.io/master/labs/manifests/storage-setup.ymlkubectl create -f storage-setup.ymlexport 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.yamlkubectl create -f https: //github.com/kubevirt/containerized-data-importer/releases/download/$VERSION/cdi-cr.yamlkubectl 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.ymlkubectl 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

直到下一次。

翻译自: https://hackernoon.com/running-linux-applications-as-unikernels-with-k8s-gl2p3yfr




推荐阅读
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
author-avatar
青烟_I乀n-a_396
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有