Kubernetes似乎就是将容器部署到集群云。它似乎没有触及的是开发和登台环境(或类似)。
在开发过程中,您希望尽可能接近生产环境并进行一些重要更改:
同样,人们可能希望非公共环境进行持续集成。
Kubernetes是否支持这种开发环境,或者它是否需要构建,希望在生产过程中它仍然可以工作?
答案 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。这些之间的差异是
创建大量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生态系统中快速发展的主题。
简化这个问题,我相信有一些工具可以很好地支持这一目标。
Docker for Mac Kubernetes(Docker 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”。
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/okteto和Okteto 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
中的其他附件。
您可以使用以下方法检查状态:
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中创建部署的描述性方法)指向 到以上步骤群集中创建的图像
为每个部署公开一个节点端口类型的服务,以使其可用于 外部世界