在捕鱼大亨网络版上开发

s : 迈克尔·豪森布拉斯 (红色的帽子), 伊利亚·德米特里琴科(Ilya Dmitrichenko) (编织)

您如何开发捕鱼大亨网络版应用程序?也就是说,如何编写和测试应该在捕鱼大亨网络版上运行的应用程序?本文重点介绍了成功或单独或在团队环境中成功编写捕鱼大亨网络版应用程序可能需要了解的挑战,工具和方法。

我们假设您是开发人员,拥有最喜欢的编程语言,编辑器/ IDE和测试框架。总体目标是在为捕鱼大亨网络版开发应用程序时对当前工作流程进行最小的更改。例如,如果您是Node.js开发人员,并且习惯于热重载设置(即,在编辑器中保存时,运行中的应用会自动进行更新),然后处理容器和容器映像,容器注册表,捕鱼大亨网络版部署,触发器以及更多其他功能不仅会让人不知所措,而且真的可以从中获得所有乐趣。

在下文中,我们将首先讨论整个开发设置,然后回顾该行业的工具,最后但并非最不重要的是,对三个示例性工具进行动手演练,以针对捕鱼大亨网络版进行迭代的本地应用程序开发。

在哪里运行集群?

作为开发人员,您需要考虑针对运行运行的捕鱼大亨网络版集群的位置以及开发环境的位置。从概念上讲,有四种开发模式:

 开发模式

许多工具支持纯离线开发,包括Minikube,适用于Mac / 视窗 的Docker,Minishift,以及我们将在下面详细讨论的工具。有时,例如,在某些微服务已在群集中运行的微服务设置中,最好使用代理设置(将流量转发到群集和从群集转发流量),网真是该类别中的示例工具。实时模式本质上意味着您要针对远程集群进行构建和/或部署,最后,纯在线模式意味着您的开发环境和集群都处于远程状态,例如, 日蚀车 要么 云9 。现在,让我们仔细看看离线开发的基础知识:在本地运行捕鱼大亨网络版。

迷你库 对于那些喜欢在本地VM中运行捕鱼大亨网络版的人来说,它是一个流行的选择。最近的Docker 苹果电脑 视窗 开始将捕鱼大亨网络版作为实验性软件包(在“ edge”渠道中)发售。您可能更希望使用Minikube而不是Docker桌面选项的一些原因是:

  • 您已经安装了Minikube并正在运行
  • 您宁愿等到Docker交付稳定的软件包
  • 您是Linux桌面用户
  • 您是Windows用户,没有Windows 10 Pro和Hyper-V

运行本地集群可以使人们脱机工作,而您不必为使用云资源付费。云提供商的成本通常是相当可承受的,并且存在免费套餐,但是有些人希望避免与经理一起批准这些成本,并且避免产生潜在的意外成本,例如在周末离开集群运行时。

一些开发人员更喜欢使用远程捕鱼大亨网络版集群,这通常是为了允许更大的计算和存储容量,并且还使协作工作流更加容易。这意味着您可以更轻松地吸引同事来帮助调试或共享对团队中应用程序的访问。此外,对于某些开发人员而言,尽可能紧密地镜像生产环境至关重要,尤其是当涉及外部云服务时,例如专有数据库,对象存储,消息队列,外部负载平衡器或邮件传递系统。

总而言之,您有充分的理由对本地集群和远程集群进行开发。这在很大程度上取决于您处于哪个阶段:从早期的原型设计和/或单独开发到集成一组更稳定的微服务。

现在,您已经对运行时环境中的选项有了基本的了解,让我们继续介绍如何迭代开发和部署应用程序。

交易工具

现在,我们将审查工具,使您可以在捕鱼大亨网络版上开发应用程序,重点是对现有工作流程的影响最小。我们力求提供一个公正的描述,包括使用每种工具的一般含义。

请注意,这是一个棘手的领域,因为即使对于已建立的技术,例如JSON vs YAML vs XML或REST vs gRPC vs SOAP,这很大程度上也取决于您的背景,偏好和组织设置。随着事情的发展非常迅速,新工具几乎每周发布一次,因此在捕鱼大亨网络版生态系统中比较工具变得更加困难。例如,仅在准备本帖子期间, 吉特库伯 守望者 出来。为了涵盖这些新工具以及相关的现有工具,例如 编织助焊剂 和OpenShift的 S2I 我们正在计划针对您正在阅读的文章的后续博客文章。

