乐趣区

关于nocalhost:Nocalhost-让云原生开发回归原始而又简单

本文为 CODING Nocalhost 研发负责人王炜 在腾讯云 CIF 工程效力峰会上所做的分享。文末可返回峰会官网,观看回放并下载 PPT。

大家好,欢送加入 CIF 大会,明天我跟大家分享的内容是:破解 Kubernetes 利用开发困局。首先做个简略的自我介绍,我是来自腾讯云 CODING DevOps 的王炜,目前是 Nocalhost 我的项目研发负责人,同时也是 CNCF 大使。话不多说,让咱们进入正题。

这次分享次要分为五个方面:

  1. 首先是 K8s 环境下的开发困局;
  2. 以及支流的云原生开发方式;
  3. 接下来是实现容器利用和热加载的原理;
  4. 开发和调试演示,这里会用一个 Demo 来进行演示;
  5. 最初是开源共建和瞻望。

首先是第一局部:K8s 环境下的开发困局。提到云原生开发,咱们就不得不先从 Docker 开始说起。当咱们的微服务越来越多,运行环境越来越简单的时候,Docker 镜像为咱们提供了很好的解决方案。然而当镜像和容器越来越多,服务的编排就成为了一个难题 。这时候也呈现了很多计划,例如 K8s、Docker Swarm 等等。当然 K8s 曾经简直成为了事实标准,也成为了容器编排的首选计划,然而这个事实标准提供的能力却是面向运维的。例如,咱们能够通过 Liveness 和 Readiness 定义服务的主动复原机制,通过 Resource 定义资源用量等。 这些定义其实对开发人员来说是减少了极大的额外负担,也造成了开发和调试两难的问题。

此外云原生的技术栈跨度十分大,这就对开发人员提出了更高的要求,这也要求团队对云原生架构设计也须要更加合乎业务的须要。所以总体而言,对企业来说,招聘和用人的老本也更高了。

下图是一张 CNCF 云原生利用开发的全景图,咱们会发现云原生开发工具这一环节目前依然是缺失的。云原生开发这么难,那么支流的开发方式又是什么呢?或者说咱们当初是怎么解决问题的?

通过总结,目前云原生开发方式次要有以下四种。

  1. 全手工的流程。例如手工构建以及推送镜像,批改镜像版本,并且期待调度失效。咱们把每次查看编码成果称为编码的反馈循环,这种开发方式编码的反馈循环大略须要十分钟一次,这是十分漫长的过程。
  2. 全自动的流程,也就是把手动的环节变成了主动。这种形式显然会更快一些,然而它的反馈循环也只是缩短为了五分钟左右一次。
  3. 第三种是对云原生比拟理解的团队常常会应用的计划,也就是应用 Telepresence 这款工具来开发。Telepresence 次要是买通本地和集群的网络,使开发者可能在本地进行开发。这种开发方式把编码的反馈循环升高到了 10 秒 1 次,然而因为开发服务以源码的形式运行在本地,这种形式有肯定的限度,我将在后文深刻解说。
  4. 第四种是应用 Nocalhost,间接在容器里开发。这种形式能够解脱 Telepresence 在某些场景下的应用限度。

接下来咱们具体聊一聊以 Telepresence 为代表的网络买通计划的应用限度。首先它最大的限度是本地环境和工作负载的运行环境有很大的差别,这就导致业务源码很难在本地运行。比如说业务在 K8s Manifest 里申明了 configmap、secret、volume 的挂载等等,这些很难在本地重建。其次还有环境方面的差别,以及跨平台,比如说像 Linux 和 Windows 之间的这些平台差别,以及在局部场景下的网络限度。

说了这么多,置信大家也可能了解,在 K8s 环境下开发的最大问题是:每次编码查看成果都须要从新构建镜像,这就导致了长时间的有效的期待。有没有不须要从新构建镜像的计划呢?答案是必定的。如果咱们能在容器里实现过程或者是利用的热加载,每次编码之后能够实时失效,咱们是不是就不须要从新构建镜像了呢?

接下来咱们持续探讨这种形式的实现原理和计划。首先从 Dockerfile 说起。Dockerfile 里定义了容器的启动命令,一般来说,这是业务过程的启动形式。例如运行一个可执行文件,如果咱们进入容器内执行 PS 命令,会发现这个过程对应在容器外面,也就是 PID=1 的过程。咱们以 Go 利用为例,如果让这个 PID=1 的过程替换为以源码的形式运行,go run main.go 这种形式,咱们是不是就能够实现利用热加载,并且批改代码后只须要从新运行这条命令,就能够看到代码成果呢?

咱们思路没有错,然而如果要实现这个计划,还须要三个条件。第一是容器的源码从哪里来?除了脚本型语言以外,个别的业务容器都没有源码;第二是以 Go 利用为例,编译的环境从哪里来?咱们晓得个别状况下构建的业务容器,因为存储大小的思考,会放弃最小的可运行环境;第三,如果将 PID=1 的过程替换掉之后,怎么阻止容器 Crash?

咱们别离来看如何解决这些问题。首先第一点源码问题,咱们能够从本地同步到容器里来解决;第二是编译环境,咱们能够把运行中的业务镜像,替换成具备编译环境的开发镜像,就可能提供编译环境;第三,咱们能够将 PID=1 的过程替换为一个阻塞的过程,这三个问题就解决了。当咱们实现这些计划后,容器其实曾经具备了热加载的根底,Nocalhost 的原理正是基于上述的计划来实现的。接下来我会用一个 Demo 来演示利用的热加载和一键 Debug 的成果。

Nocalhost 提供了 VSCode 插件和 JetBrains 的全系列插件,只有装置就能够立刻应用。接下来我将以 Golang 的为例,演示开发 Demo 我的项目 Booking for。

【请点击文末 浏览原文,返回 CIF 峰会「开源生态与效力晋升」专场 – 《破解 Kubernetes 利用开发困局》,于 08:00 处观看 Demo 演示】

容器利用的实时热加载以及一键调试的演示到这里就完结了,感兴趣的同学能够依照 Nocalhost(nocalhost.dev)官网的 Quick Start 领导入手来试一试。

通过演示置信大家曾经了解 Nocalhost 带来的全新云原生的开发体验。最初一部分我将与大家分享开源共建和瞻望。Nocalhost 目前是一个齐全开源的我的项目,代码托管在 GitHub 上,曾经有 900+ star,同时也是 CNCF Landscape 我的项目,并且被收录在云原生全景图当中,也欢送大家关注和奉献。

对于瞻望,在这次的分享中,我介绍了 Telepresence 和 Nocalhost 两种开发方式,它们在解决问题的思路上其实是各有不同的,你能够依据本人的业务状况抉择一种办法来应用。此外 Nocalhost 提供了残缺的开发环境和开发过程的治理能力,对于心愿对立治理开发环境的团队,则能够装置 Nocalhost Server 来集中管理开发集群、利用、以及开发环境,当然 Server 也是开源并且收费的,我在这里提供几张 Server 的截图,感兴趣的同学能够遵循官网文档进行装置以及应用。

我的分享到这里就完结了。欢送大家拜访 Nocalhost(nocalhost.dev)官网,并依据官网文档进行装置和试用,谢谢大家。

点击此处链接,观看 CIF 峰会回放

退出移动版