使用 Container Builder 和 Kubernetes Engine 完成 NodeJS 持续部署
要了解如何使用此存储库的所有详细信息,请参阅dev.to上的相应区块帖子
您想将应用部署到 Kubernetes 集群,而无需任何手动步骤吗?
 我已经帮您搞定了,使用 Google Cloud 创建持续部署流水线非常简单。
 为了便于理解,我选择了 NodeJS Express 应用程序,但它也适用于 React、PHP 或任何其他应用层。
让我们开始吧:
首先,我们需要授予容器构建器访问我们 Kubernetes API 的权限。请记住,这不会授予对特定集群的访问权限。它只是允许 Cloudbuilder 服务帐户访问我们的 Kubernetes 集群。因此,请跳转到IAM 设置页面并查找 Cloudbuild 服务帐户。如果该帐户不存在,您可能需要启用Cloudbuild API。
我们需要添加访问我们集群的 Kubernetes API 的权限,因此请点击笔并查找以下内容。
我不会详细介绍如何设置 Express 应用程序并对其进行测试。
 我创建了一个包含示例应用程序的仓库,我们可以使用它。
要了解如何使用此存储库的所有详细信息,请参阅dev.to上的相应区块帖子
为了方便您了解,我们有一个基本的 Express 应用,其中包含两个后端路由,分别用于检索用户或通过 ID 检索用户。
 此外,我们还提供了一个测试文件夹,其中包含针对这两个路由的测试。这些测试是在 chai 和 mocha 的帮助下编写的。
 如果您下载了代码库,可以执行以下操作来检查测试是否正常运行。
npm install
npm test
在应用程序运行之前,我们需要在 Kubernetes 集群中部署服务和应用。因此,让我们快速创建一个服务和一个部署。所有文件都可以在代码库中找到。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: server-production
  labels:
    app: YOUR-PROJECT-ID
spec:
  replicas: 2
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
  template:
    metadata:
      labels:
        app: server
    spec:
      containers:
        - name: server
          image: gcr.io/PROJECT_ID/REPOSITORY:master
          imagePullPolicy: Always
          ports:
            - containerPort: 3000
          env:
            - name: NODE_ENV
              value: "production"
这里唯一重要的部分是将项目 ID 和存储库更改为存储库将具有的路径。
之后,我们只需要一个服务来将我们的应用暴露到互联网上。所以赶紧申请服务吧。
kind: Service
apiVersion: v1
metadata:
  name:  server
spec:
  selector:
    app:  server
  ports:
    - name:  server
      protocol: TCP
      port: 80
      targetPort: 3000
  type: LoadBalancer
现在我们需要进入整个设置过程中最重要的部分——cloudbuild.yaml。我们将在这里定义持续部署步骤所需的所有内容。
第一个令人惊奇的部分是,可以将所有重要数据放入构建中定义的环境变量中,因此您可以将云构建用于不同的设置。
首先,我们安装所有节点依赖项并运行测试。
  - name: 'gcr.io/cloud-builders/npm'
    args: ['install']
  - name: 'gcr.io/cloud-builders/npm'
    args: ['run', 'test']
之后,我们会构建一个包含所有仓库文件和正确定义环境的 Docker 镜像,以便您可以轻松地进行临时部署,甚至分支部署。最后,我们会将其推送到 Google 镜像仓库。
  - name: 'gcr.io/cloud-builders/docker'
    args:
      - build
      - '--build-arg'
      - 'buildtime_variable=$_NODE_ENV'
      - '-t'
      - gcr.io/$PROJECT_ID/$REPO_NAME:$BUILD_ID
      - '.'
  - name: 'gcr.io/cloud-builders/docker'
    args: ['push', 'gcr.io/$PROJECT_ID/$REPO_NAME:$BUILD_ID']
同样重要的是要注意,我们用唯一的构建 ID 标记图像以利用 kubernetes 的应用能力,因此图像实际上发生了改变。
  - name: 'gcr.io/cloud-builders/kubectl'
    args:
      - set
      - image
      - deployment
      - $_DEPLOYMENT
      - $_DEPLOYMENT=gcr.io/$PROJECT_ID/$REPO_NAME:$BUILD_ID
    env:
      - 'CLOUDSDK_COMPUTE_ZONE=$_CLUSTER_ZONE'
      - 'CLOUDSDK_CONTAINER_CLUSTER=$_CLUSTER_NAME'
最后,我们将镜像设置到 Kubernetes 集群中。砰!提交钩子,自动化测试,如果成功,则自动部署,无需停机。
现在我们打开容器构建器触发器并选择我们的代码所在的位置。
在最后一个触发步骤中,我们现在可以添加自定义变量。这是我们实际定义集群的第一个步骤。这样,所有内容都聚合在一个地方,随时可用。
现在我们只需要提交给主服务器,然后触发器就会启动。
YIHA 现在我们有了持续部署,无需设置任何额外的服务,例如 jenkins、ant 或 chef。真是太棒了
我正在考虑创建一个从零开始到云端大师的教程系列,你有兴趣吗?给我留言吧!
链接:https://dev.to/mfahlandt/nodejs-continuous-deployment-done-with-container-builder-and-kubernetes-engine-in-google-cloud-570p