草案

草案 旨在帮助您开始将任何应用程序部署到捕鱼大亨网络版。它能够对您的应用程序使用哪种编程语言应用启发式方法,并生成Dockerfile以及Helm图表。然后,它将为您运行构建,并通过Helm图表将生成的图像部署到目标群集。它还允许用户非常容易地将端口转发设置为本地主机。

含义:

  • 用户可以按自己的喜好自定义图表和Dockerfile模板,甚至可以创建一个 定制包装 (带有Dockerfile,图表等)供将来使用
  • 猜测应该如何构建任何应用并不是很简单,在某些情况下,用户可能需要调整Dockerfile和Draft生成的Helm图表
  • 草案版本0.12.0 或更老的用户每次需要测试更改时,都需要等待Draft将代码复制到集群中,然后运行构建,推送图像并发布更新的图表;这可能很及时,但是会导致用户每次更改图像(无论是否提交给git)
  • 从草稿版本0.12.0开始,构建在本地执行
  • 用户无法选择除Helm以外的其他选项进行部署
  • 它可以监视本地更改并触发部署,但是默认情况下未启用此功能
  • 它允许开发人员使用本地或远程捕鱼大亨网络版集群
  • 部署到生产取决于用户,草稿作者推荐他们的另一个项目– Brigade
  • 可以代替Skaffold并沿壁球侧面使用

更多信息:

脚手架

脚手架 是一个工具,旨在为与不同构建系统,映像注册表和部署工具的CI集成提供可移植性。它不同于草稿,但有些可比。它具有生成清单的基本功能,但不是主要功能。 脚手架 是可扩展的,允许用户选择用于构建和部署应用程序的每个步骤的工具。

含义:

  • 设计模块化
  • 独立于CI供应商工作,用户不需要Docker或捕鱼大亨网络版插件
  • 无需CI,即可以在开发人员的笔记本电脑上使用
  • 它可以监视本地更改并触发部署
  • 它允许开发人员使用本地或远程捕鱼大亨网络版集群
  • 它可以用于部署到生产中,用户可以配置他们更喜欢这样做的方式,并为每个目标环境提供不同种类的管道
  • 可以代替草稿使用,并且可以与大多数其他工具一起使用

更多信息:

壁球

壁球 由与捕鱼大亨网络版完全集成的调试服务器和一个IDE插件组成。它允许您插入断点并执行使用IDE调试应用程序时惯用的所有有趣的工作。通过允许您将调试器附加到捕鱼大亨网络版集群中运行的Pod,它将IDE调试经验与捕鱼大亨网络版集群联系起来。

含义:

  • 可以独立于您选择的其他工具使用
  • 需要特权的DaemonSet
  • 与流行的IDE集成
  • 支持Go,Python,Node.js,Java和gdb
  • 用户必须确保容器映像内的应用程序二进制文件已使用调试符号进行编译
  • 可以与此处描述的任何其他工具结合使用
  • 它可以与本地或远程捕鱼大亨网络版集群一起使用

更多信息:

网真

网真 使用双向代理将运行在开发人员工作站上的容器与远程捕鱼大亨网络版集群连接起来,并模拟集群内环境,并提供对配置映射和秘密的访问。它旨在通过消除将应用程序部署到集群的需要来缩短容器应用程序开发的迭代时间,并利用本地容器来抽象网络和文件系统接口,以使其看起来像在集群中运行。

含义:

  • 可以独立于您选择的其他工具使用
  • 可以与Squash一起使用,尽管Squash必须用于集群中的Pod,而传统/本地调试器将需要用于调试通过网真连接到集群的本地容器
  • 网真强加了一些网络延迟
  • 它通过基于SSH的侧面程序sshuttle提供连接
  • 还提供了具有LD_PRELOAD / DYLD_INSERT_LIBRARIES的更具侵入性的依赖项注入模式
  • 它最常用于远程捕鱼大亨网络版集群,但也可以用于本地集群。

