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

How to create a local development environment for Kubernetes?

Kubernetes 似乎都是关于将容器部署到集群云中。它似乎没有触及的是开发和暂存环境(或类似环境)。

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

同样,可能需要一个非public环境来进行持续集成

Kubernetes 是否支持这种开发环境,或者是否必须构建它,希望它在生产期间仍然有效?

更新 (2016-07-15)

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


你可以运行Kubernetes locally via Docker。一旦你有了一个节点 运行ning,你就可以启动一个 pod,它有一个简单的网络服务器,并从你的主机上安装一个卷。当您访问 Web 服务器时,它将从卷中读取,如果您更改了本地磁盘上的文件,它可以提供最新版本。

"hot reload" 之类的是我们计划添加的内容,但并不像今天那么容易。但是,如果您喜欢冒险,可以将 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

EDIT 2022: 到现在为止,显然有几十种方法来提供 k8s,这与我们开始使用它的 2015 年不同。 kubeadm、microk8s、k3s、kube-spray 等

我的建议:(如果您的集群无法容纳在您的 workstation/laptop 上,)以每月 40 欧元的价格租用 Hetzner 服务器,并且 运行 WSL2 如果开启 Windows.

在远程机器上设置 k8s 集群(使用上述任何一种,我现在更喜欢 microk8s)。在本地 Linux/Mac/WSL2 环境中设置 Docker 和 Telepresence。安装kubectl并连接到远程集群。

Telepresence 将允许您用本地 docker pod 替换远程 pod,并可以访问本地文件(希望与使用的 git 存储库相同构建 pod 你是 developing/replacing),可能还有 nodemon(或其他语言特定的自动源代码重新加载系统)。

编写 bash 函数。 我怎么强调都不为过,这将为您节省数百小时的时间。如果更换吊舱开始开发不是一行/两个字,那你做的还不够好。


2016 年答案如下:

另一个很好的起点是 Vagrant setup,尤其是。如果您的主机 OS 是 Windows。明显的优势是

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

缺点 - 您需要大量 RAM,而 VirtualBox 就是 VirtualBox...无论好坏。

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

它的缺点是 NFS 文件缓存 - 有了它,它就会有问题,没有它,它就会很慢。即使设置 mount_options: 'nolock,vers=3,udp,noac' 也不能完全解决缓存问题,但它在大多数情况下都有效。容器中的某些 Gulp 任务 运行 可能需要 5 分钟,而它们在主机 OS 上需要 8 秒。一个好的折衷方案似乎是 mount_options: 'nolock,vers=3,udp,ac,hard,noatime,nodiratime,acregmin=2,acdirmin=5,acregmax=15,acdirmax=15'.

至于自动代码重新加载,这是特定于语言的,但我们对 Python 的 Django devserver 和 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 导入最新的数据库转储并清理旧的 Docker 文件保存 space.

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

docker run -v hostPath:ContainerPath

我们一直在开发一种工具来执行此操作。基本思想是你有远程 Kubernetes 集群,实际上是一个暂存环境,然后你 运行 在本地编码,它被代理到远程集群。您可以获得透明的网络访问、复制的环境变量、访问卷...尽可能接近远程环境,但您的代码 运行 在本地并在您的完全控制之下。

所以你可以进行现场开发,比方说。 http://telepresence.io

处的文档

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

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

我刚开始 Skaffold

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

要部署本地集群,最好的方法是 Minikube 或 Docker for Mac and Windows,两者都包含一个 Kubernetes 接口。

正如 Robert 之前指定的那样,minikube 是必经之路。

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

  • 安装minikube

  • 创建 minikube 集群(在 Virtual Machine 中,可以是 VirtualBox 或 Docker for Mac 或 HyperV in case of Windows)

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

  • 运行 通过创建 Deployment 镜像

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

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

这就是我切换到 microk8s 进行 kubernetes 开发的原因,我喜欢它。 microk8s 支持 DNS、本地存储、仪表板、istio、ingress 等等,测试微服务所需的一切。

它被设计成一个快速、轻量级的上游 Kubernetes 安装,与您的本地环境隔离。这种隔离是通过将 Kubernetes、Docker.io、iptables 和 CNI 的所有二进制文件打包在一个快照包中来实现的。

单节点kubernetes集群只需一条命令即可在一分钟内安装完成:

snap install microk8s --classic

确保您的系统没有任何 docker 或 kubelet 服务 运行。 Microk8s 将自动安装所有必需的服务。

请查看以下 link 以启用 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 用于 Mac Kubernetes

Docker for Mac Kubernetes (Docker Desktop is the generic cross platform name) provides an excellent option for local development. For virtualization, it uses HyperKit 它是基于 macOS 中的原生 Hypervisor 框架而不是 VirtualBox 构建的。

Kubernetes 功能首次在 January 2018 and has come a long way since, becoming a certified Kubernetes in April 2018, and graduating to the stable channel in July 2018 的边缘通道上作为测试版发布。

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

头盔

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

Azure 草稿

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

支架

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

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

Kubernetes 上的 Kompose 或 Compose

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

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

Compose on Kubernetes is a recently open sourced(2018 年 12 月)Docker 提供,允许通过自定义控制器将 Docker Compose 文件直接部署到 Kubernetes 集群。

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

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

  • 使用Docker桌面

  • 在 Docker Desktop

    的设置选项中启用 Kubernetes
  • 在 Docker 中,桌面默认分配给内存的资源是 2GB,所以要使用 Kubernetes 使用 Docker 桌面增加内存。

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

  • 运行命令kubectl configget-contexts获取可用集群

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

  • 构建应用程序的 docker 图像

  • 编写一个 YAML 文件(在 Kubernetes 中创建部署的描述性方法)指向 到上述步骤 cluster

    中创建的图像
  • 为您的每个部署公开节点端口类型的服务,以使其可供 外面的世界