123

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

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

  • 部署在本地(或至少在您且只有您可以访问的地方)
  • 在页面刷新时使用最新的源代码(假设它是一个网站;理想情况下,页面在本地文件保存时自动刷新,如果您挂载源代码并使用Yeoman之类的东西,就可以做到这一点)。

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

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

4

12 回答 12

70

Update (2016-07-15)

With the release of Kubernetes 1.3, Minikube is now the recommended way to run Kubernetes on your local machine for development.


You can run Kubernetes locally via Docker. Once you have a node running you can launch a pod that has a simple web server and mounts a volume from your host machine. When you hit the web server it will read from the volume and if you've changed the file on your local disk it can serve the latest version.

于 2015-04-21T17:15:27.427 回答
9

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

所以你可以进行实时开发,比如说。http://telepresence.io上的文档

于 2017-04-13T13:43:12.717 回答
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
于 2015-04-21T19:49:51.520 回答
5

另一个很好的起点是这个Vagrant 设置,尤其是。如果您的主机操作系统是 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 文件夹与源代码映射到它们之上。

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

于 2015-09-01T07:16:35.010 回答
4

我刚开始使用Skaffold

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

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

于 2018-05-21T16:31:17.493 回答
3

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

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

Docker for Mac Kubernetes

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

Kubernetes 功能于2018 年 1 月首次在边缘通道上作为测试版发布,此后已经走过了漫长的道路,于 2018 年4 月成为经过认证的 Kubernetes ,并于2018 年 7 月毕业进入稳定通道。

根据我的经验,它比 Minikube 更容易使用,尤其是在 macOS 上,尤其是在涉及 RBAC、Helm、管理程序、私有注册表等问题时。

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

天蓝色草稿

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

支架

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

如果你使用过 React,我认为 Skaffold 是“为 Kubernetes创建 React 应用程序”。

Kompose 或 Compose on Kubernetes

Docker Compose虽然与 Kubernetes 无关,但它是一些公司用来提供类似于他们在生产中运行的 Kubernetes 环境的简单、易用且可移植的本地开发环境的一种替代方案。但是,走这条路意味着分散您的生产和本地开发设置。

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

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

于 2019-02-02T03:58:25.943 回答
2

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

这就是我转向microk8skubernetes 开发的原因,我喜欢它。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
于 2019-01-04T10:47:18.750 回答
2

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

docker run -v hostPath:ContainerPath
于 2016-02-16T07:17:50.590 回答
1

正如 Robert 之前所指出的,minikube 是要走的路。

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

  • 安装 minikube

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

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

  • 通过创建部署运行映像

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

于 2018-10-15T16:29:56.790 回答
1

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

于 2019-08-08T13:58:25.643 回答
1

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

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

于 2018-01-25T11:21:43.220 回答
0

这是我在 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 中创建部署的描述性方法),指向在上述步骤集群中创建的映像

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

于 2020-08-09T09:33:28.637 回答