百道数据招聘: 运维工程师、架构师、商务。请发简历至 contact@baiadoadata.com

Devops解决方案

Devops解决方案

CloudRun + CloudBuild 集成CI、CD

一、什么是Cloud Run

Cloud Run 是一个代管式计算平台,可让您直接在 Google 可伸缩的基础架构之上运行容器。

如果您可以构建使用任何编程语言编写的代码的容器映像,则可以在 Cloud Run 上部署该代码。实际上,构建容器映像是可选操作。如果您使用的是 Go、Node.js、Python、Java、.NET Core 或 Ruby,则可以使用基于来源的部署选项,它会按照您所用语言的最佳做法构建容器。

Google 构建了可与 Google Cloud 上的其他服务完美配合的 Cloud Run,以便您可以构建功能齐全的应用。

简而言之,Cloud Run 可让开发者将时间花在编写代码上,将很少的时间花在运行、配置和伸缩 Cloud Run 服务上。您无需创建集群或管理基础架构即可高效使用 Cloud Run。

二、Cloud Run 服务

2.1 定义

Cloud Run 服务可为您提供运行可靠 HTTPS 端点所需的基础架构。您负责确保代码侦听 TCP 端口并处理 HTTP 请求。

标准服务功能包括

每个服务的唯一 HTTPS 端点

系统在 *.run.app 网域的唯一子网域上为每项 Cloud Run 服务提供了一个 HTTPS 端点,您也可以配置自定义网域。Cloud Run 会为您管理传输层安全协议 (TLS),并且支持 WebSocket、HTTP/2(端到端)和 gRPC(端到端)。

基于请求的快速自动扩缩

Cloud Run 旨在快速纵向扩容以处理所有传入请求。服务可以快速纵向扩容到一千个容器实例则甚至更多(如果您申请增加配额的话)。如果需求减少,Cloud Run 会移除空闲容器。如果您担心费用或下游系统过载,可以限制实例数上限。

内置流量管理

每个部署都会创建一个新的不可变的修订版本。您可以将传入流量路由到最新修订版本、回滚到先前修订版本,或同时将流量拆分到多个修订版本,以逐步执行发布。如果您想要降低部署新修订版本的风险,则这种做法会非常有用。您可以先从向新的修订版本发送 1% 的请求开始,在监控遥测时提高此百分比。

专用服务和公共服务

您可以从互联网访问 Cloud Run 服务,或者您可以通过以下三种方式限制访问权限:

  • 使用 Cloud IAM 指定访问权限政策。
  • 使用入站流量设置限制网络访问权限。如果您希望仅允许来自 VPC 和内部服务的内部流量,则此方式非常有用。
  • 仅允许使用 Cloud Identity-Aware Proxy (IAP) 进行身份验证的用户。

您可以在 Cloud Run 服务前面配置内容分发网络 (CDN),以从更靠近客户端的边缘位置提供可缓存的资源。Firebase Hosting 和 Cloud CDN 都提供此功能。

三、什么是Cloud Build

Cloud Build 服务可供您在 Google Cloud 上执行构建。

Cloud Build 可以从各种代码库或云存储空间导入源代码,根据您的规范执行构建,并生成诸如 Docker 容器或 Java 归档的软件工件。

3.1 构建配置和构建步骤

您可以编写构建配置,以向 Cloud Build 提供有关执行什么任务的说明。可以将构建配置为提取依赖项,运行单元测试、静态分析和集成测试,并使用 docker、gradle、maven、bazel 和 gulp 等构建工具创建软件工件。

Cloud Build 将构建作为一系列构建步骤执行,其中的每个构建步骤都在 Docker 容器中运行。执行构建步骤类似于在脚本中执行命令。

您可以使用 Cloud Build 和 Cloud Build 社区提供的构建步骤,也可以编写自己的自定义构建步骤:

  • Cloud Build 提供的构建步骤:Cloud Build 发布了一组适用于常用语言和任务的受支持开源构建步骤。
  • 社区提供的构建步骤:Cloud Build 用户社区提供了开源构建步骤。
  • 自定义构建步骤:您可以自行创建要在自己的构建中使用的构建步骤。

每个构建步骤都通过其连接到本地 Docker 网络(名为 cloudbuild)的容器运行。这使构建步骤可以相互通信并共享数据。

您可以在 Cloud Build 中使用标准 Docker Hub 映像

3.2 构建的工作原理

以下步骤描述了一般而言的 Cloud Build 构建生命周期:

  1. 准备应用代码及任何所需资源。
  2. 创建 YAML 或 JSON 格式的构建配置文件,其中包含 Cloud Build 的说明。
  3. 将构建提交到 Cloud Build。
  4. Cloud Build 根据您提供的构建配置执行构建。
  5. 如果适用,构建的任何工件都会推送到 Artifact Registry。

