How to create a local development environment for Kubernetes?

Kubernetes seems to be all about deploying containers to a cloud of clusters. What it doesn't seem to touch is development and staging environments (or such).

During development you want to be as close as possible to production environment with some important changes:

  • Deployed locally (or at least somewhere where you and only you can access)
  • Use latest source code on page refresh (supposing its a website; ideally page auto-refresh on local file save which can be done if you mount source code and use some stuff like Yeoman).

Similarly one may want a non-public environment to do continuous integration.

Does Kubernetes support such kind of development environment or is it something one has to build, hoping that during production it'll still work?

30949 次浏览

更新(2016-07-15)

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


你可以运行 通过 Docker 本地的 Kubernetes。一旦你有一个节点运行,你可以启动一个吊舱,有一个简单的网络服务器和挂载卷从您的主机。当你点击网络服务器,它将从卷中读取,如果你已经更改了本地磁盘上的文件,它可以提供最新版本。

这种“热重载”是我们计划添加的东西,但不像今天这样容易。但是,如果您想尝试一下,可以使用 rsync 与 docker exec、 kubectl exec 或 osc exec (所有这些执行大致相同的操作)进行同步,以便在本地目录发生变化时将其同步到容器中。您可以像下面这样对 kubectl 或 osc exec 使用 rsync:

# rsync using osc as netcat
$ rsync -av -e 'osc exec -ip test -- /bin/bash' mylocalfolder/ /tmp/remote/folder

编辑2022: 到目前为止,明显有几十种方式提供 k8,不像2015年我们开始使用它。Kubeadm,microk8s,k3s,kube- 喷雾,等等。

我的建议是: (如果你的集群不能装进你的工作站/笔记本电脑)每月花40欧元租一个 Hetzner 服务器,如果在 Windows 上运行 WSL2。

在远程机器上设置 k8s 集群(使用以上任何一种方法,我现在更喜欢使用 麦克8)。在您的本地 Linux/Mac/WSL2 env 上设置 Docker 和 Telepresance。安装 kubectl 并将其连接到远程集群。

通过使用本地的 docker pod 来替换远程 pod,可以访问本地文件(希望与你正在开发/替换的 pod 所使用的 git repo 相同) ,也可以使用 noemon (或者其他语言特定的自动源代码重载系统)。

编写 bash 函数。我再怎么强调也不为过,这将为你节省数百个小时的时间。如果更换豆荚和开始发育不是一行两个词,那么你做得不够好。


2016年的答案如下:

另一个很好的起点是这个 流浪汉陷阱,特别是如果你的主机操作系统是 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 的 devserver 和 Noemon 用于 Node.js 感到满意。对于前端项目来说,你当然可以用 Gulp + BrowserSync + watch 这样的东西做很多事情,但是对于很多开发人员来说,从 Apache 服务并不困难,只需要进行传统的硬刷新。

我们为 Kubernetes 保存了4套 yaml 文件

  • Env 变量显式设置环境(dev/stage/prod)
  • 复制品的数量
  • Devable,stage,prod 使用 docker 图像
  • Dev 使用 docker 映像,并将 NFS 文件夹与源代码映射到它们上面。

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

请参阅 https://github.com/kubernetes/kubernetes/issues/12278了解如何从主机挂载卷,相当于:

docker run -v hostPath:ContainerPath

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

所以你可以做现场开发,比如说 http://telepresence.io的文档

Kubespary 有助于建立本地集群。

库伯斯派配置 您可以对这些变量进行调整,以获得所需的库伯内特版本。

I've just started with Skaffold

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

To deploy a local cluster, the best way is Minikube or just Docker for Mac and Windows, both includes a Kubernetes interface.

正如罗伯特之前指出的那样,Minikube 才是正确的选择。

Here is a quick guide to get started with minikube. The general steps are:

  • 安装 Minikube

  • Create minikube cluster (in a Virtual Machine which can be VirtualBox or Docker for Mac or HyperV in case of Windows)

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

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

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

使用 minkube的缺点是它会在您的机器上产生另一个虚拟机。另外,对于最新的 minikube版本,它至少需要有2个 CPU 和2 GB 的内存从您的系统,这使得它相当沉重,如果您没有足够的资源系统。

这就是为什么我切换到 microk8s开发库伯内特,我喜欢它。microk8s支持 DNS、本地存储、仪表板、 istio、入口等等,这些都是测试微服务所需要的。

It is designed to be a fast and lightweight upstream Kubernetes installation isolated from your local environment. This isolation is achieved by packaging all the binaries for Kubernetes, Docker.io, iptables, and CNI in a single snap package.

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

snap install microk8s --classic

确保您的系统没有任何码头或库伯莱服务运行。 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

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

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

麦克 · 库伯内特斯的码头

Docker for Mac Kubernetes (Docker 桌面是通用的跨平台名称)为本地开发提供了极好的选择。对于虚拟化,它使用构建在 macOS 中的本地 Hypervisor 框架而不是 VirtualBox 上的 HyperKit

库伯内特功能最初是在 2018年1月的边缘通道上作为测试版发布的,此后经历了漫长的道路,成为 2018年4月的认证库伯内特,并在 2018年7月的稳定通道上毕业。

根据我的经验,它比 Minikube 更容易使用,特别是在 macOS 上,尤其是涉及到 RBAC、 Helm、 hypervisor、私有注册等问题时。

舵手

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

蔚蓝草

您还可以使用像 蔚蓝草这样的工具进行简单的本地部署,并从公共语言模板(有点像 buildpack)生成基本的 Helm 图表,以自动完成这一部分工作。

Skaffold

Skaffold is like Azure Draft but more mature, much broader in scope, and made by Google. It has a very pluggable architecture. I think in the future more people will use it for local app development for Kubernetes.

如果你使用过 React,我认为 Skaffold 是“库伯内特的 创建应用程序”。

在库伯内特上作曲

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

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

Compose on Kubernetes 是 Docker 提供的 recently open sourced(2018年12月)产品,它允许通过定制控制器将 Docker Compose 文件直接部署到 Kubernetes 集群。

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

下面是我在 Windows10中为 Kubernetes 进行本地设置的方法:-

  • 使用 Docker 桌面

  • 在 Docker 桌面的设置选项中启用 Kubernetes

  • 在 DockerDesktop 中,默认情况下为内存分配的资源是2GB,因此可以使用 Kubernetes 与多克桌面增加内存。

  • 安装 kubectl 作为与 Kubernetes 集群通信的客户端

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

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

  • 构建应用程序的 docker 映像

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

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