Docker 如何为Kubernetes创建本地开发环境?

Docker 如何为Kubernetes创建本地开发环境?,docker,google-cloud-platform,kubernetes,openshift-origin,Docker,Google Cloud Platform,Kubernetes,Openshift Origin,似乎都是关于将容器部署到集群云中。它似乎没有涉及到开发和登台环境(或诸如此类的环境) 在开发过程中,您希望通过一些重要的更改尽可能接近生产环境: 在本地部署(或至少在您且只有您可以访问的地方部署) 在页面刷新时使用最新的源代码(假设它是一个网站;理想情况下,在本地文件保存时使用页面自动刷新,这可以通过装载源代码和使用类似的东西来完成) 类似地,人们可能希望非公共环境进行持续集成 Kubernetes是否支持此类开发环境,还是必须构建这样的环境,希望在生产过程中仍能正常工作?更新(2016-0

似乎都是关于将容器部署到集群云中。它似乎没有涉及到开发和登台环境(或诸如此类的环境)

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

  • 在本地部署(或至少在您且只有您可以访问的地方部署)
  • 在页面刷新时使用最新的源代码(假设它是一个网站;理想情况下,在本地文件保存时使用页面自动刷新,这可以通过装载源代码和使用类似的东西来完成)
类似地,人们可能希望非公共环境进行持续集成

Kubernetes是否支持此类开发环境,还是必须构建这样的环境,希望在生产过程中仍能正常工作?

更新(2016-07-15)

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


你可以跑。一旦有一个节点运行,您就可以启动一个pod,它有一个简单的web服务器,并从主机装载一个卷。当您点击web服务器时,它将从卷中读取,如果您更改了本地磁盘上的文件,它可以提供最新版本

这种“热装”是我们计划增加的,但并不像今天那么容易。但是,如果您喜欢冒险,您可以将rsync与docker exec、kubectl exec或osc exec(所有这些操作大致相同)一起使用,以便在本地目录发生更改时将其同步到容器中。您可以将rsync与kubectl或osc exec一起使用,如下所示:

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

另一个很好的起点是这一点,特别是如果您的主机操作系统是Windows。明显的优势在于

  • 快速无痛的安装
  • 易于销毁/重新创建机器
  • 对资源的隐性限制
  • 通过创建多个节点测试水平缩放的能力
缺点-您需要大量的RAM,而VirtualBox就是VirtualBox。。。不管是好是坏

一个优势和劣势并存的是通过NFS映射文件。在我们的设置中,我们创建了两组RC定义—一组只是下载应用程序服务器的docker映像;另一个有7行额外的代码,用于从HostOS->Vagrant->VirtualBox->CoreOS->Kubernetes pod设置文件映射;覆盖Docker映像中的源代码

这种方法的缺点是NFS文件缓存——有了它,它就有问题,没有它,它的速度就有问题。即使设置
mount\u选项:“nolock,vers=3,udp,noac”
也不能完全消除缓存问题,但它在大多数情况下都有效。在主机操作系统上,在容器中运行的某些Gulp任务可能需要5分钟,而在主机操作系统上则需要8秒。一个好的折衷方案似乎是装载选项:“nolock,vers=3,udp,ac,hard,noatime,nodiratime,acregmin=2,acdirmin=5,acregmax=15,acdirmax=15”

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

我们为Kubernetes保留了4套yaml文件。Dev,“devstable”,stage,prod。它们之间的区别是

  • 显式设置环境的环境变量(dev/stage/prod)
  • 副本数
  • devstable、stage、prod使用docker映像
  • 开发人员使用docker映像,并将NFS文件夹与源代码映射到它们上面
创建大量bash别名和自动完成非常有用-我可以键入
recusers
,它将执行
kubectl delete-f;kubectl创建-f…
。如果我想启动整个设置,我键入
recfo
,它会重新创建十几个服务,提取最新的docker映像,从Staging env导入最新的db转储文件,并清理旧的docker文件以节省空间。

有关如何从主机装载卷的信息,请参见:

docker run -v hostPath:ContainerPath

我们一直在开发一种工具来实现这一点。基本思想是,您有一个远程Kubernetes集群,它实际上是一个登台环境,然后您在本地运行代码,它将被代理到远程集群。您可以获得透明的网络访问、复制的环境变量、对卷的访问。。。尽可能接近远程环境,但代码在本地运行并在您的完全控制下

比如说,你可以进行实时开发。位于

的文档有助于设置本地群集。大多数情况下,我在本地机器上使用基于vagrant的集群

您可以调整这些变量以获得所需的kubernetes版本。

我刚刚开始

将代码中的更改自动应用于本地集群非常有用


要部署本地群集,最好的方法是Minikube或Docker for Mac和Windows,两者都包括Kubernetes接口。

正如Robert之前指定的那样,Minikube是一种方法

是开始使用minikube的快速指南。一般步骤如下:

  • 安装minikube

  • 创建minikube群集(在虚拟机中,如果是Windows,则可以是VirtualBox或Docker for Mac或HyperV)

  • 创建应用程序文件的Docker映像(使用Dockerfile)

  • 通过创建展开来运行映像

  • 创建一个公开应用程序的服务,以便您可以访问它


    • 使用
      minkube
      的缺点是它会在您的机器上生成另一个虚拟机。此外,对于最新的
      minikube
      版本,您的系统至少需要2个CPU和2GB的RAM,如果您的系统没有足够的资源,这将使系统非常沉重

      这就是我切换到microk8s进行开发的原因
      snap install microk8s --classic
      
      velotio@velotio-ThinkPad-E470:~/PycharmProjects/k8sClient$ microk8s.status
      microk8s is running
      addons:
      ingress: disabled
      dns: disabled
      metrics-server: disabled
      istio: disabled
      gpu: disabled
      storage: disabled
      dashboard: disabled
      registry: disabled