Bazel-在Monorepo内将Docker容器构建,推送,部署到Kubernetes 结构常规

我有一个具有某些后端(Node.js)和前端(Angular)服务的monorepo。目前,我的部署过程如下:

  1. 检查测试是否通过
  2. 为我的服务构建docker映像
  3. 将docker镜像推送到容器注册表中
  4. 使用GKE将更改应用于Kubernetes集群(kubectl

我的目标是借助BazelCloud Build使所有这些步骤自动化。但是我真的很难开始使用Bazel:

要使其正常工作,我可能需要添加一个具有自己的外部依存关系的WORKSPACE文件,并为自己的软件包/服务添加多个BUILD文件? 我需要实际实施的帮助:

  1. 如何使用Bazel构建我的Dockerfile?
  2. 如何将这些图像推送到注册表中(最好是GCR)?
  3. 如何自动将更改应用于Google Kubernetes Engine?
  4. 如何将此工具链与Google Cloud Build集成?

有关该项目的更多信息

  

我整理了一个很小的sample monorepo来展示我的用例

结构

├── kubernetes
├── packages
│   ├── enums
│   ├── utils
└── services
    ├── gateway

常规

  • Gateway服务取决于enumsutils
  • 一切都用打字稿写
  • 每个服务/程序包都是一个Node模块
  • Dockerfile文件夹中有一个gateway,我想建立该文件夹
  • Kubernetes配置位于kubernetes文件夹中。
  • 请注意,我不想发布任何npm软件包!
linwen86 回答:Bazel-在Monorepo内将Docker容器构建,推送,部署到Kubernetes 结构常规

我们想要的是一个可移植的Docker容器,该容器可容纳我们的Angular应用及其服务器以及所需的任何计算机映像,以便可以在任何Cloud提供程序上运行,我们将创建一个完整的增量管道。 “ Docker规则”很快。本质上,它通过添加新的Docker层来提供工具性,因此您对应用程序所做的更改是唯一通过电线发送到云主机的内容。此外,由于Docker映像使用SHA标记,因此我们仅重新部署已更改的映像。要管理生产部署,我们将使用Kuzelnetes,Bazel规则也存在。据我所知,无法使用Bazel从Dockerfile构建Docker映像,因为 由于Dockerfile的非封闭性质,因此设计上不允许这样做。 https://blog.bazel.build/2015/07/28/docker_build.html

作为源代码一部分所做的更改将被部署到Kubernetes Cluster中,这是使用Bazel实现以下目标的一种方法。

  1. 我们必须将Bazel置于监视模式下,Deploy replace告诉Kubernetes集群更新该应用程序的已部署版本。 一种。

    命令:ibazel运行:deploy.replace

  2. 如果有任何源代码更改,请按角度进行操作。

  3. Bazel仅根据依赖于已更改文件的方式逐步重建构建图的各个部分,在这种情况下,该部分包括已更改的ng_module,包含该模块的Angular应用程序以及保存服务器的Docker nodejs_image 。正如我们要求更新部署一样,在构建完成后,它将新的Docker容器推送到Google Container Registry,而Kubernetes Engine实例开始为其提供服务。 Bazel理解构建图,它仅重新构建所做的更改。

以下是一些摘录级别的提示,实际上可以帮上忙。

工作空间文件:

创建一个Bazel工作区文件,WORKSPACE文件告诉Bazel这个目录是一个“工作区”,就像一个项目根目录。下面列出了在Bazel工作区中要执行的操作。 •工作空间的名称应与我们在其中发布的npm软件包匹配,以便在引用已发布的软件包时这些导入也很有意义。 •使用“ http_archive”提及Bazel工作区中的所有规则,当我们使用angular和node时,应针对rxjs,angular,angular_material,io_bazel_rules_sass,angular-version,build_bazel_rules_typescript,build_bazel_rules_nodejs提及这些规则。 •-接下来,我们必须使用“加载”来加载依赖项。 sass_repositories,ts_setup_workspace,angular_material_setup_workspace,ng_setup_workspace, •还加载Docker基本映像,在本例中为“ @ io_bazel_rules_docker // nodejs:image.bzl”, •不要忘记提及浏览器和Web测试存储库     web_test_repositories()     browser_repositories(         铬=真,         firefox =正确,     )

“ BUILD.bazel”文件。

•加载已下载的模块ng_module,项目模块等。 •使用“ default_visibility”设置默认可见性 •如果您有任何Jasmine测试,请使用ts_config并提及其中的依赖关系。 •ng_module(此处应提及资产,来源和代理) •如果您有任何延迟加载脚本,请在捆绑软件中提及它 •在web_package中提及根目录。 •最后,提及数据和欢迎页面/默认页面。

示例片段:

load("@angular//:index.bzl","ng_module")
ng_module(
    name = "src",srcs = glob(["*.ts"]),tsconfig = ":tsconfig.json",deps = ["//src/hello-world"],)
load("@build_bazel_rules_nodejs//:future.bzl","rollup_bundle")
rollup_bundle(
  name = "bundle",deps = [":src"]
  entry_point = "angular_bazel_example/src/main.js"
)

使用以下命令构建捆绑包。

bazel build :bundle

管道:通过詹金斯

通过Jenkins创建管道并运行管道有多个阶段。每个阶段执行单独的任务,但在我们的案例中,我们使用阶段通过BaZel Run发布图像。

pipeline {
  agent any
  stages {
    stage('Publish image') {
      steps {
        sh 'bazel run //src/server:push'
      }
    }
  }
}

注意:

bazel run :dev.apply
  1. Dev Apply映射到kubectl apply,这将创建或替换现有配置。(有关更多信息,请参见kubectl文档。)这将应用已解决的模板,其中包括重新发布图像。此操作旨在成为快速迭代开发(重建/重新发布/重新部署)的主力军。

  2. 如果要使用workpsace文件提取容器,请使用以下标记

    container_pull(     名称=“ debian_base”,     摘要=“ sha256:**”,     注册表=“ gcr.io”,     repository =“ google-appengine / debian9”, )

如果使用GKE,则需要安装gcloud sdk,并且由于我们正在使用GKE(Google Contianer Enginer),因此可以使用以下方法进行身份验证。

gcloud container clusters get-credentials <CLUSTER NAME>

应该以以下格式提及Deploymnet对象:

load(“ @ io_bazel_rules_k8s // k8s:object.bzl”,“ k8s_object”)

k8s_object(
  name = "dev",kind = "deployment",template = ":deployment.yaml",images = {
    "gcr.io/rules_k8s/server:dev": "//server:image"
  },)

Sources :
•    https://docs.bazel.build/versions/0.19.1/be/workspace.html
•    https://github.com/thelgevold/angular-bazel-example
•    https://medium.com/@Jakeherringbone/deploying-an-angular-app-to-kubernetes-using-bazel-preview-91432b8690b5
•    https://github.com/bazelbuild/rules_docker
•    https://github.com/GoogleCloudPlatform/gke-bazel-demo
•    https://github.com/bazelbuild/rules_k8s#update
•    https://codefresh.io/howtos/local-k8s-draft-skaffold-garden/
•    https://github.com/bazelbuild/rules_k8s
,

几个月后,我在整个过程中实际上走了很远。 在这里发布每个细节都太多了!

因此,这是一个实现了所有要求的开源项目:https://github.com/flolu/centsideas

如有特定问题,请随时与我联系! :)

祝你好运

,

Flo,您是否考虑过使用 terraform 和 makefile 来自动构建集群?

在我最近的项目中,我使用 make 和 terraform 实现了端到端的基础设施自动化。从本质上讲,这种方法可以在 3 到 5 分钟内使用一个命令构建整个集群、构建和部署整个项目。取决于特定日期 gcp 的速度。

有一个谷歌示例项目展示了这个想法,尽管 terraform 配置已经过时,需要替换为符合当前 0.13 / 0/14 语法的配置。

https://github.com/GoogleCloudPlatform/gke-bazel-demo#build--deploy-with-bazel

启用单命令端到端自动化的 makefile:

https://github.com/GoogleCloudPlatform/gke-bazel-demo/blob/master/Makefile

再次为您的项目替换或自定义脚本;我实际上又写了两个脚本,一个用于检查/安装客户端要求,即 git/kubctl & gcloud,另一个用于检查或配置和验证 gcloud,以防它尚未配置和验证。从那里,terraform 脚本接管并构建整个集群,一旦完成,通常的自动部署就会开始。

我发现在 terraform 和 bazel 上进行分层制作以实现端到端自动化的想法非常棒。

本文链接:https://www.f2er.com/3132809.html

大家都在问