【问题标题】:Knative - kubernetes yaml to mount data from google cloud storageKnative - kubernetes yaml 从谷歌云存储挂载数据
【发布时间】:2021-03-26 04:52:41
【问题描述】:

我是使用 YAML 文件进行 Kubernetes 和 Cloudrun 部署的新手,如果这个问题非常基础,请见谅。

问题:我有存储在云存储中的文件。我想在容器启动我的 docker 入口点之前将这些文件下载到本地挂载中。

据我了解,KNative 不支持卷或 persistentVolumeClaims。

如果理解有误,请指正。

让我用下面的图片更好地解释一下,

在 Kubernetes pod 内部,我将容器启动分为 3 个部分。

  1. 从 GCS (Google Cloud Storage) 下载文件的 Prehook -> 这会将文件从 google 存储复制到本地挂载。可以使用某种带有 clouddk 映像的 init 容器,然后使用 gsutils 将文件复制下来。
  2. 本地挂载文件系统 -> prehook 将写入此挂载。具有“容器映像”的容器也可以访问此挂载。
  3. 容器镜像 -> 这是我在容器中运行的主要容器镜像。

我正在寻找适用于 cloudrun 的 Knative 服务解决方案。我该如何解决?

另外,是否可以在没有 Knative 服务的情况下使用 yaml 文件来创建 cloudrun 服务?

【问题讨论】:

    标签: docker kubernetes google-cloud-run knative knative-serving


    【解决方案1】:

    正如您所说,Knative 合约不允许挂载或声明卷。因此,您无法实现这一点(目前,在托管的 Cloud Run 上)。

    另一方面,Pod 允许这样做,但 Knative 是“Pod”的特殊版本:没有持久化卷,而且你不能定义容器列表,它是一个只有一个容器(+ 网格(大多数情况下,Istio)在部署时注入 sidecar)

    对于您的其他问题,Cloud Run 实现了 Knative API。因此,您需要提供 Knative 服务 YAML 文件来配置您的服务。


    如果要写入文件,可以在内存分区中的/tmp 中进行。因此,在您的容器启动时,下载文件并将它们存储在那里。但是,如果您更新文件并需要推送更新,则需要手动将它们推送到 Cloud Storage。

    此外,已经下载文件并将其存储在/tmp 目录中的其他运行实例将不会在 Cloud Storage 中看到文件更改;这只是新的实例。

    更新 1:

    如果您想在容器启动“之前”下载文件,您有 2 个解决方案:

    1. “之前”是不可能的,你可以在启动时这样做:
    • 容器启动
    • 下载文件,启动你需要的东西
    • 使用您的网络服务器提供流量。

    之前的解决方案有2个问题

    • 服务冷启动受服务前下载的影响
    • 文件的最大大小受实例的最大内存大小限制(/tmp 目录是内存中的文件系统。如果您的配置为 2Gb,则大小为最大 2Gb 减去您的内存占用应用程序)
    1. 第二种解决方案是使用容器映像中已存在的文件构建容器。
    • 无冷启动影响
    • 没有内存限制
    • 降低您的敏捷性,您需要通过文件更改构建和部署新修订版。

    更新 2:

    对于解决方案 1,它不是 Knative 解决方案,它在您的代码中!我不知道您的语言和框架,但是在启动时,您需要使用 Google Cloud Storage 客户端库从您的代码中下载您需要的文件。

    给我看看你的服务器启动,我可以给你举个例子!

    对于解决方案 2,文件不在您的 git 存储库中,但仍在您的云存储中。您的 Docker 文件可能如下所示

    FROM google/cloud-sdk:alpine as gcloud
    WORKDIR /app
    
    # IF you aren't building your image on Cloud Build, you need to be authenticated
    #ARG KEY_FILE_CONTENT
    #RUN echo $KEY_FILE_CONTENT | gcloud auth activate-service-account --key-file=- && \
    
    # Get the file(s)
    gsutil cp gs://my-bucket/name.csv .
    
    FROM golang:1.15-buster as builder
    
    WORKDIR /app
    COPY go.* ./
    ....
    RUN go build -v -o server
    
    FROM debian:buster-slim
    
    # Copy the binary to the production image from the builder stage.
    COPY --from=builder /app/server /app/server
    COPY --from=gcloud /app/name.csv /app/name.csv
    
    # Run the web service on container startup.
    CMD ["/app/server"]
    

    您还可以想象在 Docker 构建命令之前下载文件并简单地在 Dockerfile 中执行复制。我不知道你的容器创建管道,但它是你可以重复使用的想法!

    【讨论】:

    • 感谢您回复我的询问。我对您回复的第二部分感兴趣,我可以在其中写入 /tmp 目录。只是这个问题的后续问题,如何在容器启动之前将这些文件下载到 /tmp 目录?
    • 对于解决方案1,如何在启动时复制? Knative 似乎也不支持 Kubernetes 的生命周期。解决方案 2 对我不起作用,因为我们不想将这些文件存储在 GIT 存储库中。
    • 所以解决方案 1,创建两个容器,在第一个容器映像中,将有代码将文件从 Google Storage 复制到 pod。在第二个容器中将有我的主容器代码。第二个解决方案可能很乏味,因为我需要在 dockerfile 能够从 GS 下载文件之前配置 jenkins 并设置身份验证。感谢您提供详细的解决方案!!!
    • 你不能有 2 个容器!!这就是为什么您需要在容器启动时在同一个容器中执行此操作。它不是很干净,但你没有其他解决方案。
    猜你喜欢
    • 2021-11-11
    • 2020-06-01
    • 2018-10-11
    • 1970-01-01
    • 2017-02-10
    • 2015-07-17
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多