首页 > 解决方案 > GKE 自动部署具有不同映像的多个部署/服务

问题描述

我目前正在查看 GKE 和谷歌云上的一些教程。我在这里关注这个https://cloud.google.com/solutions/integrating-microservices-with-pubsub#building_images_for_the_app(源代码https://github.com/GoogleCloudPlatform/gke-photoalbum-example

此示例有 3 个部署和一项服务。示例教程让您通过命令行部署所有内容,这很好并且一切正常。然后我开始研究如何通过云构建自动化部署并发现了这一点:

https://cloud.google.com/build/docs/deploying-builds/deploy-gke#automating_deployments

这些文档说您可以为触发器创建构建配置(例如推送到特定的存储库),它将触发构建。他们为此展示的示例 yaml 如下:

# deploy container image to GKE
- name: "gcr.io/cloud-builders/gke-deploy"
  args:
  - run
  - --filename=kubernetes-resource-file
  - --image=gcr.io/project-id/image:tag
  - --location=${_CLOUDSDK_COMPUTE_ZONE}
  - --cluster=${_CLOUDSDK_CONTAINER_CLUSTER}

我了解如何传入位置和集群参数,这些文档还对资源文件(文件名参数)和图像参数进行了以下说明:

kubernetes-resource-file 是您的 Kubernetes 配置文件的文件路径或包含您的 Kubernetes 资源文件的目录路径。

image 是所需的容器镜像名称,通常是应用程序名称。

将此与所有服务都在一个存储库中的演示应用程序存储库相关联,我相信我可以提供文件名参数的文件夹路径,例如来自存储库https://github.com/GoogleCloudPlatform/gke-photoalbum的配置文件夹-示例/树/主/配置

但这里的问题是这些资源文件本身有一个图像属性,所以我不知道这与云构建触发器 yaml的图像属性有什么关系。我也不知道如何在触发器 yaml 中拥有多个“图像”属性,其中每个部署都有自己的容器图像。

我一般是 GKE 和 Kubernetes 的新手,所以我想知道我是否误解了kubernetes-resource-file在这种情况下应该是什么。

但是,当多个部署/服务都捆绑到一个存储库中时,是否可以以这种方式自动部署多个部署/服务?或者让谷歌为本教程简化了一些事情——现实是大多数服务都在他们自己的仓库中,以便单独构建/测试/部署?

无论哪种方式,该属性与部署 yaml 中已定义图像image这一事实有何关系?例如:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    name: photoalbum-app
  name: photoalbum-app
spec:
  replicas: 3
  selector:
    matchLabels:
      name: photoalbum-app
  template:
    metadata:
      labels:
        name: photoalbum-app
    spec:
      containers:
      - name: photoalbum-app
        image: gcr.io/[PROJECT_ID]/photoalbum-app@[DIGEST]
        tty: true
        ports:
        - containerPort: 8080
        env:
        - name: PROJECT_ID
          value: "[PROJECT_ID]"

 

标签: kubernetesgoogle-kubernetes-enginegoogle-cloud-buildcloudbuild.yaml

解决方案


您使用的命令非常适合测试一个映像的部署。但是当您使用 Kubernetes (K8S) 和 GCP 的托管版本 (GKE) 时,您通常不会这样做。

您使用 YAML 文件来描述您的部署、服务和所有其他您想要的 K8S 对象。部署时,您可以执行类似这样的操作

kubectl apply -f <file.yaml>

如果你有几个文件,你可以使用通配符是你想要的

kubectl apply -f config/*.yaml

如果你喜欢只使用一个文件,你可以用---

apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
  labels:
    app: nginx
spec:...
...

推荐阅读