在当今快速发展的软件开发领域,持续集成和持续交付(CI/CD)管道成为了自动化软件开发和部署流程的关键。本文将介绍如何利用Google Cloud平台的服务,包括Google Source Repositories、Container Registry、CloudBuild和GoogleKubernetesEngine(GKE),来构建一个完整的CI/CD管道。
要跟随本文的实践部分,需要具备基本的Google Cloud知识和一个Google Cloud账户。此外,还需要了解基本的Git命令。对于Docker和容器的理解,以及将要使用的应用程序上下文,可以参考相关博客文章。
一旦账户创建完成,在Google Cloud平台的首页上,可以选择创建一个新项目。本文创建了一个名为“k8s-sent-deployment”的项目,并将使用该项目来设置完整的管道。
容器注册表用于存储Docker容器镜像,类似于DockerHub、AWS ECS和其他私有云容器注册表。容器注册表的好处包括安全、私有的Docker注册表、自动构建和部署、深入的漏洞扫描、锁定风险镜像、原生Docker支持以及快速、高可用的访问。
要使用该服务,需要激活API,在搜索栏中搜索“容器注册表”,然后在下一页点击“启用容器注册表API”按钮。
Google源代码仓库是一个版本控制系统,类似于Github/Bitbucket,用于存储、管理和跟踪代码。要使用该服务,需要激活API,在搜索栏中搜索“Cloud Source Repositories API”,然后在着陆页点击“启用”。
一旦API被启用,点击“转到Cloud Source Repositories”按钮,然后点击“开始使用”。可以选择创建一个新的仓库或连接一个外部仓库,如Github或Bitbucket。本文将创建一个新的仓库。如果想使用外部仓库,则可以跳过以下部分。
选择“创建一个新仓库”,输入仓库名称,并选择之前创建的项目,然后点击“创建”。可以选择从Github账户下载“情感分析”应用程序代码,或者使用自己的应用程序。流程将是相同的,只是这里和那里的一些变化。
一旦Cloud Source Repository创建完成,将被带到一个页面,以“将代码添加到仓库”。选择克隆仓库到本地Git仓库,并按照“手动生成凭据”下提到的步骤进行。
Kubernetes,也称为K8s,是一个开源系统,用于自动化部署、扩展和管理容器化应用程序。GKE是由Google基础设施管理的Kubernetes。一些好处包括自动扩展、自动升级、自动修复、日志记录和监控、负载均衡。
要使用该服务,需要启用API。在搜索栏中搜索KubernetesEngine API并启用API。一旦API被启用,需要创建一个集群。为此,打开云shell,会在右上角找到一个激活云shell的图标。
要创建一个集群,在云shell中输入以下命令:
gcloud container clusters create mykube --zone "us-west1-b" --machine-type "n1-standard-1" --num-nodes "1"
这将创建一个名为“mykube”的Kubernetes集群,包含1个n1-standard-1机器类型的计算节点。
现在,需要为管道创建以下配置文件:
Dockerfile:一个简单的文件,包含构建Docker镜像的指令。每个指令在Dockerfile中是一个命令/操作,例如,使用什么操作系统,安装什么依赖项或如何编译代码等,这些指令作为层。要了解更多关于Docker、容器和如何创建Dockerfile,请查看相关博客。
FROM python:3.8-slim-buster
WORKDIR /app
COPY . /app
RUN pip install -r requirements.txt
EXPOSE 5000
CMD ["python3","app.py"]
Deployment YAML:要运行应用程序,需要创建一个Deployment对象,可以使用YAML文件来完成。
apiVersion: apps/v1
kind: Deployment
metadata:
name: sentiment
spec:
replicas: 2
selector:
matchLabels:
app: sentimentanalysis
template:
metadata:
labels:
app: sentimentanalysis
spec:
containers:
- name: nlp-app
image: gcr.io/k8s-sent-deployment/myapp:v1
ports:
- containerPort: 5000
Service YAML:要将运行在一组Pods上的应用程序暴露为网络服务,需要一个Service YAML文件。
apiVersion: v1
kind: Service
metadata:
name: sentimentanalysis
spec:
type: LoadBalancer
selector:
app: sentimentanalysis
ports:
- port: 80
targetPort: 5000
在这个文件中,指定了kind: Service,在spec type: LoadBalancer中自动分配负载,并且app名称与Deployment YAML文件中的名称相同。它具有端口映射,目标容器端口为5000。
Cloud Build是一个服务,它在Google CloudPlatform的基础设施上执行构建。Cloud Build可以从各种代码仓库或云存储空间导入源代码,根据规格执行构建,并生成Docker容器或Java存档等工件。
它执行步骤中的命令,类似于在脚本中执行命令。
steps:
#Build the image
- name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'gcr.io/$PROJECT_ID/myapp:v1', '.']
timeout: 180s
#Push the image
- name: 'gcr.io/cloud-builders/docker'
args: ['push', 'gcr.io/$PROJECT_ID/myapp:v1']
# deploy container image to GKE
- name: "gcr.io/cloud-builders/gke-deploy"
args:
- run
- --filename=K8s_configs/
- --image=gcr.io/$PROJECT_ID/myapp:v1
- --location=us-west1-b
- --cluster=mykube
在第一步中,将构建Docker镜像,在下一步中,将镜像推送到Google Container Registry。最后一步是在Kubernetes集群上部署应用程序,文件名是将包含Deployment和Service YAML文件的文件夹目录,指定之前创建的镜像和集群名称。
注意:$PROJECT_ID变量的值将从环境中获取。
现在有了构建管道所需的一切,让开始构建一个。首先,需要创建一个触发器,以便在代码仓库中进行新的更改时触发管道。如果使用GitHub/Bitbucket作为源代码仓库,则可以按照此链接连接到仓库。
要创建一个触发器,在控制台中搜索Cloud Build并点击“创建触发器”。在下一页中,选择触发管道的事件,并为监控任何更改提供仓库和分支,类型选择Cloud Build配置文件,并提供文件位置,然后点击“创建”。
一旦触发器设置完成,将有手动触发管道的选项,或者可以在代码仓库中进行一些更改,管道将自动触发。
让首先检查手动过程,点击“运行”,然后点击“运行触发器”,它将启动管道并遵循Cloud Build YAML文件中的步骤。构建将需要3-4分钟才能完成。一旦构建完成,可以检查容器注册表中的Docker镜像和Kubernetes Engine,确认工作负载和服务是否正在运行。如果构建失败,可以查看日志并检查错误所在并尝试解决。
在案例中,由于权限问题失败了一次,所以如果遇到类似的容器权限问题,只需在IAM控制台或通过云shell添加IAM策略即可:
gcloud projects add-iam-policy-binding k8s-sent-deployment --member=serviceAccount:@cloudbuild.gserviceaccount.com --role=roles/container.developer