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

时间:2015-04-20 11:42:33

标签: docker google-cloud-platform kubernetes openshift-origin

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

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

  • 在本地部署(或至少在您只能访问的某个地方)
  • 在页面刷新时使用最新源代码(假设它是一个网站;理想情况下,本地文件保存页面自动刷新,如果您安装源代码并使用{{3}之类的内容,则可以执行此操作})。

同样,人们可能希望非公共环境进行持续集成

Kubernetes是否支持这种开发环境,或者它是否需要构建,希望在生产过程中它仍然可以工作?

14 个答案:

答案 0 :(得分:61)

更新(2016-07-15)

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


您可以运行Kubernetes locally via Docker。运行节点后,您可以启动具有简单Web服务器的pod,并从主机安装卷。当您点击Web服务器时,它将从卷中读取,如果您更改了本地磁盘上的文件,它可以提供最新版本。

答案 1 :(得分:8)

我们一直在研究这样做的工具。基本思想是你有远程Kubernetes集群,实际上是一个临时环境,然后你在本地运行代码,它被代理到远程集群。您可以获得透明的网络访问,复制的环境变量,访问卷...尽可能接近远程环境,但您的代码可以在本地运行,并且可以完全控制。

所以你可以做现场开发。 http://telepresence.io

的文档

答案 2 :(得分:5)

这种“热重载”是我们计划添加的东西,但并不像今天那么容易。但是,如果您有冒险精神,可以使用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

答案 3 :(得分:4)

另一个很好的起点是the manual,尤其是。如果您的主机操作系统是Windows。

具有明显的优势
  • 快速无痛的设置
  • 易于破坏/重新创建机器
  • 资源的隐含限制
  • 通过创建多个节点来测试水平缩放的能力

缺点 - 你需要大量的RAM,VirtualBox是VirtualBox ......无论好坏。

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

这样做的缺点是NFS文件缓存 - 有了它,它有问题,没有它,它的问题很慢。即使设置mount_options: 'nolock,vers=3,udp,noac'也没有完全摆脱缓存问题,但它在大多数情况下都能正常工作。在主机操作系统上花费8秒时,在容器中运行的一些Gulp任务可能需要5分钟。一个好的妥协似乎是mount_options: '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。这些之间的差异是

  • env变量显式设置环境(dev / stage / prod)
  • 副本数量
  • devstable,stage,prod使用docker images
  • dev使用docker镜像,并使用源代码映射NFS文件夹。

创建大量bash别名和自动填充功能非常有用 - 我只需输入rec users即可kubectl delete -f ... ; kubectl create -f ...。如果我想要开始整个设置,我输入recfo,它会重新创建十几个服务,提取最新的docker镜像,从Staging env导入最新的db转储并清理旧的Docker文件以节省空间。

答案 4 :(得分:4)

我刚开始使用Skaffold

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

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

答案 5 :(得分:2)

有关如何从主机安装卷的信息,请参阅https://github.com/kubernetes/kubernetes/issues/12278,相当于:

docker run -v hostPath:ContainerPath

答案 6 :(得分:2)

具有良好的本地开发反馈环是Kubernetes生态系统中快速发展的主题。

简化这个问题,我相信有一些工具可以很好地支持这一目标。

适用于Mac Kubernetes的Docker

Docker for Mac KubernetesDocker Desktop是通用跨平台名称)为本地开发提供了绝佳的选择。对于虚拟化,它使用HyperKit(它是基于macOS的本机Hypervisor框架而不是VirtualBox构建的)。

Kubernetes功能最初是在January 2018的边缘通道上作为Beta发布的,此后已经走了很长一段路,在April 2018成为了认证的Kubernetes,并逐渐发展到{{3 }}。

根据我的经验,与Minikube相比,使用它要容易得多,尤其是在macOS上,尤其是在涉及RBAC,Helm,hypervisor,私有注册表等问题时。

头盔

就分发代码和在本地提取更新而言,July 2018是最受欢迎的选项之一。您可以通过CI / CD将应用程序发布为Helm图表(以及它们引用的基础Docker映像)。然后,您可以从本地的Helm图表注册表中提取这些图表,并在本地群集上进行升级。