Cloud Build 使用 Docker 执行构建。对于每个构建步骤,Cloud Build 都会将 Docker 容器作为 docker run 的实例执行。目前,Cloud Build 运行的是 Docker 引擎版本 19.03.8。

四、演示

百道在调研了业内多家客户和需求之后,结合谷歌云提供的产品。设计出了一套自己的方案。架构图如下。

这是谷歌云一个很典型的CI|CD方案,如下图:

  1. 开发者推送源码到一个版本控制系统比如github
  2. github 的提交会自动触发Cloud Build的钩子函数
  3. Cloud Build构建镜像推送到谷歌云的镜像仓库,Containers Registry
  4. Cloud Build通知Cloud Run 重新部署
  5. Cloud Run 拉取在Container Registry的最新镜像

使用到的服务

  • Cloud Build
  • Cloud Run
  • Containers Registry

4.1 准备

代码仓库如下

4.2 Dockerfile

# Version JDK8

FROM centos:7
MAINTAINER Gaurav Agarwal, bharatmicrosystems@gmail.com

RUN yum install -y java-1.8.0-openjdk-devel wget git maven

# Create users and groups
RUN groupadd tomcat
RUN mkdir /opt/tomcat
RUN useradd -s /bin/nologin -g tomcat -d /opt/tomcat tomcat

# Download and install tomcat
RUN wget https://apache.mirrors.nublue.co.uk/tomcat/tomcat-8/v8.5.54/bin/apache-tomcat-8.5.54.tar.gz
RUN tar -zxvf apache-tomcat-8.5.54.tar.gz -C /opt/tomcat –strip-components=1
RUN chgrp -R tomcat /opt/tomcat/conf
RUN chmod g+rwx /opt/tomcat/conf
RUN chmod g+r /opt/tomcat/conf/*
RUN chown -R tomcat /opt/tomcat/logs/ /opt/tomcat/temp/ /opt/tomcat/webapps/ /opt/tomcat/work/
RUN chgrp -R tomcat /opt/tomcat/bin
RUN chgrp -R tomcat /opt/tomcat/lib
RUN chmod g+rwx /opt/tomcat/bin
RUN chmod g+r /opt/tomcat/bin/*

RUN rm -rf /opt/tomcat/webapps/*
RUN cd /tmp && git clone https://github.com/DEV3L/java-mvn-hello-world-web-app.git
RUN cd /tmp/java-mvn-hello-world-web-app && mvn clean install
RUN cp /tmp/java-mvn-hello-world-web-app/target/mvn-hello-world.war /opt/tomcat/webapps/ROOT.war
RUN chmod 777 /opt/tomcat/webapps/ROOT.war

VOLUME /opt/tomcat/webapps
EXPOSE 8080
CMD [“/opt/tomcat/bin/catalina.sh”, “run”]

4.3 cloudbuild.yaml

steps:
# Pull the existing image
– name: ‘gcr.io/cloud-builders/docker’
  entrypoint: ‘bash’
  args:
  – ‘-c’
  – |
    docker pull gcr.io/$PROJECT_ID/tomcat:latest || exit 0
# Build a docker image
– name: ‘gcr.io/cloud-builders/docker’
  args: [ ‘build’, ‘-t’, ‘gcr.io/$PROJECT_ID/tomcat’, ‘–cache-from’, ‘gcr.io/$PROJECT_ID/tomcat’, ‘.’ ]
# Push the docker image to container registry
– name: ‘gcr.io/cloud-builders/docker’
  args: [“push”, “gcr.io/$PROJECT_ID/tomcat”]
# Deploy an image from Container Registry to Cloud Run
– name: ‘gcr.io/cloud-builders/gcloud’
  args: [‘beta’, ‘run’, ‘deploy’, ‘tomcat’, ‘–image’, ‘gcr.io/$PROJECT_ID/tomcat:latest’, ‘–region’, ‘europe-west1’, ‘–platform’, ‘managed’, ‘–allow-unauthenticated’]
images:
– ‘gcr.io/$PROJECT_ID/tomcat’

配置Cloud Build 服务如下

  1. 构建docker镜像
  2. 推送镜像到Cloud Registry
  3. 部署镜像到Cloud Run

4.4 创建触发器

填写仓库地址和推送的分支

如果没问题的话,你可以看到配置成功

我们还需要配置IAM权限让Cloud Build 能访问Cloud Run

4.5 测试和配置

如果所有的配置都成功了,你可以在历史页面看到构建的历史

我们可以看到Cloud Build发生了什么

稍等片刻,等待构建完成

构建完成之后,可以在Containers Registry看到镜像

4.6 部署服务

打开Cloud Run页面,你可以看到已经部署好了一个新的服务

点击服务,可以看到访问的URL,通过浏览器就能看到部署的服务,我们这里部署的是个图片服务。正常打开页面如下