创建 monorepo Kubernetes 基础设施的良好实践是啥?

Posted

技术标签:

【中文标题】创建 monorepo Kubernetes 基础设施的良好实践是啥?【英文标题】:What are good practices for creating monorepo kubernetes infrastructure?创建 monorepo Kubernetes 基础设施的良好实践是什么? 【发布时间】:2018-04-20 05:00:15 【问题描述】:

我很难尝试使用 k8s 构建工作流,其中包括:

为多个微服务提供 monorepo 单个命令即可启动所有这些并能够启动本地开发 拥有docker-like 在另一台没有安装 k8s 的机器上安装整个基础架构的经验(用于本地开发) 1.git pull 2.k8s start, 3. 等待, 4.ping localhost:3000 将是目标在这里。 能够我的本地文件中的更改立即应用服务,而无需重建图像等(我猜类似于 docker 卷) 拥有模块化配置文件,其中有一个根配置文件用于引用服务较小配置的基础设施

我一直在努力寻找有关构建此类系统的示例或指南,但没有运气。

我是否遗漏了一些关于 k8s 设计的重要内容,这让我寻找在 witk k8s 上不可能的东西?

为什么我认为这样的问题不应该结束

有许多没有开发运维经验的开发人员在微服务方面尽力而为,我发现缺乏关于此类(并且非常常见的)用例的可靠指南

对于 k8s,没有关于快速反馈循环的流畅本地开发体验的明确指南。

虽然它是基于意见的,但我发现这个问题更侧重于会带来这种开发人员体验的一般方向,而不是确切的步骤。

我什至不确定(我试图找出)这是否被认为是专业开发运维人员的良好做法。我不知道如何管理大型基础设施(数十或数百个微服务)。是否可以在一台机器上运行它们?需要吗?

【问题讨论】:

【参考方案1】:

我构建了与您之前所要求的类似的东西。我手动运行hyperkube,这几乎不推荐,但对本地开发很有用。就我而言,这一切都是在 Vagrant 中运行以实现团队一致性。

docker run -d --name=kubelet \
        --volume=/:/rootfs:ro \
        --volume=/sys:/sys:ro \
        --volume=/var/lib/docker/:/var/lib/docker:rw \
        --volume=/var/lib/kubelet/:/var/lib/kubelet:slave \
        --volume=/var/run:/var/run:rw \
        --net=host \
        --pid=host \
        --privileged \
        --restart=always \
        gcr.io/google_containers/hyperkube-$ARCH:$K8S_VERSION \
        /hyperkube kubelet \
            --containerized \
            --hostname-override=127.0.0.1 \
            --api-servers=http://localhost:8080 \
            --cluster-dns=10.0.0.10 \
            --cluster-domain=cluster.local \
            --allow-privileged --v=2 \
            --image-gc-high-threshold=50 \
            --image-gc-low-threshold=40 \
            --kube-api-qps 1000 --kube-api-burst=2000 \
            --pod-manifest-path=/etc/kubernetes/manifests

除此之外,我还构建了使用 YAML mustache 模板的脚本,这些模板知道部署在哪里。当它在本地部署时,每个 pod 都将源代码安装为一个卷,以便我可以自动重新加载它。

相同的脚本能够部署到生产环境中,这要归功于它们都基于 mustache 模板。我什至有多个配置文件,可以为不同的环境应用不同的模板值。

构建脚本将准备 YAML 模板,构建它需要构建的任何图像,应用到 Kubernetes,然后它会从那里自动重新加载。这是一个半好的用户体验。我的主要问题是文件更新缓慢,因为它在 Vagrant 内部的 Docker 中运行。没有文件共享类型可以为客户端和服务器提供良好的性能并且允许文件监视(inotify 不适用于大多数文件共享类型,并且 NFS/SMB 对于 IDE 来说很慢)。

这是我第一次体验 Kubernetes,所以我怀疑这是“推荐的方式”,但它确实有效。涉及很多脚本,所以今天可能有更好的方法来做到这一点。

【讨论】:

以上是关于创建 monorepo Kubernetes 基础设施的良好实践是啥?的主要内容,如果未能解决你的问题,请参考以下文章

使用具体(旧)Angular 版本创建 NX Monorepo

在 monorepo 的情况下创建 Pull Request 的过程与标准 repo 的情况有啥不同吗

创建一个 monorepo 而不托管在包注册表上并通过 bitbucket 安装

开发人员是不是应该能够在他们的开发环境中从 lerna monorepo 创建 docker 工件?

基于 ReactTS的聊天室monorepo实战

基于 Yarn WorkSpace + Lerna + OrangeCI 搭建 Typescript Monorepo 项目实践