更多信息:

同步

同步 类似于在本地计算机和捕鱼大亨网络版中运行的容器之间同步应用程序代码(和配置) 同步 在OpenShift中执行。它旨在通过消除构建和部署步骤来缩短应用开发的迭代时间。

含义:

  • 它绕过容器映像的构建和修订控制
  • 编译语言用户必须在Pod(TBC)内运行内部版本
  • 双向同步–将远程文件复制到本地目录
  • 每次更新远程文件系统时,都会重新启动容器
  • 没有安全功能-仅开发
  • 利用 同步 ,一个用于点对点同步的Go库
  • 需要在集群中运行的特权DaemonSet
  • 节点必须将Docker与overlayfs2一起使用-撰写本文时不支持其他CRI实现

更多信息:

动手演练

我们将在下面的工具动手演练中使用的应用程序很简单 股票市场模拟器,由两个微服务组成:

  • The stock-gen microservice is written in Go 和 generates stock data randomly 和 exposes it via HTTP endpoint /stockdata. ‎* A second microservice, stock-con is a Node.js app that consumes the stream of stock data from stock-gen 和 provides an aggregation in form of a moving average via the HTTP endpoint /average/$SYMBOL as well as a health-check endpoint at /healthz.

总体而言,该应用的默认设置如下所示:

默认设置

在下文中,我们将通过动手演练,介绍上述代表性的工具:ksync,具有本地版本的Minikube以及Skaffold。对于每种工具,我们执行以下操作:

  • Set up the respective tool incl. preparations for the deployment 和 local consumption of the stock-con microservice.
  • Perform a code update, that is, change the source code of the /healthz endpoint in the stock-con microservice 和 observe the updates.

请注意,对于目标捕鱼大亨网络版集群,我们一直在本地使用Minikube,但是如果您想继续使用,也可以将ksync和Skaffold用作远程集群。

演练:ksync

作为准备,安装 同步 然后执行以下步骤来准备开发设置:

$ mkdir -p $(pwd)/ksync
$ kubectl create namespace dok
$  同步  init -n dok

用 the basic setup completed we're ready to tell 同步 ’s local client to watch a certain 捕鱼大亨网络版 namespace 和 then we create a spec to define what we want to sync (the directory $(pwd)/ksync locally with /app in the container). Note that target pod is specified via the selector parameter:

$  同步  watch -n dok
$  同步  create -n dok --selector=app=stock-con $(pwd)/ksync /app
$  同步  get -n dok

现在,我们部署库存生成器和库存消费者微服务:

$ kubectl -n=dok apply \
      -f //raw.githubusercontent.com/kubernauts/dok-example-us/master/stock-gen/app.yaml
$ kubectl -n=dok apply \
      -f //raw.githubusercontent.com/kubernauts/dok-example-us/master/stock-con/app.yaml

Once both deployments are created 和 the pods are running, we forward the stock-con service for local consumption (in a separate terminal session):

$ kubectl get -n dok po --selector=app=stock-con  \
                     -o=custom-columns=:metadata.name --no-headers |  \
                     xargs -IPOD kubectl -n dok port-forward POD 9898:9898

用 that we should be able to consume the stock-con service from our local machine; we do this by regularly checking the response of the healthz endpoint like so (in a separate terminal session):

$ watch curl localhost:9898/healthz

Now change the code in the 同步 /stock-condirectory, for example update the /healthz 端点代码 service.js by adding a field to the JSON response 和 observe how the pod gets updated 和 the response of the curl localhost:9898/healthz command changes. 总的来说,最后您应该具有以下内容:

Preview

演练:具有本地构建的Minikube

接下来,您需要启动并运行Minikube,我们将利用Minikube内部的Docker守护程序在本地构建映像。作为准备,请执行以下操作

$ git clone //github.com/kubernauts/dok-example-us.git && cd dok-example-us
$ eval $(minikube docker-env)
$ kubectl create namespace dok

现在,我们部署库存生成器和库存消费者微服务:

$ kubectl -n=dok apply -f stock-gen/app.yaml
$ kubectl -n=dok apply -f stock-con/app.yaml

