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


115

Kubernetes似乎与将容器部署到集群云有关。似乎没有碰到的是开发和暂存环境(或类似环境)。

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

  • 本地部署(或至少在您只有您可以访问的地方
  • 在页面刷新上使用最新的源代码(假设其网站;理想情况下,在本地文件保存上页面自动刷新,如果您挂载源代码并使用诸如Yeoman之类的东西,则可以完成此操作)。

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

Kubernetes是否支持这种开发环境,还是必须构建某种东西,以希望在生产期间它仍然可以工作?


看看Openshift Origin。它是Openshift的下一个版本,基于Kubernetes构建。在Docker容器中独立运行。
Mark O'Connor

@ MarkO'Connor我更希望也在Google Cloud上进行部署,但这是更多的部署解决方案。如果您使用OpenShift Origin解决方案可以进行本地开发(大多数情况下是重新加载最新的本地文件),那么请分享作为答案,我对此很感兴趣。
2015年

您找到解决方案了吗?我在本地开发集群的mesos上运行了kubernetes。我正计划在Go中构建微服务,并将其部署在kubernetes的容器中。我希望能够保存所做的更改并使其自动生成二进制文件并重新启动Pod。并没有真正进行测试的更改,但是我认为在vms上构建二进制文件然后重新启动pod可能会有点慢。
F21

2
@ F21距发布已经一年多了。kubernetes是否有良好的本地开发工作流程?
贾廷

您可以查看microk8s,这是本地计算机的轻量级k8s安装。我已经发布了相同的答案,如何安装它。安装仅需一分钟左右。
Prafull Ladha

Answers:


67

更新(2016-07-15)

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


您可以通过Docker在本地运行Kubernetes。一旦节点运行,就可以启动具有简单Web服务器的Pod,并从主机上装入卷。当您单击Web服务器时,它将从该卷中读取,并且如果您更改了本地磁盘上的文件,则它可以提供最新版本。


3
医生说,这不再是推荐的方法,“ Minikube是在本地计算机上运行Kubernetes的推荐方法”。
加丁

我认为minikube不适合自己开发k8s,对吗?
哈里兹

这取决于您所开发的内容。在k8的许多部分中,使用minikube进行开发是合理的。如果您正在研究Pod网络安全策略或CNI插件,尽管这没有多大意义。
罗伯特·贝利

1
“通过Docker在本地Kubernetes”链接已断开。有人有更新吗?
wn龙'17

1
Minikube不久前替换了本地docker设置,随后删除了本地docker版本的文档。Minikube是否可以满足您的需求?您还可以在VM内部使用kubeadm实例化本地单节点群集。
罗伯特·贝利

9

我们一直在研究一种工具来做到这一点。基本思想是,您拥有远程Kubernetes集群,有效地是一个登台环境,然后在本地运行代码,并将其代理到远程集群。您可以获得透明的网络访问,复制的环境变量,对卷的访问……与远程环境尽可能接近,但是您的代码在本地运行并受到完全控制。

这样,您就可以进行实时开发。网址为http://telepresence.io的文档


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

就其本身而言,热重载是并且应该由您使用的Web框架处理,这里yeoman通常会进行设置。缺少的是如何启用它。它需要安装本地卷。如果@Robert的答案有效,则应该是有效的解决方案。
2015年

4

另一个很好的起点是这种Vagrant设置,尤其是。如果您的主机操作系统是Windows。明显的优势是

  • 快速,轻松的设置
  • 易于销毁/重新创建机器
  • 隐式资源限制
  • 通过创建多个节点来测试水平缩放的能力

缺点-您需要大量RAM,而VirtualBox是VirtualBox ...更好或更坏。

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

缺点是NFS文件缓存-有了它,就成问题了;没有它,就成问题了。即使设置mount_options: 'nolock,vers=3,udp,noac'也不能完全摆脱缓存问题,但是大多数情况下它都能工作。在容器中运行的某些Gulp任务在主机OS上花费8秒时可能需要5分钟。似乎是一个很好的妥协mount_options: 'nolock,vers=3,udp,ac,hard,noatime,nodiratime,acregmin=2,acdirmin=5,acregmax=15,acdirmax=15'

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

我们为Kubernetes保留了4套yaml文件。开发人员,“开发人员”,阶段,产品。两者之间的区别是

  • env变量显式设置环境(dev / stage / prod)
  • 副本数
  • devstable,stage,prod使用docker映像
  • 开发人员使用docker映像,并将NFS文件夹及其源代码映射到它们。

创建很多bash别名和自动完成功能非常有用-我可以键入rec users,它将完成kubectl delete -f ... ; kubectl create -f ...。如果我希望整个设置开始,我键入recfo,它将重新创建一打服务,提取最新的docker映像,从Staging env导入最新的数据库转储,并清理旧的Docker文件以节省空间。




2

在Kubernetes生态系统中,拥有一个良好的本地开发反馈环路是快速发展的主题。

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

适用于Mac Kubernetes的Docker

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

Kubernetes功能于20181月在边缘通道上首次以beta版本发布,此后已经走了很长一段路,于20184月成为认证的Kubernetes ,并于2018年7月升级到稳定版。

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

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

Azure草稿

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

脚手架

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

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

在Kubernetes上进行Kompose或Compose

与Kubernetes无关的Docker Compose是一种替代方案,一些公司使用Docker Compose提供类似于其在生产中运行的Kubernetes环境的简单,便捷和可移植的本地开发环境。但是,走这条路意味着您的生产和本地开发设置会有所不同。

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

Kubernetes上的Compose是Docker 最近开放的开源产品(2018年12月),允许通过自定义控制器将Docker Compose文件直接部署到Kubernetes集群。


1

Kubespary对设置本地集群很有帮助。通常,我在本地计算机上使用基于无业游民的集群。

Kubespray配置 您可以调整这些变量以具有所需的kubernetes版本。


1

使用的缺点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

>确保您的系统没有运行任何docker或kubelet服务。但是我已经在本地安装了Docker,除了Kubernetes,我还在运行容器。这是否意味着我无法在本地安装microk8?
Attila Szeremi

1

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


0

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

是minikube入门的快速指南。常规步骤是:

  • 安装minikube

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

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

  • 通过创建部署来运行映像

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


0

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

  • 使用Docker桌面

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

  • 在Docker Desktop中,默认情况下为内存分配的资源为2GB,因此在Kubernetes与Docker Desktop一起使用时会增加内存。

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

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

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

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.