如何与Kubernetes进行本地开发?

Kubernetes似乎是将容器部署到集群云。 它似乎没有触及的是开发和分期环境(或类似)。

在开发过程中,您希望尽可能接近生产环境,并进行一些重要的改变:

  • 在本地部署(或者至less在某个你可以访问的地方
  • 在页面刷新上使用最新的源代码 (假设它是一个网站;理想情况下页面自动刷新本地文件保存,如果你装载源代码,并使用像Yeoman一些东西可以完成)。

同样,人们可能想要一个非公共的环境来进行持续的整合

Kubernetes是否支持这样的开发环境,还是需要构build的东西,希望在生产过程中仍然有效?

更新(2016-07-15)

随着Kubernetes 1.3的发布, Minikube现在是在本地机器上运行Kubernetes进行开发的推荐方式。


您可以通过Docker在本地运行Kubernetes 。 一旦你有一个节点运行,你可以启动一个简单的Web服务器的吊舱,并从主机上挂载一个卷。 当你点击networking服务器时,它将从卷中读取,如果你已经改变了本地磁盘上的文件,它可以提供最新版本。

另一个伟大的起点是这个stream浪汉设置 ,特别是。 如果你的主机操作系统是Windows。 明显的优点是

  • 快速和无痛的设置
  • 容易摧毁/重build机器
  • 隐含的资源限制
  • 通过创build多个节点来testing水平缩放的能力

缺点 – 你需要大量的内存,而VirtualBox是VirtualBox …好或坏。

混合的好处/缺点是通过NFS映射文件。 在我们的设置中,我们创build了两套RC定义 – 一个只是下载我们的应用程序服务器的Docker镜像; 另外有7个额外的行设置了HostOS的文件映射 – > Vagrant – > VirtualBox – > CoreOS – > Kubernetes pod; 覆盖Docker镜像的源代码。

这个缺点是NFS文件caching – 有了它,这是有问题的,没有它,这是有问题的慢。 甚至设置mount_options: 'nolock,vers=3,udp,noac'并不能完全消除caching问题,但是它在大多数情况下都是有效的。 在主机操作系统上运行8秒钟时,在容器中运行的一些Gulp任务可能需要5分钟。 好的妥协似乎是mount_options: 'nolock,vers=3,udp,ac,hard,noatime,nodiratime,acregmin=2,acdirmin=5,acregmax=15,acdirmax=15'

至于自动代码重载,这是语言特定的,但我们很高兴与Django的Python的devserver和Nodemon的Node.js。 对于前端项目,当然可以使用gulp + browserSync + watch来做很多事情,但是对于许多开发人员来说,从Apache服务并进行传统的硬刷新并不难。

我们为Kubernetes保留4套yaml文件。 Dev,“devstable”,stage,prod。 这些之间的差异是

  • envvariables显式设置环境(dev / stage / prod)
  • 复制品的数量
  • devstable,舞台,prod使用docker图像
  • dev使用docker镜像,并将NFS文件夹和源代码映射到它们上面。

创build大量的bash别名和自动完成function非常有用 – 我只需键入rec users ,它将执行kubectl delete -f ... ; kubectl create -f ... kubectl delete -f ... ; kubectl create -f ... 如果我想让整个设置开始,我inputrecfo ,然后重新创build一个服务,拉取最新的docker镜像,从Staging env导入最新的db转储,并清理旧的Docker文件以节省空间。

“重新加载”是我们计划添加的内容,但并不像现在这样容易。 但是,如果您觉得冒险,可以使用docker exec,kubectl exec或osc exec(大致做同样的事情)将rsync与本地目录同步到容器中。 你可以像下面这样使用rsync和kubectl或osc exec:

 # rsync using osc as netcat $ rsync -av -e 'osc exec -ip test -- /bin/bash' mylocalfolder/ /tmp/remote/folder 

我们一直在研究一个工具来做到这一点。 基本的想法是你有远程Kubernetes集群,有效的分段环境,然后你在本地运行代码,它被代理到远程集群。 您可以透明地访问networking,复制环境variables,访问卷…尽可能接近远程环境,但是您的代码可以在本地运行并处于完全控制之下。

所以你可以做现场开发,说。 文档在http://telepresence.io