天青草稿

您还可以使用Helm之类的工具来进行简单的本地部署,并从通用语言模板(如buildpacks)中生成基本的Helm图表,以自动完成这一难题。

脚手架

Azure Draft类似于Azure草案,但更成熟,范围更广,由Google制作。它具有非常可插拔的体系结构。我认为,将来会有更多人将其用于Kubernetes的本地应用程序开发。

如果您使用过React,我认为Skaffold就是“ Kubernetes的Skaffold”。

在Kubernetes上组合或撰写

Create React App尽管与Kubernetes无关,但却是一些公司用来提供一种简单,容易且可移植的本地开发环境的替代方案,类似于他们在生产中运行的Kubernetes环境。但是,走这条路意味着您的生产和本地开发设置会有所不同。

Docker Compose是Docker组成的Kubernetes转换器。对于已经在本地作为容器集合运行其应用程序的人来说,这可能是一条有用的路径。

Kompose是Docker提供的Compose on Kubernetes(2018年12月),允许通过自定义控制器将Docker Compose文件直接部署到Kubernetes集群。

答案 7 :(得分:1)

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

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

答案 8 :(得分:1)

看看https://github.com/okteto/oktetoOkteto Cloud。 价值主张是要拥有比本地工作更经典的开发经验,而不是在docker之前在本地工作,在那里您可以进行热重载,增量构建,调试器...但是所有本地更改都将立即同步到远程容器。远程容器使您可以访问云的速度,实现更高级别的协作,并在类似生产的环境中集成开发。而且,它消除了本地安装的负担。

答案 9 :(得分:0)

正如罗伯特之前指定的那样,minikube是必经之路。

Here是开始使用minikube的快速指南。常规步骤是:

  • 安装minikube

  • 创建minikube集群(在虚拟机中,该虚拟机可以是VirtualBox或Mac的Docker或Windows中的HyperV)

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

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

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

答案 10 :(得分:0)

您可以使用远程kubernetes集群并配置本地计算机以连接到该集群。使用kubectl cp命令将代码复制到正在运行的pod中,以便在开发过程中热重载代码。

答案 11 :(得分:0)

使用minkube的缺点是它会在您的计算机上生成另一个虚拟机。另外,在最新的minikube版本中,最低要求系统中要有2个CPU和2GB的RAM,如果您的系统没有足够的资源,这将使其非常繁重。

这就是我切换到microk8s进行kubernetes开发并喜欢它的原因。 microk8s支持DNS,本地存储,仪表板,istio,入口等等,这些都是测试微服务所需的一切。

它被设计为与本地环境隔离的快速轻量级上游Kubernetes安装。通过将Kubernetes,Docker.io,iptables和CNI的所有二进制文件打包在单个snap软件包中,可以实现这种隔离。

只需一个命令,即可在一分钟内安装一个单节点kubernetes集群:

snap install microk8s --classic

确保您的系统没有运行任何docker或kubelet服务。 Microk8s将自动安装所有必需的服务。

请查看以下链接,以启用microk8s中的其他附件。

  

https://github.com/ubuntu/microk8s

您可以使用以下方法检查状态:

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

答案 12 :(得分:0)

您可以将“ portainer”用于开发目的。这很容易,不需要记住命令或Yaml清单。

答案 13 :(得分:0)

这是我在Windows 10中为Kubernetes进行本地设置的方法:-

  • 使用Docker桌面

  • 在Docker Desktop的settings选项中启用Kubernetes

  • 默认情况下,在Docker桌面中为内存分配的资源为2GB,以便使用Kubernetes 使用Docker Desktop可以增加内存。

  • 安装kubectl作为客户端以与Kubernetes集群对话

  • 运行命令 kubectl config get-contexts 以获取可用的集群

  • 运行命令 kubectl config use-context docker-desktop 以使用docker桌面

  • 构建您的应用程序的docker映像

  • 编写一个YAML文件(在Kubernetes中创建部署的描述性方法)指向 到以上步骤群集中创建的图像

  • 为每个部署公开一个节点端口类型的服务,以使其可用于 外部世界

相关问题