Once both deployments are created 和 the pods are running, we forward the stock-con service for local consumption (in a separate terminal session) 和 check the response of the healthz endpoint:

$ kubectl get -n dok po --selector=app=stock-con  \
                     -o=custom-columns=:metadata.name --no-headers |  \
                     xargs -IPOD kubectl -n dok port-forward POD 9898:9898 &
$ watch curl localhost:9898/healthz

Now change the code in the stock-condirectory, for example, update the /healthz 端点代码 service.js 通过将字段添加到JSON响应中。完成代码更新后,最后一步是构建新的容器映像并开始新的部署,如下所示:

$ docker build -t stock-con:dev -f Dockerfile .
$ kubectl -n dok set image deployment/stock-con *=stock-con:dev

总的来说,最后您应该具有以下内容:

本地预览

演练:脚手架

要执行此演练,您首先需要安装 脚手架 。完成后,您可以执行以下步骤来准备开发设置:

$ git clone //github.com/kubernauts/dok-example-us.git && cd dok-example-us
$ kubectl create namespace dok

现在,我们部署库存生成器(但不部署通过Skaffold完成的库存消费者微服务):

$ kubectl -n=dok apply -f stock-gen/app.yaml

Note that initially we experienced an authentication error when doing skaffold dev 和 needed to apply a fix as described in 问题322 . Essentially it means changing the content of ~/.docker/config.json to:

{
   "auths": {}
}

下一个 , we had to patch stock-con/app.yaml slightly to make it work with 脚手架 :

Add a namespace field to both the stock-con deployment 和 the service with the value of dok. Change the image field of the container spec to quay.io/mhausenblas/stock-con since 脚手架 manages the container image tag on the fly.

The resulting app.yaml file stock-con looks as follows:

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  labels:
    app: stock-con
  name: stock-con
  namespace: dok
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: stock-con
    spec:
      containers:
      - name: stock-con
        image: quay.io/mhausenblas/stock-con
        env:
        - name: DOK_STOCKGEN_HOSTNAME
          value: stock-gen
        - name: DOK_STOCKGEN_PORT
          value: "9999"
        ports:
        - containerPort: 9898
          protocol: TCP
        livenessProbe:
          initialDelaySeconds: 2
          periodSeconds: 5
          httpGet:
            path: /healthz
            port: 9898
        readinessProbe:
          initialDelaySeconds: 2
          periodSeconds: 5
          httpGet:
            path: /healthz
            port: 9898
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: stock-con
  name: stock-con
  namespace: dok
spec:
  type: ClusterIP
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 9898
  selector:
    app: stock-con

The final step before we can start development is to configure 脚手架 . So, create a file skaffold.yaml in the stock-con/ directory with the following content:

apiVersion: skaffold/v1alpha2
kind: Config
build:
  artifacts:
  - imageName: quay.io/mhausenblas/stock-con
    workspace: .
    docker: {}
  local: {}
deploy:
  kubectl:
    manifests:
      - app.yaml

Now we’re ready to kick off the development. For that execute the following in the stock-con/ directory:

$ skaffold dev

Above command triggers a build of the stock-con image 和 then a deployment. Once the pod of the stock-con deployment is running, we again forward the stock-con service for local consumption (in a separate terminal session) 和 check the response of the healthz endpoint:

$ kubectl get -n dok po --selector=app=stock-con  \
                     -o=custom-columns=:metadata.name --no-headers |  \
                     xargs -IPOD kubectl -n dok port-forward POD 9898:9898 &
$ watch curl localhost:9898/healthz

If you now change the code in the stock-condirectory, for example, by updating the /healthz 端点代码 service.js 通过将字段添加到JSON响应,您应该看到Skaffold注意到更改并创建新映像并进行部署。结果屏幕看起来像这样:

支架预览

到目前为止,您应该已经了解了不同的工具如何使您能够在捕鱼大亨网络版上开发应用程序,如果您想了解有关工具和方法的更多信息,请查看以下资源:

总结了这篇关于如何在捕鱼大亨网络版上开发应用程序的文章后,我们希望您能学到一些东西,如果您有反馈意见和/或想指出您认为有用的工具,请通过Twitter告诉我们: 伊利亚 麦可 .