如何为 Kubernetes 创建本地开发环境?
Posted
技术标签:
【中文标题】如何为 Kubernetes 创建本地开发环境?【英文标题】:How to create a local development environment for Kubernetes? 【发布时间】:2015-06-27 02:55:30 【问题描述】:Kubernetes 似乎就是将容器部署到集群云中。它似乎没有触及的是开发和登台环境(或类似的)。
在开发过程中,您希望通过一些重要更改尽可能接近生产环境:
在本地部署(或至少在只有你才能访问的地方) 在页面刷新时使用最新源代码(假设它是一个网站;理想情况下,页面在本地文件保存时自动刷新,如果您挂载源代码并使用 Yeoman 之类的东西就可以做到这一点) .同样,人们可能希望在非公共环境中进行持续集成。
Kubernetes 是否支持这样的开发环境,还是必须构建的东西,希望在生产过程中它仍然可以工作?
【问题讨论】:
看看 Openshift Origin。它是 Openshift 的下一个版本,构建在 Kubernetes 之上。在 Docker 容器中独立运行。 @MarkO'Connor 我更希望在 Google Cloud 上也进行部署,但这些是更多的部署解决方案。如果您有一个允许本地开发的 OpenShift Origin 解决方案(主要是重新加载最新的本地文件),那么请分享作为答案,我很感兴趣。 您找到解决方案了吗?我在本地开发集群中的 mesos 上运行了 kubernetes。我计划在 go 中构建微服务,这些微服务将部署在 kubernetes 的容器中。我希望能够保存我的更改并让它自动构建二进制文件并重新启动 Pod。并没有真正改变来测试它,但我认为在 vms 上构建二进制文件然后重新启动 pod 可能会有点慢。 @F21 这篇文章发布已经一年多了。 Kubernetes 有什么好的本地开发工作流程吗? 你可以看看microk8s
,它是本地机器的轻量级 k8s 安装。我已经发布了相同的答案,如何安装它。它的安装只需要大约一分钟。
【参考方案1】:
更新 (2016-07-15)
随着 Kubernetes 1.3 的发布,Minikube 现在是在本地机器上运行 Kubernetes 进行开发的推荐方式。
您可以运行Kubernetes locally via Docker。一旦你运行了一个节点,你就可以启动一个 pod,它有一个简单的 web 服务器并从你的主机上挂载一个卷。当您点击 Web 服务器时,它将从该卷中读取,如果您更改了本地磁盘上的文件,它可以提供最新版本。
【讨论】:
文档说它不再是推荐的方法方法,并且“Minikube 是在本地机器上运行 Kubernetes 的推荐方法。” 我觉得 minikube 本身不适合开发 k8s 对吧? 这取决于你正在开发什么。 k8s 的很多部分都可以使用 minikube 进行开发。如果您正在研究 pod 网络安全策略或 CNI 插件,尽管这没有多大意义。 “通过 Docker 本地 Kubernetes”链接已损坏。有人有更新吗? Minikube 不久前替换了本地 docker 设置,随后删除了本地 docker 版本的文档。 Minikube 是否满足您的需求?您还可以在 VM 内部使用 kubeadm 来实例化本地单节点集群。【参考方案2】:我们一直在开发一种工具来做到这一点。基本思想是您拥有远程 Kubernetes 集群,实际上是一个暂存环境,然后您在本地运行代码并将其代理到远程集群。您可以获得透明的网络访问、复制的环境变量、对卷的访问......尽可能接近远程环境,但您的代码在本地运行并在您的完全控制下。
所以你可以进行实时开发,比如说。文档http://telepresence.io
【讨论】:
【参考方案3】:这种“热重载”是我们计划添加的,但不像今天那么容易。但是,如果您喜欢冒险,您可以使用 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 的回答有效,它应该是一个有效的解决方案。【参考方案4】:另一个很好的起点是Vagrant setup,尤其是。如果您的主机操作系统是 Windows。明显的优势是
快速无痛设置 易于销毁/重建机器 对资源的隐式限制 能够通过创建多个节点来测试水平缩放缺点 - 你需要大量内存,而 VirtualBox 就是 VirtualBox...无论好坏。
一个混合优点/缺点是通过 NFS 映射文件。在我们的设置中,我们创建了两组 RC 定义 - 一组只是下载我们的应用程序服务器的 docker 映像;另一个有 7 个额外的行,用于设置从 HostOS -> Vagrant -> VirtualBox -> CoreOS -> Kubernetes pod 的文件映射;从 Docker 镜像覆盖源代码。
这样做的缺点是 NFS 文件缓存 - 有它会出现问题,没有它会很慢。即使设置mount_options: 'nolock,vers=3,udp,noac'
也不能完全摆脱缓存问题,但它在大多数情况下都有效。一些在容器中运行的 Gulp 任务可能需要 5 分钟,而在主机操作系统上需要 8 秒。一个不错的折衷方案似乎是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 文件。开发,“devstable”,舞台,产品。它们之间的区别是
env 变量显式设置环境 (dev/stage/prod) 副本数 devstable、stage、prod 使用 docker 镜像 dev 使用 docker 镜像,并将 NFS 文件夹与源代码映射到它们之上。创建大量 bash 别名和自动完成功能非常有用 - 我只需输入 rec users
,它就会执行 kubectl delete -f ... ; kubectl create -f ...
。如果我想启动整个设置,我输入recfo
,它会重新创建十几个服务,拉取最新的 docker 镜像,从 Staging env 导入最新的 db 转储并清理旧的 Docker 文件以节省空间。
【讨论】:
【参考方案5】:我刚刚开始使用Skaffold
将代码中的更改自动应用到本地集群非常有用。
要部署本地集群,最好的方法是 Minikube 或者只是适用于 Mac 和 Windows 的 Docker,两者都包含 Kubernetes 接口。
【讨论】:
【参考方案6】:拥有良好的本地开发反馈循环是 Kubernetes 生态系统快速发展的主题。
分解这个问题,我认为有一些工具可以很好地支持这个目标。
Docker for Mac Kubernetes
Docker for Mac Kubernetes(Docker Desktop 是通用的跨平台名称)为本地开发提供了绝佳的选择。对于虚拟化,它使用HyperKit 构建在 macOS 中的原生 Hypervisor 框架上,而不是 VirtualBox。
Kubernetes 功能最初在 January 2018 的边缘通道上作为测试版发布,并且已经走过了漫长的道路,在 April 2018 成为认证 Kubernetes,并在 July 2018 毕业到稳定通道。
根据我的经验,它比 Minikube 更容易使用,尤其是在 macOS 上,尤其是在涉及 RBAC、Helm、管理程序、私有注册表等问题时。
头盔
就在本地分发代码和拉取更新而言,Helm 是最受欢迎的选项之一。您可以通过 CI/CD 将应用程序发布为 Helm 图表(以及它们引用的底层 Docker 映像)。然后,您可以在本地从 Helm 图表注册表中提取这些图表并在本地集群上升级。
Azure 草案
您还可以使用Azure Draft 之类的工具进行简单的本地部署,并从通用语言模板(类似于 buildpacks)生成基本 Helm 图表,以自动完成该难题。
支架
Skaffold 类似于 Azure Draft,但更成熟,范围更广,由 Google 制作。它有一个非常可插拔的架构。我认为未来会有更多人将其用于 Kubernetes 的本地应用开发。
如果你使用过 React,我认为 Skaffold 是“Create React App for Kubernetes”。
在 Kubernetes 上编写或编写
Docker Compose 虽然与 Kubernetes 无关,但它是一些公司用来提供类似于他们在生产中运行的 Kubernetes 环境的简单、易用且可移植的本地开发环境的一种替代方案。但是,走这条路意味着分散您的生产和本地开发设置。
Kompose 是一个 Docker Compose 到 Kubernetes 的转换器。对于已经在本地将应用程序作为容器集合运行的人来说,这可能是一条有用的路径。
Compose on Kubernetes 是 Docker 提供的 recently open sourced(2018 年 12 月)产品,允许通过自定义控制器将 Docker Compose 文件直接部署到 Kubernetes 集群。
【讨论】:
【参考方案7】:请参阅https://github.com/kubernetes/kubernetes/issues/12278 了解如何从主机挂载卷,相当于:
docker run -v hostPath:ContainerPath
【讨论】:
【参考方案8】:使用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 之外的容器。这是否意味着我无法在本地安装 microk8s? 现在已经一年多了,还在吗?想入手kubernetes,期待解决方案,喜欢microk8s的那些特性。但我不想让我的生活变得比完成工作所需的更难。 是的,它仍然存在,而且 microk8s 也发布了对 windows 和 macos 的支持。你可以在这里查看microk8s.io【参考方案9】:Kubespary 有助于设置本地集群。大多数情况下,我在本地机器上使用基于 vagrant 的集群。
Kubespray configuration 您可以调整这些变量以获得所需的 kubernetes 版本。
【讨论】:
【参考方案10】:正如 Robert 之前所指出的,minikube 是要走的路。
Here 是 minikube 入门的快速指南。一般步骤是:
安装 minikube
创建 minikube 集群(在虚拟机中,Mac 的 VirtualBox 或 Docker 或 Windows 的 HyperV)
创建应用程序文件的 Docker 映像(使用 Dockerfile)
通过创建部署运行映像
创建一个服务来公开您的应用程序,以便您可以访问它。
【讨论】:
【参考方案11】:看看https://github.com/okteto/okteto 和Okteto Cloud。 价值主张是拥有经典的开发经验,而不是在 docker 之前在本地工作,在那里您可以进行热重载、增量构建、调试器......但是您的所有本地更改都会立即同步到远程容器。远程容器使您可以访问云的速度,允许更高级别的协作,并在类似生产的环境中集成开发。此外,它还消除了本地安装的负担。
【讨论】:
【参考方案12】:这是我在 Windows 10 中为 Kubernetes 进行本地设置的方式:-
使用 Docker 桌面
在 Docker Desktop 的设置选项中启用 Kubernetes
在 Docker Desktop 中,默认分配给内存的资源是 2GB,以便使用 Kubernetes 使用 Docker Desktop 增加内存。
安装 kubectl 作为客户端与 Kubernetes 集群通信
运行命令kubectl config get-contexts获取可用集群
运行命令kubectl config use-context docker-desktop来使用docker桌面
构建应用程序的 docker 映像
编写一个 YAML 文件(在 Kubernetes 中创建部署的描述性方法)指向 到上面步骤集群中创建的图像
为您的每个部署公开一个节点端口类型的服务,以使其可用于 外面的世界
【讨论】:
以上是关于如何为 Kubernetes 创建本地开发环境?的主要内容,如果未能解决你的问题,请参考以下文章
本地快速搭建Kubernetes单机版实验环境(含问题解决方案)